/[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 595 by bh, Wed Apr 2 18:28:09 2003 UTC revision 1586 by bh, Fri Aug 15 10:27:06 2003 UTC
# Line 1  Line 1 
1    2003-08-15  Bernhard Herzog  <[email protected]>
2    
3            Move some of the mock objects in test_baserenderer into their own
4            module so they can easily be used from other tests
5    
6            * test/mockgeo.py: New test helper module with some mock objects
7            for geometry related things like shapes, shapestores and
8            projections.
9    
10            * test/test_mockgeo.py: New. Tests for the new helper module
11    
12            * test/test_baserenderer.py: Some of the mock-objects are in
13            mockgeo now.
14    
15    2003-08-12  Jan-Oliver Wagner <[email protected]>
16    
17            * Thuban/UI/about.py (About.__init__): Added Bj�rn Broscheit.
18    
19    2003-08-12  Bernhard Herzog  <[email protected]>
20    
21            * po/de.po: New. German translations by Bjoern Broscheit
22    
23    2003-08-12  Bernhard Herzog  <[email protected]>
24    
25            * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
26            strings have to be one string literal.
27    
28    2003-08-11  Bernhard Herzog  <[email protected]>
29    
30            * test/support.py (FloatComparisonMixin.assertPointListEquals):
31            New. This method was used in various derived classes, but it's
32            better to have it here.
33    
34            * test/test_shapefilestore.py
35            (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
36            FloatComparisonMixin
37    
38            * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
39            It's now in FloatComparisonMixin
40    
41            * test/test_derivedshapestore.py
42            (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
43            in FloatComparisonMixin
44    
45    2003-08-11  Bernhard Herzog  <[email protected]>
46    
47            * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
48            error message
49    
50    2003-08-08  Jan-Oliver Wagner <[email protected]>
51    
52            * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
53            with version number.
54            Changed title to reflect version number of Thuban.
55    
56    2003-08-08  Jan-Oliver Wagner <[email protected]>
57    
58            * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
59            the list corresponds to the "About" web page.
60    
61    2003-08-08  Bernhard Herzog  <[email protected]>
62    
63            * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
64            Make sure translated strings are recognized as one string literal.
65    
66            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
67            Make sure translated strings are recognized as one string literal.
68    
69            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
70            translated strings are recognized as one string literal.
71    
72            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
73            sure translated strings are recognized as one string literal.
74    
75    2003-08-07  Bernhard Herzog  <[email protected]>
76    
77            * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
78            Simply delegates to the original shapestore.
79    
80            * test/test_derivedshapestore.py
81            (TestDerivedShapeStore.test_raw_format): New. Test case for
82            DerivedShapeStore.RawShapeFormat
83    
84    2003-08-07  Bernhard Herzog  <[email protected]>
85    
86            Add raw data interface to shape objects.
87    
88            * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
89            class to ShapefileShape which now holds shapefile specific
90            information.
91            (ShapefileShape.compute_bbox): Simplified to not cache any
92            information. The way this method is used that shouldn't matter
93            performance wise.
94            (ShapefileShape.RawData): New. Return the shapeid which is the raw
95            data format for shapes from shapefiles.
96            (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
97            in the shape objects returned by a shapestore. For a
98            ShapefileStore this is always RAW_SHAPEFILE.
99            (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
100            method.
101    
102            * test/test_shapefilestore.py
103            (TestShapefileStore.test_raw_format): New test to test the raw
104            format feature of shapes.
105    
106            * Thuban/Model/layer.py: Remove the unused import of Shape from
107            data. It was only there for interface compatibility but it's not
108            used inside of Thuban and the generic Shape class has gone away.
109    
110            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
111            the raw data format and only use an optimized version of its a
112            shapefile.
113    
114    2003-08-07  Bernhard Herzog  <[email protected]>
115    
116            * test/test_baserenderer.py (SimpleShape): Shape class for the
117            tests.
118            (SimpleShapeStore.Shape): Use SimpleShape instead of
119            Thuban.Model.data.Shape to make the tests independed of the coming
120            changes.
121    
122    2003-08-07  Bernhard Herzog  <[email protected]>
123    
124            * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
125            (ThubanTestProgram): New classes that extend the respective
126            classes from unittest. These new version support skipping tests
127            under certain expected conditions. In the Thuban test suite we
128            uses this for tests that require the optional gdal support.
129            (run_tests): Use ThubanTestProgram instead of the unittest.main()
130    
131            * test/runtests.py (main): Use the new ThubanTestRunner instead of
132            the normal one from unittest
133    
134            * test/test_layer.py (TestLayer.test_raster_layer): If this test
135            is not run because gdal support isn't available report this to the
136            runner.
137    
138            * test/test_baserenderer.py
139            (TestBaseRenderer.test_raster_no_projection): Do not run this test
140            if gdal support isn't available and report this to the runner.
141    
142    2003-08-06  Bernhard Herzog  <[email protected]>
143    
144            Rearrange the renderers a bit, partly in preparation for changes
145            required for the postgis merge, partly to make it more testable.
146            Also make the representation of coordinates in Shapes more
147            consistent.
148    
149            * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
150            this class is now in BaseRenderer. This class is now practically
151            only a specialization of BaseRenderer for rendering to an actual
152            wx DC.
153            (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
154            to get the shapetype specific rendering functions.
155    
156            * Thuban/UI/baserenderer.py: New file with the basic rendering
157            logic. The code in this file is completely independend of wx.
158            (BaseRenderer): Class with the basic rendering logic
159    
160            * test/test_baserenderer.py: New. Test cases for BaseRenderer
161    
162            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
163            error_on_redraw to guard agains endless loops and stack overflows
164            when there's a bug in the rendering code that raises exceptions.
165            (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
166            rendering into a separate method _do_redraw so that error handling
167            is a bit easier. When an exception occurs, set error_on_redraw to
168            true. When it's true on entry to OnIdle do nothing and return
169            immediately.
170    
171            * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
172            Shape object will always have the coordinates as a list of list of
173            coordinate pairs (tuples).
174            (Shape.compute_bbox): Adapt to new representation.
175    
176            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
177            (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
178            Shape objects.
179    
180            * test/test_shapefilestore.py
181            (ShapefileStoreTests.assertFloatTuplesEqual)
182            (ShapefileStoreTests.assertPointListEquals): Rename to
183            assertPointListEquals and change purpose to checking equality of
184            the lists returned by Shape.Points().
185            (TestShapefileStoreArc.test_shape)
186            (TestShapefileStorePolygon.test_shape)
187            (TestShapefileStorePoint.test_shape): Use the new
188            assertPointListEquals instead of assertFloatTuplesEqual
189    
190            * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
191            (TestLayer.assertPointListEquals): Rename to assertPointListEquals
192            and change purpose to checking equality of the lists returned by
193            Shape.Points().
194            (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
195            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
196            (TestLayer.test_derived_store): Use the new assertPointListEquals
197            instead of assertFloatTuplesEqual
198    
199            * test/test_derivedshapestore.py
200            (TestDerivedShapeStore.assertFloatTuplesEqual)
201            (TestDerivedShapeStore.assertPointListEquals): Rename to
202            assertPointListEquals and change purpose to checking equality of
203            the lists returned by Shape.Points().
204            (TestDerivedShapeStore.test_shape): Use the new
205            assertPointListEquals instead of assertFloatTuplesEqual
206    
207    2003-08-06  Jan-Oliver Wagner <[email protected]>
208    
209            * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
210            a bounding box. A dialog is raised in case, no bounding box
211            is found. This fixes bug #2043:
212            https://intevation.de/rt/webrt?serial_num=2043
213    
214    2003-08-05  Bernhard Herzog  <[email protected]>
215    
216            * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
217            object look like a Color instantiation. Formerly it looked like a
218            tuple.
219    
220            * test/test_color.py (TestColor.test_repr)
221            (TestColor.test_equality, TestColor.test_inequality): New. test
222            some more apects of the Color class
223            (TestTransparent.test_repr, TestTransparent.test_hex)
224            (TestTransparent.test_equality): New. Test cases for the
225            Transparent object.
226    
227    2003-08-04  Jan-Oliver Wagner <[email protected]>
228    
229            * Doc/manual/thuban-manual.xml: a number of small improvements.
230            The resulting file is the version submitted for GREAT-ER II.
231    
232    2003-08-01  Bernhard Herzog  <[email protected]>
233    
234            * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
235            Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
236            Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
237    
238            * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
239            (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
240            (ThubanEndBusyCursor): Add doc-strings
241    
242    2003-08-01  Bernhard Herzog  <[email protected]>
243    
244            First step towards PostGIS integration. More abstraction by movin
245            more code from the layer to the shapestore. More methods of the
246            layer are now simply delegated to the equivalent method of the
247            shapestore. The SHAPETYPE_* constants are now in data not in
248            layer.
249    
250            * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
251            (SHAPETYPE_POINT, Shape): Move these constants and classes from
252            layer.py to data.py
253            (ShapefileStore.__init__): More Initialization for the new methods
254            and functionality.
255            (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
256            (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
257            (ShapefileStore.Shape): New methods that were formerly implemented
258            in the layer.
259            (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
260            (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
261            (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
262            equivalents of the new shape methods. These versions are simply
263            delegated to the original shapstore.
264    
265            * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
266            (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
267            (Layer.SetShapeStore): Removed the initializatin of instance
268            variables that were needed for the stuff that's now in
269            ShapefileStore
270            (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
271            (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
272            shapestore.
273    
274            * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
275            Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
276            instead of layer.
277    
278            * test/test_shapefilestore.py: New. Tests for ShapefileStore.
279    
280            * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
281    
282            * test/test_layer.py: Import the SHAPETYPE_* constants from data
283            instead of layer.
284            (TestLayer.test_derived_store): Remove the test for the exception
285            when instantiating the DerivedShapeStore with an incompatible
286            table which is now in test_derivedshapestore.py. Add some more
287            tests of the layer methods to determine whether they work for a
288            DerivedShapeStore as well.
289    
290    2003-07-31  Jonathan Coles   <[email protected]>
291    
292            * Doc/manual/thuban-manual.xml: Fix the list of required packages
293            by just listing the name and where they can be found.
294    
295    2003-07-31  Frank Koormann   <[email protected]>
296    
297            * Doc/manual/thuban-manual.xml:
298            Changed the screenshot elements to figure.
299            Changed some variablelist elements to itemizedlist.
300            Added section on GDAL formats.
301    
302    2003-07-31  Jonathan Coles   <[email protected]>
303    
304            * Doc/manual/thuban-manual.xml: Added a few sentences about
305            the Fix Border Color option when generating classes.
306    
307    2003-07-30  Jonathan Coles   <[email protected]>
308    
309            * Thuban/Model/classgen.py: Add docstrings. Rename specific
310            Ramp instances to use lower_case_style.
311    
312            * Thuban/UI/classgen.py: Use renamed Ramp instances.
313            
314            * Thuban/UI/classifier.py: Add docstrings.
315    
316            * Thuban/UI/dock.py: Add docstrings.
317    
318            * test/test_classgen.py: Use renamed Ramp instances.
319    
320    2003-07-30  Bernhard Herzog  <[email protected]>
321    
322            * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
323            was never used in Thuban.
324    
325    2003-07-30  Bernhard Herzog  <[email protected]>
326    
327            * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
328            method directly instead of going through the transient_table
329            method. This faster because transient_table may force the copy of
330            a DBF file into the transient database and setting a table's title
331            doesnm't affect the title of the associated transient table, so
332            this fixes RT #2042
333    
334            * Thuban/UI/main.py (__version__): Don't import the already
335            removed show_exception_dialog.
336    
337    2003-07-29  Jonathan Coles   <[email protected]>
338    
339            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
340            Put back this method and remove the equivalent function since we
341            are setting the exception hook from within this class (OnInit).
342    
343    2003-07-29  Jonathan Coles   <[email protected]>
344    
345            * Doc/manual/images/5_2_custom_ramp.png,
346            Doc/manual/images/5_2_quantiles.png,
347            Doc/manual/images/5_2_uniform_dist.png,
348            Doc/manual/images/5_2_unique_values.png,
349            Doc/manual/images/8_int_error.png: New screen shots.
350    
351            * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
352            some points, and added more screen shots.
353    
354    2003-07-29  Bernhard Herzog  <[email protected]>
355    
356            * Thuban/Model/data.py: Remove the now unused import of warnings
357    
358    2003-07-29  Bernhard Herzog  <[email protected]>
359    
360            * Thuban/Model/data.py (SimpleStore): Removed. This class has been
361            deprecated since before the 0.8 release and isn't used in Thuban
362            itself anymore.
363    
364            * Thuban/Model/transientdb.py: Remove some unnecessary imports
365    
366    2003-07-29  Jonathan Coles   <[email protected]>
367    
368            * Thuban/UI/application.py (ThubanApplication.OnInit): set the
369            python exception hook here so that we are sure to catch any
370            Thuban exception that happen during initialization.
371    
372            * Thuban/UI/main.py (main): Don't set the exception hook here,
373            it will get set in ThubanApplication.OnInit.
374    
375    2003-07-29  Jonathan Coles   <[email protected]>
376                                                                                
377            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
378            Removed and called it show_exception_dialog() so that the exception
379            handler can be set before the class is created.
380                                                                                
381            * Thuban/UI/main.py (main): Install the exception handler before
382            a ThubanApplication is created.
383                                                                                    
384    2003-07-29  Bernhard Herzog  <[email protected]>
385    
386            * po/it.po: New. Italian translation by Maurizio Napolitano
387    
388            * po/ru.po: New. Russian translation by Alex Shevlakov
389    
390    2003-07-29  Frank Koormann   <[email protected]>
391    
392            * Doc/manual/thuban-manual.xml: Extended section on supported
393            projections.
394            
395    2003-07-29  Frank Koormann   <[email protected]>
396    
397            * Doc/manual/thuban-manual.xml: gaspell-checked.
398    
399    2003-07-29  Jonathan Coles   <[email protected]>
400    
401            * Doc/manual/images/3_5_legend.png: Added border to improve look
402            on white background.
403    
404    2003-07-29  Jonathan Coles   <[email protected]>
405    
406            * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
407            descriptions for the legend toolbar.
408    
409            * Doc/manual/images/4_2_raster_layer_properties.png: Removed
410            cursor from dialog box.
411    
412    2003-07-28  Jonathan Coles   <[email protected]>
413    
414            * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
415    
416            * Doc/manual/images/2_4_session_tree.png,
417            Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
418            Doc/manual/images/4_2_layer_properties.png,
419            Doc/manual/images/4_2_raster_layer_properties.png,
420            Doc/manual/images/5_3_genclass.png,
421            Doc/manual/images/5_classification.png,
422            Doc/manual/images/6_projection.png,
423            Doc/manual/images/7_1_table_view.png,
424            Doc/manual/images/7_2_5_join.png: New screenshots.
425    
426    2003-07-24  Jonathan Coles   <[email protected]>
427    
428            * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
429    
430    2003-07-24  Jonathan Coles   <[email protected]>
431    
432            * Doc/manual/thuban-manual.xml: Added EPS images and wrote
433            chapter on Layer Management.
434    
435            * Doc/manual/Makefile: New. Makefile to generate all formats for the
436            manual and images.
437    
438    2003-07-24  Bernhard Herzog  <[email protected]>
439    
440            * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
441            it annoys lintian which warns about these files not being
442            executable. The #1 isn't necessary here since if you absolutely
443            must execute them you can always say "python <filename>".
444    
445            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
446            superfluous code to set brush and pen for point shapes
447    
448            * Thuban/UI/viewport.py: Remove commented out code that wouldn't
449            belong in viewport anyway
450    
451    2003-07-24  Frank Koormann   <[email protected]>
452    
453            * Doc/manual/thuban-manual.xml: Added section on table management.
454    
455    2003-07-24  Bernhard Herzog  <[email protected]>
456    
457            * test/runtests.py (main): Recognize the long "verbose" option
458            correctly.
459    
460    2003-07-22  Jonathan Coles   <[email protected]>
461    
462            * Doc/manual/thuban-manual.xml: Continue to write first revision
463            of the manual.
464    
465            * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
466            with Begin/EndDrawing() calls to ensure we aren't doing to
467            many updates to the dc during rendering.
468            (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
469            a pen and brush argument so they need to be passed to the function.
470    
471            * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
472            Calculates the minimum and maximum scale values. Factored out
473            of set_view_transform so that it could be used to zoom all the
474            way into a single point.
475            (ViewPort.set_view_transform): Call calc_min_max_scales().
476            (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
477            if only a single point is selected.
478    
479            * Doc/manual/images/1_2_legend_close.png,
480            Doc/manual/images/1_2_legend_dock.png,
481            Doc/manual/images/1_2_mainwindow.png,
482            Doc/manual/images/1_2_mainwindow.ps,
483            Doc/manual/images/1_2_mainwindow.sk,
484            Doc/manual/images/3_2_fullextent.png,
485            Doc/manual/images/3_2_fulllayerextent.png,
486            Doc/manual/images/3_2_fullshapeextent.png,
487            Doc/manual/images/3_2_pan.png,
488            Doc/manual/images/3_2_zoomin.png,
489            Doc/manual/images/3_2_zoomout.png,
490            Doc/manual/images/3_3_identify.png,
491            Doc/manual/images/3_3_label.png,
492            Doc/manual/images/3_5_invisible.png,
493            Doc/manual/images/3_5_movedown.png,
494            Doc/manual/images/3_5_moveup.png,
495            Doc/manual/images/3_5_props.png,
496            Doc/manual/images/3_5_tobottom.png,
497            Doc/manual/images/3_5_totop.png,
498            Doc/manual/images/3_5_visible.png: New. Images for the documentation.
499    
500    2003-07-18  Bernhard Herzog  <[email protected]>
501    
502            * Thuban/UI/messages.py (MAP_REPLACED): New message.
503    
504            * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
505            after the new map has been assigned
506    
507            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
508            Delegate MAP_REPLACED to the canvas too
509            (MainWindow.prepare_new_session): Removed. Thanks to the new
510            MAP_REPLACED message it's no longer needed
511            (MainWindow.OpenSession, MainWindow.NewSession):
512            prepare_new_session has been removed.
513    
514            * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
515            MAP_REPLACED so that we can close the dialog if a new map is set.
516            (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
517            (Classifier.map_replaced): Handle MAP_REPLACED by closing the
518            dialog
519    
520            * test/test_viewport.py (SimpleViewPortTest)
521            (SimpleViewPortTest.test_default_size): Add doc-strings
522            (ViewPortTest.setUp): Bind map to self.map so we can use it in
523            tests. Subscribe to MAP_REPLACED messages too.
524            (ViewPortTest.tearDown): No need to explicitly unsubscribe
525            (ViewPortTest.test_set_map): New test for the SetMap method.
526    
527    2003-07-18  Bernhard Herzog  <[email protected]>
528    
529            * test/test_viewport.py (SimpleViewPortTest.test_default_size):
530            Move this test from ViewPortTest.setUp to this new separate test
531            case. setUp is not the place for the actual tests.
532            (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
533            more of the test from setUp to the new test test_inital_settings.
534            (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
535            (ViewPortTest.test_proj_conv): Split test_proj_conv into
536            test_win_to_proj and test_proj_to_win and make the tests easier to
537            understand
538            (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
539            (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
540            (ViewPortTest.test_unprojected_rect_around_point)
541            (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
542            Reformat to increase readability.
543    
544    2003-07-18  Bernhard Herzog  <[email protected]>
545    
546            * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
547    
548    2003-07-18  Bernhard Herzog  <[email protected]>
549    
550            * test/runtests.py: The test suite can now be run without an X
551            connection. To make sure this remains true, remove the DISPLAY
552            environment variable so that an error occurs if the wxGTK is
553            imported accidentally
554    
555    2003-07-18  Bernhard Herzog  <[email protected]>
556    
557            * Thuban/UI/viewport.py: Remove unused imports
558    
559            * Thuban/UI/view.py: Remove unused imports
560    
561    2003-07-18  Bernhard Herzog  <[email protected]>
562    
563            * test/test_export.py Remove unused imports. The OutputTransform
564            function is now in viewport.py and is called output_transform
565            (TestScalebar.test_output_transform)
566            (TestScalebar.test_OutputTransform): Renamed to
567            test_output_transform and updated to use output_transform instead
568            of OutputTransform
569    
570            * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
571            renamed.
572            (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
573            renamed to output_transform
574    
575            * Thuban/UI/viewport.py (OutputTransform, output_transform):
576            Rename to output_transform
577    
578    2003-07-18  Bernhard Herzog  <[email protected]>
579    
580            * Thuban/Model/layer.py (Layer.__init__): Rename
581            classificationField to classificatin_column and init it here so
582            that it can be used in SetClassificationColumn
583            (Layer.GetClassificationColumn, Layer.GetClassificationField):
584            Rename to GetClassificationColumn.
585            (Layer.SetClassificationColumn, Layer.SetClassificationField):
586            Rename to SetClassificationColumn and issue a LAYER_CHANGED
587            message if the column changes.
588            (Layer._classification_changed, Layer.ClassChanged): Rename to
589            _classification_changed. Update the callers.
590            (Layer.SetShapeStore): Further field->column renames.
591    
592            * Thuban/Model/load.py (SessionLoader.start_classification)
593            (SessionLoader.start_clpoint): Updates because of
594            field->column method name changes in the Layer class
595    
596            * Thuban/Model/save.py (SessionSaver.write_classification): Updates
597            because of field->column method name changes in the Layer class
598    
599            * Thuban/UI/classifier.py (Classifier.__init__)
600            (Classifier._OnTry, Classifier._OnRevert): Updates because of
601            field->column method name changes in the Layer class
602    
603            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
604            because of field->column method name changes in the Layer class
605    
606            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
607            of field->column method name changes in the Layer class
608    
609            * test/test_save.py (SaveSessionTest.testClassifiedLayer)
610            (SaveSessionTest.testClassifiedLayer): Update because of
611            field->column method name changes in the Layer class
612    
613            * test/test_layer.py (SetShapeStoreTests.setUp)
614            (SetShapeStoreTests.test_sanity): Update because of field->column
615            method name changes in the Layer class
616            (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
617            (TestLayerModification.test_sanity)
618            (TestLayerModification.test_initial_settings): remove unsued code
619            and rename to test_sanity.
620            (TestLayerModification.test_set_classification): New test for
621            SetClassification and SetClassificationField.
622    
623    2003-07-18  Bernhard Herzog  <[email protected]>
624    
625            * test/test_classgen.py (TestFixedRamp.test): Extend test to check
626            the non-fixed values as well. The old test would have accepted a
627            fixed ramp that only returnes the fixed properties
628    
629    2003-07-17  Jonathan Coles   <[email protected]>
630    
631            * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
632            shots for the manual. The XCF file is the source image and
633            has additional layers to support changes.
634    
635            * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
636    
637            * Thuban/UI/classifier.py (Classifier.__BuildClassification):
638            Return both the new class and the field name.
639    
640            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
641            fit the map to the window as this changes any zoom level that
642            the user may have set.
643    
644    2003-07-16  Jonathan Coles   <[email protected]>
645    
646            * Thuban/Model/classgen.py (generate_singletons,
647            generate_uniform_distribution, generate_quantiles): Remove
648            fixes parameter, but maintain the same functionality by having
649            the calling function pass a FixedRamp object for the ramp.
650            (FixedRamp): New. Adapts a ramp to have fixed property values.
651    
652            * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
653            (Classification): Inherit from Publisher.
654            (Classification.__init__): Remove the layer parameter.
655            Classifications no longer need to have a parent layer.
656            (Classification.GetField, Classification.GetFieldType,
657            Classification.SetFieldInfo): Removed. The field name is stored
658            in the layer, and the type can be retreived by calling
659            Layer.GetFieldType().
660            (Classification._set_layer, Classification.GetLayer): Removed.
661            Classifications no longer have a parent layer.
662    
663            * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
664            classification.
665            (Layer.SetShapeStore): Reset the classification first while
666            we still have the old shape store to work with.
667            (Layer.GetClassificationField, Layer.SetClassificationField):
668            New. Method for getting/setting the field to classify on.
669            (Layer.SetClassification): Simplified now that the layer
670            simply has to hold a reference to the classification and not
671            tell the classification who owns it.
672            Fixes RTbug #2023.
673    
674            * Thuban/Model/load.py (SessionLoader.start_classification):
675            Set the field name on the layer, not the classification.
676    
677            * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
678            classification is modified.
679    
680            * Thuban/Model/save.py (SessionSaver.write_classification):
681            Get the field name and type from the layer.
682    
683            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
684            parameter records to rows and add docstring. Fixes RTbug #1997.
685    
686            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
687            ramp when we need to fix certain values of a ramp rather than
688            using the old fixes parameter. Fixes RTbug #2024.
689    
690            * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
691            parameter.
692            (ClassTable.Reset): Add fieldType parameter and use it, rather
693            than asking the classification.
694            (Classifier.__init__): Remember the original class's field
695            and ask the layer for the field type, rather than the classification.
696            (Classifier.__SetGridTable): Retrieve the field and field type
697            for the table because they are not in the classification.
698            (Classifier._OnTry, Classifier._OnRevert): Set the classification
699            field on the layer in addition to the classification itself.
700    
701            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
702            classification field from layer.
703    
704            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
705            classification field from layer. Split up tests and remove
706            *-imports. Fixes RTbug #1992.
707    
708            * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
709    
710            * test/test_classification.py
711            (TestClassification.test_classification): Remove tests for methods
712            that no longer exist.
713    
714            * test/test_layer.py (SetShapeStoreTests.setUp): Classification
715            __init__ no longer has a field parameter, use SetClassificationField.
716            (SetShapeStoreTests.test_sanity): Use layer object to get class
717            field info.
718    
719            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
720            SetClassificationField on layer to set class field info.
721    
722            * test/test_viewport.py: Renamed from test/test_view.py.
723    
724    2003-07-16  Jan-Oliver Wagner <[email protected]>
725    
726            * Doc/manual/thuban-manual.xml: Added authors and an initial
727            coarse structure.
728    
729    2003-07-15  Bernhard Herzog  <[email protected]>
730    
731            * test/support.py (FloatComparisonMixin): This is a mix-in class
732            and therefore should not be derived from any other class.
733    
734            * test/test_range.py (RangeTest): FloatComparisonMixin is a
735            mix-in, so derive from TestCase as well.
736    
737    2003-07-15  Bernhard Herzog  <[email protected]>
738    
739            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
740            draw_func handling a bit to remove one layer of indirection. This
741            makes the renderer about 10% faster in the non-classifying case
742            and the code a bit cleaner
743            (MapRenderer.draw_point_shape): Add the pen and brush parameters
744            and set them in the dc. Now the draw_point_shape method and
745            wxproj's draw_polygon_shape function have basically the same
746            signature so that both can be directly used as draw_func
747    
748    2003-07-15  Bernhard Herzog  <[email protected]>
749    
750            * Thuban/Model/save.py (SessionSaver.write_classification): Encode
751            string values (in addition to the labels) as UTF 8
752    
753            * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
754            values if the field type is string
755    
756            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
757            saving a session with non-ascii string classification values.
758    
759            * test/test_load.py (TestClassification.file_contents)
760            (TestClassification.test): Check for non-ascii values in string
761            classifications
762    
763    2003-07-14  Jonathan Coles   <[email protected]>
764    
765            * test/test_view.py: New. Tests for ViewPort.
766    
767    2003-07-14  Frank Koormann   <[email protected]>
768    
769            * Thuban/Model/load.py (SessionLoader.start_map): Encode map
770            title to latin1.  Fixes https://intevation.de/rt/webrt?serial_num=2013
771    
772            * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
773            unicode strings from session file: session title, map title and
774            projection name.
775            
776    2003-07-10  Jonathan Coles   <[email protected]>
777    
778            * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
779            drag_stop, not drag_move when the mouse is released.
780    
781    2003-07-10  Jonathan Coles   <[email protected]>
782    
783            The most important part of this is the seperation of view.py into
784            two pieces. viewport.py now has a class called ViewPort which
785            contains all the non-wx parts of view.py and can therefore be
786            tested. view.py contains only the wx-specific parts and is fairly
787            simple.
788    
789            * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
790            RTTbug #1992.
791            * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
792            RTTbug #1992.
793    
794            * Thuban/Model/classgen.py (generate_singletons,
795            generate_uniform_distribution, generate_quantiles):
796            Added 'fixes' parameter so that property attributes can
797            be held constant over the generated classification groups.
798            (CustomRamp.GetProperties): Remove unused variables.
799    
800            * Thuban/Model/map.py (Map.SetProjection): Send the old
801            projection as an argument to listeners of the MAP_PROJECTION_CHANGED
802            event.
803    
804            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
805            parameter which is a list of records that restricts which
806            records are saved. Fixes RTbug #1997.
807    
808            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
809            Port exception dialog from GREAT-ER. Fixes RTbug #1993.
810    
811            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
812            to allow the user to fix line color/width on generated groups.
813            (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
814            functions to optionally fix group properties.
815    
816            * Thuban/UI/main.py (main): Set exception hook to the
817            ShowExceptionDialog. Fixes RTbug #1993.
818    
819            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
820            the table window when it is selectd to be shown.
821    
822            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
823            Export Selection button and move the export buttons underneath
824            the table.
825            (QueryTableFrame.UpdateStatusText): Added event argument so
826            that it can respond to grid selection events. The status text
827            is now updated even when the table is not associated with a
828            layer as was previously assumed.
829            (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
830            UpdateStatusText responds to these events.
831            (QueryTableFrame.OnSaveAs): Renamed to doExport.
832            (QueryTableFrame.doExport): Helper function that saves the
833            entire table, or selected rows, to a file.
834            (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
835            Respond to export button events and call doExport.
836    
837            * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
838            the function doesn't return NULL without first setting a Python
839            Error.
840    
841            * test/runtests.py (main): Only print "Unknown option" for
842            unsupported options.
843    
844            * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
845            optional epsilon argument to specify floating point accuracy.
846            (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
847            for each item test.
848    
849            * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
850            tests for saving selected records.
851    
852            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
853            tests for saving selected records.
854    
855            * test/test_map.py (TestMapWithContents.test_set_projection):
856            MAP_PROJECTION_CHANGED events send the old projection.
857    
858            * test/test_session.py
859            (TestSessionWithContent.test_forward_map_projection):
860            MAP_PROJECTION_CHANGED events send the old projection.
861    
862            * test/test_table.py (TableTest): Update tests to use non-deprecated
863            functions.
864    
865    2003-07-08  Bernhard Herzog  <[email protected]>
866    
867            * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
868            constants in the column objects are the standard ones defined in
869            the table module.
870    
871            * test/test_transientdb.py
872            (TestTransientTable.test_transienttable_to_dbf): New. Test whether
873            exporting transient tables as DBF works. This should catch the bug
874            just fixed in TransientTableBase.Width.
875    
876    2003-07-08  Bernhard Herzog  <[email protected]>
877    
878            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
879            interpolated colors correctly.
880    
881            * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
882            New. Test case for the fix in classgen.py
883    
884    2003-07-08  Bernhard Herzog  <[email protected]>
885    
886            * test/runtests.py (main): Make the default output less verbose
887            and add a verbosity option (-v) to get the old output
888    
889    2003-07-08  Bernhard Herzog  <[email protected]>
890    
891            * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
892            0.9.
893    
894            * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
895            New. Return the join type
896    
897            * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
898            DTD
899            (SessionSaver.write_data_containers): Save the join type for
900            joined tables
901    
902            * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
903            namespace
904            (SessionLoader.start_jointable): Handle the jointype attribute
905    
906            * test/test_load_0_8.py: New. Effectively a copy of test_load.py
907            as of Thuban 0.8. These are now tests to determine whether Thuban
908            can still read files generated by Thuban 0.8
909    
910            * test/test_load.py (LoadSessionTest.dtd)
911            (TestSingleLayer.file_contents)
912            (TestLayerVisibility.file_contents, TestLabels.file_contents)
913            (TestLayerProjection.file_contents)
914            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
915            (TestJoinedTable.file_contents)
916            (TestLoadError.file_contents): Update for new DTD
917            (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
918            for new join type attribute
919    
920            * test/test_save.py (SaveSessionTest.dtd)
921            (SaveSessionTest.testEmptySession)
922            (SaveSessionTest.testSingleLayer)
923            (SaveSessionTest.testLayerProjection)
924            (SaveSessionTest.testRasterLayer)
925            (SaveSessionTest.testClassifiedLayer)
926            (SaveSessionTest.test_dbf_table)
927            (SaveSessionTest.test_joined_table): Update for new DTD
928            (SaveSessionTest.test_joined_table): Add test for new join type
929            attribute
930    
931    2003-07-04  Bernhard Herzog  <[email protected]>
932    
933            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
934            function for table_to_dbf
935            (table_to_dbf): Deal with names longer than the 10 character limit
936    
937            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
938            doc-string
939            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
940            long column names
941    
942    2003-07-03  Bernhard Herzog  <[email protected]>
943    
944            * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
945    
946    2003-07-03  Bernhard Herzog  <[email protected]>
947    
948            * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
949            for the Thuban manual and README with some basic information about
950            the manual
951    
952    2003-07-03  Bernhard Herzog  <[email protected]>
953    
954            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
955            Update doc-string
956            (TransientJoinedTable.create): Do not modify the column objects of
957            the input tables in place and copy all columns of the input tables
958            into the joined table after all.
959    
960            * test/test_transientdb.py
961            (TestTransientTable.test_transient_joined_table_same_column_name):
962            Update to reflect the new behavior
963            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
964            Update to reflect the new behavior
965            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
966            New test case for a bug which modified the column objects in place
967    
968    2003-07-02  Jonathan Coles   <[email protected]>
969    
970            * Thuban/Model/classgen.py (generate_singletons,
971            generate_uniform_distribution, generate_quantiles,
972            GenQuantiles0): Make sure maxValue isn't less than
973            one, otherwise we could divide by zero.
974    
975            * test/test_classgen.py (ClassGenTest.doClassRangeTest,
976            ClassGenTest.doClassSingleTest): Call doBoundsTest to
977            check the end classification groups against the
978            proper property values.
979            (ClassGenTest.doBoundsTest): New. Checks the first and
980            last classification groups to make sure their properties
981            are the correct upper and lower bounds for a color ramp.
982    
983    2003-07-02  Jonathan Coles   <[email protected]>
984    
985            * Thuban/Model/classgen.py (generate_singletons,
986            generate_uniform_distribution, generate_quantiles,
987            GenQuantiles0): The denominator was one to high when
988            calculating the index for the ramp causing the index
989            to never to reach one.
990    
991    2003-07-02  Jonathan Coles   <[email protected]>
992    
993            Changed the singature of ClassGroupRange.__init__ and
994            ClassGroupRange.SetRange() so that the min/max values are
995            passed as a tuple. This makes a better calling scheme for
996            when a Range object is passed instead.
997    
998            * Thuban/Model/classgen.py: Fixed parameters to
999            ClassGroupRange constructor.
1000    
1001            * Thuban/Model/classification.py (ClassGroupRange.__init__):
1002            Consolidate the min/max parameters into a single _range which
1003            can either be a tuple or a Range object.
1004            (ClassGroupRange.SetRange): Consolidate the min/max parameters
1005            into a single _range which can either be a tuple or a Range object.
1006    
1007            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
1008            call to ClassGroupRange constructor to use a tuple.
1009    
1010            * Thuban/Model/layer.py (Layer.SetClassification): Switch
1011            the classification instance variable to the new class
1012            before calling _set_layer otherwise subscribers to a
1013            LAYER_CHANGED event will not see any difference.
1014    
1015            * test/test_classification.py: Fix tests of ClassGroupRange
1016            so that they use the new signature.
1017    
1018            * test/test_load.py: Fix use of ClassGroupRange so that it
1019            uses the new signature.
1020    
1021            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
1022            uses the new signature.
1023    
1024            * test/test_save.py: Fix use of ClassGroupRange so that it
1025            uses the new signature.
1026    
1027    
1028    2003-07-01  Jonathan Coles   <[email protected]>
1029    
1030            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
1031            Import used objects/class from color.
1032            (generate_singletons): We don't
1033            need the numGroups parameter anymore because we are using
1034            the new ramps with GetProperties().
1035            (generate_uniform_distribution): Use new ramp method
1036            GetProperties().
1037            (generate_quantiles, GenQuantiles0): Use new ramp method
1038            GetProperties().
1039            (CustomRamp.SetNumGroups): Removed. The ramps now map
1040            a value from 0 to 1 to class properties so the number
1041            of groups is not needed ahead of time.
1042            (CustomRamp.next): Removed. CustomRamp does not support
1043            interation anymore.
1044            (CustomRamp.GetProperties): Returns a ClassGroupProperties
1045            object based on the index value from 0 to 1 that is
1046            passed to it.
1047            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
1048            Made into instances of Monochromatic class instread of
1049            deriving from it.
1050            (HotToCold.SetNumGroups): Removed. See CustomRamp.
1051            (HotToCold.next): Removed. See CustomRamp.
1052    
1053            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
1054            (Classification.SetField, Classification.SetFieldType):
1055            Replaced with SetFieldInfo.
1056            (Classification.SetFieldInfo): New. Does a better job of
1057            what SetField and SetFieldType used to do by combining
1058            their function since they should really always be done
1059            at the same time.
1060            (Classification.SetLayer): Renamed to _set_layer.
1061            (Classification._set_layer): Should only be called from
1062            Layer's SetClassification. This does not cause a recursive
1063            call as SetLayer did because we know that Layer knows about
1064            the classification.
1065    
1066            * Thuban/Model/color.py: Fixes RTbug #1971.
1067            (_Transparent): Renamed from Transparent so it doesn't
1068            conflict with the module variable.
1069            (Transparent, Black): Renamed from Color.Transparent,
1070            Color.Black so they are not class variables.
1071    
1072            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
1073            (Layer.Destroy): We don't need to call SetClassification
1074            anymore to clear out the back reference in the classifcation
1075            to the layer. It's better to set it to None using _set_layer,
1076            and we won't be creating another clas object too.
1077            (Layer.SetClassification): Classification._set_layer is not
1078            recursive so remove all the locking variables. Also clean
1079            up the code so that it remains unchanged if something fails.
1080    
1081            * Thuban/Model/load.py: Fixes RTbug #1971.
1082            (SessionLoader.start_classification): Call
1083            Classification.SetFieldInfo().
1084    
1085            * Thuban/Model/save.py: Removed import of Color which wasn't
1086            being used.
1087    
1088            * Thuban/UI/classgen.py: Fixes RTbug #1972.
1089            (ClassGenDialog.__init__): Color ramps are now instances
1090            already so we don't need to create any new objects.
1091            (ClassGenDialog.OnOK): Check for numGroups is no longer
1092            necessary because we never use it.
1093    
1094            * Thuban/UI/classifier.py: Fixes RTbug #1971.
1095            (Classifier.__BuildClassification, Classifier.__SetGridTable):
1096            Call Classification.SetFieldInfo() instead of SetFieldType.
1097    
1098            * Thuban/UI/renderer.py: Fixes RTbug #1971.
1099    
1100            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
1101            (MapCanvas.__init__): Subscribe to the idle time event. Set
1102            background color to white.
1103            (MapCanvas.OnPaint): Set a flag indicating that we should
1104            render the map during idle time. If we already have a bitmap
1105            just draw it now.
1106            (MapCanvas.OnIdle): New. Render the map only during idle time.
1107            This also fixes a problem with the busy cursor under gtk.
1108    
1109            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
1110            Fix calls to generate_singletons because the signature changed.
1111    
1112            * test/test_classification.py: Fix color references and
1113            change calls to Classification.[SetField|SetFieldType] to
1114            SetFieldInfo.
1115    
1116            * test/test_load.py: Fix color references.
1117    
1118            * test/test_load_0_2.py: Fix color references.
1119    
1120            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
1121            Change calls to Classification.[SetField|SetFieldType] to
1122            SetFieldInfo.
1123    
1124    2003-07-01  Frank Koormann   <[email protected]>
1125    
1126            MERGE from the greater-ms3 branch.
1127    
1128            * test/test_transientdb.py
1129            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
1130            New. Test join of two tables with partly equal column names.
1131    
1132            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
1133            If duplicates in left and right tables column names are found,
1134            append '_' (underscores) to the name until it is unique.
1135            Create always new internal names for the resulting table and reference
1136            columns in the join statement with <table>.<column>
1137    
1138    2003-07-01  Bernhard Herzog  <[email protected]>
1139    
1140            * test/test_transientdb.py
1141            (TestTransientTable.test_transient_joined_table_same_column_name):
1142            New. Test whether joining on columns with the same names in both
1143            tables works.
1144            
1145            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
1146            sure to use the right internal names even when joining on field
1147            with the same names in both tables. Also, detect duplicate names
1148            in the joined table correctly.
1149    
1150    2003-07-01  Frank Koormann   <[email protected]>
1151    
1152            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
1153            Reverse List of layers to render in same order as in desktop legend.
1154    
1155    2003-06-30  Jonathan Coles   <[email protected]>
1156    
1157            * Thuban/version.py (make_tuple): Takes a version string
1158            and splits it into a tuple of at most three integers.
1159            Used make_tuple() to make tuple versions of the version
1160            numbers.
1161    
1162            * Thuban/UI/about.py: Add Thuban email addresses.
1163    
1164    2003-06-30  Jonathan Coles   <[email protected]>
1165    
1166            * Thuban/version.py: SQLite/PySQLite version dependencies
1167            were too high.
1168    
1169    2003-06-30  Jonathan Coles   <[email protected]>
1170    
1171            * Thuban/version.py: Update version to 0.8.1
1172            
1173            * MANIFEST.in: Added Projections so that default.proj is
1174            included.
1175    
1176    2003-06-26  Jonathan Coles   <[email protected]>
1177    
1178            New About box with lots more information including library
1179            versions and credits. More/better version checking before
1180            Thuban starts.
1181    
1182            * Thuban/UI/about.py: New. New About box that displays
1183            library version information and credits.
1184    
1185            * Thuban/version.py: Added new 'versions' dictionary which
1186            contains the verions of various libraries which are checked
1187            when the module loads.
1188            (verify_versions): Check all version numbers and returns
1189            a list of errors.
1190    
1191            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
1192            Reset the status of the buttons as the situation warrants,
1193            but in a better more reliable way by not relying on the
1194            current status to determine what needs to change.
1195    
1196            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
1197            (verify_versions): Remove most of the code since it is
1198            now in Thuban.version.verify_versions.o
1199    
1200            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
1201            About box in Thuban.UI.about.
1202    
1203            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
1204            Returns the version of gdal library being used as a string.
1205    
1206            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
1207            Removed.
1208            (get_proj_version): Return the version of PROJ that the file
1209            was compiled with.
1210            (get_gtk_version): Return th version of GTK that the file
1211            was compiled with.
1212    
1213    2003-06-25  Jonathan Coles   <[email protected]>
1214    
1215            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
1216            of the SelectPropertiesDialog should be self so the window
1217            appears on top.
1218            (ClassGroupPropertiesCtrl.DoEdit): The parent
1219            of the SelectPropertiesDialog should be self so the window
1220            appears on top.
1221    
1222            * Thuban/UI/resource.py: Cleaned up how we determine file
1223            extensions.
1224            (GetImageResource): Return an wxImage from our Resources.
1225    
1226    2003-06-24  Jonathan Coles   <[email protected]>
1227    
1228            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
1229            Check that a layer has a classification before trying
1230            to get it. Raster layers don't have classifications.
1231    
1232    2003-06-23  Jonathan Coles   <[email protected]>
1233            
1234            * setup.py: Add Resources/XML to resource list.
1235        
1236    2003-06-23  Jonathan Coles   <[email protected]>
1237    
1238            * setup.cfg: Fix copyright dates
1239        
1240    2003-06-23  Jonathan Coles   <[email protected]>
1241    
1242            * MANIFEST.in: Update with Resources/XML
1243    
1244            * setup.py: Don't include Locale resources yet as we don't
1245            have any and it causes problems building the distribution
1246            for Windows. Update version to 0.8.0.
1247    
1248            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
1249    
1250            * Thuban/UI/mainwindow.py: Add blank line at the end because
1251            file was not being read correctly building the Windows
1252            distribution.
1253    
1254    2003-06-23  Jonathan Coles   <[email protected]>
1255    
1256            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
1257    
1258            * Thuban/version.py: Temporarily update longversion for
1259            the 0.8 release so that it doesn't have the cvs revision.
1260    
1261    2003-06-23  Jonathan Coles   <[email protected]>
1262    
1263            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
1264            to make sure that we don't create reentrant possibilities with
1265            wxYield.
1266    
1267            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
1268            directly to avoid the wxSafeYield() call which generates an
1269            OnPaint event causing infinite recursion. Don't try to catch
1270            exception anymore. This was for before there were limits on map
1271            scaling.
1272    
1273    2003-06-23  Bernhard Herzog  <[email protected]>
1274    
1275            Bug fix for RT #1961:
1276    
1277            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
1278            Register DerivedShapestores with the session
1279    
1280            * Thuban/Model/session.py (Session.Tables): Make sure each table
1281            is only listed once.
1282    
1283            * test/test_load.py (TestJoinedTable.test): Add check_format call.
1284            Update file contents to match the one written out.
1285    
1286    2003-06-20  Bernhard Herzog  <[email protected]>
1287    
1288            * test/xmlsupport.py (SaxEventLister.startElementNS)
1289            (SaxEventLister.endElementNS): Do not include the qname. Python
1290            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
1291            is (presumably incorrectly) None, whereas it's a string with the
1292            element name in the later versions.
1293    
1294            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
1295            (TestEventList.test_even_list_namespace): Update tests to reflect
1296            the new behaviour
1297            (TestEventList.test_even_list_id_normalization): Fix doc-string
1298    
1299    2003-06-20  Jonathan Coles   <[email protected]>
1300    
1301            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
1302            by deriving classes to determine if that layer supports shapes.
1303            (Layer): Override HasShapes and return true.
1304    
1305            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
1306            instead of a direct call to wx[Begin|End]CusyCursor().
1307            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
1308            table data.
1309    
1310            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
1311            New. Wrappers around the wxWindows functions that allow us to
1312            make additional calls such as wxYield which gives the native
1313            system a chance to update the cursor correctly.
1314    
1315            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
1316            instead of a direct call to wx[Begin|End]CusyCursor().
1317    
1318            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
1319            instead of a direct call to wx[Begin|End]CusyCursor().
1320            (MapCanvas.find_shape_at): Check if the current search layer
1321            support shapes, otherwise go on to the next layer.
1322    
1323            * test/test_layer.py: Add tests in each type of layer for
1324            HasClassification() and HasShapes()
1325    
1326    2003-06-20  Jonathan Coles   <[email protected]>
1327    
1328            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
1329            turning on the busy cursor to allow the system to change the
1330            cursor before we begin painting. This fixes a problem that
1331            was occuring only under GTK. Fixes RTbug #1840.
1332    
1333    2003-06-20  Bernhard Herzog  <[email protected]>
1334    
1335            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
1336            version.
1337    
1338            * Thuban/Model/save.py (sort_data_stores): New. Make topological
1339            sort of the data sources so they can be written with sources that
1340            data sources that depend on other data sources come after the
1341            sources they depend on.
1342            (SessionSaver.__init__): Add idmap instance variable to map from
1343            objects to the ids used in the file.
1344            (SessionSaver.get_id, SessionSaver.define_id)
1345            (SessionSaver.has_id): New. Methods to manage the idmap
1346            (SessionSaver.write): Use thuban-0.8.dtd
1347            (SessionSaver.write_session): Add a namespace on the session and
1348            write out the data sources before the maps.
1349            (SessionSaver.write_data_containers): New. Write the data
1350            containers.
1351            (SessionSaver.write_layer): Layer elements now refer to a
1352            shapestore and don't contain filenames anymore.
1353    
1354            * Thuban/Model/load.py (LoadError): Exception class to raise when
1355            errors in the files are discovered
1356            (SessionLoader.__init__): Define dispatchers for elements with a
1357            thuban-0.8 namespace too.
1358            (SessionLoader.check_attrs): New helper method to check and
1359            convert attributes
1360            (AttrDesc): New. Helper class for SessionLoader.check_attrs
1361            (SessionLoader.start_fileshapesource)
1362            (SessionLoader.start_derivedshapesource)
1363            (SessionLoader.start_filetable, SessionLoader.start_jointable):
1364            Handlers for the new elements in the new fileformat
1365            (SessionLoader.start_layer): Handle the shapestore attribute in
1366            addition to filename.
1367            (SessionLoader.start_table, SessionLoader.end_table): Removed.
1368            They were never used in the old formats and aren't needed for the
1369            new.
1370    
1371            * Thuban/Model/session.py (Session.DataContainers): New method to
1372            return all "data containers", i.e. shapestores and tables
1373    
1374            * test/xmlsupport.py (SaxEventLister.__init__)
1375            (SaxEventLister.startElementNS, sax_eventlist): Add support to
1376            normalize IDs.
1377    
1378            * test/test_xmlsupport.py
1379            (TestEventList.test_even_list_id_normalization): New test case for
1380            id normalization
1381    
1382            * test/test_load.py (LoadSessionTest.check_format): Use ID
1383            normalization
1384            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
1385            class atrributes used for ID normalization
1386            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
1387            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
1388            file format
1389            (TestJoinedTable): New test for loading sessions with joined
1390            tables.
1391            (TestLoadError): New. Test whether missing required attributes
1392            cause a LoadError.
1393    
1394            * test/test_save.py (SaveSessionTest.thubanids)
1395            (SaveSessionTest.thubanidrefs): New class attributes for ID
1396            normalization in .thuban files.
1397            (SaveSessionTest.compare_xml): Use id-normalization.
1398            (SaveSessionTest.testEmptySession)
1399            (SaveSessionTest.testLayerProjection)
1400            (SaveSessionTest.testRasterLayer)
1401            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
1402            (SaveSessionTest.testLayerProjection): The filename used was the
1403            same as for testSingleLayer. Use a different one.
1404            (SaveSessionTest.test_dbf_table)
1405            (SaveSessionTest.test_joined_table): New test cases for saving the
1406            new data sources structures.
1407            (TestStoreSort, MockDataStore): Classes to test the sorting of the
1408            data stores for writing.
1409    
1410            * test/runtests.py: Add CVS keywords
1411    
1412    2003-06-20  Jonathan Coles   <[email protected]>
1413    
1414            * test/test_session.py
1415            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
1416            Use the cultural_landmark-point.dbf file for the store so that
1417            the table rows and shape count match.
1418    
1419    2003-06-20  Jonathan Coles   <[email protected]>
1420    
1421            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
1422            an exception if the number of shapes is different from the
1423            number of rows in the table. Address RTbug #1933.
1424    
1425            * test/test_layer.py (TestLayer.test_derived_store): Add
1426            a test for the new exception in DerivedShapeStore.__init__.
1427    
1428            * test/support.py (FloatTestCase): Removed since there is
1429            already FloatComparisonMixin. Fixes RTbug #1954.
1430            (FloatComparisonMixin.assertFloatEqual): Include test for
1431            infinity that was part of FloatTestCase.
1432    
1433            * test/test_range.py (RangeTest): Inherit from
1434            support.FloatComparisonMixin now that we don't have
1435            support.FloatTestCase.
1436    
1437    2003-06-20  Bernhard Herzog  <[email protected]>
1438    
1439            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
1440            the implementation in xmlsupport instead.
1441            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
1442    
1443            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
1444            of test_save
1445    
1446    2003-06-20  Bernhard Herzog  <[email protected]>
1447    
1448            * test/test_load.py (LoadSessionTest.check_format): New helper
1449            method to make sure the test files we load might have been written
1450            by the current thuban version.
1451            (ClassificationTest.TestLayers, TestSingleLayer.test)
1452            (TestLayerVisibility.test, TestClassification.test)
1453            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
1454            Add check_format() calls and fix the thuban data to match the data
1455            that would be written by saving the session loaded from it.
1456    
1457            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
1458            the same class and function in test_save.
1459    
1460            * test/test_xmlsupport.py (TestEventList): New. test cases for
1461            sax_eventlist
1462    
1463    2003-06-20  Bernhard Herzog  <[email protected]>
1464    
1465            * Resources/XML/thuban.dtd: Add comment about which versions of
1466            Thuban are covered by this DTD
1467            (map): Fix content model for layers and raster layers. There can
1468            be any number or layers and raster layers in any order.
1469    
1470    2003-06-20  Jonathan Coles   <[email protected]>
1471    
1472            This is mainly about fixing RTbug #1949.
1473    
1474            * Thuban/Model/classification.py: Remove "from __future__"
1475            import statement since python 2.2 is the earliest supported
1476            version.
1477    
1478            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
1479            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
1480            depending on the units this projection *forwards* into.
1481    
1482            * Thuban/Model/save.py (SessionSaver.write_classification):
1483            Remove unnecessary use of lambdas and nested functions.
1484    
1485            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
1486            adjustment here if the map projection uses degrees.
1487    
1488            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
1489            scale adjust code since it is now done before calling
1490            this method. Don't do anything if the map projection
1491            is None.
1492    
1493    2003-06-19  Bernhard Herzog  <[email protected]>
1494    
1495            Move version specific load tests to their own file.
1496    
1497            * test/test_load.py: Expand the doc-string to explain a bit how to
1498            handle file format changes.
1499            (TestClassification.test): Update the docstring as this test is
1500            not about Thuban 0.2 anymore.
1501    
1502            * test/test_load_0_2.py: New file with the load tests for thuban
1503            files created with Thuban 0.2 and earlier.
1504    
1505    2003-06-19  Bernhard Herzog  <[email protected]>
1506    
1507            Add XML validation to some of the tests. Validation will only be
1508            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
1509            To make the DTD available to the test cases it's moved into
1510            Resources/XML
1511    
1512            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
1513            for versions up to and including 0.2. Two slight changes: added an
1514            encoding specification and fixed the comment which refered to
1515            GRASS, not Thuban
1516    
1517            * test/xmlsupport.py: New support module for tests involving XML.
1518            Currently there's a mix-in class for XML validation.
1519    
1520            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
1521    
1522            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
1523            so that we can validate the
1524            (SaveSessionTest.testEmptySession)
1525            (SaveSessionTest.testSingleLayer)
1526            (SaveSessionTest.testSingleLayer)
1527            (SaveSessionTest.testLayerProjection)
1528            (SaveSessionTest.testRasterLayer)
1529            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
1530    
1531            * test/runtests.py (main): Call print_additional_summary instead
1532            of print_garbage_information
1533    
1534            * test/support.py (resource_dir): New function to return the
1535            "Resource" subdirectory
1536            (print_additional_summary): New function to combine several
1537            summary functions
1538            (run_tests): Use print_additional_summary instead of calling
1539            print_garbage_information directly
1540    
1541    2003-06-19  Bernhard Herzog  <[email protected]>
1542    
1543            * Doc/thuban.dtd (classification): Correct the content model of
1544            the classification element.
1545            (projection): Add the "name" attribute
1546    
1547    2003-06-19  Frank Koormann   <[email protected]>
1548    
1549            MERGE from the greater-ms3 branch.
1550    
1551            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
1552            scale if projection is latlong to get better estimate.
1553    
1554            Fix problem of hidden properties dialog under windows after double
1555            click on layer tree:
1556            The tree control always gets an Expanded / Collapsed event after
1557            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
1558            raises the already displayed window.
1559    
1560            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
1561            raiseProperties initialized to prevent endless loops
1562            (LegendTree._OnItemActivated): Depending on self.raiseProperties
1563            simply raise the properties or open the dialog and issue a second
1564            event.
1565    
1566    2003-06-18  Jonathan Coles   <[email protected]>
1567    
1568            * setup.py: Fix a few problems that occured under Windows.
1569    
1570    2003-06-18  Jonathan Coles   <[email protected]>
1571    
1572            When Thuban loaded the map was redrawn twice because the
1573            legend was being opened after the mainwindow was created
1574            and not during its creation. This meant the map was drawn
1575            initially and then had to be redrawn when the legend
1576            caused the display to change. Now the legend is opened
1577            in the mainwindow constructor which resolves this issue.
1578    
1579            Also, although we were checking for the existence of
1580            gdal and gdalwarp modules, the gdalwarp extension was
1581            still being compiled (which may fail if the system doesn't
1582            have gdal installed). the build_ext command to setup.py
1583            now accepts the flags --with-gdal and --without-gdal.
1584            If --without-gdal is specified setup.py will try to
1585            use the gdal parameters specified by gdal-config. Under
1586            windows, those parameters have to be set in setup.py
1587            as with proj4 an wxWindows.
1588    
1589            * setup.py: Use a list instead of seperate variables for
1590            extension parameters so we can create a generic function
1591            that runs an appropriate *-config script.
1592            (run_cs_script): Renamed from run_wx_script and modified
1593            to accept a second argument which is a list of lists to
1594            be filled in by the values returned from running the command.
1595            (thuban_build_ext): New. Extends the build_ext command and
1596            provides the options --with-gdal/--without-gdal which then
1597            optionally includes the gdalwarp extension.
1598    
1599            * Thuban/Model/resource.py: First check if we can import
1600            the gdalwarp Thuban extension before checking for gdal.
1601            Also added some comments.
1602            
1603            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
1604            the map is None which may be the case if none has been loaded
1605            yet.
1606    
1607            * Thuban/UI/main.py (main): Remove call to ShowLegend.
1608    
1609            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
1610    
1611            * Thuban/UI/renderer.py: Check for gdal support before importing
1612            gdalwarp.
1613            (MapRenderer.render_map): Only try to optimize if we have gdal
1614            support otherwise nothing will get drawn.
1615    
1616            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
1617            during startup before a map has been created. Check if map is None
1618            before using it and do nothing if it is.
1619    
1620    2003-06-17  Jonathan Coles   <[email protected]>
1621    
1622            Fix the problem with raster layers under Windows that caused
1623            Thuban to crash. The view should respond to layer projection
1624            changed events to update the display. Changes to a projection
1625            should not cause the map to be set to full extent.
1626            
1627            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
1628            current_map_proj to remember the current map projection so that
1629            when the projection changes we know what the previous projection
1630            was.
1631            (MapCanvas.SetMap): Unsubscribe and subscribe to
1632            LAYER_PROJECTION_CHANGED events.
1633            (MapCanvas.projection_changed): Split into two methods that respond
1634            to map and layer projection changes.
1635            (MapCanvas.map_projection_changed): New. Takes the current view and
1636            projects it using the new projection. This does not cause the
1637            map to be redrawn at full extent.
1638            (MapCanvas.layer_projection_changed): New. Cause a redraw which
1639            will draw each layer in its new projection.
1640            
1641            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
1642            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
1643            under Windows.
1644            
1645            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
1646            to twice sizeof(void*) because there are two digits for each
1647            hex byte.
1648    
1649    2003-06-16  Bernhard Herzog  <[email protected]>
1650    
1651            Update to the layer interface: Direct access to the table,
1652            shapetable, shapefile and filename attributes is now actively
1653            deprecated by issuing deprecation warnings for all places where
1654            this happens.
1655    
1656            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
1657            to the instance variables table, shapetable, shapefile and
1658            filename via __getattr__ so that we can issue a deprecation
1659            warning.
1660            (Layer.SetShapeStore): Don't set the deprecated instance variables
1661            any more
1662            (Layer.SetShapeStore): Don't use deprecated layer instance
1663            variables
1664            (Layer.Destroy): No need to explicitly remove the instance
1665            variables any more
1666            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
1667            instance variables
1668    
1669            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
1670            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
1671            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
1672            use deprecated layer instance variables
1673    
1674            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
1675            deprecated layer instance variables
1676    
1677            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
1678            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
1679            instance variables
1680    
1681            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
1682            deprecated layer instance variables
1683    
1684            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
1685            deprecated layer instance variables
1686    
1687            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
1688            deprecated layer instance variables
1689    
1690            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
1691            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
1692            variables
1693    
1694            * test/runtests.py (main): Turn Thuban's deprecation warnings into
1695            errors so that they're cought by the tests
1696    
1697            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
1698            layer instance variables
1699    
1700    2003-06-16  Jonathan Coles   <[email protected]>
1701    
1702            Fix a problem under Windows whereby if the user double-clicks on a
1703            layer in the legend that tree item will expand or collapse as well
1704            as open the layer properties dialog. The state of the tree item
1705            should not be affected.
1706    
1707            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
1708            preventExpandCollapse and subscribe to expanding and collapsing
1709            events.
1710            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
1711            collapsing events and will veto the event if it has been triggered
1712            by the user double clicking on a layer.
1713            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
1714            that an expanding/collapsing event should be vetoed.
1715    
1716    2003-06-13  Bernhard Herzog  <[email protected]>
1717    
1718            * Thuban/UI/classifier.py (Classifier.OnClose)
1719            (Classifier.map_layers_removed)
1720            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
1721            in OnClose and not in map_layers_removed or
1722            layer_shapestore_replaced to make sure it always happens when the
1723            dialog is closed
1724    
1725    2003-06-13  Jonathan Coles   <[email protected]>
1726    
1727            This puts back a fix for Windows where a panel is needed so that
1728            the background of the table view appears correctly.
1729    
1730            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
1731            object that can be used by derived classes to place any
1732            controls (including the grid) onto.
1733            (QueryTableFrame.__init__): Use the panel as the parent window
1734            for all the controls. Reparent the grid so that the panel is
1735            the parent. Call UpdateStatusText() to correctly initialize
1736            the status bar.
1737    
1738    2003-06-13  Jonathan Coles   <[email protected]>
1739    
1740            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
1741            from wxFrame (as opposed to wxDialog like the other classes)
1742            but otherwise behaves like the other classes. This is needed
1743            for the TableView which isn't really a dialog and needs to
1744            have a status bar and control buttons.
1745    
1746            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
1747            instance variable to keep track of how many rows are selected.
1748            Subscribe once to the the events we are interested in.
1749            (ThubanGrid.OnRangeSelect): Only handle event if event handling
1750            hasn't been turned off.
1751            (ThubanGrid.OnSelectCell): Only handle event if event handling
1752            hasn't been turned off.
1753            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
1754            as an event listener (which changes the event handler stack)
1755            simply set an instance variable to False. This is checked in
1756            the event handlers.
1757            (ThubanGrid.GetNumberSelected): Return the number of currently
1758            selected rows.
1759            (TableFrame): Inherit from ThubanFrame so we can have a
1760            status bar and control buttons.
1761            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
1762            Explicitly set which items are selected in the operator choice and
1763            action choice so there is always a valid selection. Fixes RTbug #1941.
1764            Subscribe to grid cell selection events so we can update the
1765            status bar.
1766            (QueryTableFrame.UpdateStatusText): Update the status bar with
1767            how many rows are in the grid, how many columns, and how many
1768            rows are selected.
1769            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
1770            Call UpdateStatusText when cells are (de)selected.
1771            (QueryTableFrame.OnQuery): Use the string value in the value
1772            combo if either the selected item index is 0 or if the string
1773            cannot be found in the predefined list (this happens if the
1774            user changes the text). Fixes RTbug #1940.
1775            Only turn off the grid event listeners if there a query comes
1776            back with a none empty list of ids. in the case that the list
1777            is empty this causes a grid.ClearSelection() call to actually
1778            clear the grid selection which causes the selected items in
1779            the map to be deselected. Fixes RTbug #1939.
1780    
1781            * test/test_save.py (XMLWriterTest.Encode): Check return values.
1782            Fixes RTbug #1851.
1783    
1784    2003-06-13  Bernhard Herzog  <[email protected]>
1785    
1786            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
1787            self.selected_shape with the current selection to make sure the
1788            contents of the dialog are up to date when it's shown for the
1789            first time.
1790            The dialog used to work without this by luck. The recent fix to
1791            the connector module 'broke' a 'feature' the identify view was
1792            relying on, i.e that subscribing to a message in response to
1793            receiving a message of that type would mean that the new
1794            subscriber would also be called for the same message.
1795            
1796    2003-06-12  Jonathan Coles   <[email protected]>
1797    
1798            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
1799            the image is rendered. Fixes RTbug #1937.
1800    
1801    2003-06-12  Jonathan Coles   <[email protected]>
1802    
1803            * Thuban/Lib/fileutil.py: As is done under Windows, create the
1804            user directory if it doesn't exist on a posix system.
1805            Fixes RTbug #1815.
1806    
1807            * Thuban/Model/resource.py (get_user_proj_files): Moved the
1808            called to get_application_dir here, so that the directory
1809            will only be called if this method is invoked.
1810    
1811            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
1812            the projfilepath if no projection is selected.
1813    
1814    2003-06-12  Jonathan Coles   <[email protected]>
1815    
1816            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
1817            the scalebar if the current map has no projection set.
1818    
1819            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
1820            projfilepath label to just the basename of the projection file
1821            rather than include the entire path.
1822    
1823            * Thuban/Model/resource.py: Fix missed proj functions that
1824            needed to be renamed.
1825    
1826    2003-06-12  Jonathan Coles   <[email protected]>
1827    
1828            * Thuban/Model/classification.py: Removed assert statements that
1829            tested if the variable was an instance of Color.
1830    
1831            * Thuban/Model/color.py (Color): Remove commented code that isn't
1832            used.
1833            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
1834            Fixes RTbug #1835.
1835            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
1836            Needed now that the class doesn't inherit from Color.
1837    
1838    2003-06-12  Jonathan Coles   <[email protected]>
1839    
1840            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
1841            check unicode strings.
1842    
1843            * test/test_layer.py: Check for existence of gdal.
1844    
1845    2003-06-12  Jonathan Coles   <[email protected]>
1846        
1847            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
1848            that was in load.py
1849    
1850            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
1851            that was in save.py
1852    
1853    2003-06-12  Jonathan Coles   <[email protected]>
1854    
1855            This is largely a collection of bug fixes. We also handle the
1856            case where gdal is not on the system. The XMLReader and XMLWriter
1857            classes were moved into there own files to resolve some circular
1858            import references and because they shouldn't really be in the
1859            file that is dediciated to reading/writing session files since
1860            they are also used elsewhere.
1861    
1862            * Thuban/Model/classgen.py: Renamed functions to follow the
1863            function_names_with_underscores style. Fixes RTbug #1903.
1864            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
1865    
1866            * Thuban/Model/layer.py: Import gdal only if it available.
1867            (RasterLayer): Handle the case where the gdal library is unavailable.
1868            Addresses RTbug #1877.
1869    
1870            * Thuban/Model/load.py (XMLReader): Moved into seperate file
1871            xmlreader.py.
1872    
1873    2003-06-12  Jonathan Coles   <[email protected]>
1874    
1875            This is largely a collection of bug fixes. We also handle the
1876            case where gdal is not on the system. The XMLReader and XMLWriter
1877            classes were moved into there own files to resolve some circular
1878            import references and because they shouldn't really be in the
1879            file that is dediciated to reading/writing session files since
1880            they are also used elsewhere.
1881    
1882            * Thuban/Model/classgen.py: Renamed functions to follow the
1883            function_names_with_underscores style. Fixes RTbug #1903.
1884            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
1885    
1886            * Thuban/Model/layer.py: Import gdal only if it available.
1887            (RasterLayer): Handle the case where the gdal library is unavailable.
1888            Addresses RTbug #1877.
1889    
1890            * Thuban/Model/load.py (XMLReader): Moved into seperate file
1891            xmlreader.py.
1892    
1893            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
1894            file xmlwriter.py.
1895    
1896            * Thuban/Model/resource.py: Renamed functions to following the
1897            function_names_with_underscores style.
1898            (has_gdal_support): New function that returns true if the gdal
1899            library is available. Addresses RTbug #1877.
1900    
1901            * Thuban/UI/application.py (ThubanApplication.OpenSession):
1902            Display a message box if the gdal library is not available, but
1903            only if there are any layers that would use it. Addresses RTbug #1877.
1904    
1905            * Thuban/UI/classgen.py: Use renamed projection resource functions.
1906            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
1907            when using integers versus floats.
1908    
1909            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
1910            determine if the "Add Image Layer" menu option should be
1911            greyed out or not. Addresses RTbug #1877.
1912    
1913            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
1914    
1915            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
1916            optimize if a raster layer is visible. Fixes RTbug #1931.
1917            Only draw the raster layer if the gdal library is available.
1918            Addresses RTbug #1877.
1919    
1920            * test/test_classgen.py: Add tests for generate_singletons,
1921            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
1922            (test_calculate_quantiles): Fix some tests to catch the new
1923            ValueError that is raised.
1924    
1925            * test/test_proj.py: Use renamed projection resource functions.
1926    
1927            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
1928            test for saving classified layers. Fixes RTbug #1902.
1929            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
1930    
1931    2003-06-12  Jan-Oliver Wagner <[email protected]>
1932    
1933            Fix for http://intevation.de/rt/webrt?serial_num=1900.
1934    
1935            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
1936    
1937            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
1938            multiplechoicedialog.py rather than from the wxPython library.
1939    
1940    2003-06-11  Frank Koormann  <[email protected]>
1941    
1942            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
1943            update.
1944    
1945    2003-06-11  Frank Koormann  <[email protected]>
1946    
1947            * Thuban/Lib/fileutil.py (get_application_dir): New function to
1948            determine the absolute .thuban/thuban directory under
1949            "posix" (os.expanduser) and "nt" (read AppData registry key).
1950    
1951            * Thuban/Model/resource.py: Use get_application_dir
1952    
1953            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
1954            Use get_application_dir.
1955    
1956    2003-06-10  Bernhard Herzog  <[email protected]>
1957    
1958            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
1959            the messages MAP_LAYERS_REMOVED messages
1960            (LayerTableFrame.OnClose): Unsubscribe from it.
1961            (LayerTableFrame.map_layers_removed): New. Receiver for
1962            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
1963            dialog is showing is removed.
1964    
1965    2003-06-10  Bernhard Herzog  <[email protected]>
1966    
1967            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
1968            of the receivers list so that unsubscribing in a receiver doesn't
1969            modify it while iterating over it.
1970    
1971            * test/test_connector.py
1972            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
1973            unsubscribing in a receiver works correctly. See docstring for
1974            details
1975    
1976    2003-06-10  Bernhard Herzog  <[email protected]>
1977    
1978            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
1979            message.
1980    
1981            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
1982            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
1983            LAYER_CHANGED will still be sent if the classification changes.
1984    
1985            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
1986            parameter so we can subscribe to some of its messages
1987            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
1988            and the layer's LAYER_SHAPESTORE_REPLACED
1989            (Classifier.unsubscribe_messages): New. Unsubscribe from message
1990            subscribed to in __init__
1991            (Classifier.map_layers_removed)
1992            (Classifier.layer_shapestore_replaced): receivers for the messages
1993            subscribed to in __init__. Unsubscribe and close the dialog
1994    
1995            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
1996            the map to the Classifier dialog
1997    
1998            * test/test_layer.py (SetShapeStoreTests): Derive from
1999            SubscriberMixin as well so we can test messages
2000            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
2001            messages
2002            (SetShapeStoreTests.tearDown): Clear the messages again
2003            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
2004            for the modified flag too
2005            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
2006            to check whether SetShapeStore sets the modified flag
2007            (SetShapeStoreTests.test_set_shape_store_different_field_name)
2008            (SetShapeStoreTests.test_set_shape_store_same_field)
2009            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
2010            Add tests for the messages. This checks both the new
2011            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
2012    
2013    2003-06-06  Jan-Oliver Wagner <[email protected]>
2014    
2015            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
2016            the menu items.
2017    
2018    2003-06-05  Frank Koormann  <[email protected]>
2019    
2020            * Thuban/UI/identifyview.py (IdentifyView.__init__):
2021            Layout reimplemented without panel. Make life easier to fit the list
2022            in the dialog.
2023    
2024    2003-06-05  Frank Koormann  <[email protected]>
2025    
2026            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
2027            once on initialisation (Former implementation resulted in multiple
2028            entries for each projection).
2029            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
2030            if set, select the projection found under the specified name. This
2031            overwrites any other selection estimate.
2032            Removed projchoice filling from this method.
2033            (ProjFrame._OnSave, ProjFrame._OnAddToList):
2034            Updated call of ProjFrame.__FillAvailList
2035            (LCCPanel._DoLayout): Moved parameter controls in more common order.
2036    
2037            * Resources/Projections/defaults.proj: Extended defaults representing
2038            various common European projections.
2039    
2040    2003-06-05  Frank Koormann  <[email protected]>
2041    
2042            * Thuban/UI/identifyview.py (IdentifyView.__init__):
2043            Use ListCtrl instead of GridCtrl
2044    
2045            * Thuban/Model/resource.py:
2046            Guess location of .thuban directory from tempdir parent directory.
2047    
2048            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2049            Guess location of .thuban directory from tempdir parent directory.
2050    
2051    2003-06-04  Bernhard Herzog  <[email protected]>
2052    
2053            Do not cache the values returned by the tree widget's
2054            GetFirstChild and GetNextChild methods because it led to lots of
2055            segfaults. The new way requires more brute force but is more
2056            reliable.
2057    
2058            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
2059            variable layer2id
2060            (LegendTree.find_layer): New method to do with brute force what
2061            layer2id tried to accomplish
2062            (LegendTree._OnMsgLayerChanged)
2063            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
2064            Use find_layer instead of layer2id
2065            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
2066            update layer2id anymore
2067            (LegendTree._OnMsgMapLayersRemoved)
2068            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
2069    
2070    2003-06-03  Thomas Koester  <[email protected]>
2071    
2072            * Thuban/Model/classgen.py (GenQuantiles0): New function.
2073    
2074    2003-06-02  Bernhard Herzog  <[email protected]>
2075    
2076            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
2077            New commands.
2078            (main_menu): Add the new commands.
2079            (MainWindow.TableRename): New. Implementation of the table_rename
2080            command.
2081            (MainWindow.RenameLayer): New. Implementation of the layer_rename
2082            command.
2083    
2084            * Thuban/Model/session.py (Session.AddTable): call self.changed to
2085            set the modified flag
2086    
2087            * test/test_session.py (TestSessionSimple.test_add_table): Test
2088            whether the modified flag is set properly
2089    
2090            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
2091            instead of issue so that the modified flags get updated.
2092    
2093            * test/test_base.py (SomeTitledObject): Derive from Modifiable
2094            instead of Publisher to reflect reality better and to accomodate
2095            the fact that SetTitle now calls changed instead of issue
2096    
2097    2003-06-02  Bernhard Herzog  <[email protected]>
2098    
2099            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
2100            acquisition has to happen before the try in a try-finally.
2101    
2102    2003-06-02  Bernhard Herzog  <[email protected]>
2103    
2104            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
2105            possible that a layer is removed that is not currently selected in
2106            the legend so don't check for this.
2107    
2108    2003-05-30  Bernhard Herzog  <[email protected]>
2109    
2110            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
2111            variables to None that have direct or indirect references to
2112            shapefiles or dbf files to make sure that they do go away and the
2113            files are closed.
2114    
2115    2003-05-30  Bernhard Herzog  <[email protected]>
2116    
2117            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
2118            availImgListIndices when a new image list is created
2119            
2120    2003-05-30  Bernhard Herzog  <[email protected]>
2121    
2122            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
2123            changing_selection to indicate whether the LegendTree code itself
2124            is currently changing the selection
2125            (LegendTree.normalize_selection): New method to normalize the
2126            selection by selecting the layer item even if the user clicked on
2127            the classification.
2128            (LegendTree._OnSelChanged): normalize the selection. This works
2129            around a bug in wx which doesn't keep track of the selection
2130            properly when subtrees are deleted.
2131    
2132    2003-05-30  Bernhard Herzog  <[email protected]>
2133    
2134            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
2135            maximum and minimum scale factors.
2136    
2137            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
2138            changes in classgen.py
2139    
2140    2003-05-30  Jonathan Coles   <[email protected]>
2141    
2142            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
2143            all the methods functions. Fixes RTBug #1903.
2144    
2145            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
2146            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
2147            RTBug #1907.
2148    
2149            * Thuban/UI/classgen.py: Use classgen functions that were part
2150            of the ClassGenerator class. Put try/finally blocks around
2151            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
2152            RTBug #1904.
2153    
2154            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
2155    
2156            * Thuban/UI/legend.py: The legend was cleared and repopulated any
2157            time something changed which caused some state to be lost such
2158            as which children were expanded or collapsed. Fixes RTBug #1901.
2159            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
2160            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
2161            the legend but not in the map.
2162            (LegendTree.__FillTree): Move main functionality out into smaller
2163            methods that can be used by other methods.
2164            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
2165            if they are available.
2166            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
2167            that we override the wxTreeCtrl method. Iterate over children
2168            and call __RemoveLayer.
2169            (LegendTree.__AddLayer): New. Add a new layer to the legend.
2170            (LegendTree.__RemoveLayer): Remove a layer from the legend.
2171            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
2172            Should only be called with the id of a layer branch.
2173            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
2174            Returns the root item or creates one if necessary.
2175    
2176            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
2177            ProjectRasterFile with tuple arguments instead of strings.
2178    
2179            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
2180            with try/finally. Fixes RTBug #1904.
2181    
2182            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
2183            with try/finally. Fixes RTBug #1904.
2184            (MapCanvas.FitSelectedToWindow): If a single point is selected
2185            simply center it on the display. Fixes RTBug #1849.
2186    
2187            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
2188            to be compiled as a standalone app. Now the code can only be
2189            called from Python which simplifies the parameter passing.
2190            (ProjectRasterFile): Handle Python arguments. Remove code that
2191            checks for a destination dataset. Add more clean up code.
2192    
2193            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
2194            TestMapWithContents.test_lower_layer_bottom):
2195            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
2196            Fixes RTBug #1907.
2197    
2198            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
2199            extent to the map when the legend is toggled. Fixes RTBug #1881.
2200    
2201    2003-05-29  Jan-Oliver Wagner <[email protected]>
2202    
2203            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
2204            unsubscribes all that is subcribed in __init__.
2205    
2206    2003-05-28  Bernhard Herzog  <[email protected]>
2207    
2208            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
2209            (MainWindow.CanDuplicateLayer): New methods to implement the
2210            Layer/Duplicate command.
2211            (layer_duplicate command): New.
2212            (main_menu): Add layer_duplicate to the Layer menu.
2213    
2214    2003-05-28  Bernhard Herzog  <[email protected]>
2215    
2216            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
2217            renderer so that NULL/None values get displayed differently (by a
2218            gray rectangle).
2219            (TableGrid.__init__): Override the default renderers
2220    
2221    2003-05-28  Bernhard Herzog  <[email protected]>
2222    
2223            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
2224            classification to "None" if the type of the field has changed.
2225    
2226            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
2227            test for the Layer.SetShapeStore method
2228    
2229    2003-05-28  Jan-Oliver Wagner <[email protected]>
2230    
2231            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
2232            does not necessarily have a filename).
2233    
2234    2003-05-28  Jan-Oliver Wagner <[email protected]>
2235    
2236            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
2237            sort the selection list for the dialog.
2238    
2239    2003-05-28  Frank Koormann  <[email protected]>
2240    
2241            * extensions/thuban/wxproj.cpp
2242            (project_point): Removed cast to int for projected point coordinates.
2243            (shape_centroid): Return last point if all polygon vertices fall
2244            to one point.
2245    
2246    2003-05-28  Bernhard Herzog  <[email protected]>
2247    
2248            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
2249            with layers that don't have shapestores, i.e. raster layers.
2250    
2251    2003-05-28  Bernhard Herzog  <[email protected]>
2252    
2253            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
2254            when determining the title from the filename.
2255    
2256            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
2257            reflect changes in the way the title is derived from the filename
2258    
2259    2003-05-28  Frank Koormann  <[email protected]>
2260    
2261            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
2262            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
2263    
2264    2003-05-27  Bernhard Herzog  <[email protected]>
2265    
2266            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
2267            delegate SelectedLayer.
2268            (MainWindow.LayerUnjoinTable): Implement.
2269            (_can_unjoin): New. Helper function for the sensitivity of the
2270            layer/unjoin command.
2271    
2272            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
2273            (DerivedShapeStore.OrigShapeStore): New. Return the original
2274            shapestore. Used to figure out how to unjoin.
2275            (DerivedShapeStore.Shapefile): Fix a typo.
2276    
2277    2003-05-27  Bernhard Herzog  <[email protected]>
2278    
2279            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
2280            well
2281            (JoinDialog.__init__): Use the layer parameter and only build the
2282            left choice when a layer is given
2283            (JoinDialog.OnJoin): Handle layer joins as well
2284            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
2285            that the user selects the "Select..." item. The sensitivitly
2286            updating is now in update_sensitivity
2287            (JoinDialog.y): New method to refactor the sensitivity update of
2288            the join button into its own method.
2289    
2290            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
2291    
2292    2003-05-27  Bernhard Herzog  <[email protected]>
2293    
2294            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
2295            iff there are unreferenced tables in the session
2296    
2297    2003-05-27  Bernhard Herzog  <[email protected]>
2298    
2299            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
2300    
2301            * Thuban/Model/session.py (Session.UnreferencedTables): New method
2302            to return tables that are not referenced by other tables or shape
2303            stores and can be removed.
2304            (Session.RemoveTable): Issue a TABLE_REMOVED message after
2305            removing the table
2306    
2307            * Thuban/UI/mainwindow.py: Remove unused imports
2308            (MainWindow.TableClose): Implement.
2309    
2310            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
2311            messages so that the frame will be automatically closed when a new
2312            session is opened or the table is removed.
2313            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
2314            __init__
2315            (TableFrame.close_on_session_replaced)
2316            (TableFrame.close_on_table_removed): New. Subscribers that close
2317            the window
2318    
2319            * test/test_session.py (TestSessionMessages.test_remove_table)
2320            (TestSessionSimple.test_remove_table): Move the test to
2321            TestSessionSimple and add test for the TABLE_REMOVED message
2322            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
2323            (TestSessionSimple.test_unreferenced_tables) New. Test for the
2324            UnreferencedTables method.
2325            (UnreferencedTablesTests): New. Class with some more sophisticated
2326            tests for UnreferencedTables.
2327    
2328    2003-05-27  Frank Koormann  <[email protected]>
2329    
2330            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
2331            display has some unwanted side effects. Removed again.
2332    
2333    2003-05-27  Frank Koormann  <[email protected]>
2334    
2335            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
2336    
2337            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
2338    
2339    2003-05-27  Jan-Oliver Wagner <[email protected]>
2340    
2341            * test/test_menu.py (MenuTest.test): Added test for
2342            Menu.RemoveItem().
2343    
2344            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
2345            the menu.
2346    
2347    2003-05-27  Frank Koormann  <[email protected]>
2348            
2349            Nonmodal dialogs without parent (i.e. they can fall behind the main
2350            window)
2351    
2352            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
2353            all dialogs in the dialogs dictionary and the canvas.
2354    
2355            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
2356            parent, i.e. can fall behind other windows.
2357            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
2358            dictionary before removing it.
2359    
2360            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
2361    
2362            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
2363            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
2364            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
2365    
2366    2003-05-27  Bernhard Herzog  <[email protected]>
2367    
2368            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
2369            tableview dialog
2370            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
2371            Also, don't use the table's titles as the dialog names. The titles
2372            aren't guaranteed to be unique.
2373            (MainWindow.TableOpen): Open a table view dialog after opening the
2374            table
2375    
2376    2003-05-27  Bernhard Herzog  <[email protected]>
2377    
2378            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
2379            effect can be achieved by simply closing the window showing the
2380            table.
2381            (MainWindow.TableHide): Removed.
2382            (main_menu): Removed "table_hide"
2383    
2384    2003-05-27  Frank Koormann  <[email protected]>
2385    
2386            Fix legend tree display problems under Win32
2387    
2388            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
2389            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
2390            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
2391    
2392            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
2393    
2394    2003-05-27  Jan-Oliver Wagner <[email protected]>
2395    
2396            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
2397            'after' now allows to insert separators almost anywhere in the menu.
2398    
2399    2003-05-27  Frank Koormann  <[email protected]>
2400    
2401            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
2402            "S" of selection box label to hint on hot key (Alt-S). Works under
2403            Win32 but is ignored under GTK.
2404    
2405    2003-05-26  Frank Koormann  <[email protected]>
2406    
2407            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
2408            Center Choices.
2409    
2410    2003-05-26  Bernhard Herzog  <[email protected]>
2411    
2412            Remove the Precision methods again. They're too DBF specific to be
2413            part of the table interface and they're only used in table_to_dbf
2414            anyway.
2415            
2416            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
2417            fixed precision of 12 for doubles.
2418            (TransientTableBase.Precision): Removed
2419            (AutoTransientTable.Width): Delegate to self.table.
2420    
2421            * Thuban/Model/table.py (DBFTable.Precision)
2422            (MemoryTable.Precision): Removed.
2423            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
2424            (table_to_dbf): Use a fixed precision of 12 for floats unless the
2425            column object specifies something else.
2426    
2427            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
2428            test for table_to_dbf
2429    
2430    2003-05-26  Bernhard Herzog  <[email protected]>
2431    
2432            * test/test_transientdb.py
2433            (TestTransientTable.run_iceland_political_tests): Fix a comment.
2434    
2435    2003-05-26  Bernhard Herzog  <[email protected]>
2436    
2437            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
2438            implementation. Mark parts of the file format strings for
2439            localization.
2440    
2441            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
2442            file and add the table to the tables managed by the session
2443    
2444            * test/test_session.py (TestSessionSimple.test_open_table_file):
2445            New. test case for OpenTableFile
2446    
2447    2003-05-26  Jan-Oliver Wagner <[email protected]>
2448    
2449            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
2450            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
2451            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
2452            Replace the true/false of wxWindows by True/False of Python 2.2.1.
2453    
2454    2003-05-26  Jan-Oliver Wagner <[email protected]>
2455    
2456            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
2457            already a selection present, update the grid accordingly.
2458    
2459            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
2460            resizeable and increase its initial size.
2461    
2462    2003-05-26  Frank Koormann  <[email protected]>
2463    
2464            Table export functionality
2465    
2466            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
2467            Return width (in characters) for a column.
2468            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
2469            (table_to_dbf): Write table to dbf file.
2470            (table_to_csv): Write table to csv file.
2471    
2472            * Thuban/Model/transientdb.py (TransientTableBase.Width,
2473            TransientTableBase.Precision): Return column width and precision.
2474    
2475            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
2476            or table_to_csv depending on file selection.
2477    
2478            * test/test_dbf_table.py:
2479            Test table_to_dbf (extension of former part of test).
2480    
2481            * test/test_csv_table.py:
2482            Test table_to_csv.
2483    
2484    2003-05-23  Jan-Oliver Wagner <[email protected]>
2485    
2486            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
2487            Use QueryTableFrame instead of TableFrame.
2488    
2489            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
2490            table window with 'Layer Table:' instead of 'Table:'.
2491    
2492    2003-05-23  Jan-Oliver Wagner <[email protected]>
2493    
2494            Give all tables a title via mix-in TitledObject.LayerShowTable
2495    
2496            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
2497            only if it exists.
2498    
2499            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
2500            and call its init-method with a default title. Remove Title() method.
2501    
2502            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
2503            AutoTransientTable): mix-in TitledObject and call its init-method with
2504            a default title. Remove Title() method.
2505    
2506    2003-05-23  Bernhard Herzog  <[email protected]>
2507    
2508            * Thuban/Model/session.py (Session.AddShapeStore): Define
2509            AddShapeStore analogously to AddTable.
2510    
2511            * test/test_session.py (TestSessionSimple.test_add_shapestore):
2512            New. Test for AddShapeStore
2513    
2514    2003-05-23  Jan-Oliver Wagner <[email protected]>
2515    
2516            Introducing QueryTableFrame and a very coarse ShowTable implementation.
2517    
2518            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
2519            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
2520            The latter implements the selection GUI without dependency on a layer.
2521            LayerTableFrame now is derived from QueryTableFrame and connects
2522            to a layer.
2523    
2524            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
2525            implementation that still needs work.
2526    
2527            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
2528    
2529    2003-05-22  Frank Koormann  <[email protected]>
2530    
2531            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
2532            Added "outer_join = False" as optional parameter.
2533            (TransientJoinedTable.create): If outer join is true, perform a
2534            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
2535            the left table. Records not matching are filled with 0 / None.
2536    
2537            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
2538            (JoinDialog.OnJoin): Consider outer join check box.
2539    
2540    2003-05-22  Bernhard Herzog  <[email protected]>
2541    
2542            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
2543            somewhat safer way. Storing the traceback in a local variable can
2544            lead to memory leaks
2545    
2546    2003-05-22  Bernhard Herzog  <[email protected]>
2547    
2548            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
2549            the wxMessageDialog's Destroy() method.
2550    
2551    2003-05-22  Frank Koormann  <[email protected]>
2552    
2553            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
2554            TransientTable.Title()
2555    
2556    2003-05-22  Frank Koormann  <[email protected]>
2557    
2558            Join Dialog, initial version.
2559    
2560            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
2561    
2562            * Thuban/UI/join.py (JoinDialog): Functional implementation of
2563            former framework. Renamed Table1/Table2 to LeftTable/RightTable
2564            in all occurences.
2565    
2566            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
2567            Typo fixed.
2568    
2569    2003-05-22  Bernhard Herzog  <[email protected]>
2570    
2571            Give the tables titles so that the GUI can display more meaningful
2572            names. For now the titles are fixed but depend on e.g. filenames
2573            or the titles of the joined tables.
2574    
2575            * Thuban/Model/transientdb.py (TransientTable.Title)
2576            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
2577    
2578            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
2579    
2580            * test/test_transientdb.py
2581            (TestTransientTable.test_auto_transient_table_title): New. Test
2582            for the Title method
2583            (TestTransientTable.test_transient_joined_table)
2584            (TestTransientTable.test_transient_table): Add test for the Title
2585            methods
2586    
2587            * test/test_memory_table.py (TestMemoryTable.test_title): New.
2588            Test for the Title method
2589    
2590            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
2591            the Title method
2592    
2593    2003-05-22  Bernhard Herzog  <[email protected]>
2594    
2595            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2596            Provide a better way to destroy the layers
2597            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
2598            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
2599            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
2600            the new way to destroy the layers.
2601            (TestLayer.test_derived_store): New. Test for using a layer with a
2602            DerivedShapeStore
2603    
2604            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
2605            filename if the shape store actually has one.
2606    
2607    2003-05-22  Bernhard Herzog  <[email protected]>
2608    
2609            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
2610            for the filename
2611    
2612            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
2613            for the FileName method
2614            (TestDBFTableWriting.test_write): Fix spelling of filename
2615    
2616    2003-05-22  Thomas Koester  <[email protected]>
2617    
2618            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
2619            from SciParam that now really is immutable.
2620    
2621    2003-05-22  Frank Koormann  <[email protected]>
2622    
2623            Layer Top/Bottom placement added to legend.
2624    
2625            * Thuban/UI/legend.py
2626            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
2627            bound to tool events.
2628            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
2629            New, methods binding the event methods with the map methods.
2630    
2631            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
2632            layer at top/bottom of layer stack.
2633    
2634            * Resources/Bitmaps/top_layer.xpm: New button icon.
2635    
2636            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
2637    
2638    2003-05-22  Bernhard Herzog  <[email protected]>
2639    
2640            * Thuban/Model/session.py (Session.RemoveTable): New method to
2641            remove tables
2642    
2643            * test/test_session.py (TestSessionSimple.test_remove_table): New.
2644            Test for RemoveTable
2645    
2646    2003-05-22  Thomas Koester  <[email protected]>
2647    
2648            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
2649            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
2650    
2651    2003-05-22  Bernhard Herzog  <[email protected]>
2652    
2653            Implement a way to discover dependencies between tables and
2654            shapestores.
2655    
2656            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
2657            (TransientJoinedTable.Dependencies)
2658            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
2659            interface
2660            (TransientJoinedTable.__init__): Keep tack of the original table
2661            objects in addition to the corresponding transient tables.
2662    
2663            * Thuban/Model/table.py (DBFTable.Dependencies)
2664            (MemoryTable.Dependencies): New. Implement the dependencies
2665            interface
2666    
2667            * Thuban/Model/data.py (ShapeTable): New. Helper class for
2668            ShapefileStore
2669            (ShapefileStore.__init__): Use ShapeTable instead of
2670            AutoTransientTable
2671            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
2672            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
2673            methods for filename and type
2674            (ShapefileStore.Dependencies): New. Implement the dependencies
2675            interface
2676            (DerivedShapeStore): New class to replace SimpleStore. The main
2677            difference to SimpleStore is that it depends not on a shapefile
2678            but another shapestore which expresses the dependencies a bit
2679            better
2680            (SimpleStore.__init__): Add deprecation warning.
2681    
2682            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
2683            Test for the Dependencies method.
2684    
2685            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
2686            New. Test for the Dependencies method.
2687    
2688            * test/test_transientdb.py
2689            (TestTransientTable.test_auto_transient_table_dependencies): New.
2690            Test for the Dependencies method.
2691            (TestTransientTable.test_transient_joined_table): Add test for the
2692            Dependencies method.
2693    
2694            * test/test_session.py (TestSessionSimple.setUp)
2695            (TestSessionSimple.tearDown): New. Implement a better way to
2696            destroy the sessions.
2697            (TestSessionSimple.test_initial_state)
2698            (TestSessionSimple.test_add_table): Bind session to self.session
2699            so that it's destroyed by tearDown
2700            (TestSessionSimple.test_open_shapefile): New. Test for
2701            OpenShapefile and the object it returns
2702    
2703    2003-05-22  Bernhard Herzog  <[email protected]>
2704    
2705            * Thuban/Model/session.py (Session.AddTable): New method to
2706            register tables with the session.
2707            (Session.Tables): Return the tables registered with AddTable too.
2708    
2709            * test/test_session.py (TestSessionSimple.test_add_table): New.
2710            Test case for the AddTable method
2711    
2712    2003-05-22  Frank Koormann  <[email protected]>
2713    
2714            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
2715            lower right corner, center labels for selections, initialize controls
2716            in reasonable order for keyboard navigation.
2717    
2718            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
2719            (ProjFrame.__DoOnProjAvail): Determine position of current projection
2720            using the wxListBox.FindString() method. Still a problem (#1886)
2721    
2722            * Thuban/UI/classifier.py
2723            (Classifier.__init__, SelectPropertiesDialog.__init__)
2724    
2725            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
2726            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
2727            different classification types from here to __init__.
2728            (GenUniquePanel.__init__): Set the column width of the first field
2729            in the Field ListCtrl to the full width.
2730    
2731            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
2732            Button to 'Export'. Center Buttons in Selection Box, set Focus to
2733            Grid.
2734            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
2735            changes focus to the Selection when pressing "Alt-S".
2736    
2737            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
2738            the text if not visible. The italic font sometimes exceeds the
2739            rendering area.
2740    
2741    2003-05-21  Jonathan Coles   <[email protected]>
2742    
2743            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
2744            to OnClose so that Thuban closes correctly.
2745    
2746            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
2747            DockFrame.OnClose, not DockFrame._OnClose.
2748    
2749    2003-05-21  Jonathan Coles   <[email protected]>
2750    
2751            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
2752            references to 'inf' and use new Range __init__ to pass floats
2753            directly rather than converting them to strings first.
2754            Fixes RTBug #1876.
2755    
2756            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
2757            Use new Range ___init__ to pass floats.
2758    
2759            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
2760            filename is a valid image file. Throw IOError otherwise.
2761    
2762            * Thuban/Model/range.py: Brought over new Range from SciParam that
2763            is immutable and has an __init__ which can accept floats.
2764    
2765            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
2766            into try block. AddLayer doesn't throw any exceptions anymore.
2767            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
2768            try block.
2769    
2770            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
2771            the first item in choices. Fixes RTBug #1882.
2772    
2773            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
2774            has gone to 0 which is a serious problem. abort.
2775            (MapRenderer.draw_raster_layer): Catch IOError seperately and
2776            print the error from GDAL.
2777    
2778            * Thuban/UI/tableview.py (TableGrid.__init__): Call
2779            ToggleEventListeners to turn on listening.
2780            (TableGrid.ToggleEventListeners): New. Turns event listening on
2781            and off so as to prevent excessive messages.
2782            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
2783            to suppress excessive messages when selecting many rows.
2784            Fixes RTBug #1880.
2785    
2786            * Thuban/UI/view.py: Added checks against if scale == 0. This
2787            is a serious problem that can occur when an image without
2788            geo data is loading and causes the map projection bounds to
2789            go to infinity. Right now, the solution is to simply try
2790            to recover.
2791    
2792            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
2793            to set the MFILEReceiver attributes even if the data is NULL.
2794    
2795            * extensions/thuban/gdalwarp.cpp: Improved the error handling
2796            and passed GDAL messages back up to the Python layer. Also
2797            tried to fix some memory leaks that were present in the original
2798            utility but didn't matter because the program aborted.
2799    
2800            * test/test_range.py: Copied over tests from SciParam. Removed
2801            tests against importing. Fixes RTBug #1867.
2802    
2803    2003-05-21  Bernhard Herzog  <[email protected]>
2804    
2805            * test/test_load.py: Remove unused imports and restructure the
2806            test code
2807            (LoadSessionTest): Split into one class for each test and turn
2808            LoadSessionTest itself into the base class for all such session
2809            tests.
2810            (ClassificationTest): New base class for load tests that test
2811            classifications
2812            (TestSingleLayer, TestLayerVisibility, TestClassification)
2813            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
2814            for the individual tests
2815    
2816            * test/support.py (FileLoadTestCase.filename): New base class for
2817            file loading tests
2818    
2819    2003-05-21  Jan-Oliver Wagner <[email protected]>
2820    
2821            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
2822            Mercator' to 'UTM Zone 32' as a more convenient example.
2823            Added 'Gauss Krueger Zone 6'.
2824    
2825            * Data/iceland_sample_raster.thuban: political polygon now
2826            filled transparent to have the raster image visible at once.
2827    
2828    2003-05-21  Frank Koormann  <[email protected]>
2829    
2830            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
2831            OnClose() to keep in sync with extensions. Internally Thuban
2832            still uses "underscored" names.
2833    
2834    2003-05-20  Jonathan Coles   <[email protected]>
2835    
2836            This puts back Raster layer support. These layers support projections
2837            through the GDAL library. Currently, the CVS version is being used.
2838            There are no Debian packages available although this may change soon.
2839            A GDAL driver was extended to support writing to memory rather to
2840            files.
2841    
2842            There is still some work that needs to be done, such as some error
2843            handling when loading invalid images or when there is a problem
2844            projecting the image. This putback simply checks in the majority
2845            of the work.
2846    
2847            * setup.py: Add gdalwarp library extension.
2848    
2849            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
2850            Defaults to False, but can be overridden by subclasses if they
2851            support classification.
2852            (RasterLayer): New. Defines a new layer that represents an
2853            image.
2854    
2855            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
2856            tag handler.
2857            (SessionLoader.start_layer): Encode the filename.
2858            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
2859            New. Supports reading a rasterlayer tag.
2860    
2861            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
2862    
2863            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
2864            get a string in Latin1. If we get such as string convert it to
2865            unicode first, otherwise leave if alone before encoding.
2866            (SessionSaver.write_layer): Add support for writing both Layers
2867            and RasterLayers.
2868    
2869            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
2870            The right argument may not be a string, it could also be a Column.
2871    
2872            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
2873            Make initial window size 600x400. Fixes RTBug #1872.
2874    
2875            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
2876            the dialog is constructed so that we can support layers that
2877            do not have classifications.
2878            (Classifier._OnTry): Only build a classification if the layer
2879            supports one.
2880    
2881            * Thuban/UI/legend.py: Change all checks that a layer is an
2882            instance of Layer into checks against BaseLayer.
2883            (LegendTree.__FillTreeLayer): Only add children to a branch if
2884            the layer supports classification.
2885    
2886            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
2887            MainWindow.OpenSession): Don't proceed with an action if the
2888            user chooses Cancel when they are asked to save changes.
2889            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
2890            user to select an image file. Create a new RasterLayer and add
2891            it to the map.
2892    
2893            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
2894            for rendering RasterLayer layers.
2895            (MapRenderer.draw_raster_layer): Actually method that calls
2896            the GDALWarp python wrapper and constructs an image from the
2897            data returned.
2898    
2899            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
2900            Choices symbols to match those used in the table query method.
2901            Replace deprecated method calls on table with new method names.
2902    
2903            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
2904            how small the scale can get. This still needs more testing.
2905    
2906            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
2907            Provides a driver to output in .bmp format.
2908    
2909            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
2910            New. Provides IO routines which write to memory, rather than a file.
2911    
2912            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
2913            of the gdalwarp utility provided in GDAL. Added function calls
2914            that can be accessed from python.
2915    
2916            * Data/iceland_sample_raster.thuban: New. Sample file that uses
2917            a raster layer.
2918    
2919            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
2920            layer image data.
2921    
2922            * Doc/thuban.dtd: Added rasterlayer attribute definition.
2923    
2924            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
2925            tests associated with the raster layer code.
2926    
2927            * test/test_transientdb.py
2928            (TestTransientTable.test_auto_transient_table_query): Added a test
2929            for using a Column object as the "right" parameter to a query.
2930    
2931    2003-05-19  Frank Koormann  <[email protected]>
2932    
2933            * Thuban/version.py (get_changelog_date):
2934            Catch exceptions if ChangeLog does not exist.
2935    
2936            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
2937    
2938    2003-05-19  Frank Koormann  <[email protected]>
2939    
2940            Extended version information for Thuban
2941    
2942            * Thuban/version.py: New, version information for Thuban: Last
2943            modification date and last ChangeLog entry date.
2944    
2945            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
2946            information: Display Thuban, wxPython and Python version.
2947    
2948    2003-05-16  Bernhard Herzog  <[email protected]>
2949    
2950            * Thuban/Model/save.py: Remove some unused imports including the
2951            __future__ import for nested_scopes as Thuban relies on Python 2.2
2952            now.
2953            (XMLWriter.encode): Remove the special case for a None argument.
2954            In the saver encode is always called with a string argument.
2955    
2956    2003-05-16  Bernhard Herzog  <[email protected]>
2957    
2958            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
2959            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
2960            of the bug was that e.g. float("1.2") would fail. Thuban now
2961            requires 2.4.x.
2962            
2963    2003-05-16  Frank Koormann   <[email protected]>
2964    
2965            Printing enhancement and WMF export (under Win32)
2966    
2967            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
2968            ScreenRenderer. Renders Map, Legend and Scalebar for export.
2969            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
2970            PrintRender.
2971    
2972            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
2973            to fullfil information needed for PrinterRenderer.
2974            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
2975            (MapCanvas.Print): Adapted to new MapPrintout.
2976            (OutputTransform): General calculations to transform from canvas
2977            coordinates to export/printing devices.
2978    
2979            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
2980            new method_command to call ExportMap, with platform dependency (only
2981            __WXMSW__)
2982      
2983            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
2984            of scalebar drawing area as new parameters.
2985            
2986            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
2987    
2988            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
2989            Update to extended scalebar.DrawScalebar header.
2990    
2991            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
2992    
2993            * test/test_scalebar.py: Made test executable as standalone.
2994    
2995    2003-05-16  Bernhard Herzog  <[email protected]>
2996    
2997            * Thuban/Model/table.py (Table): Remove this compatibility alias
2998            for DBFTable.
2999    
3000            * test/test_table.py: Import DBFTable as Table because that alias
3001            doesn't exist anymore.
3002    
3003            * Thuban/UI/classgen.py: Remove some unused imports
3004    
3005    2003-05-14  Jonathan Coles   <[email protected]>
3006    
3007            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
3008            Fix docstring.
3009            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
3010            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
3011            values of the supplied range to determine the beginning and end
3012            bounds of the generated classes.
3013    
3014            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
3015            do not have a leading 0 (.5 is now accepted as well as 0.5).
3016    
3017            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
3018            call to ClassGenerator.GenUniformDistribution.
3019    
3020            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
3021            layout bug with the 'Projection' label.
3022    
3023            * test/support.py (FloatTestCase): New. Needed for the Range tests.
3024    
3025            * test/test_range.py: New. Imported from SciParam.
3026    
3027    2003-05-12  Jonathan Coles   <[email protected]>
3028    
3029            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
3030            to table.UniqueValues() with calls that retrieve all the values
3031            from the table. This will need to be replaced by a method on table
3032            which can simply return the list (perhaps more efficiently).
3033    
3034    2003-05-12  Jonathan Coles   <[email protected]>
3035    
3036            The return value of ClassGenerator.CalculateQuantiles has changed.
3037            Refer to the documentation for details.
3038    
3039            * test/test_classgen.py: Modified Quantile tests to use the
3040            new return values.
3041    
3042            * Thuban/Model/classgen.py
3043            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
3044            use new return values from CalculateQuantiles to produce the correct
3045            range bounds in the Classification.
3046            (ClassGenerator.CalculateQuantiles): Add more comments describing
3047            the return values and parameters. Make minor adjustments to improve
3048            the legibility of the code. Fix problem with adjusted not being set
3049            in most cases.
3050    
3051    2003-05-12  Frank Koormann <[email protected]>
3052            
3053            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
3054            and latin1. Fixes #1851 finally.
3055    
3056    2003-05-09  Jonathan Coles   <[email protected]>
3057    
3058            * test/test_classgen.py: New. Tests the Quantile algorithm.
3059    
3060            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
3061            Clean up debugging statement, add comments, fix a small bug in the
3062            returned adjusted percentiles.
3063            
3064    2003-05-09  Jonathan Coles   <[email protected]>
3065    
3066            Introduces Range class from SciParam into the ClassGroupRange class,
3067            and such ranges can now be saved and loaded from disk.
3068    
3069            Quantiles are now available in the Classification Generator.
3070    
3071            Initial support for building Queries on a table. Doesn't do anything
3072            but run some tests.
3073    
3074            * Thuban/Model/classification.py: Explicit imports.
3075            (ClassGroupRange): Use the Range class to store the underlying
3076            range information. The interface remains the same, except for
3077            GetRange(), and you can also supply a Range object as the min
3078            parameter to SetRange or __init__.
3079    
3080            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
3081            string appropriately for use in Thuban. Fixes RTbug #1851.
3082            (SessionLoader.end_projection): Handle the context of the
3083            projection tag a bit better by looking at what objects are not
3084            None. There was an assumption that a projection tag for a map
3085            could occur before any layers.
3086            (SessionLoader.start_clrange): Provide backward compatibility for
3087            reading min/max values as well as the new range parameter.
3088    
3089            * Thuban/Model/map.py: Explicit imports.
3090    
3091            * Thuban/Model/resource.py: Import _.
3092            (ProjFileSaver.write): write header using projfile.dtd.
3093    
3094            * Thuban/Model/save.py: Explicit imports.
3095            (XMLWriter.encode): New. Encode the given string from a format
3096            used by Thuban into UTF-8. Fixes RTbug #1851.
3097    
3098            * Thuban/UI/classgen.py: Explicit imports.
3099            (ClassGenDialog.__init__): Clean up the code and add support
3100            for Quantiles.
3101            (ClassGenDialog.OnOK): Add support for Quantiles.
3102            (GenQuantilesPanel): New. Input panel for Quantiles.
3103            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
3104            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
3105    
3106            * Thuban/Model/classgen.py: New. Contains all the classes named above.
3107    
3108            * Thuban/UI/classifier.py: Explicit imports.
3109            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
3110            ClassTable.SetValueAsCustom): Reworked to use new Range class.
3111    
3112            * Thuban/UI/legend.py: Explicit imports.
3113    
3114            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
3115            a Table menu and associated method calls.
3116            (MainWindow.choose_color): Removed. No longer needed.
3117    
3118            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
3119            should be disabled if no projection is selected in the available
3120            list.
3121    
3122            * Thuban/UI/renderer.py: Explicit imports.
3123    
3124            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
3125            with correctly selecting the rows and issuing the right events.
3126            Be sure to call Skip() to allow the grid to do some of its own
3127            handling which allows the rows to actually be selected.
3128            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
3129            selecting multiple shapes.
3130            (LayerTableFrame): Support for building Queries.
3131            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
3132    
3133            * Thuban/UI/tree.py: Explicit imports.
3134    
3135            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
3136            table view can call it.
3137    
3138            * test/test_classification.py: Explicit imports.
3139            (TestClassification.test_ClassGroupRange): Fix test for new
3140            Range class.
3141    
3142            * Doc/thuban.dtd: Add range parameter for clrange.
3143    
3144            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
3145            object in ClassGroupRange, and also uesd for inputting ranges in
3146            the classifer table and elsewhere.
3147    
3148            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
3149            yet.
3150    
3151    2003-05-09  Frank Koormann <[email protected]>
3152    
3153            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
3154    
3155    2003-05-08  Frank Koormann <[email protected]>
3156    
3157            Coding style updates
3158    
3159            * test/test_scalebar.py: Replaced tab indentation by spaces.
3160    
3161            * Thuban/UI/scalebar.py: Explicit imports.
3162    
3163    2003-05-08  Frank Koormann <[email protected]>
3164    
3165            * Thuban/UI/scalebar.py
3166            (ScaleBar.DrawScalebar): Format string bug fixed.
3167    
3168    2003-05-08  Frank Koormann <[email protected]>
3169    
3170            Reorganization of scalebar component (no wx in Thuban/Model)
3171    
3172            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
3173            (deriveInterval):
3174            Calculate scalebar interval and unit which fits in width for scale.
3175            (roundInterval): Round float.
3176    
3177            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
3178    
3179            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
3180    
3181            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
3182    
3183    2003-05-08  Frank Koormann <[email protected]>
3184    
3185            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
3186            Initialize ScaleBar with canvas.map
3187    
3188            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
3189            round intervals to display smarter lengths
3190            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
3191            layer. If the maps has no projection applied grey the scalebar.
3192    
3193    2003-05-07  Frank Koormann <[email protected]>
3194            
3195            Basic Scalebar features added.
3196    
3197            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
3198    
3199            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
3200            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
3201            and the renderer.
3202    
3203            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
3204    
3205            * Thuban/UI/messages.py: SCALE_CHANGED added.
3206    
3207    2003-05-07  Bernhard Herzog  <[email protected]>
3208    
3209            * Thuban/Model/session.py (Session.__init__): New instance
3210            variable shapestores to hold a list of all open shapestore objects
3211            (Session.ShapeStores): New. Accessor method for the shapestores
3212            list.
3213            (Session._add_shapestore, Session._clean_weak_store_refs): New.
3214            Internal methods to maintain the shapestores list.
3215            (Session.Tables): New. Return all tables open in the session.
3216            (Session.OpenShapefile): Insert the new ShapeStore into the
3217            shapestores list.
3218    
3219            * test/test_session.py (TestSessionSimple.test_initial_state): Add
3220            tests for ShapeStores and Tables
3221            (TestSessionWithContent.test_shape_stores)
3222            (TestSessionWithContent.test_tables): New. Test cases for
3223            ShapeStores and Tables
3224    
3225    2003-05-07  Bernhard Herzog  <[email protected]>
3226    
3227            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
3228            Add comments about the optimizations used.
3229            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
3230            Implement the ReadValue table interface method.
3231    
3232            * test/test_transientdb.py
3233            (TestTransientTable.run_iceland_political_tests)
3234            (TestTransientTable.test_transient_joined_table): Add tests for
3235            ReadValue
3236    
3237    2003-05-07  Frank Koormann <[email protected]>
3238    
3239            * Resources/Bitmaps/fulllayerextent.xpm,
3240            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
3241            new icons.
3242    
3243    2003-05-06  Bernhard Herzog  <[email protected]>
3244    
3245            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
3246            New. Simply delegate to the transient table's version.
3247    
3248            * test/test_transientdb.py
3249            (TestTransientTable.test_auto_transient_table_query): New. Test
3250            case for AutoTransientTable's SimpleQuery
3251    
3252    2003-05-06  Bernhard Herzog  <[email protected]>
3253    
3254            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
3255            Implement a simple query method for the query dialog
3256            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
3257            the row index or shapeid.
3258            (TransientTable.create): Insert the right value of the row index
3259            (TransientJoinedTable.create): Copy the row index of the left
3260            table to the joined result table
3261    
3262            * test/test_transientdb.py
3263            (TestTransientTable.test_transient_table_read_twice): Fix
3264            doc-string
3265            (TestTransientTable.test_transient_table_query): New. Test for the
3266            SimpleQuery method
3267    
3268    2003-05-06  Bernhard Herzog  <[email protected]>
3269    
3270            Convert all table users to use the new table interface. This only
3271            covers Thuban itself, not GREAT-ER or other applications built on
3272            Thuban yet, so the compatibility interface stays in place for the
3273            time being but it now issues DeprecationWarnings.
3274    
3275            Finally, the new Table interface has a new method, HasColumn.
3276    
3277            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
3278            issue deprecation warnings when they're. The warnings refer to the
3279            caller of the method.
3280            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
3281            for the deprecation warnings
3282    
3283            * test/test_table.py: Ignore the deprecation warnings for the old
3284            table in the tests in this module. The purpose of the tests is to
3285            test the old interface, after all.
3286    
3287            * test/test_transientdb.py
3288            (TestTransientTable.run_iceland_political_tests): Use the
3289            constants for the types. Add a test for HasColumn
3290            (TestTransientTable.test_transient_joined_table): Adapt to new
3291            table interface. Add a test for HasColumn
3292            (TestTransientTable.test_transient_table_read_twice): Adapt to new
3293            table interface
3294    
3295            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
3296            Adapt to new table interface
3297    
3298            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
3299            new table interface
3300    
3301            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
3302            (RecordTable.SetTable): Adapt to new table interface
3303    
3304            * Thuban/UI/classifier.py (Classifier.__init__)
3305            (Classifier.__init__): Adapt to new table interface
3306    
3307            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
3308            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
3309            to new table interface
3310    
3311            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
3312            (AutoTransientTable.HasColumn): Implement the new table interface
3313            method
3314            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
3315            (AutoTransientTable.UniqueValues): Adapt to new table interface
3316    
3317            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
3318            Adapt to new table interface
3319    
3320            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
3321            simplify opening shapefiles a bit easier.
3322            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
3323            (TestLayer.test_point_layer): Use the new helper method
3324            (TestLayer.test_get_field_type): New. Test for the GetFieldType
3325            method
3326    
3327            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
3328            the new table method
3329    
3330            * test/test_memory_table.py (TestMemoryTable.test_has_column):
3331            Test for the new table method HasColumn
3332    
3333    2003-05-06  Jonathan Coles   <[email protected]>
3334    
3335            Addresses the "Selection Extent" wish of RTbug #1787.
3336    
3337            * Resources/Bitmaps/fulllayerextent.xpm,
3338            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
3339            extent. These are just place holders for the real bitmaps.
3340    
3341            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
3342            calculate the bounding box once (the first time compute_bbox() is
3343            called).
3344            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
3345            the bounding box for the shapes in lat/long coordinates.
3346    
3347            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
3348            option.
3349            (MainWindow.has_selected_shapes): New. Returns true if there are
3350            any selected shapes.
3351            (MainWindow.FullSelectionExtent): New. Calls
3352            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
3353            (_has_selected_shapes): New. Returns true if there are any
3354            selected shapes.
3355    
3356            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
3357            true if there are any selected shapes.
3358    
3359            * Thuban/UI/view.py (MapCanvas): Added delegated method
3360            HasSelectedShapes.
3361            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
3362            shapes on the canvas using the map projection (if any).
3363    
3364            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
3365            for Layer.ShapesBoundingBox().
3366    
3367    2003-05-06  Bernhard Herzog  <[email protected]>
3368    
3369            * Resources/Projections/defaults.proj: Fix spelling of Mercator
3370    
3371    2003-05-05  Jonathan Coles   <[email protected]>
3372    
3373            Addresses the "Full Layer Extent" wish of RTbug #1787.
3374    
3375            * Resources/Projections/defaults.proj: Added UK National Grid.
3376    
3377            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
3378            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
3379            when the user selects the menu option.
3380    
3381            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
3382            scales the given layer on the canvas using the map projection.
3383    
3384    2003-05-05  Bernhard Herzog  <[email protected]>
3385    
3386            Convert the table implementations to a new table interface. All
3387            tables use a common mixin class to provide backwards compatibility
3388            until all table users have been updated.
3389    
3390            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
3391            provide backwards compatibility for table classes implementing the
3392            new interface
3393            (DBFTable, MemoryTable): Implement the new table interface. Use
3394            OldTableInterfaceMixin as base for compatibility
3395            (DBFColumn, MemoryColumn): New. Column description for DBFTable
3396            and MemoryTable resp.
3397    
3398            * test/test_dbf_table.py: New. Test cases for the DBFTable with
3399            the new table interface.
3400    
3401            * test/test_memory_table.py: New. Test cases for the MemoryTable
3402            with the new table interface.
3403    
3404            * test/test_table.py: Document the all tests in this file as only
3405            for backwards compatibility. The equivalent tests for the new
3406            interface are in test_memory_table.py and test_dbf_table.py
3407            (MemoryTableTest.test_read): field_info should be returning tuples
3408            with four items
3409            (MemoryTableTest.test_write): Make doc-string a more precise.
3410    
3411            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
3412            table interface. Derive from from OldTableInterfaceMixin for
3413            compatibility.
3414            (TransientTableBase.create): New intance variable column_map to
3415            map from names and indices to column objects
3416            (TransientTable.create): Use the new table interface of the input
3417            table
3418            (AutoTransientTable): Convert to new table interface. Derive from
3419            from OldTableInterfaceMixin for compatibility.
3420            (AutoTransientTable.write_record): Removed. It's not implemented
3421            yet and we still have to decide how to handle writing with the new
3422            table and data framework.
3423    
3424            * test/test_transientdb.py
3425            (TestTransientTable.run_iceland_political_tests)
3426            (TestTransientTable.test_transient_joined_table): Use the new
3427            table interface
3428    
3429    2003-05-05  Jonathan Coles   <[email protected]>
3430    
3431            This is namely a collection of UI updates to improve user interactivity.
3432            Tabbing between controls now exists and you can use ESC to close dialog
3433            boxes; ENTER will active the default button.
3434    
3435            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
3436            order that the controls are created so that tabbing works correctly.
3437            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
3438            wxDialog can handle the default button correctly.
3439            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
3440            same reasons as for OnOK.
3441            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
3442            when we ask the table for the maximum/minimum values of a field
3443            which could take a very long time.
3444    
3445            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
3446            order that the controls are created so that tabbing works correctly.
3447            (SelectPropertiesDialog.__init__): Rearrange the order that the
3448            controls are created so that tabbing works correctly.
3449    
3450            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
3451            to derive from a wxDialog but behave like the original implementation
3452            which was derived from a wxFrame. wxDialog provides useful key
3453            handling functionality like ESC calling OnCancel and ENTER calling
3454            OnOK which is lost with wxFrame.
3455    
3456            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
3457            new dialogs.
3458    
3459            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
3460            order that the controls are created so that tabbing works correctly.
3461            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
3462            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
3463            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
3464            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
3465            can provide the "UK National Grid" as a default projection.
3466            (UTMPanel.__init__): Rearrange the order that the controls are
3467            created so that tabbing works correctly.
3468    
3469    2003-05-05  Bernhard Herzog  <[email protected]>
3470    
3471            * extensions/thuban/wxproj.cpp: Fix some of the comments.
3472            (project_point): If a map projection but no layer projection is
3473            given, convert degrees to radians before applying the map
3474            projection.
3475    
3476            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
3477            (TableGrid.allow_messages): New methods to make it possible to
3478            inhibit message sending.
3479            (TableGrid.issue): Only send the message if not inhibited.
3480            (LayerTableGrid.select_shape): Use the new methods to make sure
3481            that no ROW_SELECTED message is sent while we're updating the
3482            selected rows to match the selected shapes.
3483    
3484    2003-05-02  Jan-Oliver Wagner <[email protected]>
3485    
3486            Implementation of MemoryTable.
3487    
3488            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
3489            implementation that operates on a list of tuples. All of the data
3490            are kept in the memory.
3491    
3492            * test/test_table.py (MemoryTableTest): New.
3493    
3494            * test/test_transientdb.py (SimpleTable): Removed.
3495            (TestTransientTable.test_transient_joined_table,
3496            (TestTransientTable.test_transient_table_read_twice): Replaced
3497            SimpleTable by MemoryTable.
3498    
3499    2003-04-30  Jonathan Coles   <[email protected]>
3500    
3501            * Data/iceland_sample.thuban: Now contains correct projections
3502            for each of the layers.
3503    
3504            * Resources/Projections/defaults.proj: Geographic projection
3505            contains unit conversion parameter.
3506    
3507    2003-04-30  Jonathan Coles   <[email protected]>
3508    
3509            The most important part of this putback is the projection changes.
3510            It should now be possible to specify the projection that a layer
3511            is in and then specify a different projection for the map. The
3512            projection dialog has an extra parameter for a geographic projection
3513            which lets the user select if the input is in degrees or radians.
3514    
3515            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
3516            to say that the parameter is a tuple of unprojected
3517            points (which is what the callers to this method were assuming).
3518            Also, since the points are unprojected we need to projected them.
3519    
3520            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
3521            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
3522            groups are selected, move the layer up/down. Fixes RTbug #1833.
3523    
3524            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
3525    
3526            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
3527            parameter in call to SetClientData.
3528            (GeoPanel): Add support for selecting the units that the
3529            source data is in (Radians or Degrees).
3530    
3531            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
3532            the rendering loop by reducing the number of if's, removing the
3533            unnecessary try/except block, and checking if the old group
3534            is the same as the new one (which happens a lot if there is
3535            no classification, or lots of shapes are in the same group).
3536    
3537            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
3538            around the redraw routine to try to catch problems that the user
3539            may create by selecting invalid projections for the data set and
3540            map. Clears the display if there are any problems and prints the
3541            error.
3542            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
3543            rectangle.
3544    
3545            * extensions/thuban/wxproj.cpp (project_point): First invert the
3546            supplied point (which should be in projected coordinates) using
3547            the layer's projection and then project the point using the
3548            map's projection.
3549            (project_points): Use project_point() to project each point.
3550    
3551    2003-04-30  Jan-Oliver Wagner <[email protected]>
3552    
3553            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
3554            don't set the Classification to None if the classfication field
3555            is None (ie only a DEFAULT).
3556    
3557    2003-04-30  Bernhard Herzog  <[email protected]>
3558    
3559            * Thuban/UI/view.py: Fix some typos.
3560    
3561            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
3562            not pop up the dialog if the selection becomes empty (this could
3563            happen if e.g. a new selection is opened while the identify tool
3564            is active and dialog had been closed)
3565    
3566    2003-04-30  Bernhard Herzog  <[email protected]>
3567    
3568            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
3569            instance variable read_record_last_result
3570            (TransientTableBase.read_record): Make sure reading the same
3571            record twice works. The implementation uses the new instance
3572            variable read_record_last_result
3573    
3574            * test/test_transientdb.py
3575            (TestTransientTable.test_transient_table_read_twice): New test
3576            case for the above bug-fix.
3577    
3578    2003-04-29  Jonathan Coles   <[email protected]>
3579    
3580            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
3581    
3582            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
3583    
3584            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
3585            (ClassTable.SetValueAsCustom): Rename keyword argument in
3586            ClassGroup* constructors to match argument name.
3587    
3588    2003-04-29  Bernhard Herzog  <[email protected]>
3589    
3590            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
3591            transient DB if it exists to make sure it doesn't leave a journal
3592            file in the temp directory.
3593    
3594            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
3595            self.conn to None after closing the connection to make sure it's
3596            not closed twice
3597    
3598    2003-04-29  Jonathan Coles   <[email protected]>
3599    
3600            Add a visible parameter in the layer XML tag. The default value is
3601            "true". If anything other than "false" is specified we also assume
3602            "true". Addresses RTbug #1025.
3603    
3604            * Doc/thuban.dtd: Add visible parameter to a layer.
3605    
3606            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
3607            of visible from 1 to True.
3608            (Layer.__init__): Change default value of visible from 1 to True.
3609    
3610            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
3611            parameter.
3612    
3613            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
3614            parameter.
3615    
3616            * test/test_load.py: Add new test data contents_test_visible.
3617            (LoadSessionTest.setUp): save test data.
3618            (LoadSessionTest.testLayerVisibility): Test if the visible flag
3619            is loaded correctly.
3620    
3621            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
3622            for saving an invisible layer.
3623    
3624    2003-04-29  Jonathan Coles   <[email protected]>
3625    
3626            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
3627            legend dialog box and tell it to change its map to the one
3628            supplied to SetMap(). Fixes RTbug #1770.
3629    
3630    2003-04-29  Bernhard Herzog  <[email protected]>
3631    
3632            Next step of table implementation. Introduce a transient database
3633            using SQLite that some of the data is copied to on demand. This
3634            allows us to do joins and other operations that require an index
3635            for good performance with reasonable efficiency. Thuban now needs
3636            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
3637            haven't tested that.
3638            
3639            * Thuban/Model/transientdb.py: New. Transient database
3640            implementation.
3641    
3642            * test/test_transientdb.py: New. Tests for the transient DB
3643            classes.
3644    
3645            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
3646            classes to help automatically remove temporary files and
3647            directories.
3648            (Session.__init__): New instance variables temp_dir for the
3649            temporary directory and transient_db for the SQLite database
3650            (Session.temp_directory): New. Create a temporary directory if not
3651            yet done and return its name. Use AutoRemoveDir to have it
3652            automatically deleted
3653            (Session.TransientDB): Instantiate the transient database if not
3654            done yet and return it.
3655    
3656            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
3657            AutoTransientTable so that data is copied to the transient DB on
3658            demand.
3659            (SimpleStore): New class that simply combines a table and a
3660            shapefile
3661    
3662            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
3663            DBFTable and update its doc-string to reflect the fact that this
3664            is only the table interface to a DBF file. Table is now an alias
3665            for DBFTable for temporary backwards compatibility.
3666    
3667            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
3668            the last reference to the session goes away so that the temporary
3669            files are removed properly.
3670    
3671            * test/test_load.py (LoadSessionTest.tearDown): Remove the
3672            reference to the session to make sure the temporary files are
3673            removed.
3674    
3675    2003-04-29  Bernhard Herzog  <[email protected]>
3676    
3677            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
3678            the __parser instance variable into a normal local variable in
3679            read. It's only used there and read will never be called more than
3680            once. Plus it introduces a reference cycle that keeps can keep the
3681            session object alive for a long time.
3682    
3683    2003-04-29  Jonathan Coles   <[email protected]>
3684    
3685            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
3686            Projection an immutable item. Fixes RTbug #1825.
3687            (Projection.__init__): Initialize instance variables here.
3688            (ProjFile.Replace): New. Replace the given projection object with
3689            the new projection object. This solves the problem of needing the
3690            mutator Projection.SetProjection() in the ProjFrame class and
3691            allows a projection to change parameters without changing its
3692            location in the file.
3693    
3694            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
3695            be of type wxSAVE and should verify overwriting a file.
3696    
3697            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
3698            ProjFile.Replace() method instead of the mutator
3699            Projection.SetProjection(). Also requires that we reassign the
3700            client data to the new projection.
3701    
3702            * test/test_proj.py (TestProjection.test): Test GetName() and
3703            GetAllParameters()
3704            (TestProjFile.test): Remove tests for Set*() methods. Add tests
3705            for Replace().
3706    
3707    2003-04-25  Jonathan Coles   <[email protected]>
3708    
3709            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
3710            to save the name of the projection.
3711    
3712            * test/test_save.py (SaveSessionTest.testLayerProjection): New
3713            test to verify layer projections are saved correctly.
3714    
3715    2003-04-25  Jonathan Coles   <[email protected]>
3716    
3717            * Thuban/Model/proj.py (Projection.SetName): Set the name
3718            to "Unknown" if name is None.
3719            (Projection.SetAllParameters): New. Set the projection's
3720            parameter list to the one supplied.
3721            (Projection.SetProjection): New. Set the projection's
3722            properties to those of the supplied Projection.
3723    
3724            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
3725            the dialog title to include the map's title.
3726            (MainWindow.LayerProjection): Set the dialog title to include
3727            the layer's title.
3728    
3729            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
3730            error dialogs into a single method call.
3731            (ProjFrame.__VerifyButtons): Add more states to check.
3732            (ProjFrame.__GetProjection): Return the current state of an
3733            edited projection or None.
3734            (ProjFrame.__FillAvailList): Remove checks for states that
3735            shouldn't exist.
3736            (ProjFrame._OnNew): Clear all selected items and supply
3737            a projection panel if necessary.
3738    
3739            * test/test_proj.py (TestProjFile.test): Add tests for
3740            ProjFile.SetAllParameters, ProjFile.SetProjection,
3741            ProjFile.SetName.
3742    
3743    2003-04-25  Jonathan Coles   <[email protected]>
3744    
3745            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
3746            takes an optional argument to select the current projection.
3747            This does not guarantee that the item is visible due to
3748            limited wxWindows functionality. Fixes RTBug #1821.
3749    
3750    2003-04-25  Jonathan Coles   <[email protected]>
3751    
3752            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
3753            the projection name and use it when constructing the Projection
3754            object.
3755    
3756            * Thuban/Model/proj.py (Projection.__init__): Change the default
3757            value for 'name' to None and then test if name is equal to None
3758            in the body of the constructor. This way the caller doesn't have to
3759            know what the default value should be. Namely, useful in load.py
3760            where we have to pick a default value if the 'name' parameter
3761            doesn't exist in the XML file.
3762    
3763            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
3764            Tests a file where a layer has a projection.
3765    
3766    2003-04-25  Jonathan Coles   <[email protected]>
3767    
3768            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
3769            tree for projection information.
3770    
3771            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
3772            XMLReader.GetFileName.
3773            (SessionLoader): Added support for loading projection tags that
3774            appear inside a layer.
3775    
3776            * Thuban/Model/proj.py (ProjFile): Document the class. Move
3777            back to using a list because the order of the projections in
3778            the file is important to maintain. Fixes RTbug #1817.
3779    
3780            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
3781            to ProjFile.GetFilename.
3782    
3783            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
3784            information.
3785    
3786            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
3787            ProjFrame._OnSaveAs. Removed old dead code from previous
3788            implementation.
3789            (ProjFrame._OnExport): Add support for exporting more than one
3790            projection to a single file.
3791            (ProjFrame.__FillAvailList): use string formatting (% operator)
3792            to build strings that are (partly) translated. Fixes RTbug #1818.
3793    
3794            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
3795            class.
3796    
3797    2003-04-24  Bernhard Herzog  <[email protected]>
3798    
3799            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
3800    
3801            * po/fr.po: New. French translation by Daniel Calvelo Aros
3802    
3803            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
3804            empty strings.
3805    
3806    2003-04-24  Jonathan Coles   <[email protected]>
3807    
3808            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
3809            implement the interface that the ProjFrame dialog expects.
3810    
3811            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
3812            name of the projection to be changed.
3813            (ProjFile): Use a dictionary instead of a list so that removing
3814            projections is easier and we are sure about uniqueness.
3815            (ProjFile.Remove): Remove the given projection object.
3816    
3817            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
3818            Return a list with only one projection file instead of searching for
3819            any projection file. This simplifies many things if the user can
3820            only have one system file and one user file.
3821    
3822            * Thuban/UI/classgen.py: Change all references to
3823            genCombo to genChoice.
3824    
3825            * Thuban/UI/mainwindow.py: Add a Projection option under the
3826            layer menu.
3827            (MainWindow.LayerProjection): New. Open up a projection window
3828            for a layer.
3829    
3830            * Thuban/UI/projdialog.py: Large changes to how the dialog is
3831            laid out. Use three panels instead of one. One for the list of
3832            projections, one for the edit controls, and one for the buttons.
3833            Fixed resizing problems so that the dialog resizes correctly
3834            when the projection panel changes. Added import/export, save, and
3835            new buttons/functionality.
3836    
3837    2003-04-24  Bernhard Herzog  <[email protected]>
3838    
3839            First step towards table management. Introduce a simple data
3840            abstraction so that we replace the data a layer uses more easily
3841            in the next step.
3842    
3843            * Thuban/Model/data.py: New file with a simple data abstraction
3844            that bundles shapefile and dbffile into one object.
3845    
3846            * Thuban/Model/session.py (Session.OpenShapefile): New method to
3847            open shapefiles and return a shape store object
3848    
3849            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
3850            object instead of a shapefile filename. This introduces a new
3851            instance variable store holding the datastore. For intermediate
3852            backwards compatibility keep the old instance variables.
3853            (open_shapefile): Removed. No longer needed with the shape store.
3854            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
3855            get the shape store used by a layer.
3856            (Layer.Destroy): No need to explicitly destroy the shapefile or
3857            table anymore.
3858    
3859            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
3860            (MainWindow.AddLayer): Use the session's OpenShapefile method to
3861            open shapefiles
3862    
3863            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
3864            session's OpenShapefile method to open shapefiles
3865    
3866            * test/test_classification.py
3867            (TestClassification.test_classification): Use the session's
3868            OpenShapefile method to open shapefiles and build the filename in
3869            a more platform independed way
3870    
3871            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
3872            Implement to have a session to use in the tests
3873            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
3874            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
3875            session's OpenShapefile method to open shapefiles
3876            (TestLayerLegend.setUp): Instantiate a session so that we can use
3877            it to open shapefiles.
3878            (TestLayerLegend.tearDown): Make sure that all references to
3879            layers and session are removed otherwise we may get a resource
3880            leak
3881    
3882            * test/test_map.py (TestMapAddLayer.test_add_layer)
3883            (TestMapWithContents.setUp): Instantiate a session so that we can
3884            use it to open shapefiles.
3885            (TestMapWithContents.tearDown): Make sure that all references to
3886            layers, maps and sessions are removed otherwise we may get a
3887            resource leak
3888            ("__main__"): use support.run_tests() so that more info about
3889            uncollected garbage is printed
3890    
3891            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
3892            session's OpenShapefile method to open shapefiles
3893            ("__main__"): use support.run_tests() so that more info about
3894            uncollected garbage is printed
3895    
3896            * test/test_selection.py (TestSelection.tearDown): Make sure that
3897            all references to the session and the selection are removed
3898            otherwise we may get a resource leak
3899            (TestSelection.get_layer): Instantiate a session so that we can
3900            use it to open shapefiles.
3901            ("__main__"): use support.run_tests() so that more info about
3902            uncollected garbage is printed
3903    
3904            * test/test_session.py (TestSessionBase.tearDown)
3905            (TestSessionWithContent.tearDown): Make sure that all references
3906            to the session and layers are removed otherwise we may get a
3907            resource leak
3908            (TestSessionWithContent.setUp): Use the session's OpenShapefile
3909            method to open shapefiles
3910    
3911    2003-04-24  Jonathan Coles   <[email protected]>
3912    
3913            * Thuban/Model/load.py (XMLReader.read): Should have been checking
3914            if the file_or_filename object had the 'read' attribute.
3915    
3916    2003-04-23  Jonathan Coles   <[email protected]>
3917    
3918            * Thuban/Model/resource.py: Fixes RTbug #1813.
3919            (ReadProjFile): Add documentation about which exceptions are raised.
3920            Always pass the exceptions up to the caller.
3921            (GetProjFiles): If the directory can't be read return an empty list.
3922            If any of the proj files can't be read skip that file and go
3923            on to the next one.
3924    
3925            * test/test_proj.py: Added test cases to handle nonexistent files,
3926            unreadable files, and files that don't parse correctly.
3927    
3928    2003-04-23  Jonathan Coles   <[email protected]>
3929    
3930            Projection dialog. Allows the user to select from a list
3931            of projection templates and optionally edit them and save new ones.
3932    
3933            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
3934            (ProjPanel): Base class for projection specific panels.
3935            (TMPanel): Projection panel for Transverse Mercartor.
3936            (UTMPanel): Projection panel for Universal Transverse Mercartor.
3937            (LCCPanel): Projection panel for Lambert Conic Conformal.
3938            (GeoPanel): Projetion panel for Geographic Projection.
3939    
3940    2003-04-23  Jonathan Coles   <[email protected]>
3941    
3942            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
3943            promote symmetry. There now exists XMLReader and XMLWriter.
3944            (XMLReader.read): New. Call to read the given file descriptor or
3945            filename.
3946            (XMLReader.close): New. Make sure the file is closed.
3947            (XMLReader.GetFileName): New. Return just the file name that is being
3948            read from.
3949            (XMLReader.GetDirectory): New. Return just the directory of the file
3950            that is being read.
3951            (XMLReader.AddDispatchers): New. Take a dictionary which contains
3952            the names of functions to call as the XML tree is parsed.
3953            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
3954            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
3955            (SessionLoader): Removed class variables start_dispatcher and
3956            end_dispatcher since this functionality is now part of a class
3957            instance. Fixes RTbug #1808.
3958            (SessionLoader.__init__): Add dispatcher functions.
3959            (load_xmlfile): Code was moved into the XMLReader.read().
3960            (load_session): Use modified SessionLoader.
3961    
3962            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
3963            map's projection.
3964    
3965            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
3966            GetAllParameters.
3967            (Projection.GetParameter): Returns the value for the given parameter.
3968    
3969            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
3970            (GetProjFiles): Renamed from GetProjections. Now returns a list
3971            of ProjFile objects.
3972            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
3973            a list of ProjFile objects whose files are not user defined.
3974            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
3975            list of ProjFile objects whose files are user defined.
3976            (ProjFileReader): Extend new XMLReader.
3977    
3978            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
3979            promote symmetry.
3980    
3981            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
3982            control instead of a wxComboBox. wxChoice controls do not generate
3983            events as the uses highlights possible choices which fixes problems
3984            with resizing the dialog when the use selects an option.
3985    
3986            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
3987            control instead of a wxComboBox.
3988    
3989            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
3990            dialog.
3991    
3992            * test/test_proj.py (TestProjection.test): New tests for GetParameter
3993            method.
3994    
3995    2003-04-22  Bernhard Herzog  <[email protected]>
3996    
3997            * Thuban/UI/mainwindow.py: Remove some unused imports and global
3998            constants
3999    
4000            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
4001            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
4002    
4003    2003-04-17  Bernhard Herzog  <[email protected]>
4004    
4005            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
4006            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
4007            anymore.
4008            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
4009            (Layer.ShapeType, Layer.Shape): No need to call
4010            self.open_shapefile since it's always called in __init__
4011    
4012            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
4013            In wxPython 2.4 there's no need to extend MainLoop anymore since
4014            wxPython itself makes sure OnExit is called.
4015    
4016    2003-04-16  Jonathan Coles   <[email protected]>
4017    
4018            Initial putback of projection management code. Includes new
4019            classes to read and write projection files. The current load
4020            and save classes were abstracted a bit so they could be reused.
4021            The Projection class was extended to provide new methods and
4022            have a name.
4023    
4024            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
4025            general XML reading methods that were part of ProcessSession.
4026    
4027            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
4028            name.
4029            (ProjFile): New. Represents a file that contains projection
4030            information.
4031    
4032            * Thuban/Model/resource.py: New. Contains general utilities
4033            for read and writing projection files.
4034    
4035            * Thuban/Model/save.py (XMLSaver): New. Contains all the
4036            general XML writing methods that were part of SessionSaver.
4037            (SessionSaver): Renamed from Saver.
4038    
4039            * test/test_proj.py: New test cases for the projection
4040            file read and write functions.
4041    
4042    2003-04-16  Jonathan Coles   <[email protected]>
4043    
4044            * Thuban/Model/classification.py: Use repr() around values
4045            in the ClassGroup*.__repr__() methods so it is clearer when
4046            a value is a string and when it is a number.
4047    
4048            * test/test_load.py: Rework the classification test to test
4049            that we can load old files.
4050            (testLabels): Test a file where the groups have labels.
4051    
4052    2003-04-16  Bernhard Herzog  <[email protected]>
4053    
4054            Safer implementation of the performance enhancements of the
4055            low-level renderer:
4056            
4057            * extensions/thuban/wxproj.cpp (extract_projection)
4058            (extract_pointer): Rename extract_projection to extract_pointer
4059            and redefine its purpose to return the pointer stored in a CObject
4060            returned by the object's cobject method. Update all callers.
4061            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
4062            handling of these low-level parameters so that each s_draw_info
4063            instance is handled as a CObject at python level that also
4064            contains real references to the actual python objects which
4065            contain the values in the struct. Add free_draw_info as the
4066            destructor.
4067            (draw_polygon_shape): Add the py_draw_info parameter which must a
4068            cobject containing an s_draw_info pointer.
4069    
4070            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
4071            method to instantiat the low-level render parameter
4072            (MapRenderer.draw_shape_layer): Use the new method. Remove some
4073            commented out code.
4074            (MapRenderer.draw_polygon_shape): Make the first parameter not the
4075            layer but the low-level render parameter
4076            (ScreenRenderer.draw_shape_layer): Use the low-level render
4077            parameter.
4078    
4079    2003-04-15  Jonathan Coles   <[email protected]>
4080    
4081            * Thuban/Model/classification.py: Implemented __repr__ for
4082            the ClassGroup* classes to make debugging a bit easier.
4083            (ClassGroup.SetLabel): Check that the string is an instance
4084            of StringTypes not StringType. Accounts for Unicode strings.
4085    
4086            * Thuban/Model/color.py: Implemented __repr__ to make
4087            debugging a bit easier.
4088    
4089            * Thuban/Model/save.py (Saver.write_classification): Need to
4090            save the group label.
4091    
4092            * test/test_load.py (testClassification): New. Loads the
4093            iceland_sample_test.thuban file and checks if it was loaded
4094            correctly.
4095    
4096    2003-04-15  Jonathan Coles   <[email protected]>
4097    
4098            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
4099            to improve rendering performance by initializing the variables
4100            that are not change each time draw_polygon_shape() is called.
4101            The values are stored in a global struct draw_info.
4102            (draw_polygon_shape): Removed initialization code that is
4103            now in draw_polygon_init().
4104    
4105            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
4106            drawing initialization call to draw_polygon_init()
4107            (MapRenderer.draw_polygon_shape): Use new signature of
4108            draw_polygon_shape.
4109    
4110            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
4111            weirdness by setting the range to (1, maxint).
4112    
4113            * Thuban/Model/classification.py (ClassGroupProperties): Make
4114            instance variables private and optimize comparison operator
4115            by first checking if the color references are the same.
4116            (ClassGroupSingleton): Make instance variables private.
4117            (ClassGroupRange): Make instance variables private.
4118    
4119            * HOWTO-Release: Filled in missing steps for releasing packages.
4120    
4121    2003-04-15  Bernhard Herzog  <[email protected]>
4122    
4123            First stab at internationalized messages:
4124    
4125            * Thuban/__init__.py (_): Implement the translation function for
4126            real using the python gettext module.
4127    
4128            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
4129            translate empty strings.
4130    
4131            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4132            Add a missing space to a warning message
4133    
4134            * po/README: New. Notes about the management of the translation
4135            files.
4136    
4137            * po/Makefile: New. Makefile to help manage the translation files.
4138    
4139            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
4140    
4141            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
4142            translations and support files in po/
4143    
4144            * setup.py (data_files): Add the *.mo files to the data_files too
4145    
4146            * README: Add note about the translations when building from CVS
4147    
4148    2003-04-14  Jonathan Coles   <[email protected]>
4149    
4150            * Thuban/UI/dock.py: Fixes some window resizing problems most
4151            noticable under windows. Always assume the button bitmaps will
4152            be there. Code clean up.
4153            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
4154            images for the dock/undock button to the same images.
4155            Work around for RTbug #1801.
4156    
4157            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
4158            be allowed to grow within the sizer. Fixes a bug under Windows
4159            where the toolbar wasn't being drawn.
4160    
4161    2003-04-14  Frank Koormann   <[email protected]>
4162    
4163            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
4164            Updated design to try to make the button functionality more
4165            transparent.
4166    
4167    2003-04-14  Jonathan Coles   <[email protected]>
4168    
4169            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
4170            finalize the intialization of the panel.
4171    
4172            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
4173            creation of the panel. Should be the last thing called in the
4174            initializer of a subclass.
4175    
4176            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
4177            set the current selections in the combo boxes. This is needed
4178            under Windows.
4179    
4180            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
4181            level panel to the dialog so that the background colors are
4182            consistent under Windows.
4183    
4184    2003-04-11  Jonathan Coles   <[email protected]>
4185    
4186            * Thuban/UI/classgen.py: Change color ramps to start at white
4187            not black.
4188    
4189            * Thuban/UI/legend.py: Enable/disable the legend buttons when
4190            the legend changes. Fixes RTbug #1793.
4191    
4192            * test/test_classification.py: Added test for copying of
4193            classifications.
4194    
4195    2003-04-11  Jonathan Coles   <[email protected]>
4196    
4197            * Thuban/UI/resource.py: New. Centralize the loading of resources
4198            such as bitmaps.
4199    
4200            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
4201            added images to the move buttons, added 'reverse' button.
4202            (CustomRampPanel.__init__): Added images to the move buttons.
4203            (GreyRamp): New. Generates a ramp from white to black.
4204            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
4205    
4206            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
4207            ID_PROPERTY_*.
4208            (Classifier.__init__): Minor changes to the layout.
4209            (Classifier._OnTitleChanged): Listen for when the user edits the
4210            title and update the dialog's title and the layer's title.
4211    
4212            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
4213    
4214            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
4215            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
4216            if the layer's title changes.
4217    
4218            * Thuban/UI/mainwindow.py: Added new menu item and associated code
4219            to open a dialog to rename the map.
4220            (MainWindow): Use new resource class to import bitmaps.
4221    
4222    2003-04-11  Jonathan Coles   <[email protected]>
4223    
4224            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
4225            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
4226            Resources/Bitmaps/group_use_none.xpm,
4227            Resources/Bitmaps/group_use_not.xpm,
4228            Resources/Bitmaps/hide_layer.xpm,
4229            Resources/Bitmaps/layer_properties.xpm,
4230            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
4231            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
4232            New.
4233    
4234    2003-04-10  Jonathan Coles   <[email protected]>
4235    
4236            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
4237            Should pass group to ClassGroup constructor.
4238    
4239    2003-04-10  Jonathan Coles   <[email protected]>
4240    
4241            * Thuban/Model/classification.py: (ClassGroup): Move all the common
4242            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
4243            here. Implement SetVisible(), IsVisible().
4244            (ClassGroup.__init__): Add group parameter which acts as a copy
4245            constructor.
4246    
4247            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
4248            "Visible" check boxes.
4249            (Classifier): Rename the buttons and refactor the code to match
4250            the new labels.
4251    
4252            * Thuban/UI/legend.py: Classify button is now called "Properties".
4253            Refactored the code to change variable names.
4254            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
4255    
4256            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
4257            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
4258            renamed to MainWindow.LayerEditProperties.
4259            (MainWindow.ToggleLegend): Don't include map name in legend title.
4260            (MainWindow.SetMap): Added the map name to the window title.
4261            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
4262            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
4263            Functionality is found in the layer properties dialog.
4264    
4265            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
4266            draw visible groups.
4267    
4268    2003-04-09  Jonathan Coles   <[email protected]>
4269    
4270            * Thuban/UI/classgen.py: Modifications to allow simple
4271            addition and selection of new color schemes.
4272            (MonochromaticRamp): New. Generates a ramp between two colors.
4273            (RedRamp): New. Generates a ramp of all red.
4274            (GreenRamp): New. Generates a ramp of all green.
4275            (BlueRamp): New. Generates a ramp of all blue.
4276    
4277    2003-04-09  Jonathan Coles   <[email protected]>
4278    
4279            * Thuban/Model/classification.py (Classification.__deepcopy__):
4280            Need to copy over field and fieldType attributes.
4281    
4282            * Thuban/Model/table.py (Table.field_range): New. Retrive the
4283            maximum and minimum values over the entire table for a given
4284            field.
4285            (Table.GetUniqueValues): New. Retrieve all the unique values
4286            in the table for a given field.
4287    
4288            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
4289            (GenUniquePanel): New. Controls to allow the user to select
4290            which unique field values they would like in the classification.
4291            (CustomRampPanel): Code that was in ClassGenDialog that allows
4292            the user to select the properties for a custom ramp.
4293            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
4294    
4295            * Thuban/UI/classifier.py: Removed a lot of debugging code.
4296            (Classifier._SetClassification): Callback method so that the
4297            class generator can set the classification in the grid.
4298            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
4299            editing of a group properties class into a wxWindows control.
4300    
4301            * Thuban/UI/dock.py: It was decided that if the user closes
4302            a dockable window the window should simply hide itself. That
4303            way if the user wants to show the dock again it appears in the
4304            same place as it was when it was closed.
4305            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
4306            (DockableWindow._OnButtonClose): Hide the window instead of
4307            destroying it.
4308            (DockableWindow._OnClose): Hide the window instead of
4309            destroying it.
4310    
4311            * Thuban/UI/legend.py (LegendTree): Use a private method to
4312            consistently set the font and style of the text. Fixes RTbug #1786.
4313    
4314            * Thuban/UI/mainwindow.py: Import just the Classifier class.
4315    
4316    2003-04-07  Bernhard Herzog  <[email protected]>
4317    
4318            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
4319            to the map module
4320    
4321    2003-04-07  Bernhard Herzog  <[email protected]>
4322    
4323            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
4324            favor of ToggleSessionTree
4325            (MainWindow.ToggleSessionTree): New method to toggle visibility of
4326            the session tree.
4327            (MainWindow.SessionTreeShown): New method to return whether the
4328            session tree is currently shown.
4329            (MainWindow.ToggleLegend): New method to toggle visibility of the
4330            legend
4331            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
4332            LegendShown
4333            (MainWindow.LegendShown): New method to return whether the legend
4334            is currently shown.
4335            (_method_command): Add checked parameter so we can define check
4336            menu items
4337            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
4338            mainwindow methods.
4339            (show_session_tree, show_legend commands): Removed.
4340            (toggle_session_tree, toggle_legend commands): New commands to
4341            toggle the visibility of the dialogs
4342    
4343    2003-04-07  Jonathan Coles   <[email protected]>
4344    
4345            * Thuban/UI/classgen.py: Fix Windows problem.
4346    
4347            * Thuban/UI/dock.py: Fix Windows problem.
4348    
4349            * Thuban/UI/mainwindow.py: Use False instead of false.
4350            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
4351    
4352    2003-04-07  Jonathan Coles   <[email protected]>
4353    
4354            Since we now say that the order of the groups in a classification
4355            matters, it makes sense to be able to manipulate that order. Most
4356            of the changes to Thuban/Model/classification.py are to that end.
4357    
4358            * Thuban/Model/classification.py (Classification.AppendGroup,
4359            Classification.InsertGroup, Classification.ReplaceGroup,
4360            Classification.RemoveGroup, Classification.GetGroup): Do as the
4361            names imply.
4362            (Classification.FindGroup): This was called GetGroup, but GetGroup
4363            takes an index, while FindGroup takes a value.
4364            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
4365            REFERENCE. Currently there is a cyclic reference between the layer
4366            and its classification. If the classification doesn't need to know
4367            its owning layer we can change this, since it may make sense to be
4368            able to use the same classification with different layers.
4369    
4370            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
4371    
4372            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
4373            not AddGroup()
4374    
4375            * Thuban/UI/classifier.py: Now that we can depend on the order in
4376            a Classification and have methods to manipulate that order we don't
4377            need to use our own data structures in the grid. We can simply make
4378            the grid/table access the information they need from a copy of
4379            the classification object.
4380            (Classifier._OnCloseBtn): Event handler for when the user clicks
4381            'Close'. This is needed so if the user applies changes and then
4382            continues to change the table the user has the option of discarding
4383            the most recent changes and keeping what they applied.
4384    
4385            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
4386            into the same group.
4387    
4388            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
4389            with a really old version of proj, PJ_VERSION won't even be defined.
4390            If it isn't defined then just compile so that the function always
4391            returns Py_False.
4392    
4393            * test/test_classification.py: Fix tests to use the renamed methods.
4394            Still need to write tests for the new methods.
4395    
4396    2003-04-04  Jonathan Coles   <[email protected]>
4397    
4398            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
4399            call to SetSelection out of the method and before the call
4400            to __SelectField in __init__. This prevents a recursion of events
4401            when _OnFieldSelect is triggered by the user.
4402    
4403    2003-04-04  Jonathan Coles   <[email protected]>
4404    
4405            * Thuban/Model/classification.py: Rename Color.None to
4406            Color.Transparent.
4407            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
4408            Don't bother copying the color, since Colors are immutable.
4409    
4410            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
4411            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
4412            Thuban/UI/renderer.py, Thuban/UI/view.py:
4413            Rename Color.None to Color.Transparent.
4414        
4415            * test/test_classification.py, test/test_load.py: Rename Color.None
4416            to Color.Transparent.
4417    
4418    2003-04-04  Jonathan Coles   <[email protected]>
4419    
4420            * Thuban/Model/classification.py: Fix assert calls.
4421            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
4422            Copy the color parameter rather than hold onto a reference.
4423    
4424            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
4425            the color object.
4426            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
4427            are sure there exists only one refernce to Color.None in the system.
4428            This allows us to use 'is' rather than the comparision functions.
4429            
4430            * Thuban/Model/save.py: Fix assert calls.
4431            
4432            * Thuban/UI/classifier.py: Fix assert calls.
4433            (ClassGrid._OnCellDClick): Call up to the classifier to open the
4434            dialog to edit the groups properties.
4435            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
4436            correctly if a cell is resized.
4437            (ClassTable.SetClassification): New. Changes the classification
4438            that is in the table.
4439            (ClassTable.__SetRow): Allow groups to be prepended.
4440            (Classifier): New code for opening the EditProperties and
4441            GenerateRanges dialogs.
4442            (SelectPropertiesDialog.__GetColor): Only set the color in the
4443            color dialog if the current color is not None.
4444            
4445            * Thuban/UI/dock.py: Fix assert calls.
4446            
4447            * Thuban/UI/legend.py: Fix assert calls.
4448            
4449            * Thuban/UI/renderer.py: Fix assert calls.
4450            
4451            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
4452            classifications.
4453            (GenRangePanel): Panel specific to range generation.
4454            (GenSingletonPanel): Panel specific to singleton generation.
4455            (ClassGenerator): Class responsible for actually generating
4456            the classification from the data gathered in the dialog box.
4457            (PropertyRamp): Generates properties whose values range from
4458            a starting property to an ending property.
4459    
4460    2003-04-03  Bernhard Herzog  <[email protected]>
4461    
4462            * test/support.py (print_garbage_information): New function that
4463            prints information about still connected messages and memory
4464            leaks.
4465            (run_suite): Removed.
4466            (run_tests): New function for use as a replacement of
4467            unittest.main in the test_* files. This one calls
4468            print_garbage_information at the end.
4469    
4470            * test/runtests.py (main): Use support.print_garbage_information
4471    
4472            * test/test_layer.py: Use support.run_tests instead of
4473            unittest.main so we get memory leak information
4474            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4475            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
4476            (TestLayerLegend.test_visibility): Call the layer's Destroy method
4477            to fix a memory leak.
4478    
4479            * test/test_classification.py: Use support.run_tests instead of
4480            unittest.main so we get memory leak information
4481            (TestClassification.test_classification): Call the layer's Destroy
4482            method to fix a memory leak.
4483    
4484  2003-04-02  Bernhard Herzog  <[email protected]>  2003-04-02  Bernhard Herzog  <[email protected]>
4485    
4486          * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):          * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):

Legend:
Removed from v.595  
changed lines
  Added in v.1586

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26