/[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 803 by jonathan, Wed Apr 30 17:07:01 2003 UTC revision 1548 by bh, Tue Aug 5 12:39:16 2003 UTC
# Line 1  Line 1 
1    2003-08-05  Bernhard Herzog  <[email protected]>
2    
3            * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
4            object look like a Color instantiation. Formerly it looked like a
5            tuple.
6    
7            * test/test_color.py (TestColor.test_repr)
8            (TestColor.test_equality, TestColor.test_inequality): New. test
9            some more apects of the Color class
10            (TestTransparent.test_repr, TestTransparent.test_hex)
11            (TestTransparent.test_equality): New. Test cases for the
12            Transparent object.
13    
14    2003-08-04  Jan-Oliver Wagner <[email protected]>
15    
16            * Doc/manual/thuban-manual.xml: a number of small improvements.
17            The resulting file is the version submitted for GREAT-ER II.
18    
19    2003-08-01  Bernhard Herzog  <[email protected]>
20    
21            * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
22            Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
23            Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
24    
25            * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
26            (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
27            (ThubanEndBusyCursor): Add doc-strings
28    
29    2003-08-01  Bernhard Herzog  <[email protected]>
30    
31            First step towards PostGIS integration. More abstraction by movin
32            more code from the layer to the shapestore. More methods of the
33            layer are now simply delegated to the equivalent method of the
34            shapestore. The SHAPETYPE_* constants are now in data not in
35            layer.
36    
37            * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
38            (SHAPETYPE_POINT, Shape): Move these constants and classes from
39            layer.py to data.py
40            (ShapefileStore.__init__): More Initialization for the new methods
41            and functionality.
42            (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
43            (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
44            (ShapefileStore.Shape): New methods that were formerly implemented
45            in the layer.
46            (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
47            (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
48            (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
49            equivalents of the new shape methods. These versions are simply
50            delegated to the original shapstore.
51    
52            * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
53            (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
54            (Layer.SetShapeStore): Removed the initializatin of instance
55            variables that were needed for the stuff that's now in
56            ShapefileStore
57            (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
58            (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
59            shapestore.
60    
61            * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
62            Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
63            instead of layer.
64    
65            * test/test_shapefilestore.py: New. Tests for ShapefileStore.
66    
67            * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
68    
69            * test/test_layer.py: Import the SHAPETYPE_* constants from data
70            instead of layer.
71            (TestLayer.test_derived_store): Remove the test for the exception
72            when instantiating the DerivedShapeStore with an incompatible
73            table which is now in test_derivedshapestore.py. Add some more
74            tests of the layer methods to determine whether they work for a
75            DerivedShapeStore as well.
76    
77    2003-07-31  Jonathan Coles   <[email protected]>
78    
79            * Doc/manual/thuban-manual.xml: Fix the list of required packages
80            by just listing the name and where they can be found.
81    
82    2003-07-31  Frank Koormann   <[email protected]>
83    
84            * Doc/manual/thuban-manual.xml:
85            Changed the screenshot elements to figure.
86            Changed some variablelist elements to itemizedlist.
87            Added section on GDAL formats.
88    
89    2003-07-31  Jonathan Coles   <[email protected]>
90    
91            * Doc/manual/thuban-manual.xml: Added a few sentences about
92            the Fix Border Color option when generating classes.
93    
94    2003-07-30  Jonathan Coles   <[email protected]>
95    
96            * Thuban/Model/classgen.py: Add docstrings. Rename specific
97            Ramp instances to use lower_case_style.
98    
99            * Thuban/UI/classgen.py: Use renamed Ramp instances.
100            
101            * Thuban/UI/classifier.py: Add docstrings.
102    
103            * Thuban/UI/dock.py: Add docstrings.
104    
105            * test/test_classgen.py: Use renamed Ramp instances.
106    
107    2003-07-30  Bernhard Herzog  <[email protected]>
108    
109            * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
110            was never used in Thuban.
111    
112    2003-07-30  Bernhard Herzog  <[email protected]>
113    
114            * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
115            method directly instead of going through the transient_table
116            method. This faster because transient_table may force the copy of
117            a DBF file into the transient database and setting a table's title
118            doesnm't affect the title of the associated transient table, so
119            this fixes RT #2042
120    
121            * Thuban/UI/main.py (__version__): Don't import the already
122            removed show_exception_dialog.
123    
124    2003-07-29  Jonathan Coles   <[email protected]>
125    
126            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
127            Put back this method and remove the equivalent function since we
128            are setting the exception hook from within this class (OnInit).
129    
130    2003-07-29  Jonathan Coles   <[email protected]>
131    
132            * Doc/manual/images/5_2_custom_ramp.png,
133            Doc/manual/images/5_2_quantiles.png,
134            Doc/manual/images/5_2_uniform_dist.png,
135            Doc/manual/images/5_2_unique_values.png,
136            Doc/manual/images/8_int_error.png: New screen shots.
137    
138            * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
139            some points, and added more screen shots.
140    
141    2003-07-29  Bernhard Herzog  <[email protected]>
142    
143            * Thuban/Model/data.py: Remove the now unused import of warnings
144    
145    2003-07-29  Bernhard Herzog  <[email protected]>
146    
147            * Thuban/Model/data.py (SimpleStore): Removed. This class has been
148            deprecated since before the 0.8 release and isn't used in Thuban
149            itself anymore.
150    
151            * Thuban/Model/transientdb.py: Remove some unnecessary imports
152    
153    2003-07-29  Jonathan Coles   <[email protected]>
154    
155            * Thuban/UI/application.py (ThubanApplication.OnInit): set the
156            python exception hook here so that we are sure to catch any
157            Thuban exception that happen during initialization.
158    
159            * Thuban/UI/main.py (main): Don't set the exception hook here,
160            it will get set in ThubanApplication.OnInit.
161    
162    2003-07-29  Jonathan Coles   <[email protected]>
163                                                                                
164            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
165            Removed and called it show_exception_dialog() so that the exception
166            handler can be set before the class is created.
167                                                                                
168            * Thuban/UI/main.py (main): Install the exception handler before
169            a ThubanApplication is created.
170                                                                                    
171    2003-07-29  Bernhard Herzog  <[email protected]>
172    
173            * po/it.po: New. Italian translation by Maurizio Napolitano
174    
175            * po/ru.po: New. Russian translation by Alex Shevlakov
176    
177    2003-07-29  Frank Koormann   <[email protected]>
178    
179            * Doc/manual/thuban-manual.xml: Extended section on supported
180            projections.
181            
182    2003-07-29  Frank Koormann   <[email protected]>
183    
184            * Doc/manual/thuban-manual.xml: gaspell-checked.
185    
186    2003-07-29  Jonathan Coles   <[email protected]>
187    
188            * Doc/manual/images/3_5_legend.png: Added border to improve look
189            on white background.
190    
191    2003-07-29  Jonathan Coles   <[email protected]>
192    
193            * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
194            descriptions for the legend toolbar.
195    
196            * Doc/manual/images/4_2_raster_layer_properties.png: Removed
197            cursor from dialog box.
198    
199    2003-07-28  Jonathan Coles   <[email protected]>
200    
201            * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
202    
203            * Doc/manual/images/2_4_session_tree.png,
204            Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
205            Doc/manual/images/4_2_layer_properties.png,
206            Doc/manual/images/4_2_raster_layer_properties.png,
207            Doc/manual/images/5_3_genclass.png,
208            Doc/manual/images/5_classification.png,
209            Doc/manual/images/6_projection.png,
210            Doc/manual/images/7_1_table_view.png,
211            Doc/manual/images/7_2_5_join.png: New screenshots.
212    
213    2003-07-24  Jonathan Coles   <[email protected]>
214    
215            * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
216    
217    2003-07-24  Jonathan Coles   <[email protected]>
218    
219            * Doc/manual/thuban-manual.xml: Added EPS images and wrote
220            chapter on Layer Management.
221    
222            * Doc/manual/Makefile: New. Makefile to generate all formats for the
223            manual and images.
224    
225    2003-07-24  Bernhard Herzog  <[email protected]>
226    
227            * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
228            it annoys lintian which warns about these files not being
229            executable. The #1 isn't necessary here since if you absolutely
230            must execute them you can always say "python <filename>".
231    
232            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
233            superfluous code to set brush and pen for point shapes
234    
235            * Thuban/UI/viewport.py: Remove commented out code that wouldn't
236            belong in viewport anyway
237    
238    2003-07-24  Frank Koormann   <[email protected]>
239    
240            * Doc/manual/thuban-manual.xml: Added section on table management.
241    
242    2003-07-24  Bernhard Herzog  <[email protected]>
243    
244            * test/runtests.py (main): Recognize the long "verbose" option
245            correctly.
246    
247    2003-07-22  Jonathan Coles   <[email protected]>
248    
249            * Doc/manual/thuban-manual.xml: Continue to write first revision
250            of the manual.
251    
252            * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
253            with Begin/EndDrawing() calls to ensure we aren't doing to
254            many updates to the dc during rendering.
255            (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
256            a pen and brush argument so they need to be passed to the function.
257    
258            * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
259            Calculates the minimum and maximum scale values. Factored out
260            of set_view_transform so that it could be used to zoom all the
261            way into a single point.
262            (ViewPort.set_view_transform): Call calc_min_max_scales().
263            (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
264            if only a single point is selected.
265    
266            * Doc/manual/images/1_2_legend_close.png,
267            Doc/manual/images/1_2_legend_dock.png,
268            Doc/manual/images/1_2_mainwindow.png,
269            Doc/manual/images/1_2_mainwindow.ps,
270            Doc/manual/images/1_2_mainwindow.sk,
271            Doc/manual/images/3_2_fullextent.png,
272            Doc/manual/images/3_2_fulllayerextent.png,
273            Doc/manual/images/3_2_fullshapeextent.png,
274            Doc/manual/images/3_2_pan.png,
275            Doc/manual/images/3_2_zoomin.png,
276            Doc/manual/images/3_2_zoomout.png,
277            Doc/manual/images/3_3_identify.png,
278            Doc/manual/images/3_3_label.png,
279            Doc/manual/images/3_5_invisible.png,
280            Doc/manual/images/3_5_movedown.png,
281            Doc/manual/images/3_5_moveup.png,
282            Doc/manual/images/3_5_props.png,
283            Doc/manual/images/3_5_tobottom.png,
284            Doc/manual/images/3_5_totop.png,
285            Doc/manual/images/3_5_visible.png: New. Images for the documentation.
286    
287    2003-07-18  Bernhard Herzog  <[email protected]>
288    
289            * Thuban/UI/messages.py (MAP_REPLACED): New message.
290    
291            * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
292            after the new map has been assigned
293    
294            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
295            Delegate MAP_REPLACED to the canvas too
296            (MainWindow.prepare_new_session): Removed. Thanks to the new
297            MAP_REPLACED message it's no longer needed
298            (MainWindow.OpenSession, MainWindow.NewSession):
299            prepare_new_session has been removed.
300    
301            * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
302            MAP_REPLACED so that we can close the dialog if a new map is set.
303            (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
304            (Classifier.map_replaced): Handle MAP_REPLACED by closing the
305            dialog
306    
307            * test/test_viewport.py (SimpleViewPortTest)
308            (SimpleViewPortTest.test_default_size): Add doc-strings
309            (ViewPortTest.setUp): Bind map to self.map so we can use it in
310            tests. Subscribe to MAP_REPLACED messages too.
311            (ViewPortTest.tearDown): No need to explicitly unsubscribe
312            (ViewPortTest.test_set_map): New test for the SetMap method.
313    
314    2003-07-18  Bernhard Herzog  <[email protected]>
315    
316            * test/test_viewport.py (SimpleViewPortTest.test_default_size):
317            Move this test from ViewPortTest.setUp to this new separate test
318            case. setUp is not the place for the actual tests.
319            (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
320            more of the test from setUp to the new test test_inital_settings.
321            (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
322            (ViewPortTest.test_proj_conv): Split test_proj_conv into
323            test_win_to_proj and test_proj_to_win and make the tests easier to
324            understand
325            (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
326            (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
327            (ViewPortTest.test_unprojected_rect_around_point)
328            (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
329            Reformat to increase readability.
330    
331    2003-07-18  Bernhard Herzog  <[email protected]>
332    
333            * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
334    
335    2003-07-18  Bernhard Herzog  <[email protected]>
336    
337            * test/runtests.py: The test suite can now be run without an X
338            connection. To make sure this remains true, remove the DISPLAY
339            environment variable so that an error occurs if the wxGTK is
340            imported accidentally
341    
342    2003-07-18  Bernhard Herzog  <[email protected]>
343    
344            * Thuban/UI/viewport.py: Remove unused imports
345    
346            * Thuban/UI/view.py: Remove unused imports
347    
348    2003-07-18  Bernhard Herzog  <[email protected]>
349    
350            * test/test_export.py Remove unused imports. The OutputTransform
351            function is now in viewport.py and is called output_transform
352            (TestScalebar.test_output_transform)
353            (TestScalebar.test_OutputTransform): Renamed to
354            test_output_transform and updated to use output_transform instead
355            of OutputTransform
356    
357            * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
358            renamed.
359            (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
360            renamed to output_transform
361    
362            * Thuban/UI/viewport.py (OutputTransform, output_transform):
363            Rename to output_transform
364    
365    2003-07-18  Bernhard Herzog  <[email protected]>
366    
367            * Thuban/Model/layer.py (Layer.__init__): Rename
368            classificationField to classificatin_column and init it here so
369            that it can be used in SetClassificationColumn
370            (Layer.GetClassificationColumn, Layer.GetClassificationField):
371            Rename to GetClassificationColumn.
372            (Layer.SetClassificationColumn, Layer.SetClassificationField):
373            Rename to SetClassificationColumn and issue a LAYER_CHANGED
374            message if the column changes.
375            (Layer._classification_changed, Layer.ClassChanged): Rename to
376            _classification_changed. Update the callers.
377            (Layer.SetShapeStore): Further field->column renames.
378    
379            * Thuban/Model/load.py (SessionLoader.start_classification)
380            (SessionLoader.start_clpoint): Updates because of
381            field->column method name changes in the Layer class
382    
383            * Thuban/Model/save.py (SessionSaver.write_classification): Updates
384            because of field->column method name changes in the Layer class
385    
386            * Thuban/UI/classifier.py (Classifier.__init__)
387            (Classifier._OnTry, Classifier._OnRevert): Updates because of
388            field->column method name changes in the Layer class
389    
390            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
391            because of field->column method name changes in the Layer class
392    
393            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
394            of field->column method name changes in the Layer class
395    
396            * test/test_save.py (SaveSessionTest.testClassifiedLayer)
397            (SaveSessionTest.testClassifiedLayer): Update because of
398            field->column method name changes in the Layer class
399    
400            * test/test_layer.py (SetShapeStoreTests.setUp)
401            (SetShapeStoreTests.test_sanity): Update because of field->column
402            method name changes in the Layer class
403            (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
404            (TestLayerModification.test_sanity)
405            (TestLayerModification.test_initial_settings): remove unsued code
406            and rename to test_sanity.
407            (TestLayerModification.test_set_classification): New test for
408            SetClassification and SetClassificationField.
409    
410    2003-07-18  Bernhard Herzog  <[email protected]>
411    
412            * test/test_classgen.py (TestFixedRamp.test): Extend test to check
413            the non-fixed values as well. The old test would have accepted a
414            fixed ramp that only returnes the fixed properties
415    
416    2003-07-17  Jonathan Coles   <[email protected]>
417    
418            * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
419            shots for the manual. The XCF file is the source image and
420            has additional layers to support changes.
421    
422            * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
423    
424            * Thuban/UI/classifier.py (Classifier.__BuildClassification):
425            Return both the new class and the field name.
426    
427            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
428            fit the map to the window as this changes any zoom level that
429            the user may have set.
430    
431    2003-07-16  Jonathan Coles   <[email protected]>
432    
433            * Thuban/Model/classgen.py (generate_singletons,
434            generate_uniform_distribution, generate_quantiles): Remove
435            fixes parameter, but maintain the same functionality by having
436            the calling function pass a FixedRamp object for the ramp.
437            (FixedRamp): New. Adapts a ramp to have fixed property values.
438    
439            * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
440            (Classification): Inherit from Publisher.
441            (Classification.__init__): Remove the layer parameter.
442            Classifications no longer need to have a parent layer.
443            (Classification.GetField, Classification.GetFieldType,
444            Classification.SetFieldInfo): Removed. The field name is stored
445            in the layer, and the type can be retreived by calling
446            Layer.GetFieldType().
447            (Classification._set_layer, Classification.GetLayer): Removed.
448            Classifications no longer have a parent layer.
449    
450            * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
451            classification.
452            (Layer.SetShapeStore): Reset the classification first while
453            we still have the old shape store to work with.
454            (Layer.GetClassificationField, Layer.SetClassificationField):
455            New. Method for getting/setting the field to classify on.
456            (Layer.SetClassification): Simplified now that the layer
457            simply has to hold a reference to the classification and not
458            tell the classification who owns it.
459            Fixes RTbug #2023.
460    
461            * Thuban/Model/load.py (SessionLoader.start_classification):
462            Set the field name on the layer, not the classification.
463    
464            * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
465            classification is modified.
466    
467            * Thuban/Model/save.py (SessionSaver.write_classification):
468            Get the field name and type from the layer.
469    
470            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
471            parameter records to rows and add docstring. Fixes RTbug #1997.
472    
473            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
474            ramp when we need to fix certain values of a ramp rather than
475            using the old fixes parameter. Fixes RTbug #2024.
476    
477            * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
478            parameter.
479            (ClassTable.Reset): Add fieldType parameter and use it, rather
480            than asking the classification.
481            (Classifier.__init__): Remember the original class's field
482            and ask the layer for the field type, rather than the classification.
483            (Classifier.__SetGridTable): Retrieve the field and field type
484            for the table because they are not in the classification.
485            (Classifier._OnTry, Classifier._OnRevert): Set the classification
486            field on the layer in addition to the classification itself.
487    
488            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
489            classification field from layer.
490    
491            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
492            classification field from layer. Split up tests and remove
493            *-imports. Fixes RTbug #1992.
494    
495            * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
496    
497            * test/test_classification.py
498            (TestClassification.test_classification): Remove tests for methods
499            that no longer exist.
500    
501            * test/test_layer.py (SetShapeStoreTests.setUp): Classification
502            __init__ no longer has a field parameter, use SetClassificationField.
503            (SetShapeStoreTests.test_sanity): Use layer object to get class
504            field info.
505    
506            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
507            SetClassificationField on layer to set class field info.
508    
509            * test/test_viewport.py: Renamed from test/test_view.py.
510    
511    2003-07-16  Jan-Oliver Wagner <[email protected]>
512    
513            * Doc/manual/thuban-manual.xml: Added authors and an initial
514            coarse structure.
515    
516    2003-07-15  Bernhard Herzog  <[email protected]>
517    
518            * test/support.py (FloatComparisonMixin): This is a mix-in class
519            and therefore should not be derived from any other class.
520    
521            * test/test_range.py (RangeTest): FloatComparisonMixin is a
522            mix-in, so derive from TestCase as well.
523    
524    2003-07-15  Bernhard Herzog  <[email protected]>
525    
526            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
527            draw_func handling a bit to remove one layer of indirection. This
528            makes the renderer about 10% faster in the non-classifying case
529            and the code a bit cleaner
530            (MapRenderer.draw_point_shape): Add the pen and brush parameters
531            and set them in the dc. Now the draw_point_shape method and
532            wxproj's draw_polygon_shape function have basically the same
533            signature so that both can be directly used as draw_func
534    
535    2003-07-15  Bernhard Herzog  <[email protected]>
536    
537            * Thuban/Model/save.py (SessionSaver.write_classification): Encode
538            string values (in addition to the labels) as UTF 8
539    
540            * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
541            values if the field type is string
542    
543            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
544            saving a session with non-ascii string classification values.
545    
546            * test/test_load.py (TestClassification.file_contents)
547            (TestClassification.test): Check for non-ascii values in string
548            classifications
549    
550    2003-07-14  Jonathan Coles   <[email protected]>
551    
552            * test/test_view.py: New. Tests for ViewPort.
553    
554    2003-07-14  Frank Koormann   <[email protected]>
555    
556            * Thuban/Model/load.py (SessionLoader.start_map): Encode map
557            title to latin1.  Fixes https://intevation.de/rt/webrt?serial_num=2013
558    
559            * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
560            unicode strings from session file: session title, map title and
561            projection name.
562            
563    2003-07-10  Jonathan Coles   <[email protected]>
564    
565            * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
566            drag_stop, not drag_move when the mouse is released.
567    
568    2003-07-10  Jonathan Coles   <[email protected]>
569    
570            The most important part of this is the seperation of view.py into
571            two pieces. viewport.py now has a class called ViewPort which
572            contains all the non-wx parts of view.py and can therefore be
573            tested. view.py contains only the wx-specific parts and is fairly
574            simple.
575    
576            * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
577            RTTbug #1992.
578            * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
579            RTTbug #1992.
580    
581            * Thuban/Model/classgen.py (generate_singletons,
582            generate_uniform_distribution, generate_quantiles):
583            Added 'fixes' parameter so that property attributes can
584            be held constant over the generated classification groups.
585            (CustomRamp.GetProperties): Remove unused variables.
586    
587            * Thuban/Model/map.py (Map.SetProjection): Send the old
588            projection as an argument to listeners of the MAP_PROJECTION_CHANGED
589            event.
590    
591            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
592            parameter which is a list of records that restricts which
593            records are saved. Fixes RTbug #1997.
594    
595            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
596            Port exception dialog from GREAT-ER. Fixes RTbug #1993.
597    
598            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
599            to allow the user to fix line color/width on generated groups.
600            (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
601            functions to optionally fix group properties.
602    
603            * Thuban/UI/main.py (main): Set exception hook to the
604            ShowExceptionDialog. Fixes RTbug #1993.
605    
606            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
607            the table window when it is selectd to be shown.
608    
609            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
610            Export Selection button and move the export buttons underneath
611            the table.
612            (QueryTableFrame.UpdateStatusText): Added event argument so
613            that it can respond to grid selection events. The status text
614            is now updated even when the table is not associated with a
615            layer as was previously assumed.
616            (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
617            UpdateStatusText responds to these events.
618            (QueryTableFrame.OnSaveAs): Renamed to doExport.
619            (QueryTableFrame.doExport): Helper function that saves the
620            entire table, or selected rows, to a file.
621            (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
622            Respond to export button events and call doExport.
623    
624            * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
625            the function doesn't return NULL without first setting a Python
626            Error.
627    
628            * test/runtests.py (main): Only print "Unknown option" for
629            unsupported options.
630    
631            * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
632            optional epsilon argument to specify floating point accuracy.
633            (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
634            for each item test.
635    
636            * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
637            tests for saving selected records.
638    
639            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
640            tests for saving selected records.
641    
642            * test/test_map.py (TestMapWithContents.test_set_projection):
643            MAP_PROJECTION_CHANGED events send the old projection.
644    
645            * test/test_session.py
646            (TestSessionWithContent.test_forward_map_projection):
647            MAP_PROJECTION_CHANGED events send the old projection.
648    
649            * test/test_table.py (TableTest): Update tests to use non-deprecated
650            functions.
651    
652    2003-07-08  Bernhard Herzog  <[email protected]>
653    
654            * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
655            constants in the column objects are the standard ones defined in
656            the table module.
657    
658            * test/test_transientdb.py
659            (TestTransientTable.test_transienttable_to_dbf): New. Test whether
660            exporting transient tables as DBF works. This should catch the bug
661            just fixed in TransientTableBase.Width.
662    
663    2003-07-08  Bernhard Herzog  <[email protected]>
664    
665            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
666            interpolated colors correctly.
667    
668            * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
669            New. Test case for the fix in classgen.py
670    
671    2003-07-08  Bernhard Herzog  <[email protected]>
672    
673            * test/runtests.py (main): Make the default output less verbose
674            and add a verbosity option (-v) to get the old output
675    
676    2003-07-08  Bernhard Herzog  <[email protected]>
677    
678            * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
679            0.9.
680    
681            * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
682            New. Return the join type
683    
684            * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
685            DTD
686            (SessionSaver.write_data_containers): Save the join type for
687            joined tables
688    
689            * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
690            namespace
691            (SessionLoader.start_jointable): Handle the jointype attribute
692    
693            * test/test_load_0_8.py: New. Effectively a copy of test_load.py
694            as of Thuban 0.8. These are now tests to determine whether Thuban
695            can still read files generated by Thuban 0.8
696    
697            * test/test_load.py (LoadSessionTest.dtd)
698            (TestSingleLayer.file_contents)
699            (TestLayerVisibility.file_contents, TestLabels.file_contents)
700            (TestLayerProjection.file_contents)
701            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
702            (TestJoinedTable.file_contents)
703            (TestLoadError.file_contents): Update for new DTD
704            (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
705            for new join type attribute
706    
707            * test/test_save.py (SaveSessionTest.dtd)
708            (SaveSessionTest.testEmptySession)
709            (SaveSessionTest.testSingleLayer)
710            (SaveSessionTest.testLayerProjection)
711            (SaveSessionTest.testRasterLayer)
712            (SaveSessionTest.testClassifiedLayer)
713            (SaveSessionTest.test_dbf_table)
714            (SaveSessionTest.test_joined_table): Update for new DTD
715            (SaveSessionTest.test_joined_table): Add test for new join type
716            attribute
717    
718    2003-07-04  Bernhard Herzog  <[email protected]>
719    
720            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
721            function for table_to_dbf
722            (table_to_dbf): Deal with names longer than the 10 character limit
723    
724            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
725            doc-string
726            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
727            long column names
728    
729    2003-07-03  Bernhard Herzog  <[email protected]>
730    
731            * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
732    
733    2003-07-03  Bernhard Herzog  <[email protected]>
734    
735            * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
736            for the Thuban manual and README with some basic information about
737            the manual
738    
739    2003-07-03  Bernhard Herzog  <[email protected]>
740    
741            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
742            Update doc-string
743            (TransientJoinedTable.create): Do not modify the column objects of
744            the input tables in place and copy all columns of the input tables
745            into the joined table after all.
746    
747            * test/test_transientdb.py
748            (TestTransientTable.test_transient_joined_table_same_column_name):
749            Update to reflect the new behavior
750            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
751            Update to reflect the new behavior
752            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
753            New test case for a bug which modified the column objects in place
754    
755    2003-07-02  Jonathan Coles   <[email protected]>
756    
757            * Thuban/Model/classgen.py (generate_singletons,
758            generate_uniform_distribution, generate_quantiles,
759            GenQuantiles0): Make sure maxValue isn't less than
760            one, otherwise we could divide by zero.
761    
762            * test/test_classgen.py (ClassGenTest.doClassRangeTest,
763            ClassGenTest.doClassSingleTest): Call doBoundsTest to
764            check the end classification groups against the
765            proper property values.
766            (ClassGenTest.doBoundsTest): New. Checks the first and
767            last classification groups to make sure their properties
768            are the correct upper and lower bounds for a color ramp.
769    
770    2003-07-02  Jonathan Coles   <[email protected]>
771    
772            * Thuban/Model/classgen.py (generate_singletons,
773            generate_uniform_distribution, generate_quantiles,
774            GenQuantiles0): The denominator was one to high when
775            calculating the index for the ramp causing the index
776            to never to reach one.
777    
778    2003-07-02  Jonathan Coles   <[email protected]>
779    
780            Changed the singature of ClassGroupRange.__init__ and
781            ClassGroupRange.SetRange() so that the min/max values are
782            passed as a tuple. This makes a better calling scheme for
783            when a Range object is passed instead.
784    
785            * Thuban/Model/classgen.py: Fixed parameters to
786            ClassGroupRange constructor.
787    
788            * Thuban/Model/classification.py (ClassGroupRange.__init__):
789            Consolidate the min/max parameters into a single _range which
790            can either be a tuple or a Range object.
791            (ClassGroupRange.SetRange): Consolidate the min/max parameters
792            into a single _range which can either be a tuple or a Range object.
793    
794            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
795            call to ClassGroupRange constructor to use a tuple.
796    
797            * Thuban/Model/layer.py (Layer.SetClassification): Switch
798            the classification instance variable to the new class
799            before calling _set_layer otherwise subscribers to a
800            LAYER_CHANGED event will not see any difference.
801    
802            * test/test_classification.py: Fix tests of ClassGroupRange
803            so that they use the new signature.
804    
805            * test/test_load.py: Fix use of ClassGroupRange so that it
806            uses the new signature.
807    
808            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
809            uses the new signature.
810    
811            * test/test_save.py: Fix use of ClassGroupRange so that it
812            uses the new signature.
813    
814    
815    2003-07-01  Jonathan Coles   <[email protected]>
816    
817            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
818            Import used objects/class from color.
819            (generate_singletons): We don't
820            need the numGroups parameter anymore because we are using
821            the new ramps with GetProperties().
822            (generate_uniform_distribution): Use new ramp method
823            GetProperties().
824            (generate_quantiles, GenQuantiles0): Use new ramp method
825            GetProperties().
826            (CustomRamp.SetNumGroups): Removed. The ramps now map
827            a value from 0 to 1 to class properties so the number
828            of groups is not needed ahead of time.
829            (CustomRamp.next): Removed. CustomRamp does not support
830            interation anymore.
831            (CustomRamp.GetProperties): Returns a ClassGroupProperties
832            object based on the index value from 0 to 1 that is
833            passed to it.
834            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
835            Made into instances of Monochromatic class instread of
836            deriving from it.
837            (HotToCold.SetNumGroups): Removed. See CustomRamp.
838            (HotToCold.next): Removed. See CustomRamp.
839    
840            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
841            (Classification.SetField, Classification.SetFieldType):
842            Replaced with SetFieldInfo.
843            (Classification.SetFieldInfo): New. Does a better job of
844            what SetField and SetFieldType used to do by combining
845            their function since they should really always be done
846            at the same time.
847            (Classification.SetLayer): Renamed to _set_layer.
848            (Classification._set_layer): Should only be called from
849            Layer's SetClassification. This does not cause a recursive
850            call as SetLayer did because we know that Layer knows about
851            the classification.
852    
853            * Thuban/Model/color.py: Fixes RTbug #1971.
854            (_Transparent): Renamed from Transparent so it doesn't
855            conflict with the module variable.
856            (Transparent, Black): Renamed from Color.Transparent,
857            Color.Black so they are not class variables.
858    
859            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
860            (Layer.Destroy): We don't need to call SetClassification
861            anymore to clear out the back reference in the classifcation
862            to the layer. It's better to set it to None using _set_layer,
863            and we won't be creating another clas object too.
864            (Layer.SetClassification): Classification._set_layer is not
865            recursive so remove all the locking variables. Also clean
866            up the code so that it remains unchanged if something fails.
867    
868            * Thuban/Model/load.py: Fixes RTbug #1971.
869            (SessionLoader.start_classification): Call
870            Classification.SetFieldInfo().
871    
872            * Thuban/Model/save.py: Removed import of Color which wasn't
873            being used.
874    
875            * Thuban/UI/classgen.py: Fixes RTbug #1972.
876            (ClassGenDialog.__init__): Color ramps are now instances
877            already so we don't need to create any new objects.
878            (ClassGenDialog.OnOK): Check for numGroups is no longer
879            necessary because we never use it.
880    
881            * Thuban/UI/classifier.py: Fixes RTbug #1971.
882            (Classifier.__BuildClassification, Classifier.__SetGridTable):
883            Call Classification.SetFieldInfo() instead of SetFieldType.
884    
885            * Thuban/UI/renderer.py: Fixes RTbug #1971.
886    
887            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
888            (MapCanvas.__init__): Subscribe to the idle time event. Set
889            background color to white.
890            (MapCanvas.OnPaint): Set a flag indicating that we should
891            render the map during idle time. If we already have a bitmap
892            just draw it now.
893            (MapCanvas.OnIdle): New. Render the map only during idle time.
894            This also fixes a problem with the busy cursor under gtk.
895    
896            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
897            Fix calls to generate_singletons because the signature changed.
898    
899            * test/test_classification.py: Fix color references and
900            change calls to Classification.[SetField|SetFieldType] to
901            SetFieldInfo.
902    
903            * test/test_load.py: Fix color references.
904    
905            * test/test_load_0_2.py: Fix color references.
906    
907            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
908            Change calls to Classification.[SetField|SetFieldType] to
909            SetFieldInfo.
910    
911    2003-07-01  Frank Koormann   <[email protected]>
912    
913            MERGE from the greater-ms3 branch.
914    
915            * test/test_transientdb.py
916            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
917            New. Test join of two tables with partly equal column names.
918    
919            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
920            If duplicates in left and right tables column names are found,
921            append '_' (underscores) to the name until it is unique.
922            Create always new internal names for the resulting table and reference
923            columns in the join statement with <table>.<column>
924    
925    2003-07-01  Bernhard Herzog  <[email protected]>
926    
927            * test/test_transientdb.py
928            (TestTransientTable.test_transient_joined_table_same_column_name):
929            New. Test whether joining on columns with the same names in both
930            tables works.
931            
932            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
933            sure to use the right internal names even when joining on field
934            with the same names in both tables. Also, detect duplicate names
935            in the joined table correctly.
936    
937    2003-07-01  Frank Koormann   <[email protected]>
938    
939            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
940            Reverse List of layers to render in same order as in desktop legend.
941    
942    2003-06-30  Jonathan Coles   <[email protected]>
943    
944            * Thuban/version.py (make_tuple): Takes a version string
945            and splits it into a tuple of at most three integers.
946            Used make_tuple() to make tuple versions of the version
947            numbers.
948    
949            * Thuban/UI/about.py: Add Thuban email addresses.
950    
951    2003-06-30  Jonathan Coles   <[email protected]>
952    
953            * Thuban/version.py: SQLite/PySQLite version dependencies
954            were too high.
955    
956    2003-06-30  Jonathan Coles   <[email protected]>
957    
958            * Thuban/version.py: Update version to 0.8.1
959            
960            * MANIFEST.in: Added Projections so that default.proj is
961            included.
962    
963    2003-06-26  Jonathan Coles   <[email protected]>
964    
965            New About box with lots more information including library
966            versions and credits. More/better version checking before
967            Thuban starts.
968    
969            * Thuban/UI/about.py: New. New About box that displays
970            library version information and credits.
971    
972            * Thuban/version.py: Added new 'versions' dictionary which
973            contains the verions of various libraries which are checked
974            when the module loads.
975            (verify_versions): Check all version numbers and returns
976            a list of errors.
977    
978            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
979            Reset the status of the buttons as the situation warrants,
980            but in a better more reliable way by not relying on the
981            current status to determine what needs to change.
982    
983            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
984            (verify_versions): Remove most of the code since it is
985            now in Thuban.version.verify_versions.o
986    
987            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
988            About box in Thuban.UI.about.
989    
990            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
991            Returns the version of gdal library being used as a string.
992    
993            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
994            Removed.
995            (get_proj_version): Return the version of PROJ that the file
996            was compiled with.
997            (get_gtk_version): Return th version of GTK that the file
998            was compiled with.
999    
1000    2003-06-25  Jonathan Coles   <[email protected]>
1001    
1002            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
1003            of the SelectPropertiesDialog should be self so the window
1004            appears on top.
1005            (ClassGroupPropertiesCtrl.DoEdit): The parent
1006            of the SelectPropertiesDialog should be self so the window
1007            appears on top.
1008    
1009            * Thuban/UI/resource.py: Cleaned up how we determine file
1010            extensions.
1011            (GetImageResource): Return an wxImage from our Resources.
1012    
1013    2003-06-24  Jonathan Coles   <[email protected]>
1014    
1015            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
1016            Check that a layer has a classification before trying
1017            to get it. Raster layers don't have classifications.
1018    
1019    2003-06-23  Jonathan Coles   <[email protected]>
1020            
1021            * setup.py: Add Resources/XML to resource list.
1022        
1023    2003-06-23  Jonathan Coles   <[email protected]>
1024    
1025            * setup.cfg: Fix copyright dates
1026        
1027    2003-06-23  Jonathan Coles   <[email protected]>
1028    
1029            * MANIFEST.in: Update with Resources/XML
1030    
1031            * setup.py: Don't include Locale resources yet as we don't
1032            have any and it causes problems building the distribution
1033            for Windows. Update version to 0.8.0.
1034    
1035            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
1036    
1037            * Thuban/UI/mainwindow.py: Add blank line at the end because
1038            file was not being read correctly building the Windows
1039            distribution.
1040    
1041    2003-06-23  Jonathan Coles   <[email protected]>
1042    
1043            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
1044    
1045            * Thuban/version.py: Temporarily update longversion for
1046            the 0.8 release so that it doesn't have the cvs revision.
1047    
1048    2003-06-23  Jonathan Coles   <[email protected]>
1049    
1050            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
1051            to make sure that we don't create reentrant possibilities with
1052            wxYield.
1053    
1054            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
1055            directly to avoid the wxSafeYield() call which generates an
1056            OnPaint event causing infinite recursion. Don't try to catch
1057            exception anymore. This was for before there were limits on map
1058            scaling.
1059    
1060    2003-06-23  Bernhard Herzog  <[email protected]>
1061    
1062            Bug fix for RT #1961:
1063    
1064            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
1065            Register DerivedShapestores with the session
1066    
1067            * Thuban/Model/session.py (Session.Tables): Make sure each table
1068            is only listed once.
1069    
1070            * test/test_load.py (TestJoinedTable.test): Add check_format call.
1071            Update file contents to match the one written out.
1072    
1073    2003-06-20  Bernhard Herzog  <[email protected]>
1074    
1075            * test/xmlsupport.py (SaxEventLister.startElementNS)
1076            (SaxEventLister.endElementNS): Do not include the qname. Python
1077            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
1078            is (presumably incorrectly) None, whereas it's a string with the
1079            element name in the later versions.
1080    
1081            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
1082            (TestEventList.test_even_list_namespace): Update tests to reflect
1083            the new behaviour
1084            (TestEventList.test_even_list_id_normalization): Fix doc-string
1085    
1086    2003-06-20  Jonathan Coles   <[email protected]>
1087    
1088            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
1089            by deriving classes to determine if that layer supports shapes.
1090            (Layer): Override HasShapes and return true.
1091    
1092            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
1093            instead of a direct call to wx[Begin|End]CusyCursor().
1094            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
1095            table data.
1096    
1097            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
1098            New. Wrappers around the wxWindows functions that allow us to
1099            make additional calls such as wxYield which gives the native
1100            system a chance to update the cursor correctly.
1101    
1102            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
1103            instead of a direct call to wx[Begin|End]CusyCursor().
1104    
1105            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
1106            instead of a direct call to wx[Begin|End]CusyCursor().
1107            (MapCanvas.find_shape_at): Check if the current search layer
1108            support shapes, otherwise go on to the next layer.
1109    
1110            * test/test_layer.py: Add tests in each type of layer for
1111            HasClassification() and HasShapes()
1112    
1113    2003-06-20  Jonathan Coles   <[email protected]>
1114    
1115            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
1116            turning on the busy cursor to allow the system to change the
1117            cursor before we begin painting. This fixes a problem that
1118            was occuring only under GTK. Fixes RTbug #1840.
1119    
1120    2003-06-20  Bernhard Herzog  <[email protected]>
1121    
1122            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
1123            version.
1124    
1125            * Thuban/Model/save.py (sort_data_stores): New. Make topological
1126            sort of the data sources so they can be written with sources that
1127            data sources that depend on other data sources come after the
1128            sources they depend on.
1129            (SessionSaver.__init__): Add idmap instance variable to map from
1130            objects to the ids used in the file.
1131            (SessionSaver.get_id, SessionSaver.define_id)
1132            (SessionSaver.has_id): New. Methods to manage the idmap
1133            (SessionSaver.write): Use thuban-0.8.dtd
1134            (SessionSaver.write_session): Add a namespace on the session and
1135            write out the data sources before the maps.
1136            (SessionSaver.write_data_containers): New. Write the data
1137            containers.
1138            (SessionSaver.write_layer): Layer elements now refer to a
1139            shapestore and don't contain filenames anymore.
1140    
1141            * Thuban/Model/load.py (LoadError): Exception class to raise when
1142            errors in the files are discovered
1143            (SessionLoader.__init__): Define dispatchers for elements with a
1144            thuban-0.8 namespace too.
1145            (SessionLoader.check_attrs): New helper method to check and
1146            convert attributes
1147            (AttrDesc): New. Helper class for SessionLoader.check_attrs
1148            (SessionLoader.start_fileshapesource)
1149            (SessionLoader.start_derivedshapesource)
1150            (SessionLoader.start_filetable, SessionLoader.start_jointable):
1151            Handlers for the new elements in the new fileformat
1152            (SessionLoader.start_layer): Handle the shapestore attribute in
1153            addition to filename.
1154            (SessionLoader.start_table, SessionLoader.end_table): Removed.
1155            They were never used in the old formats and aren't needed for the
1156            new.
1157    
1158            * Thuban/Model/session.py (Session.DataContainers): New method to
1159            return all "data containers", i.e. shapestores and tables
1160    
1161            * test/xmlsupport.py (SaxEventLister.__init__)
1162            (SaxEventLister.startElementNS, sax_eventlist): Add support to
1163            normalize IDs.
1164    
1165            * test/test_xmlsupport.py
1166            (TestEventList.test_even_list_id_normalization): New test case for
1167            id normalization
1168    
1169            * test/test_load.py (LoadSessionTest.check_format): Use ID
1170            normalization
1171            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
1172            class atrributes used for ID normalization
1173            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
1174            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
1175            file format
1176            (TestJoinedTable): New test for loading sessions with joined
1177            tables.
1178            (TestLoadError): New. Test whether missing required attributes
1179            cause a LoadError.
1180    
1181            * test/test_save.py (SaveSessionTest.thubanids)
1182            (SaveSessionTest.thubanidrefs): New class attributes for ID
1183            normalization in .thuban files.
1184            (SaveSessionTest.compare_xml): Use id-normalization.
1185            (SaveSessionTest.testEmptySession)
1186            (SaveSessionTest.testLayerProjection)
1187            (SaveSessionTest.testRasterLayer)
1188            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
1189            (SaveSessionTest.testLayerProjection): The filename used was the
1190            same as for testSingleLayer. Use a different one.
1191            (SaveSessionTest.test_dbf_table)
1192            (SaveSessionTest.test_joined_table): New test cases for saving the
1193            new data sources structures.
1194            (TestStoreSort, MockDataStore): Classes to test the sorting of the
1195            data stores for writing.
1196    
1197            * test/runtests.py: Add CVS keywords
1198    
1199    2003-06-20  Jonathan Coles   <[email protected]>
1200    
1201            * test/test_session.py
1202            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
1203            Use the cultural_landmark-point.dbf file for the store so that
1204            the table rows and shape count match.
1205    
1206    2003-06-20  Jonathan Coles   <[email protected]>
1207    
1208            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
1209            an exception if the number of shapes is different from the
1210            number of rows in the table. Address RTbug #1933.
1211    
1212            * test/test_layer.py (TestLayer.test_derived_store): Add
1213            a test for the new exception in DerivedShapeStore.__init__.
1214    
1215            * test/support.py (FloatTestCase): Removed since there is
1216            already FloatComparisonMixin. Fixes RTbug #1954.
1217            (FloatComparisonMixin.assertFloatEqual): Include test for
1218            infinity that was part of FloatTestCase.
1219    
1220            * test/test_range.py (RangeTest): Inherit from
1221            support.FloatComparisonMixin now that we don't have
1222            support.FloatTestCase.
1223    
1224    2003-06-20  Bernhard Herzog  <[email protected]>
1225    
1226            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
1227            the implementation in xmlsupport instead.
1228            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
1229    
1230            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
1231            of test_save
1232    
1233    2003-06-20  Bernhard Herzog  <[email protected]>
1234    
1235            * test/test_load.py (LoadSessionTest.check_format): New helper
1236            method to make sure the test files we load might have been written
1237            by the current thuban version.
1238            (ClassificationTest.TestLayers, TestSingleLayer.test)
1239            (TestLayerVisibility.test, TestClassification.test)
1240            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
1241            Add check_format() calls and fix the thuban data to match the data
1242            that would be written by saving the session loaded from it.
1243    
1244            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
1245            the same class and function in test_save.
1246    
1247            * test/test_xmlsupport.py (TestEventList): New. test cases for
1248            sax_eventlist
1249    
1250    2003-06-20  Bernhard Herzog  <[email protected]>
1251    
1252            * Resources/XML/thuban.dtd: Add comment about which versions of
1253            Thuban are covered by this DTD
1254            (map): Fix content model for layers and raster layers. There can
1255            be any number or layers and raster layers in any order.
1256    
1257    2003-06-20  Jonathan Coles   <[email protected]>
1258    
1259            This is mainly about fixing RTbug #1949.
1260    
1261            * Thuban/Model/classification.py: Remove "from __future__"
1262            import statement since python 2.2 is the earliest supported
1263            version.
1264    
1265            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
1266            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
1267            depending on the units this projection *forwards* into.
1268    
1269            * Thuban/Model/save.py (SessionSaver.write_classification):
1270            Remove unnecessary use of lambdas and nested functions.
1271    
1272            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
1273            adjustment here if the map projection uses degrees.
1274    
1275            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
1276            scale adjust code since it is now done before calling
1277            this method. Don't do anything if the map projection
1278            is None.
1279    
1280    2003-06-19  Bernhard Herzog  <[email protected]>
1281    
1282            Move version specific load tests to their own file.
1283    
1284            * test/test_load.py: Expand the doc-string to explain a bit how to
1285            handle file format changes.
1286            (TestClassification.test): Update the docstring as this test is
1287            not about Thuban 0.2 anymore.
1288    
1289            * test/test_load_0_2.py: New file with the load tests for thuban
1290            files created with Thuban 0.2 and earlier.
1291    
1292    2003-06-19  Bernhard Herzog  <[email protected]>
1293    
1294            Add XML validation to some of the tests. Validation will only be
1295            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
1296            To make the DTD available to the test cases it's moved into
1297            Resources/XML
1298    
1299            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
1300            for versions up to and including 0.2. Two slight changes: added an
1301            encoding specification and fixed the comment which refered to
1302            GRASS, not Thuban
1303    
1304            * test/xmlsupport.py: New support module for tests involving XML.
1305            Currently there's a mix-in class for XML validation.
1306    
1307            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
1308    
1309            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
1310            so that we can validate the
1311            (SaveSessionTest.testEmptySession)
1312            (SaveSessionTest.testSingleLayer)
1313            (SaveSessionTest.testSingleLayer)
1314            (SaveSessionTest.testLayerProjection)
1315            (SaveSessionTest.testRasterLayer)
1316            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
1317    
1318            * test/runtests.py (main): Call print_additional_summary instead
1319            of print_garbage_information
1320    
1321            * test/support.py (resource_dir): New function to return the
1322            "Resource" subdirectory
1323            (print_additional_summary): New function to combine several
1324            summary functions
1325            (run_tests): Use print_additional_summary instead of calling
1326            print_garbage_information directly
1327    
1328    2003-06-19  Bernhard Herzog  <[email protected]>
1329    
1330            * Doc/thuban.dtd (classification): Correct the content model of
1331            the classification element.
1332            (projection): Add the "name" attribute
1333    
1334    2003-06-19  Frank Koormann   <[email protected]>
1335    
1336            MERGE from the greater-ms3 branch.
1337    
1338            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
1339            scale if projection is latlong to get better estimate.
1340    
1341            Fix problem of hidden properties dialog under windows after double
1342            click on layer tree:
1343            The tree control always gets an Expanded / Collapsed event after
1344            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
1345            raises the already displayed window.
1346    
1347            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
1348            raiseProperties initialized to prevent endless loops
1349            (LegendTree._OnItemActivated): Depending on self.raiseProperties
1350            simply raise the properties or open the dialog and issue a second
1351            event.
1352    
1353    2003-06-18  Jonathan Coles   <[email protected]>
1354    
1355            * setup.py: Fix a few problems that occured under Windows.
1356    
1357    2003-06-18  Jonathan Coles   <[email protected]>
1358    
1359            When Thuban loaded the map was redrawn twice because the
1360            legend was being opened after the mainwindow was created
1361            and not during its creation. This meant the map was drawn
1362            initially and then had to be redrawn when the legend
1363            caused the display to change. Now the legend is opened
1364            in the mainwindow constructor which resolves this issue.
1365    
1366            Also, although we were checking for the existence of
1367            gdal and gdalwarp modules, the gdalwarp extension was
1368            still being compiled (which may fail if the system doesn't
1369            have gdal installed). the build_ext command to setup.py
1370            now accepts the flags --with-gdal and --without-gdal.
1371            If --without-gdal is specified setup.py will try to
1372            use the gdal parameters specified by gdal-config. Under
1373            windows, those parameters have to be set in setup.py
1374            as with proj4 an wxWindows.
1375    
1376            * setup.py: Use a list instead of seperate variables for
1377            extension parameters so we can create a generic function
1378            that runs an appropriate *-config script.
1379            (run_cs_script): Renamed from run_wx_script and modified
1380            to accept a second argument which is a list of lists to
1381            be filled in by the values returned from running the command.
1382            (thuban_build_ext): New. Extends the build_ext command and
1383            provides the options --with-gdal/--without-gdal which then
1384            optionally includes the gdalwarp extension.
1385    
1386            * Thuban/Model/resource.py: First check if we can import
1387            the gdalwarp Thuban extension before checking for gdal.
1388            Also added some comments.
1389            
1390            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
1391            the map is None which may be the case if none has been loaded
1392            yet.
1393    
1394            * Thuban/UI/main.py (main): Remove call to ShowLegend.
1395    
1396            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
1397    
1398            * Thuban/UI/renderer.py: Check for gdal support before importing
1399            gdalwarp.
1400            (MapRenderer.render_map): Only try to optimize if we have gdal
1401            support otherwise nothing will get drawn.
1402    
1403            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
1404            during startup before a map has been created. Check if map is None
1405            before using it and do nothing if it is.
1406    
1407    2003-06-17  Jonathan Coles   <[email protected]>
1408    
1409            Fix the problem with raster layers under Windows that caused
1410            Thuban to crash. The view should respond to layer projection
1411            changed events to update the display. Changes to a projection
1412            should not cause the map to be set to full extent.
1413            
1414            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
1415            current_map_proj to remember the current map projection so that
1416            when the projection changes we know what the previous projection
1417            was.
1418            (MapCanvas.SetMap): Unsubscribe and subscribe to
1419            LAYER_PROJECTION_CHANGED events.
1420            (MapCanvas.projection_changed): Split into two methods that respond
1421            to map and layer projection changes.
1422            (MapCanvas.map_projection_changed): New. Takes the current view and
1423            projects it using the new projection. This does not cause the
1424            map to be redrawn at full extent.
1425            (MapCanvas.layer_projection_changed): New. Cause a redraw which
1426            will draw each layer in its new projection.
1427            
1428            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
1429            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
1430            under Windows.
1431            
1432            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
1433            to twice sizeof(void*) because there are two digits for each
1434            hex byte.
1435    
1436    2003-06-16  Bernhard Herzog  <[email protected]>
1437    
1438            Update to the layer interface: Direct access to the table,
1439            shapetable, shapefile and filename attributes is now actively
1440            deprecated by issuing deprecation warnings for all places where
1441            this happens.
1442    
1443            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
1444            to the instance variables table, shapetable, shapefile and
1445            filename via __getattr__ so that we can issue a deprecation
1446            warning.
1447            (Layer.SetShapeStore): Don't set the deprecated instance variables
1448            any more
1449            (Layer.SetShapeStore): Don't use deprecated layer instance
1450            variables
1451            (Layer.Destroy): No need to explicitly remove the instance
1452            variables any more
1453            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
1454            instance variables
1455    
1456            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
1457            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
1458            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
1459            use deprecated layer instance variables
1460    
1461            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
1462            deprecated layer instance variables
1463    
1464            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
1465            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
1466            instance variables
1467    
1468            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
1469            deprecated layer instance variables
1470    
1471            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
1472            deprecated layer instance variables
1473    
1474            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
1475            deprecated layer instance variables
1476    
1477            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
1478            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
1479            variables
1480    
1481            * test/runtests.py (main): Turn Thuban's deprecation warnings into
1482            errors so that they're cought by the tests
1483    
1484            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
1485            layer instance variables
1486    
1487    2003-06-16  Jonathan Coles   <[email protected]>
1488    
1489            Fix a problem under Windows whereby if the user double-clicks on a
1490            layer in the legend that tree item will expand or collapse as well
1491            as open the layer properties dialog. The state of the tree item
1492            should not be affected.
1493    
1494            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
1495            preventExpandCollapse and subscribe to expanding and collapsing
1496            events.
1497            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
1498            collapsing events and will veto the event if it has been triggered
1499            by the user double clicking on a layer.
1500            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
1501            that an expanding/collapsing event should be vetoed.
1502    
1503    2003-06-13  Bernhard Herzog  <[email protected]>
1504    
1505            * Thuban/UI/classifier.py (Classifier.OnClose)
1506            (Classifier.map_layers_removed)
1507            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
1508            in OnClose and not in map_layers_removed or
1509            layer_shapestore_replaced to make sure it always happens when the
1510            dialog is closed
1511    
1512    2003-06-13  Jonathan Coles   <[email protected]>
1513    
1514            This puts back a fix for Windows where a panel is needed so that
1515            the background of the table view appears correctly.
1516    
1517            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
1518            object that can be used by derived classes to place any
1519            controls (including the grid) onto.
1520            (QueryTableFrame.__init__): Use the panel as the parent window
1521            for all the controls. Reparent the grid so that the panel is
1522            the parent. Call UpdateStatusText() to correctly initialize
1523            the status bar.
1524    
1525    2003-06-13  Jonathan Coles   <[email protected]>
1526    
1527            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
1528            from wxFrame (as opposed to wxDialog like the other classes)
1529            but otherwise behaves like the other classes. This is needed
1530            for the TableView which isn't really a dialog and needs to
1531            have a status bar and control buttons.
1532    
1533            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
1534            instance variable to keep track of how many rows are selected.
1535            Subscribe once to the the events we are interested in.
1536            (ThubanGrid.OnRangeSelect): Only handle event if event handling
1537            hasn't been turned off.
1538            (ThubanGrid.OnSelectCell): Only handle event if event handling
1539            hasn't been turned off.
1540            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
1541            as an event listener (which changes the event handler stack)
1542            simply set an instance variable to False. This is checked in
1543            the event handlers.
1544            (ThubanGrid.GetNumberSelected): Return the number of currently
1545            selected rows.
1546            (TableFrame): Inherit from ThubanFrame so we can have a
1547            status bar and control buttons.
1548            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
1549            Explicitly set which items are selected in the operator choice and
1550            action choice so there is always a valid selection. Fixes RTbug #1941.
1551            Subscribe to grid cell selection events so we can update the
1552            status bar.
1553            (QueryTableFrame.UpdateStatusText): Update the status bar with
1554            how many rows are in the grid, how many columns, and how many
1555            rows are selected.
1556            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
1557            Call UpdateStatusText when cells are (de)selected.
1558            (QueryTableFrame.OnQuery): Use the string value in the value
1559            combo if either the selected item index is 0 or if the string
1560            cannot be found in the predefined list (this happens if the
1561            user changes the text). Fixes RTbug #1940.
1562            Only turn off the grid event listeners if there a query comes
1563            back with a none empty list of ids. in the case that the list
1564            is empty this causes a grid.ClearSelection() call to actually
1565            clear the grid selection which causes the selected items in
1566            the map to be deselected. Fixes RTbug #1939.
1567    
1568            * test/test_save.py (XMLWriterTest.Encode): Check return values.
1569            Fixes RTbug #1851.
1570    
1571    2003-06-13  Bernhard Herzog  <[email protected]>
1572    
1573            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
1574            self.selected_shape with the current selection to make sure the
1575            contents of the dialog are up to date when it's shown for the
1576            first time.
1577            The dialog used to work without this by luck. The recent fix to
1578            the connector module 'broke' a 'feature' the identify view was
1579            relying on, i.e that subscribing to a message in response to
1580            receiving a message of that type would mean that the new
1581            subscriber would also be called for the same message.
1582            
1583    2003-06-12  Jonathan Coles   <[email protected]>
1584    
1585            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
1586            the image is rendered. Fixes RTbug #1937.
1587    
1588    2003-06-12  Jonathan Coles   <[email protected]>
1589    
1590            * Thuban/Lib/fileutil.py: As is done under Windows, create the
1591            user directory if it doesn't exist on a posix system.
1592            Fixes RTbug #1815.
1593    
1594            * Thuban/Model/resource.py (get_user_proj_files): Moved the
1595            called to get_application_dir here, so that the directory
1596            will only be called if this method is invoked.
1597    
1598            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
1599            the projfilepath if no projection is selected.
1600    
1601    2003-06-12  Jonathan Coles   <[email protected]>
1602    
1603            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
1604            the scalebar if the current map has no projection set.
1605    
1606            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
1607            projfilepath label to just the basename of the projection file
1608            rather than include the entire path.
1609    
1610            * Thuban/Model/resource.py: Fix missed proj functions that
1611            needed to be renamed.
1612    
1613    2003-06-12  Jonathan Coles   <[email protected]>
1614    
1615            * Thuban/Model/classification.py: Removed assert statements that
1616            tested if the variable was an instance of Color.
1617    
1618            * Thuban/Model/color.py (Color): Remove commented code that isn't
1619            used.
1620            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
1621            Fixes RTbug #1835.
1622            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
1623            Needed now that the class doesn't inherit from Color.
1624    
1625    2003-06-12  Jonathan Coles   <[email protected]>
1626    
1627            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
1628            check unicode strings.
1629    
1630            * test/test_layer.py: Check for existence of gdal.
1631    
1632    2003-06-12  Jonathan Coles   <[email protected]>
1633        
1634            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
1635            that was in load.py
1636    
1637            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
1638            that was in save.py
1639    
1640    2003-06-12  Jonathan Coles   <[email protected]>
1641    
1642            This is largely a collection of bug fixes. We also handle the
1643            case where gdal is not on the system. The XMLReader and XMLWriter
1644            classes were moved into there own files to resolve some circular
1645            import references and because they shouldn't really be in the
1646            file that is dediciated to reading/writing session files since
1647            they are also used elsewhere.
1648    
1649            * Thuban/Model/classgen.py: Renamed functions to follow the
1650            function_names_with_underscores style. Fixes RTbug #1903.
1651            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
1652    
1653            * Thuban/Model/layer.py: Import gdal only if it available.
1654            (RasterLayer): Handle the case where the gdal library is unavailable.
1655            Addresses RTbug #1877.
1656    
1657            * Thuban/Model/load.py (XMLReader): Moved into seperate file
1658            xmlreader.py.
1659    
1660    2003-06-12  Jonathan Coles   <[email protected]>
1661    
1662            This is largely a collection of bug fixes. We also handle the
1663            case where gdal is not on the system. The XMLReader and XMLWriter
1664            classes were moved into there own files to resolve some circular
1665            import references and because they shouldn't really be in the
1666            file that is dediciated to reading/writing session files since
1667            they are also used elsewhere.
1668    
1669            * Thuban/Model/classgen.py: Renamed functions to follow the
1670            function_names_with_underscores style. Fixes RTbug #1903.
1671            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
1672    
1673            * Thuban/Model/layer.py: Import gdal only if it available.
1674            (RasterLayer): Handle the case where the gdal library is unavailable.
1675            Addresses RTbug #1877.
1676    
1677            * Thuban/Model/load.py (XMLReader): Moved into seperate file
1678            xmlreader.py.
1679    
1680            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
1681            file xmlwriter.py.
1682    
1683            * Thuban/Model/resource.py: Renamed functions to following the
1684            function_names_with_underscores style.
1685            (has_gdal_support): New function that returns true if the gdal
1686            library is available. Addresses RTbug #1877.
1687    
1688            * Thuban/UI/application.py (ThubanApplication.OpenSession):
1689            Display a message box if the gdal library is not available, but
1690            only if there are any layers that would use it. Addresses RTbug #1877.
1691    
1692            * Thuban/UI/classgen.py: Use renamed projection resource functions.
1693            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
1694            when using integers versus floats.
1695    
1696            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
1697            determine if the "Add Image Layer" menu option should be
1698            greyed out or not. Addresses RTbug #1877.
1699    
1700            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
1701    
1702            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
1703            optimize if a raster layer is visible. Fixes RTbug #1931.
1704            Only draw the raster layer if the gdal library is available.
1705            Addresses RTbug #1877.
1706    
1707            * test/test_classgen.py: Add tests for generate_singletons,
1708            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
1709            (test_calculate_quantiles): Fix some tests to catch the new
1710            ValueError that is raised.
1711    
1712            * test/test_proj.py: Use renamed projection resource functions.
1713    
1714            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
1715            test for saving classified layers. Fixes RTbug #1902.
1716            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
1717    
1718    2003-06-12  Jan-Oliver Wagner <[email protected]>
1719    
1720            Fix for http://intevation.de/rt/webrt?serial_num=1900.
1721    
1722            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
1723    
1724            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
1725            multiplechoicedialog.py rather than from the wxPython library.
1726    
1727    2003-06-11  Frank Koormann  <[email protected]>
1728    
1729            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
1730            update.
1731    
1732    2003-06-11  Frank Koormann  <[email protected]>
1733    
1734            * Thuban/Lib/fileutil.py (get_application_dir): New function to
1735            determine the absolute .thuban/thuban directory under
1736            "posix" (os.expanduser) and "nt" (read AppData registry key).
1737    
1738            * Thuban/Model/resource.py: Use get_application_dir
1739    
1740            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
1741            Use get_application_dir.
1742    
1743    2003-06-10  Bernhard Herzog  <[email protected]>
1744    
1745            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
1746            the messages MAP_LAYERS_REMOVED messages
1747            (LayerTableFrame.OnClose): Unsubscribe from it.
1748            (LayerTableFrame.map_layers_removed): New. Receiver for
1749            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
1750            dialog is showing is removed.
1751    
1752    2003-06-10  Bernhard Herzog  <[email protected]>
1753    
1754            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
1755            of the receivers list so that unsubscribing in a receiver doesn't
1756            modify it while iterating over it.
1757    
1758            * test/test_connector.py
1759            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
1760            unsubscribing in a receiver works correctly. See docstring for
1761            details
1762    
1763    2003-06-10  Bernhard Herzog  <[email protected]>
1764    
1765            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
1766            message.
1767    
1768            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
1769            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
1770            LAYER_CHANGED will still be sent if the classification changes.
1771    
1772            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
1773            parameter so we can subscribe to some of its messages
1774            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
1775            and the layer's LAYER_SHAPESTORE_REPLACED
1776            (Classifier.unsubscribe_messages): New. Unsubscribe from message
1777            subscribed to in __init__
1778            (Classifier.map_layers_removed)
1779            (Classifier.layer_shapestore_replaced): receivers for the messages
1780            subscribed to in __init__. Unsubscribe and close the dialog
1781    
1782            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
1783            the map to the Classifier dialog
1784    
1785            * test/test_layer.py (SetShapeStoreTests): Derive from
1786            SubscriberMixin as well so we can test messages
1787            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
1788            messages
1789            (SetShapeStoreTests.tearDown): Clear the messages again
1790            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
1791            for the modified flag too
1792            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
1793            to check whether SetShapeStore sets the modified flag
1794            (SetShapeStoreTests.test_set_shape_store_different_field_name)
1795            (SetShapeStoreTests.test_set_shape_store_same_field)
1796            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
1797            Add tests for the messages. This checks both the new
1798            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
1799    
1800    2003-06-06  Jan-Oliver Wagner <[email protected]>
1801    
1802            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
1803            the menu items.
1804    
1805    2003-06-05  Frank Koormann  <[email protected]>
1806    
1807            * Thuban/UI/identifyview.py (IdentifyView.__init__):
1808            Layout reimplemented without panel. Make life easier to fit the list
1809            in the dialog.
1810    
1811    2003-06-05  Frank Koormann  <[email protected]>
1812    
1813            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
1814            once on initialisation (Former implementation resulted in multiple
1815            entries for each projection).
1816            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
1817            if set, select the projection found under the specified name. This
1818            overwrites any other selection estimate.
1819            Removed projchoice filling from this method.
1820            (ProjFrame._OnSave, ProjFrame._OnAddToList):
1821            Updated call of ProjFrame.__FillAvailList
1822            (LCCPanel._DoLayout): Moved parameter controls in more common order.
1823    
1824            * Resources/Projections/defaults.proj: Extended defaults representing
1825            various common European projections.
1826    
1827    2003-06-05  Frank Koormann  <[email protected]>
1828    
1829            * Thuban/UI/identifyview.py (IdentifyView.__init__):
1830            Use ListCtrl instead of GridCtrl
1831    
1832            * Thuban/Model/resource.py:
1833            Guess location of .thuban directory from tempdir parent directory.
1834    
1835            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
1836            Guess location of .thuban directory from tempdir parent directory.
1837    
1838    2003-06-04  Bernhard Herzog  <[email protected]>
1839    
1840            Do not cache the values returned by the tree widget's
1841            GetFirstChild and GetNextChild methods because it led to lots of
1842            segfaults. The new way requires more brute force but is more
1843            reliable.
1844    
1845            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
1846            variable layer2id
1847            (LegendTree.find_layer): New method to do with brute force what
1848            layer2id tried to accomplish
1849            (LegendTree._OnMsgLayerChanged)
1850            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
1851            Use find_layer instead of layer2id
1852            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
1853            update layer2id anymore
1854            (LegendTree._OnMsgMapLayersRemoved)
1855            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
1856    
1857    2003-06-03  Thomas Koester  <[email protected]>
1858    
1859            * Thuban/Model/classgen.py (GenQuantiles0): New function.
1860    
1861    2003-06-02  Bernhard Herzog  <[email protected]>
1862    
1863            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
1864            New commands.
1865            (main_menu): Add the new commands.
1866            (MainWindow.TableRename): New. Implementation of the table_rename
1867            command.
1868            (MainWindow.RenameLayer): New. Implementation of the layer_rename
1869            command.
1870    
1871            * Thuban/Model/session.py (Session.AddTable): call self.changed to
1872            set the modified flag
1873    
1874            * test/test_session.py (TestSessionSimple.test_add_table): Test
1875            whether the modified flag is set properly
1876    
1877            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
1878            instead of issue so that the modified flags get updated.
1879    
1880            * test/test_base.py (SomeTitledObject): Derive from Modifiable
1881            instead of Publisher to reflect reality better and to accomodate
1882            the fact that SetTitle now calls changed instead of issue
1883    
1884    2003-06-02  Bernhard Herzog  <[email protected]>
1885    
1886            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
1887            acquisition has to happen before the try in a try-finally.
1888    
1889    2003-06-02  Bernhard Herzog  <[email protected]>
1890    
1891            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
1892            possible that a layer is removed that is not currently selected in
1893            the legend so don't check for this.
1894    
1895    2003-05-30  Bernhard Herzog  <[email protected]>
1896    
1897            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
1898            variables to None that have direct or indirect references to
1899            shapefiles or dbf files to make sure that they do go away and the
1900            files are closed.
1901    
1902    2003-05-30  Bernhard Herzog  <[email protected]>
1903    
1904            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
1905            availImgListIndices when a new image list is created
1906            
1907    2003-05-30  Bernhard Herzog  <[email protected]>
1908    
1909            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
1910            changing_selection to indicate whether the LegendTree code itself
1911            is currently changing the selection
1912            (LegendTree.normalize_selection): New method to normalize the
1913            selection by selecting the layer item even if the user clicked on
1914            the classification.
1915            (LegendTree._OnSelChanged): normalize the selection. This works
1916            around a bug in wx which doesn't keep track of the selection
1917            properly when subtrees are deleted.
1918    
1919    2003-05-30  Bernhard Herzog  <[email protected]>
1920    
1921            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
1922            maximum and minimum scale factors.
1923    
1924            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
1925            changes in classgen.py
1926    
1927    2003-05-30  Jonathan Coles   <[email protected]>
1928    
1929            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
1930            all the methods functions. Fixes RTBug #1903.
1931    
1932            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
1933            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
1934            RTBug #1907.
1935    
1936            * Thuban/UI/classgen.py: Use classgen functions that were part
1937            of the ClassGenerator class. Put try/finally blocks around
1938            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
1939            RTBug #1904.
1940    
1941            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
1942    
1943            * Thuban/UI/legend.py: The legend was cleared and repopulated any
1944            time something changed which caused some state to be lost such
1945            as which children were expanded or collapsed. Fixes RTBug #1901.
1946            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
1947            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
1948            the legend but not in the map.
1949            (LegendTree.__FillTree): Move main functionality out into smaller
1950            methods that can be used by other methods.
1951            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
1952            if they are available.
1953            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
1954            that we override the wxTreeCtrl method. Iterate over children
1955            and call __RemoveLayer.
1956            (LegendTree.__AddLayer): New. Add a new layer to the legend.
1957            (LegendTree.__RemoveLayer): Remove a layer from the legend.
1958            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
1959            Should only be called with the id of a layer branch.
1960            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
1961            Returns the root item or creates one if necessary.
1962    
1963            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
1964            ProjectRasterFile with tuple arguments instead of strings.
1965    
1966            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
1967            with try/finally. Fixes RTBug #1904.
1968    
1969            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
1970            with try/finally. Fixes RTBug #1904.
1971            (MapCanvas.FitSelectedToWindow): If a single point is selected
1972            simply center it on the display. Fixes RTBug #1849.
1973    
1974            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
1975            to be compiled as a standalone app. Now the code can only be
1976            called from Python which simplifies the parameter passing.
1977            (ProjectRasterFile): Handle Python arguments. Remove code that
1978            checks for a destination dataset. Add more clean up code.
1979    
1980            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
1981            TestMapWithContents.test_lower_layer_bottom):
1982            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
1983            Fixes RTBug #1907.
1984    
1985            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
1986            extent to the map when the legend is toggled. Fixes RTBug #1881.
1987    
1988    2003-05-29  Jan-Oliver Wagner <[email protected]>
1989    
1990            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
1991            unsubscribes all that is subcribed in __init__.
1992    
1993    2003-05-28  Bernhard Herzog  <[email protected]>
1994    
1995            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
1996            (MainWindow.CanDuplicateLayer): New methods to implement the
1997            Layer/Duplicate command.
1998            (layer_duplicate command): New.
1999            (main_menu): Add layer_duplicate to the Layer menu.
2000    
2001    2003-05-28  Bernhard Herzog  <[email protected]>
2002    
2003            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
2004            renderer so that NULL/None values get displayed differently (by a
2005            gray rectangle).
2006            (TableGrid.__init__): Override the default renderers
2007    
2008    2003-05-28  Bernhard Herzog  <[email protected]>
2009    
2010            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
2011            classification to "None" if the type of the field has changed.
2012    
2013            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
2014            test for the Layer.SetShapeStore method
2015    
2016    2003-05-28  Jan-Oliver Wagner <[email protected]>
2017    
2018            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
2019            does not necessarily have a filename).
2020    
2021    2003-05-28  Jan-Oliver Wagner <[email protected]>
2022    
2023            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
2024            sort the selection list for the dialog.
2025    
2026    2003-05-28  Frank Koormann  <[email protected]>
2027    
2028            * extensions/thuban/wxproj.cpp
2029            (project_point): Removed cast to int for projected point coordinates.
2030            (shape_centroid): Return last point if all polygon vertices fall
2031            to one point.
2032    
2033    2003-05-28  Bernhard Herzog  <[email protected]>
2034    
2035            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
2036            with layers that don't have shapestores, i.e. raster layers.
2037    
2038    2003-05-28  Bernhard Herzog  <[email protected]>
2039    
2040            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
2041            when determining the title from the filename.
2042    
2043            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
2044            reflect changes in the way the title is derived from the filename
2045    
2046    2003-05-28  Frank Koormann  <[email protected]>
2047    
2048            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
2049            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
2050    
2051    2003-05-27  Bernhard Herzog  <[email protected]>
2052    
2053            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
2054            delegate SelectedLayer.
2055            (MainWindow.LayerUnjoinTable): Implement.
2056            (_can_unjoin): New. Helper function for the sensitivity of the
2057            layer/unjoin command.
2058    
2059            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
2060            (DerivedShapeStore.OrigShapeStore): New. Return the original
2061            shapestore. Used to figure out how to unjoin.
2062            (DerivedShapeStore.Shapefile): Fix a typo.
2063    
2064    2003-05-27  Bernhard Herzog  <[email protected]>
2065    
2066            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
2067            well
2068            (JoinDialog.__init__): Use the layer parameter and only build the
2069            left choice when a layer is given
2070            (JoinDialog.OnJoin): Handle layer joins as well
2071            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
2072            that the user selects the "Select..." item. The sensitivitly
2073            updating is now in update_sensitivity
2074            (JoinDialog.y): New method to refactor the sensitivity update of
2075            the join button into its own method.
2076    
2077            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
2078    
2079    2003-05-27  Bernhard Herzog  <[email protected]>
2080    
2081            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
2082            iff there are unreferenced tables in the session
2083    
2084    2003-05-27  Bernhard Herzog  <[email protected]>
2085    
2086            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
2087    
2088            * Thuban/Model/session.py (Session.UnreferencedTables): New method
2089            to return tables that are not referenced by other tables or shape
2090            stores and can be removed.
2091            (Session.RemoveTable): Issue a TABLE_REMOVED message after
2092            removing the table
2093    
2094            * Thuban/UI/mainwindow.py: Remove unused imports
2095            (MainWindow.TableClose): Implement.
2096    
2097            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
2098            messages so that the frame will be automatically closed when a new
2099            session is opened or the table is removed.
2100            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
2101            __init__
2102            (TableFrame.close_on_session_replaced)
2103            (TableFrame.close_on_table_removed): New. Subscribers that close
2104            the window
2105    
2106            * test/test_session.py (TestSessionMessages.test_remove_table)
2107            (TestSessionSimple.test_remove_table): Move the test to
2108            TestSessionSimple and add test for the TABLE_REMOVED message
2109            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
2110            (TestSessionSimple.test_unreferenced_tables) New. Test for the
2111            UnreferencedTables method.
2112            (UnreferencedTablesTests): New. Class with some more sophisticated
2113            tests for UnreferencedTables.
2114    
2115    2003-05-27  Frank Koormann  <[email protected]>
2116    
2117            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
2118            display has some unwanted side effects. Removed again.
2119    
2120    2003-05-27  Frank Koormann  <[email protected]>
2121    
2122            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
2123    
2124            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
2125    
2126    2003-05-27  Jan-Oliver Wagner <[email protected]>
2127    
2128            * test/test_menu.py (MenuTest.test): Added test for
2129            Menu.RemoveItem().
2130    
2131            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
2132            the menu.
2133    
2134    2003-05-27  Frank Koormann  <[email protected]>
2135            
2136            Nonmodal dialogs without parent (i.e. they can fall behind the main
2137            window)
2138    
2139            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
2140            all dialogs in the dialogs dictionary and the canvas.
2141    
2142            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
2143            parent, i.e. can fall behind other windows.
2144            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
2145            dictionary before removing it.
2146    
2147            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
2148    
2149            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
2150            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
2151            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
2152    
2153    2003-05-27  Bernhard Herzog  <[email protected]>
2154    
2155            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
2156            tableview dialog
2157            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
2158            Also, don't use the table's titles as the dialog names. The titles
2159            aren't guaranteed to be unique.
2160            (MainWindow.TableOpen): Open a table view dialog after opening the
2161            table
2162    
2163    2003-05-27  Bernhard Herzog  <[email protected]>
2164    
2165            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
2166            effect can be achieved by simply closing the window showing the
2167            table.
2168            (MainWindow.TableHide): Removed.
2169            (main_menu): Removed "table_hide"
2170    
2171    2003-05-27  Frank Koormann  <[email protected]>
2172    
2173            Fix legend tree display problems under Win32
2174    
2175            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
2176            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
2177            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
2178    
2179            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
2180    
2181    2003-05-27  Jan-Oliver Wagner <[email protected]>
2182    
2183            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
2184            'after' now allows to insert separators almost anywhere in the menu.
2185    
2186    2003-05-27  Frank Koormann  <[email protected]>
2187    
2188            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
2189            "S" of selection box label to hint on hot key (Alt-S). Works under
2190            Win32 but is ignored under GTK.
2191    
2192    2003-05-26  Frank Koormann  <[email protected]>
2193    
2194            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
2195            Center Choices.
2196    
2197    2003-05-26  Bernhard Herzog  <[email protected]>
2198    
2199            Remove the Precision methods again. They're too DBF specific to be
2200            part of the table interface and they're only used in table_to_dbf
2201            anyway.
2202            
2203            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
2204            fixed precision of 12 for doubles.
2205            (TransientTableBase.Precision): Removed
2206            (AutoTransientTable.Width): Delegate to self.table.
2207    
2208            * Thuban/Model/table.py (DBFTable.Precision)
2209            (MemoryTable.Precision): Removed.
2210            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
2211            (table_to_dbf): Use a fixed precision of 12 for floats unless the
2212            column object specifies something else.
2213    
2214            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
2215            test for table_to_dbf
2216    
2217    2003-05-26  Bernhard Herzog  <[email protected]>
2218    
2219            * test/test_transientdb.py
2220            (TestTransientTable.run_iceland_political_tests): Fix a comment.
2221    
2222    2003-05-26  Bernhard Herzog  <[email protected]>
2223    
2224            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
2225            implementation. Mark parts of the file format strings for
2226            localization.
2227    
2228            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
2229            file and add the table to the tables managed by the session
2230    
2231            * test/test_session.py (TestSessionSimple.test_open_table_file):
2232            New. test case for OpenTableFile
2233    
2234    2003-05-26  Jan-Oliver Wagner <[email protected]>
2235    
2236            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
2237            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
2238            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
2239            Replace the true/false of wxWindows by True/False of Python 2.2.1.
2240    
2241    2003-05-26  Jan-Oliver Wagner <[email protected]>
2242    
2243            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
2244            already a selection present, update the grid accordingly.
2245    
2246            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
2247            resizeable and increase its initial size.
2248    
2249    2003-05-26  Frank Koormann  <[email protected]>
2250    
2251            Table export functionality
2252    
2253            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
2254            Return width (in characters) for a column.
2255            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
2256            (table_to_dbf): Write table to dbf file.
2257            (table_to_csv): Write table to csv file.
2258    
2259            * Thuban/Model/transientdb.py (TransientTableBase.Width,
2260            TransientTableBase.Precision): Return column width and precision.
2261    
2262            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
2263            or table_to_csv depending on file selection.
2264    
2265            * test/test_dbf_table.py:
2266            Test table_to_dbf (extension of former part of test).
2267    
2268            * test/test_csv_table.py:
2269            Test table_to_csv.
2270    
2271    2003-05-23  Jan-Oliver Wagner <[email protected]>
2272    
2273            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
2274            Use QueryTableFrame instead of TableFrame.
2275    
2276            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
2277            table window with 'Layer Table:' instead of 'Table:'.
2278    
2279    2003-05-23  Jan-Oliver Wagner <[email protected]>
2280    
2281            Give all tables a title via mix-in TitledObject.LayerShowTable
2282    
2283            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
2284            only if it exists.
2285    
2286            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
2287            and call its init-method with a default title. Remove Title() method.
2288    
2289            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
2290            AutoTransientTable): mix-in TitledObject and call its init-method with
2291            a default title. Remove Title() method.
2292    
2293    2003-05-23  Bernhard Herzog  <[email protected]>
2294    
2295            * Thuban/Model/session.py (Session.AddShapeStore): Define
2296            AddShapeStore analogously to AddTable.
2297    
2298            * test/test_session.py (TestSessionSimple.test_add_shapestore):
2299            New. Test for AddShapeStore
2300    
2301    2003-05-23  Jan-Oliver Wagner <[email protected]>
2302    
2303            Introducing QueryTableFrame and a very coarse ShowTable implementation.
2304    
2305            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
2306            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
2307            The latter implements the selection GUI without dependency on a layer.
2308            LayerTableFrame now is derived from QueryTableFrame and connects
2309            to a layer.
2310    
2311            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
2312            implementation that still needs work.
2313    
2314            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
2315    
2316    2003-05-22  Frank Koormann  <[email protected]>
2317    
2318            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
2319            Added "outer_join = False" as optional parameter.
2320            (TransientJoinedTable.create): If outer join is true, perform a
2321            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
2322            the left table. Records not matching are filled with 0 / None.
2323    
2324            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
2325            (JoinDialog.OnJoin): Consider outer join check box.
2326    
2327    2003-05-22  Bernhard Herzog  <[email protected]>
2328    
2329            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
2330            somewhat safer way. Storing the traceback in a local variable can
2331            lead to memory leaks
2332    
2333    2003-05-22  Bernhard Herzog  <[email protected]>
2334    
2335            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
2336            the wxMessageDialog's Destroy() method.
2337    
2338    2003-05-22  Frank Koormann  <[email protected]>
2339    
2340            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
2341            TransientTable.Title()
2342    
2343    2003-05-22  Frank Koormann  <[email protected]>
2344    
2345            Join Dialog, initial version.
2346    
2347            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
2348    
2349            * Thuban/UI/join.py (JoinDialog): Functional implementation of
2350            former framework. Renamed Table1/Table2 to LeftTable/RightTable
2351            in all occurences.
2352    
2353            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
2354            Typo fixed.
2355    
2356    2003-05-22  Bernhard Herzog  <[email protected]>
2357    
2358            Give the tables titles so that the GUI can display more meaningful
2359            names. For now the titles are fixed but depend on e.g. filenames
2360            or the titles of the joined tables.
2361    
2362            * Thuban/Model/transientdb.py (TransientTable.Title)
2363            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
2364    
2365            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
2366    
2367            * test/test_transientdb.py
2368            (TestTransientTable.test_auto_transient_table_title): New. Test
2369            for the Title method
2370            (TestTransientTable.test_transient_joined_table)
2371            (TestTransientTable.test_transient_table): Add test for the Title
2372            methods
2373    
2374            * test/test_memory_table.py (TestMemoryTable.test_title): New.
2375            Test for the Title method
2376    
2377            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
2378            the Title method
2379    
2380    2003-05-22  Bernhard Herzog  <[email protected]>
2381    
2382            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2383            Provide a better way to destroy the layers
2384            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
2385            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
2386            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
2387            the new way to destroy the layers.
2388            (TestLayer.test_derived_store): New. Test for using a layer with a
2389            DerivedShapeStore
2390    
2391            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
2392            filename if the shape store actually has one.
2393    
2394    2003-05-22  Bernhard Herzog  <[email protected]>
2395    
2396            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
2397            for the filename
2398    
2399            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
2400            for the FileName method
2401            (TestDBFTableWriting.test_write): Fix spelling of filename
2402    
2403    2003-05-22  Thomas Koester  <[email protected]>
2404    
2405            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
2406            from SciParam that now really is immutable.
2407    
2408    2003-05-22  Frank Koormann  <[email protected]>
2409    
2410            Layer Top/Bottom placement added to legend.
2411    
2412            * Thuban/UI/legend.py
2413            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
2414            bound to tool events.
2415            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
2416            New, methods binding the event methods with the map methods.
2417    
2418            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
2419            layer at top/bottom of layer stack.
2420    
2421            * Resources/Bitmaps/top_layer.xpm: New button icon.
2422    
2423            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
2424    
2425    2003-05-22  Bernhard Herzog  <[email protected]>
2426    
2427            * Thuban/Model/session.py (Session.RemoveTable): New method to
2428            remove tables
2429    
2430            * test/test_session.py (TestSessionSimple.test_remove_table): New.
2431            Test for RemoveTable
2432    
2433    2003-05-22  Thomas Koester  <[email protected]>
2434    
2435            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
2436            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
2437    
2438    2003-05-22  Bernhard Herzog  <[email protected]>
2439    
2440            Implement a way to discover dependencies between tables and
2441            shapestores.
2442    
2443            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
2444            (TransientJoinedTable.Dependencies)
2445            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
2446            interface
2447            (TransientJoinedTable.__init__): Keep tack of the original table
2448            objects in addition to the corresponding transient tables.
2449    
2450            * Thuban/Model/table.py (DBFTable.Dependencies)
2451            (MemoryTable.Dependencies): New. Implement the dependencies
2452            interface
2453    
2454            * Thuban/Model/data.py (ShapeTable): New. Helper class for
2455            ShapefileStore
2456            (ShapefileStore.__init__): Use ShapeTable instead of
2457            AutoTransientTable
2458            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
2459            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
2460            methods for filename and type
2461            (ShapefileStore.Dependencies): New. Implement the dependencies
2462            interface
2463            (DerivedShapeStore): New class to replace SimpleStore. The main
2464            difference to SimpleStore is that it depends not on a shapefile
2465            but another shapestore which expresses the dependencies a bit
2466            better
2467            (SimpleStore.__init__): Add deprecation warning.
2468    
2469            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
2470            Test for the Dependencies method.
2471    
2472            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
2473            New. Test for the Dependencies method.
2474    
2475            * test/test_transientdb.py
2476            (TestTransientTable.test_auto_transient_table_dependencies): New.
2477            Test for the Dependencies method.
2478            (TestTransientTable.test_transient_joined_table): Add test for the
2479            Dependencies method.
2480    
2481            * test/test_session.py (TestSessionSimple.setUp)
2482            (TestSessionSimple.tearDown): New. Implement a better way to
2483            destroy the sessions.
2484            (TestSessionSimple.test_initial_state)
2485            (TestSessionSimple.test_add_table): Bind session to self.session
2486            so that it's destroyed by tearDown
2487            (TestSessionSimple.test_open_shapefile): New. Test for
2488            OpenShapefile and the object it returns
2489    
2490    2003-05-22  Bernhard Herzog  <[email protected]>
2491    
2492            * Thuban/Model/session.py (Session.AddTable): New method to
2493            register tables with the session.
2494            (Session.Tables): Return the tables registered with AddTable too.
2495    
2496            * test/test_session.py (TestSessionSimple.test_add_table): New.
2497            Test case for the AddTable method
2498    
2499    2003-05-22  Frank Koormann  <[email protected]>
2500    
2501            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
2502            lower right corner, center labels for selections, initialize controls
2503            in reasonable order for keyboard navigation.
2504    
2505            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
2506            (ProjFrame.__DoOnProjAvail): Determine position of current projection
2507            using the wxListBox.FindString() method. Still a problem (#1886)
2508    
2509            * Thuban/UI/classifier.py
2510            (Classifier.__init__, SelectPropertiesDialog.__init__)
2511    
2512            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
2513            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
2514            different classification types from here to __init__.
2515            (GenUniquePanel.__init__): Set the column width of the first field
2516            in the Field ListCtrl to the full width.
2517    
2518            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
2519            Button to 'Export'. Center Buttons in Selection Box, set Focus to
2520            Grid.
2521            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
2522            changes focus to the Selection when pressing "Alt-S".
2523    
2524            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
2525            the text if not visible. The italic font sometimes exceeds the
2526            rendering area.
2527    
2528    2003-05-21  Jonathan Coles   <[email protected]>
2529    
2530            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
2531            to OnClose so that Thuban closes correctly.
2532    
2533            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
2534            DockFrame.OnClose, not DockFrame._OnClose.
2535    
2536    2003-05-21  Jonathan Coles   <[email protected]>
2537    
2538            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
2539            references to 'inf' and use new Range __init__ to pass floats
2540            directly rather than converting them to strings first.
2541            Fixes RTBug #1876.
2542    
2543            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
2544            Use new Range ___init__ to pass floats.
2545    
2546            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
2547            filename is a valid image file. Throw IOError otherwise.
2548    
2549            * Thuban/Model/range.py: Brought over new Range from SciParam that
2550            is immutable and has an __init__ which can accept floats.
2551    
2552            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
2553            into try block. AddLayer doesn't throw any exceptions anymore.
2554            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
2555            try block.
2556    
2557            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
2558            the first item in choices. Fixes RTBug #1882.
2559    
2560            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
2561            has gone to 0 which is a serious problem. abort.
2562            (MapRenderer.draw_raster_layer): Catch IOError seperately and
2563            print the error from GDAL.
2564    
2565            * Thuban/UI/tableview.py (TableGrid.__init__): Call
2566            ToggleEventListeners to turn on listening.
2567            (TableGrid.ToggleEventListeners): New. Turns event listening on
2568            and off so as to prevent excessive messages.
2569            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
2570            to suppress excessive messages when selecting many rows.
2571            Fixes RTBug #1880.
2572    
2573            * Thuban/UI/view.py: Added checks against if scale == 0. This
2574            is a serious problem that can occur when an image without
2575            geo data is loading and causes the map projection bounds to
2576            go to infinity. Right now, the solution is to simply try
2577            to recover.
2578    
2579            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
2580            to set the MFILEReceiver attributes even if the data is NULL.
2581    
2582            * extensions/thuban/gdalwarp.cpp: Improved the error handling
2583            and passed GDAL messages back up to the Python layer. Also
2584            tried to fix some memory leaks that were present in the original
2585            utility but didn't matter because the program aborted.
2586    
2587            * test/test_range.py: Copied over tests from SciParam. Removed
2588            tests against importing. Fixes RTBug #1867.
2589    
2590    2003-05-21  Bernhard Herzog  <[email protected]>
2591    
2592            * test/test_load.py: Remove unused imports and restructure the
2593            test code
2594            (LoadSessionTest): Split into one class for each test and turn
2595            LoadSessionTest itself into the base class for all such session
2596            tests.
2597            (ClassificationTest): New base class for load tests that test
2598            classifications
2599            (TestSingleLayer, TestLayerVisibility, TestClassification)
2600            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
2601            for the individual tests
2602    
2603            * test/support.py (FileLoadTestCase.filename): New base class for
2604            file loading tests
2605    
2606    2003-05-21  Jan-Oliver Wagner <[email protected]>
2607    
2608            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
2609            Mercator' to 'UTM Zone 32' as a more convenient example.
2610            Added 'Gauss Krueger Zone 6'.
2611    
2612            * Data/iceland_sample_raster.thuban: political polygon now
2613            filled transparent to have the raster image visible at once.
2614    
2615    2003-05-21  Frank Koormann  <[email protected]>
2616    
2617            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
2618            OnClose() to keep in sync with extensions. Internally Thuban
2619            still uses "underscored" names.
2620    
2621    2003-05-20  Jonathan Coles   <[email protected]>
2622    
2623            This puts back Raster layer support. These layers support projections
2624            through the GDAL library. Currently, the CVS version is being used.
2625            There are no Debian packages available although this may change soon.
2626            A GDAL driver was extended to support writing to memory rather to
2627            files.
2628    
2629            There is still some work that needs to be done, such as some error
2630            handling when loading invalid images or when there is a problem
2631            projecting the image. This putback simply checks in the majority
2632            of the work.
2633    
2634            * setup.py: Add gdalwarp library extension.
2635    
2636            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
2637            Defaults to False, but can be overridden by subclasses if they
2638            support classification.
2639            (RasterLayer): New. Defines a new layer that represents an
2640            image.
2641    
2642            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
2643            tag handler.
2644            (SessionLoader.start_layer): Encode the filename.
2645            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
2646            New. Supports reading a rasterlayer tag.
2647    
2648            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
2649    
2650            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
2651            get a string in Latin1. If we get such as string convert it to
2652            unicode first, otherwise leave if alone before encoding.
2653            (SessionSaver.write_layer): Add support for writing both Layers
2654            and RasterLayers.
2655    
2656            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
2657            The right argument may not be a string, it could also be a Column.
2658    
2659            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
2660            Make initial window size 600x400. Fixes RTBug #1872.
2661    
2662            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
2663            the dialog is constructed so that we can support layers that
2664            do not have classifications.
2665            (Classifier._OnTry): Only build a classification if the layer
2666            supports one.
2667    
2668            * Thuban/UI/legend.py: Change all checks that a layer is an
2669            instance of Layer into checks against BaseLayer.
2670            (LegendTree.__FillTreeLayer): Only add children to a branch if
2671            the layer supports classification.
2672    
2673            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
2674            MainWindow.OpenSession): Don't proceed with an action if the
2675            user chooses Cancel when they are asked to save changes.
2676            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
2677            user to select an image file. Create a new RasterLayer and add
2678            it to the map.
2679    
2680            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
2681            for rendering RasterLayer layers.
2682            (MapRenderer.draw_raster_layer): Actually method that calls
2683            the GDALWarp python wrapper and constructs an image from the
2684            data returned.
2685    
2686            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
2687            Choices symbols to match those used in the table query method.
2688            Replace deprecated method calls on table with new method names.
2689    
2690            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
2691            how small the scale can get. This still needs more testing.
2692    
2693            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
2694            Provides a driver to output in .bmp format.
2695    
2696            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
2697            New. Provides IO routines which write to memory, rather than a file.
2698    
2699            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
2700            of the gdalwarp utility provided in GDAL. Added function calls
2701            that can be accessed from python.
2702    
2703            * Data/iceland_sample_raster.thuban: New. Sample file that uses
2704            a raster layer.
2705    
2706            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
2707            layer image data.
2708    
2709            * Doc/thuban.dtd: Added rasterlayer attribute definition.
2710    
2711            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
2712            tests associated with the raster layer code.
2713    
2714            * test/test_transientdb.py
2715            (TestTransientTable.test_auto_transient_table_query): Added a test
2716            for using a Column object as the "right" parameter to a query.
2717    
2718    2003-05-19  Frank Koormann  <[email protected]>
2719    
2720            * Thuban/version.py (get_changelog_date):
2721            Catch exceptions if ChangeLog does not exist.
2722    
2723            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
2724    
2725    2003-05-19  Frank Koormann  <[email protected]>
2726    
2727            Extended version information for Thuban
2728    
2729            * Thuban/version.py: New, version information for Thuban: Last
2730            modification date and last ChangeLog entry date.
2731    
2732            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
2733            information: Display Thuban, wxPython and Python version.
2734    
2735    2003-05-16  Bernhard Herzog  <[email protected]>
2736    
2737            * Thuban/Model/save.py: Remove some unused imports including the
2738            __future__ import for nested_scopes as Thuban relies on Python 2.2
2739            now.
2740            (XMLWriter.encode): Remove the special case for a None argument.
2741            In the saver encode is always called with a string argument.
2742    
2743    2003-05-16  Bernhard Herzog  <[email protected]>
2744    
2745            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
2746            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
2747            of the bug was that e.g. float("1.2") would fail. Thuban now
2748            requires 2.4.x.
2749            
2750    2003-05-16  Frank Koormann   <[email protected]>
2751    
2752            Printing enhancement and WMF export (under Win32)
2753    
2754            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
2755            ScreenRenderer. Renders Map, Legend and Scalebar for export.
2756            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
2757            PrintRender.
2758    
2759            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
2760            to fullfil information needed for PrinterRenderer.
2761            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
2762            (MapCanvas.Print): Adapted to new MapPrintout.
2763            (OutputTransform): General calculations to transform from canvas
2764            coordinates to export/printing devices.
2765    
2766            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
2767            new method_command to call ExportMap, with platform dependency (only
2768            __WXMSW__)
2769      
2770            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
2771            of scalebar drawing area as new parameters.
2772            
2773            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
2774    
2775            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
2776            Update to extended scalebar.DrawScalebar header.
2777    
2778            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
2779    
2780            * test/test_scalebar.py: Made test executable as standalone.
2781    
2782    2003-05-16  Bernhard Herzog  <[email protected]>
2783    
2784            * Thuban/Model/table.py (Table): Remove this compatibility alias
2785            for DBFTable.
2786    
2787            * test/test_table.py: Import DBFTable as Table because that alias
2788            doesn't exist anymore.
2789    
2790            * Thuban/UI/classgen.py: Remove some unused imports
2791    
2792    2003-05-14  Jonathan Coles   <[email protected]>
2793    
2794            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
2795            Fix docstring.
2796            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
2797            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
2798            values of the supplied range to determine the beginning and end
2799            bounds of the generated classes.
2800    
2801            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
2802            do not have a leading 0 (.5 is now accepted as well as 0.5).
2803    
2804            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
2805            call to ClassGenerator.GenUniformDistribution.
2806    
2807            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
2808            layout bug with the 'Projection' label.
2809    
2810            * test/support.py (FloatTestCase): New. Needed for the Range tests.
2811    
2812            * test/test_range.py: New. Imported from SciParam.
2813    
2814    2003-05-12  Jonathan Coles   <[email protected]>
2815    
2816            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
2817            to table.UniqueValues() with calls that retrieve all the values
2818            from the table. This will need to be replaced by a method on table
2819            which can simply return the list (perhaps more efficiently).
2820    
2821    2003-05-12  Jonathan Coles   <[email protected]>
2822    
2823            The return value of ClassGenerator.CalculateQuantiles has changed.
2824            Refer to the documentation for details.
2825    
2826            * test/test_classgen.py: Modified Quantile tests to use the
2827            new return values.
2828    
2829            * Thuban/Model/classgen.py
2830            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
2831            use new return values from CalculateQuantiles to produce the correct
2832            range bounds in the Classification.
2833            (ClassGenerator.CalculateQuantiles): Add more comments describing
2834            the return values and parameters. Make minor adjustments to improve
2835            the legibility of the code. Fix problem with adjusted not being set
2836            in most cases.
2837    
2838    2003-05-12  Frank Koormann <[email protected]>
2839            
2840            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
2841            and latin1. Fixes #1851 finally.
2842    
2843    2003-05-09  Jonathan Coles   <[email protected]>
2844    
2845            * test/test_classgen.py: New. Tests the Quantile algorithm.
2846    
2847            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
2848            Clean up debugging statement, add comments, fix a small bug in the
2849            returned adjusted percentiles.
2850            
2851    2003-05-09  Jonathan Coles   <[email protected]>
2852    
2853            Introduces Range class from SciParam into the ClassGroupRange class,
2854            and such ranges can now be saved and loaded from disk.
2855    
2856            Quantiles are now available in the Classification Generator.
2857    
2858            Initial support for building Queries on a table. Doesn't do anything
2859            but run some tests.
2860    
2861            * Thuban/Model/classification.py: Explicit imports.
2862            (ClassGroupRange): Use the Range class to store the underlying
2863            range information. The interface remains the same, except for
2864            GetRange(), and you can also supply a Range object as the min
2865            parameter to SetRange or __init__.
2866    
2867            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
2868            string appropriately for use in Thuban. Fixes RTbug #1851.
2869            (SessionLoader.end_projection): Handle the context of the
2870            projection tag a bit better by looking at what objects are not
2871            None. There was an assumption that a projection tag for a map
2872            could occur before any layers.
2873            (SessionLoader.start_clrange): Provide backward compatibility for
2874            reading min/max values as well as the new range parameter.
2875    
2876            * Thuban/Model/map.py: Explicit imports.
2877    
2878            * Thuban/Model/resource.py: Import _.
2879            (ProjFileSaver.write): write header using projfile.dtd.
2880    
2881            * Thuban/Model/save.py: Explicit imports.
2882            (XMLWriter.encode): New. Encode the given string from a format
2883            used by Thuban into UTF-8. Fixes RTbug #1851.
2884    
2885            * Thuban/UI/classgen.py: Explicit imports.
2886            (ClassGenDialog.__init__): Clean up the code and add support
2887            for Quantiles.
2888            (ClassGenDialog.OnOK): Add support for Quantiles.
2889            (GenQuantilesPanel): New. Input panel for Quantiles.
2890            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
2891            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
2892    
2893            * Thuban/Model/classgen.py: New. Contains all the classes named above.
2894    
2895            * Thuban/UI/classifier.py: Explicit imports.
2896            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
2897            ClassTable.SetValueAsCustom): Reworked to use new Range class.
2898    
2899            * Thuban/UI/legend.py: Explicit imports.
2900    
2901            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
2902            a Table menu and associated method calls.
2903            (MainWindow.choose_color): Removed. No longer needed.
2904    
2905            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
2906            should be disabled if no projection is selected in the available
2907            list.
2908    
2909            * Thuban/UI/renderer.py: Explicit imports.
2910    
2911            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
2912            with correctly selecting the rows and issuing the right events.
2913            Be sure to call Skip() to allow the grid to do some of its own
2914            handling which allows the rows to actually be selected.
2915            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
2916            selecting multiple shapes.
2917            (LayerTableFrame): Support for building Queries.
2918            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
2919    
2920            * Thuban/UI/tree.py: Explicit imports.
2921    
2922            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
2923            table view can call it.
2924    
2925            * test/test_classification.py: Explicit imports.
2926            (TestClassification.test_ClassGroupRange): Fix test for new
2927            Range class.
2928    
2929            * Doc/thuban.dtd: Add range parameter for clrange.
2930    
2931            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
2932            object in ClassGroupRange, and also uesd for inputting ranges in
2933            the classifer table and elsewhere.
2934    
2935            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
2936            yet.
2937    
2938    2003-05-09  Frank Koormann <[email protected]>
2939    
2940            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
2941    
2942    2003-05-08  Frank Koormann <[email protected]>
2943    
2944            Coding style updates
2945    
2946            * test/test_scalebar.py: Replaced tab indentation by spaces.
2947    
2948            * Thuban/UI/scalebar.py: Explicit imports.
2949    
2950    2003-05-08  Frank Koormann <[email protected]>
2951    
2952            * Thuban/UI/scalebar.py
2953            (ScaleBar.DrawScalebar): Format string bug fixed.
2954    
2955    2003-05-08  Frank Koormann <[email protected]>
2956    
2957            Reorganization of scalebar component (no wx in Thuban/Model)
2958    
2959            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
2960            (deriveInterval):
2961            Calculate scalebar interval and unit which fits in width for scale.
2962            (roundInterval): Round float.
2963    
2964            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
2965    
2966            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
2967    
2968            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
2969    
2970    2003-05-08  Frank Koormann <[email protected]>
2971    
2972            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
2973            Initialize ScaleBar with canvas.map
2974    
2975            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
2976            round intervals to display smarter lengths
2977            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
2978            layer. If the maps has no projection applied grey the scalebar.
2979    
2980    2003-05-07  Frank Koormann <[email protected]>
2981            
2982            Basic Scalebar features added.
2983    
2984            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
2985    
2986            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
2987            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
2988            and the renderer.
2989    
2990            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
2991    
2992            * Thuban/UI/messages.py: SCALE_CHANGED added.
2993    
2994    2003-05-07  Bernhard Herzog  <[email protected]>
2995    
2996            * Thuban/Model/session.py (Session.__init__): New instance
2997            variable shapestores to hold a list of all open shapestore objects
2998            (Session.ShapeStores): New. Accessor method for the shapestores
2999            list.
3000            (Session._add_shapestore, Session._clean_weak_store_refs): New.
3001            Internal methods to maintain the shapestores list.
3002            (Session.Tables): New. Return all tables open in the session.
3003            (Session.OpenShapefile): Insert the new ShapeStore into the
3004            shapestores list.
3005    
3006            * test/test_session.py (TestSessionSimple.test_initial_state): Add
3007            tests for ShapeStores and Tables
3008            (TestSessionWithContent.test_shape_stores)
3009            (TestSessionWithContent.test_tables): New. Test cases for
3010            ShapeStores and Tables
3011    
3012    2003-05-07  Bernhard Herzog  <[email protected]>
3013    
3014            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
3015            Add comments about the optimizations used.
3016            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
3017            Implement the ReadValue table interface method.
3018    
3019            * test/test_transientdb.py
3020            (TestTransientTable.run_iceland_political_tests)
3021            (TestTransientTable.test_transient_joined_table): Add tests for
3022            ReadValue
3023    
3024    2003-05-07  Frank Koormann <[email protected]>
3025    
3026            * Resources/Bitmaps/fulllayerextent.xpm,
3027            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
3028            new icons.
3029    
3030    2003-05-06  Bernhard Herzog  <[email protected]>
3031    
3032            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
3033            New. Simply delegate to the transient table's version.
3034    
3035            * test/test_transientdb.py
3036            (TestTransientTable.test_auto_transient_table_query): New. Test
3037            case for AutoTransientTable's SimpleQuery
3038    
3039    2003-05-06  Bernhard Herzog  <[email protected]>
3040    
3041            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
3042            Implement a simple query method for the query dialog
3043            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
3044            the row index or shapeid.
3045            (TransientTable.create): Insert the right value of the row index
3046            (TransientJoinedTable.create): Copy the row index of the left
3047            table to the joined result table
3048    
3049            * test/test_transientdb.py
3050            (TestTransientTable.test_transient_table_read_twice): Fix
3051            doc-string
3052            (TestTransientTable.test_transient_table_query): New. Test for the
3053            SimpleQuery method
3054    
3055    2003-05-06  Bernhard Herzog  <[email protected]>
3056    
3057            Convert all table users to use the new table interface. This only
3058            covers Thuban itself, not GREAT-ER or other applications built on
3059            Thuban yet, so the compatibility interface stays in place for the
3060            time being but it now issues DeprecationWarnings.
3061    
3062            Finally, the new Table interface has a new method, HasColumn.
3063    
3064            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
3065            issue deprecation warnings when they're. The warnings refer to the
3066            caller of the method.
3067            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
3068            for the deprecation warnings
3069    
3070            * test/test_table.py: Ignore the deprecation warnings for the old
3071            table in the tests in this module. The purpose of the tests is to
3072            test the old interface, after all.
3073    
3074            * test/test_transientdb.py
3075            (TestTransientTable.run_iceland_political_tests): Use the
3076            constants for the types. Add a test for HasColumn
3077            (TestTransientTable.test_transient_joined_table): Adapt to new
3078            table interface. Add a test for HasColumn
3079            (TestTransientTable.test_transient_table_read_twice): Adapt to new
3080            table interface
3081    
3082            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
3083            Adapt to new table interface
3084    
3085            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
3086            new table interface
3087    
3088            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
3089            (RecordTable.SetTable): Adapt to new table interface
3090    
3091            * Thuban/UI/classifier.py (Classifier.__init__)
3092            (Classifier.__init__): Adapt to new table interface
3093    
3094            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
3095            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
3096            to new table interface
3097    
3098            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
3099            (AutoTransientTable.HasColumn): Implement the new table interface
3100            method
3101            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
3102            (AutoTransientTable.UniqueValues): Adapt to new table interface
3103    
3104            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
3105            Adapt to new table interface
3106    
3107            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
3108            simplify opening shapefiles a bit easier.
3109            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
3110            (TestLayer.test_point_layer): Use the new helper method
3111            (TestLayer.test_get_field_type): New. Test for the GetFieldType
3112            method
3113    
3114            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
3115            the new table method
3116    
3117            * test/test_memory_table.py (TestMemoryTable.test_has_column):
3118            Test for the new table method HasColumn
3119    
3120    2003-05-06  Jonathan Coles   <[email protected]>
3121    
3122            Addresses the "Selection Extent" wish of RTbug #1787.
3123    
3124            * Resources/Bitmaps/fulllayerextent.xpm,
3125            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
3126            extent. These are just place holders for the real bitmaps.
3127    
3128            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
3129            calculate the bounding box once (the first time compute_bbox() is
3130            called).
3131            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
3132            the bounding box for the shapes in lat/long coordinates.
3133    
3134            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
3135            option.
3136            (MainWindow.has_selected_shapes): New. Returns true if there are
3137            any selected shapes.
3138            (MainWindow.FullSelectionExtent): New. Calls
3139            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
3140            (_has_selected_shapes): New. Returns true if there are any
3141            selected shapes.
3142    
3143            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
3144            true if there are any selected shapes.
3145    
3146            * Thuban/UI/view.py (MapCanvas): Added delegated method
3147            HasSelectedShapes.
3148            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
3149            shapes on the canvas using the map projection (if any).
3150    
3151            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
3152            for Layer.ShapesBoundingBox().
3153    
3154    2003-05-06  Bernhard Herzog  <[email protected]>
3155    
3156            * Resources/Projections/defaults.proj: Fix spelling of Mercator
3157    
3158    2003-05-05  Jonathan Coles   <[email protected]>
3159    
3160            Addresses the "Full Layer Extent" wish of RTbug #1787.
3161    
3162            * Resources/Projections/defaults.proj: Added UK National Grid.
3163    
3164            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
3165            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
3166            when the user selects the menu option.
3167    
3168            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
3169            scales the given layer on the canvas using the map projection.
3170    
3171    2003-05-05  Bernhard Herzog  <[email protected]>
3172    
3173            Convert the table implementations to a new table interface. All
3174            tables use a common mixin class to provide backwards compatibility
3175            until all table users have been updated.
3176    
3177            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
3178            provide backwards compatibility for table classes implementing the
3179            new interface
3180            (DBFTable, MemoryTable): Implement the new table interface. Use
3181            OldTableInterfaceMixin as base for compatibility
3182            (DBFColumn, MemoryColumn): New. Column description for DBFTable
3183            and MemoryTable resp.
3184    
3185            * test/test_dbf_table.py: New. Test cases for the DBFTable with
3186            the new table interface.
3187    
3188            * test/test_memory_table.py: New. Test cases for the MemoryTable
3189            with the new table interface.
3190    
3191            * test/test_table.py: Document the all tests in this file as only
3192            for backwards compatibility. The equivalent tests for the new
3193            interface are in test_memory_table.py and test_dbf_table.py
3194            (MemoryTableTest.test_read): field_info should be returning tuples
3195            with four items
3196            (MemoryTableTest.test_write): Make doc-string a more precise.
3197    
3198            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
3199            table interface. Derive from from OldTableInterfaceMixin for
3200            compatibility.
3201            (TransientTableBase.create): New intance variable column_map to
3202            map from names and indices to column objects
3203            (TransientTable.create): Use the new table interface of the input
3204            table
3205            (AutoTransientTable): Convert to new table interface. Derive from
3206            from OldTableInterfaceMixin for compatibility.
3207            (AutoTransientTable.write_record): Removed. It's not implemented
3208            yet and we still have to decide how to handle writing with the new
3209            table and data framework.
3210    
3211            * test/test_transientdb.py
3212            (TestTransientTable.run_iceland_political_tests)
3213            (TestTransientTable.test_transient_joined_table): Use the new
3214            table interface
3215    
3216    2003-05-05  Jonathan Coles   <[email protected]>
3217    
3218            This is namely a collection of UI updates to improve user interactivity.
3219            Tabbing between controls now exists and you can use ESC to close dialog
3220            boxes; ENTER will active the default button.
3221    
3222            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
3223            order that the controls are created so that tabbing works correctly.
3224            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
3225            wxDialog can handle the default button correctly.
3226            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
3227            same reasons as for OnOK.
3228            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
3229            when we ask the table for the maximum/minimum values of a field
3230            which could take a very long time.
3231    
3232            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
3233            order that the controls are created so that tabbing works correctly.
3234            (SelectPropertiesDialog.__init__): Rearrange the order that the
3235            controls are created so that tabbing works correctly.
3236    
3237            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
3238            to derive from a wxDialog but behave like the original implementation
3239            which was derived from a wxFrame. wxDialog provides useful key
3240            handling functionality like ESC calling OnCancel and ENTER calling
3241            OnOK which is lost with wxFrame.
3242    
3243            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
3244            new dialogs.
3245    
3246            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
3247            order that the controls are created so that tabbing works correctly.
3248            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
3249            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
3250            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
3251            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
3252            can provide the "UK National Grid" as a default projection.
3253            (UTMPanel.__init__): Rearrange the order that the controls are
3254            created so that tabbing works correctly.
3255    
3256    2003-05-05  Bernhard Herzog  <[email protected]>
3257    
3258            * extensions/thuban/wxproj.cpp: Fix some of the comments.
3259            (project_point): If a map projection but no layer projection is
3260            given, convert degrees to radians before applying the map
3261            projection.
3262    
3263            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
3264            (TableGrid.allow_messages): New methods to make it possible to
3265            inhibit message sending.
3266            (TableGrid.issue): Only send the message if not inhibited.
3267            (LayerTableGrid.select_shape): Use the new methods to make sure
3268            that no ROW_SELECTED message is sent while we're updating the
3269            selected rows to match the selected shapes.
3270    
3271    2003-05-02  Jan-Oliver Wagner <[email protected]>
3272    
3273            Implementation of MemoryTable.
3274    
3275            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
3276            implementation that operates on a list of tuples. All of the data
3277            are kept in the memory.
3278    
3279            * test/test_table.py (MemoryTableTest): New.
3280    
3281            * test/test_transientdb.py (SimpleTable): Removed.
3282            (TestTransientTable.test_transient_joined_table,
3283            (TestTransientTable.test_transient_table_read_twice): Replaced
3284            SimpleTable by MemoryTable.
3285    
3286  2003-04-30  Jonathan Coles   <[email protected]>  2003-04-30  Jonathan Coles   <[email protected]>
3287    
3288          * Data/iceland_sample.thuban: Now contains correct projections          * Data/iceland_sample.thuban: Now contains correct projections

Legend:
Removed from v.803  
changed lines
  Added in v.1548

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26