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

Legend:
Removed from v.370  
changed lines
  Added in v.1584

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26