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

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

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

revision 55 by bh, Tue Sep 11 11:45:27 2001 UTC revision 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]>
3287    
3288            * Data/iceland_sample.thuban: Now contains correct projections
3289            for each of the layers.
3290    
3291            * Resources/Projections/defaults.proj: Geographic projection
3292            contains unit conversion parameter.
3293    
3294    2003-04-30  Jonathan Coles   <[email protected]>
3295    
3296            The most important part of this putback is the projection changes.
3297            It should now be possible to specify the projection that a layer
3298            is in and then specify a different projection for the map. The
3299            projection dialog has an extra parameter for a geographic projection
3300            which lets the user select if the input is in degrees or radians.
3301    
3302            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
3303            to say that the parameter is a tuple of unprojected
3304            points (which is what the callers to this method were assuming).
3305            Also, since the points are unprojected we need to projected them.
3306    
3307            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
3308            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
3309            groups are selected, move the layer up/down. Fixes RTbug #1833.
3310    
3311            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
3312    
3313            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
3314            parameter in call to SetClientData.
3315            (GeoPanel): Add support for selecting the units that the
3316            source data is in (Radians or Degrees).
3317    
3318            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
3319            the rendering loop by reducing the number of if's, removing the
3320            unnecessary try/except block, and checking if the old group
3321            is the same as the new one (which happens a lot if there is
3322            no classification, or lots of shapes are in the same group).
3323    
3324            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
3325            around the redraw routine to try to catch problems that the user
3326            may create by selecting invalid projections for the data set and
3327            map. Clears the display if there are any problems and prints the
3328            error.
3329            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
3330            rectangle.
3331    
3332            * extensions/thuban/wxproj.cpp (project_point): First invert the
3333            supplied point (which should be in projected coordinates) using
3334            the layer's projection and then project the point using the
3335            map's projection.
3336            (project_points): Use project_point() to project each point.
3337    
3338    2003-04-30  Jan-Oliver Wagner <[email protected]>
3339    
3340            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
3341            don't set the Classification to None if the classfication field
3342            is None (ie only a DEFAULT).
3343    
3344    2003-04-30  Bernhard Herzog  <[email protected]>
3345    
3346            * Thuban/UI/view.py: Fix some typos.
3347    
3348            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
3349            not pop up the dialog if the selection becomes empty (this could
3350            happen if e.g. a new selection is opened while the identify tool
3351            is active and dialog had been closed)
3352    
3353    2003-04-30  Bernhard Herzog  <[email protected]>
3354    
3355            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
3356            instance variable read_record_last_result
3357            (TransientTableBase.read_record): Make sure reading the same
3358            record twice works. The implementation uses the new instance
3359            variable read_record_last_result
3360    
3361            * test/test_transientdb.py
3362            (TestTransientTable.test_transient_table_read_twice): New test
3363            case for the above bug-fix.
3364    
3365    2003-04-29  Jonathan Coles   <[email protected]>
3366    
3367            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
3368    
3369            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
3370    
3371            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
3372            (ClassTable.SetValueAsCustom): Rename keyword argument in
3373            ClassGroup* constructors to match argument name.
3374    
3375    2003-04-29  Bernhard Herzog  <[email protected]>
3376    
3377            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
3378            transient DB if it exists to make sure it doesn't leave a journal
3379            file in the temp directory.
3380    
3381            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
3382            self.conn to None after closing the connection to make sure it's
3383            not closed twice
3384    
3385    2003-04-29  Jonathan Coles   <[email protected]>
3386    
3387            Add a visible parameter in the layer XML tag. The default value is
3388            "true". If anything other than "false" is specified we also assume
3389            "true". Addresses RTbug #1025.
3390    
3391            * Doc/thuban.dtd: Add visible parameter to a layer.
3392    
3393            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
3394            of visible from 1 to True.
3395            (Layer.__init__): Change default value of visible from 1 to True.
3396    
3397            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
3398            parameter.
3399    
3400            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
3401            parameter.
3402    
3403            * test/test_load.py: Add new test data contents_test_visible.
3404            (LoadSessionTest.setUp): save test data.
3405            (LoadSessionTest.testLayerVisibility): Test if the visible flag
3406            is loaded correctly.
3407    
3408            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
3409            for saving an invisible layer.
3410    
3411    2003-04-29  Jonathan Coles   <[email protected]>
3412    
3413            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
3414            legend dialog box and tell it to change its map to the one
3415            supplied to SetMap(). Fixes RTbug #1770.
3416    
3417    2003-04-29  Bernhard Herzog  <[email protected]>
3418    
3419            Next step of table implementation. Introduce a transient database
3420            using SQLite that some of the data is copied to on demand. This
3421            allows us to do joins and other operations that require an index
3422            for good performance with reasonable efficiency. Thuban now needs
3423            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
3424            haven't tested that.
3425            
3426            * Thuban/Model/transientdb.py: New. Transient database
3427            implementation.
3428    
3429            * test/test_transientdb.py: New. Tests for the transient DB
3430            classes.
3431    
3432            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
3433            classes to help automatically remove temporary files and
3434            directories.
3435            (Session.__init__): New instance variables temp_dir for the
3436            temporary directory and transient_db for the SQLite database
3437            (Session.temp_directory): New. Create a temporary directory if not
3438            yet done and return its name. Use AutoRemoveDir to have it
3439            automatically deleted
3440            (Session.TransientDB): Instantiate the transient database if not
3441            done yet and return it.
3442    
3443            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
3444            AutoTransientTable so that data is copied to the transient DB on
3445            demand.
3446            (SimpleStore): New class that simply combines a table and a
3447            shapefile
3448    
3449            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
3450            DBFTable and update its doc-string to reflect the fact that this
3451            is only the table interface to a DBF file. Table is now an alias
3452            for DBFTable for temporary backwards compatibility.
3453    
3454            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
3455            the last reference to the session goes away so that the temporary
3456            files are removed properly.
3457    
3458            * test/test_load.py (LoadSessionTest.tearDown): Remove the
3459            reference to the session to make sure the temporary files are
3460            removed.
3461    
3462    2003-04-29  Bernhard Herzog  <[email protected]>
3463    
3464            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
3465            the __parser instance variable into a normal local variable in
3466            read. It's only used there and read will never be called more than
3467            once. Plus it introduces a reference cycle that keeps can keep the
3468            session object alive for a long time.
3469    
3470    2003-04-29  Jonathan Coles   <[email protected]>
3471    
3472            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
3473            Projection an immutable item. Fixes RTbug #1825.
3474            (Projection.__init__): Initialize instance variables here.
3475            (ProjFile.Replace): New. Replace the given projection object with
3476            the new projection object. This solves the problem of needing the
3477            mutator Projection.SetProjection() in the ProjFrame class and
3478            allows a projection to change parameters without changing its
3479            location in the file.
3480    
3481            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
3482            be of type wxSAVE and should verify overwriting a file.
3483    
3484            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
3485            ProjFile.Replace() method instead of the mutator
3486            Projection.SetProjection(). Also requires that we reassign the
3487            client data to the new projection.
3488    
3489            * test/test_proj.py (TestProjection.test): Test GetName() and
3490            GetAllParameters()
3491            (TestProjFile.test): Remove tests for Set*() methods. Add tests
3492            for Replace().
3493    
3494    2003-04-25  Jonathan Coles   <[email protected]>
3495    
3496            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
3497            to save the name of the projection.
3498    
3499            * test/test_save.py (SaveSessionTest.testLayerProjection): New
3500            test to verify layer projections are saved correctly.
3501    
3502    2003-04-25  Jonathan Coles   <[email protected]>
3503    
3504            * Thuban/Model/proj.py (Projection.SetName): Set the name
3505            to "Unknown" if name is None.
3506            (Projection.SetAllParameters): New. Set the projection's
3507            parameter list to the one supplied.
3508            (Projection.SetProjection): New. Set the projection's
3509            properties to those of the supplied Projection.
3510    
3511            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
3512            the dialog title to include the map's title.
3513            (MainWindow.LayerProjection): Set the dialog title to include
3514            the layer's title.
3515    
3516            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
3517            error dialogs into a single method call.
3518            (ProjFrame.__VerifyButtons): Add more states to check.
3519            (ProjFrame.__GetProjection): Return the current state of an
3520            edited projection or None.
3521            (ProjFrame.__FillAvailList): Remove checks for states that
3522            shouldn't exist.
3523            (ProjFrame._OnNew): Clear all selected items and supply
3524            a projection panel if necessary.
3525    
3526            * test/test_proj.py (TestProjFile.test): Add tests for
3527            ProjFile.SetAllParameters, ProjFile.SetProjection,
3528            ProjFile.SetName.
3529    
3530    2003-04-25  Jonathan Coles   <[email protected]>
3531    
3532            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
3533            takes an optional argument to select the current projection.
3534            This does not guarantee that the item is visible due to
3535            limited wxWindows functionality. Fixes RTBug #1821.
3536    
3537    2003-04-25  Jonathan Coles   <[email protected]>
3538    
3539            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
3540            the projection name and use it when constructing the Projection
3541            object.
3542    
3543            * Thuban/Model/proj.py (Projection.__init__): Change the default
3544            value for 'name' to None and then test if name is equal to None
3545            in the body of the constructor. This way the caller doesn't have to
3546            know what the default value should be. Namely, useful in load.py
3547            where we have to pick a default value if the 'name' parameter
3548            doesn't exist in the XML file.
3549    
3550            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
3551            Tests a file where a layer has a projection.
3552    
3553    2003-04-25  Jonathan Coles   <[email protected]>
3554    
3555            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
3556            tree for projection information.
3557    
3558            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
3559            XMLReader.GetFileName.
3560            (SessionLoader): Added support for loading projection tags that
3561            appear inside a layer.
3562    
3563            * Thuban/Model/proj.py (ProjFile): Document the class. Move
3564            back to using a list because the order of the projections in
3565            the file is important to maintain. Fixes RTbug #1817.
3566    
3567            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
3568            to ProjFile.GetFilename.
3569    
3570            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
3571            information.
3572    
3573            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
3574            ProjFrame._OnSaveAs. Removed old dead code from previous
3575            implementation.
3576            (ProjFrame._OnExport): Add support for exporting more than one
3577            projection to a single file.
3578            (ProjFrame.__FillAvailList): use string formatting (% operator)
3579            to build strings that are (partly) translated. Fixes RTbug #1818.
3580    
3581            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
3582            class.
3583    
3584    2003-04-24  Bernhard Herzog  <[email protected]>
3585    
3586            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
3587    
3588            * po/fr.po: New. French translation by Daniel Calvelo Aros
3589    
3590            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
3591            empty strings.
3592    
3593    2003-04-24  Jonathan Coles   <[email protected]>
3594    
3595            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
3596            implement the interface that the ProjFrame dialog expects.
3597    
3598            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
3599            name of the projection to be changed.
3600            (ProjFile): Use a dictionary instead of a list so that removing
3601            projections is easier and we are sure about uniqueness.
3602            (ProjFile.Remove): Remove the given projection object.
3603    
3604            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
3605            Return a list with only one projection file instead of searching for
3606            any projection file. This simplifies many things if the user can
3607            only have one system file and one user file.
3608    
3609            * Thuban/UI/classgen.py: Change all references to
3610            genCombo to genChoice.
3611    
3612            * Thuban/UI/mainwindow.py: Add a Projection option under the
3613            layer menu.
3614            (MainWindow.LayerProjection): New. Open up a projection window
3615            for a layer.
3616    
3617            * Thuban/UI/projdialog.py: Large changes to how the dialog is
3618            laid out. Use three panels instead of one. One for the list of
3619            projections, one for the edit controls, and one for the buttons.
3620            Fixed resizing problems so that the dialog resizes correctly
3621            when the projection panel changes. Added import/export, save, and
3622            new buttons/functionality.
3623    
3624    2003-04-24  Bernhard Herzog  <[email protected]>
3625    
3626            First step towards table management. Introduce a simple data
3627            abstraction so that we replace the data a layer uses more easily
3628            in the next step.
3629    
3630            * Thuban/Model/data.py: New file with a simple data abstraction
3631            that bundles shapefile and dbffile into one object.
3632    
3633            * Thuban/Model/session.py (Session.OpenShapefile): New method to
3634            open shapefiles and return a shape store object
3635    
3636            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
3637            object instead of a shapefile filename. This introduces a new
3638            instance variable store holding the datastore. For intermediate
3639            backwards compatibility keep the old instance variables.
3640            (open_shapefile): Removed. No longer needed with the shape store.
3641            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
3642            get the shape store used by a layer.
3643            (Layer.Destroy): No need to explicitly destroy the shapefile or
3644            table anymore.
3645    
3646            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
3647            (MainWindow.AddLayer): Use the session's OpenShapefile method to
3648            open shapefiles
3649    
3650            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
3651            session's OpenShapefile method to open shapefiles
3652    
3653            * test/test_classification.py
3654            (TestClassification.test_classification): Use the session's
3655            OpenShapefile method to open shapefiles and build the filename in
3656            a more platform independed way
3657    
3658            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
3659            Implement to have a session to use in the tests
3660            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
3661            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
3662            session's OpenShapefile method to open shapefiles
3663            (TestLayerLegend.setUp): Instantiate a session so that we can use
3664            it to open shapefiles.
3665            (TestLayerLegend.tearDown): Make sure that all references to
3666            layers and session are removed otherwise we may get a resource
3667            leak
3668    
3669            * test/test_map.py (TestMapAddLayer.test_add_layer)
3670            (TestMapWithContents.setUp): Instantiate a session so that we can
3671            use it to open shapefiles.
3672            (TestMapWithContents.tearDown): Make sure that all references to
3673            layers, maps and sessions are removed otherwise we may get a
3674            resource leak
3675            ("__main__"): use support.run_tests() so that more info about
3676            uncollected garbage is printed
3677    
3678            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
3679            session's OpenShapefile method to open shapefiles
3680            ("__main__"): use support.run_tests() so that more info about
3681            uncollected garbage is printed
3682    
3683            * test/test_selection.py (TestSelection.tearDown): Make sure that
3684            all references to the session and the selection are removed
3685            otherwise we may get a resource leak
3686            (TestSelection.get_layer): Instantiate a session so that we can
3687            use it to open shapefiles.
3688            ("__main__"): use support.run_tests() so that more info about
3689            uncollected garbage is printed
3690    
3691            * test/test_session.py (TestSessionBase.tearDown)
3692            (TestSessionWithContent.tearDown): Make sure that all references
3693            to the session and layers are removed otherwise we may get a
3694            resource leak
3695            (TestSessionWithContent.setUp): Use the session's OpenShapefile
3696            method to open shapefiles
3697    
3698    2003-04-24  Jonathan Coles   <[email protected]>
3699    
3700            * Thuban/Model/load.py (XMLReader.read): Should have been checking
3701            if the file_or_filename object had the 'read' attribute.
3702    
3703    2003-04-23  Jonathan Coles   <[email protected]>
3704    
3705            * Thuban/Model/resource.py: Fixes RTbug #1813.
3706            (ReadProjFile): Add documentation about which exceptions are raised.
3707            Always pass the exceptions up to the caller.
3708            (GetProjFiles): If the directory can't be read return an empty list.
3709            If any of the proj files can't be read skip that file and go
3710            on to the next one.
3711    
3712            * test/test_proj.py: Added test cases to handle nonexistent files,
3713            unreadable files, and files that don't parse correctly.
3714    
3715    2003-04-23  Jonathan Coles   <[email protected]>
3716    
3717            Projection dialog. Allows the user to select from a list
3718            of projection templates and optionally edit them and save new ones.
3719    
3720            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
3721            (ProjPanel): Base class for projection specific panels.
3722            (TMPanel): Projection panel for Transverse Mercartor.
3723            (UTMPanel): Projection panel for Universal Transverse Mercartor.
3724            (LCCPanel): Projection panel for Lambert Conic Conformal.
3725            (GeoPanel): Projetion panel for Geographic Projection.
3726    
3727    2003-04-23  Jonathan Coles   <[email protected]>
3728    
3729            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
3730            promote symmetry. There now exists XMLReader and XMLWriter.
3731            (XMLReader.read): New. Call to read the given file descriptor or
3732            filename.
3733            (XMLReader.close): New. Make sure the file is closed.
3734            (XMLReader.GetFileName): New. Return just the file name that is being
3735            read from.
3736            (XMLReader.GetDirectory): New. Return just the directory of the file
3737            that is being read.
3738            (XMLReader.AddDispatchers): New. Take a dictionary which contains
3739            the names of functions to call as the XML tree is parsed.
3740            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
3741            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
3742            (SessionLoader): Removed class variables start_dispatcher and
3743            end_dispatcher since this functionality is now part of a class
3744            instance. Fixes RTbug #1808.
3745            (SessionLoader.__init__): Add dispatcher functions.
3746            (load_xmlfile): Code was moved into the XMLReader.read().
3747            (load_session): Use modified SessionLoader.
3748    
3749            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
3750            map's projection.
3751    
3752            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
3753            GetAllParameters.
3754            (Projection.GetParameter): Returns the value for the given parameter.
3755    
3756            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
3757            (GetProjFiles): Renamed from GetProjections. Now returns a list
3758            of ProjFile objects.
3759            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
3760            a list of ProjFile objects whose files are not user defined.
3761            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
3762            list of ProjFile objects whose files are user defined.
3763            (ProjFileReader): Extend new XMLReader.
3764    
3765            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
3766            promote symmetry.
3767    
3768            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
3769            control instead of a wxComboBox. wxChoice controls do not generate
3770            events as the uses highlights possible choices which fixes problems
3771            with resizing the dialog when the use selects an option.
3772    
3773            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
3774            control instead of a wxComboBox.
3775    
3776            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
3777            dialog.
3778    
3779            * test/test_proj.py (TestProjection.test): New tests for GetParameter
3780            method.
3781    
3782    2003-04-22  Bernhard Herzog  <[email protected]>
3783    
3784            * Thuban/UI/mainwindow.py: Remove some unused imports and global
3785            constants
3786    
3787            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
3788            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
3789    
3790    2003-04-17  Bernhard Herzog  <[email protected]>
3791    
3792            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
3793            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
3794            anymore.
3795            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
3796            (Layer.ShapeType, Layer.Shape): No need to call
3797            self.open_shapefile since it's always called in __init__
3798    
3799            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
3800            In wxPython 2.4 there's no need to extend MainLoop anymore since
3801            wxPython itself makes sure OnExit is called.
3802    
3803    2003-04-16  Jonathan Coles   <[email protected]>
3804    
3805            Initial putback of projection management code. Includes new
3806            classes to read and write projection files. The current load
3807            and save classes were abstracted a bit so they could be reused.
3808            The Projection class was extended to provide new methods and
3809            have a name.
3810    
3811            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
3812            general XML reading methods that were part of ProcessSession.
3813    
3814            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
3815            name.
3816            (ProjFile): New. Represents a file that contains projection
3817            information.
3818    
3819            * Thuban/Model/resource.py: New. Contains general utilities
3820            for read and writing projection files.
3821    
3822            * Thuban/Model/save.py (XMLSaver): New. Contains all the
3823            general XML writing methods that were part of SessionSaver.
3824            (SessionSaver): Renamed from Saver.
3825    
3826            * test/test_proj.py: New test cases for the projection
3827            file read and write functions.
3828    
3829    2003-04-16  Jonathan Coles   <[email protected]>
3830    
3831            * Thuban/Model/classification.py: Use repr() around values
3832            in the ClassGroup*.__repr__() methods so it is clearer when
3833            a value is a string and when it is a number.
3834    
3835            * test/test_load.py: Rework the classification test to test
3836            that we can load old files.
3837            (testLabels): Test a file where the groups have labels.
3838    
3839    2003-04-16  Bernhard Herzog  <[email protected]>
3840    
3841            Safer implementation of the performance enhancements of the
3842            low-level renderer:
3843            
3844            * extensions/thuban/wxproj.cpp (extract_projection)
3845            (extract_pointer): Rename extract_projection to extract_pointer
3846            and redefine its purpose to return the pointer stored in a CObject
3847            returned by the object's cobject method. Update all callers.
3848            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
3849            handling of these low-level parameters so that each s_draw_info
3850            instance is handled as a CObject at python level that also
3851            contains real references to the actual python objects which
3852            contain the values in the struct. Add free_draw_info as the
3853            destructor.
3854            (draw_polygon_shape): Add the py_draw_info parameter which must a
3855            cobject containing an s_draw_info pointer.
3856    
3857            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
3858            method to instantiat the low-level render parameter
3859            (MapRenderer.draw_shape_layer): Use the new method. Remove some
3860            commented out code.
3861            (MapRenderer.draw_polygon_shape): Make the first parameter not the
3862            layer but the low-level render parameter
3863            (ScreenRenderer.draw_shape_layer): Use the low-level render
3864            parameter.
3865    
3866    2003-04-15  Jonathan Coles   <[email protected]>
3867    
3868            * Thuban/Model/classification.py: Implemented __repr__ for
3869            the ClassGroup* classes to make debugging a bit easier.
3870            (ClassGroup.SetLabel): Check that the string is an instance
3871            of StringTypes not StringType. Accounts for Unicode strings.
3872    
3873            * Thuban/Model/color.py: Implemented __repr__ to make
3874            debugging a bit easier.
3875    
3876            * Thuban/Model/save.py (Saver.write_classification): Need to
3877            save the group label.
3878    
3879            * test/test_load.py (testClassification): New. Loads the
3880            iceland_sample_test.thuban file and checks if it was loaded
3881            correctly.
3882    
3883    2003-04-15  Jonathan Coles   <[email protected]>
3884    
3885            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
3886            to improve rendering performance by initializing the variables
3887            that are not change each time draw_polygon_shape() is called.
3888            The values are stored in a global struct draw_info.
3889            (draw_polygon_shape): Removed initialization code that is
3890            now in draw_polygon_init().
3891    
3892            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
3893            drawing initialization call to draw_polygon_init()
3894            (MapRenderer.draw_polygon_shape): Use new signature of
3895            draw_polygon_shape.
3896    
3897            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
3898            weirdness by setting the range to (1, maxint).
3899    
3900            * Thuban/Model/classification.py (ClassGroupProperties): Make
3901            instance variables private and optimize comparison operator
3902            by first checking if the color references are the same.
3903            (ClassGroupSingleton): Make instance variables private.
3904            (ClassGroupRange): Make instance variables private.
3905    
3906            * HOWTO-Release: Filled in missing steps for releasing packages.
3907    
3908    2003-04-15  Bernhard Herzog  <[email protected]>
3909    
3910            First stab at internationalized messages:
3911    
3912            * Thuban/__init__.py (_): Implement the translation function for
3913            real using the python gettext module.
3914    
3915            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
3916            translate empty strings.
3917    
3918            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
3919            Add a missing space to a warning message
3920    
3921            * po/README: New. Notes about the management of the translation
3922            files.
3923    
3924            * po/Makefile: New. Makefile to help manage the translation files.
3925    
3926            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
3927    
3928            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
3929            translations and support files in po/
3930    
3931            * setup.py (data_files): Add the *.mo files to the data_files too
3932    
3933            * README: Add note about the translations when building from CVS
3934    
3935    2003-04-14  Jonathan Coles   <[email protected]>
3936    
3937            * Thuban/UI/dock.py: Fixes some window resizing problems most
3938            noticable under windows. Always assume the button bitmaps will
3939            be there. Code clean up.
3940            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
3941            images for the dock/undock button to the same images.
3942            Work around for RTbug #1801.
3943    
3944            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
3945            be allowed to grow within the sizer. Fixes a bug under Windows
3946            where the toolbar wasn't being drawn.
3947    
3948    2003-04-14  Frank Koormann   <[email protected]>
3949    
3950            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
3951            Updated design to try to make the button functionality more
3952            transparent.
3953    
3954    2003-04-14  Jonathan Coles   <[email protected]>
3955    
3956            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
3957            finalize the intialization of the panel.
3958    
3959            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
3960            creation of the panel. Should be the last thing called in the
3961            initializer of a subclass.
3962    
3963            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
3964            set the current selections in the combo boxes. This is needed
3965            under Windows.
3966    
3967            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
3968            level panel to the dialog so that the background colors are
3969            consistent under Windows.
3970    
3971    2003-04-11  Jonathan Coles   <[email protected]>
3972    
3973            * Thuban/UI/classgen.py: Change color ramps to start at white
3974            not black.
3975    
3976            * Thuban/UI/legend.py: Enable/disable the legend buttons when
3977            the legend changes. Fixes RTbug #1793.
3978    
3979            * test/test_classification.py: Added test for copying of
3980            classifications.
3981    
3982    2003-04-11  Jonathan Coles   <[email protected]>
3983    
3984            * Thuban/UI/resource.py: New. Centralize the loading of resources
3985            such as bitmaps.
3986    
3987            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
3988            added images to the move buttons, added 'reverse' button.
3989            (CustomRampPanel.__init__): Added images to the move buttons.
3990            (GreyRamp): New. Generates a ramp from white to black.
3991            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
3992    
3993            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
3994            ID_PROPERTY_*.
3995            (Classifier.__init__): Minor changes to the layout.
3996            (Classifier._OnTitleChanged): Listen for when the user edits the
3997            title and update the dialog's title and the layer's title.
3998    
3999            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
4000    
4001            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
4002            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
4003            if the layer's title changes.
4004    
4005            * Thuban/UI/mainwindow.py: Added new menu item and associated code
4006            to open a dialog to rename the map.
4007            (MainWindow): Use new resource class to import bitmaps.
4008    
4009    2003-04-11  Jonathan Coles   <[email protected]>
4010    
4011            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
4012            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
4013            Resources/Bitmaps/group_use_none.xpm,
4014            Resources/Bitmaps/group_use_not.xpm,
4015            Resources/Bitmaps/hide_layer.xpm,
4016            Resources/Bitmaps/layer_properties.xpm,
4017            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
4018            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
4019            New.
4020    
4021    2003-04-10  Jonathan Coles   <[email protected]>
4022    
4023            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
4024            Should pass group to ClassGroup constructor.
4025    
4026    2003-04-10  Jonathan Coles   <[email protected]>
4027    
4028            * Thuban/Model/classification.py: (ClassGroup): Move all the common
4029            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
4030            here. Implement SetVisible(), IsVisible().
4031            (ClassGroup.__init__): Add group parameter which acts as a copy
4032            constructor.
4033    
4034            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
4035            "Visible" check boxes.
4036            (Classifier): Rename the buttons and refactor the code to match
4037            the new labels.
4038    
4039            * Thuban/UI/legend.py: Classify button is now called "Properties".
4040            Refactored the code to change variable names.
4041            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
4042    
4043            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
4044            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
4045            renamed to MainWindow.LayerEditProperties.
4046            (MainWindow.ToggleLegend): Don't include map name in legend title.
4047            (MainWindow.SetMap): Added the map name to the window title.
4048            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
4049            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
4050            Functionality is found in the layer properties dialog.
4051    
4052            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
4053            draw visible groups.
4054    
4055    2003-04-09  Jonathan Coles   <[email protected]>
4056    
4057            * Thuban/UI/classgen.py: Modifications to allow simple
4058            addition and selection of new color schemes.
4059            (MonochromaticRamp): New. Generates a ramp between two colors.
4060            (RedRamp): New. Generates a ramp of all red.
4061            (GreenRamp): New. Generates a ramp of all green.
4062            (BlueRamp): New. Generates a ramp of all blue.
4063    
4064    2003-04-09  Jonathan Coles   <[email protected]>
4065    
4066            * Thuban/Model/classification.py (Classification.__deepcopy__):
4067            Need to copy over field and fieldType attributes.
4068    
4069            * Thuban/Model/table.py (Table.field_range): New. Retrive the
4070            maximum and minimum values over the entire table for a given
4071            field.
4072            (Table.GetUniqueValues): New. Retrieve all the unique values
4073            in the table for a given field.
4074    
4075            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
4076            (GenUniquePanel): New. Controls to allow the user to select
4077            which unique field values they would like in the classification.
4078            (CustomRampPanel): Code that was in ClassGenDialog that allows
4079            the user to select the properties for a custom ramp.
4080            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
4081    
4082            * Thuban/UI/classifier.py: Removed a lot of debugging code.
4083            (Classifier._SetClassification): Callback method so that the
4084            class generator can set the classification in the grid.
4085            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
4086            editing of a group properties class into a wxWindows control.
4087    
4088            * Thuban/UI/dock.py: It was decided that if the user closes
4089            a dockable window the window should simply hide itself. That
4090            way if the user wants to show the dock again it appears in the
4091            same place as it was when it was closed.
4092            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
4093            (DockableWindow._OnButtonClose): Hide the window instead of
4094            destroying it.
4095            (DockableWindow._OnClose): Hide the window instead of
4096            destroying it.
4097    
4098            * Thuban/UI/legend.py (LegendTree): Use a private method to
4099            consistently set the font and style of the text. Fixes RTbug #1786.
4100    
4101            * Thuban/UI/mainwindow.py: Import just the Classifier class.
4102    
4103    2003-04-07  Bernhard Herzog  <[email protected]>
4104    
4105            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
4106            to the map module
4107    
4108    2003-04-07  Bernhard Herzog  <[email protected]>
4109    
4110            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
4111            favor of ToggleSessionTree
4112            (MainWindow.ToggleSessionTree): New method to toggle visibility of
4113            the session tree.
4114            (MainWindow.SessionTreeShown): New method to return whether the
4115            session tree is currently shown.
4116            (MainWindow.ToggleLegend): New method to toggle visibility of the
4117            legend
4118            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
4119            LegendShown
4120            (MainWindow.LegendShown): New method to return whether the legend
4121            is currently shown.
4122            (_method_command): Add checked parameter so we can define check
4123            menu items
4124            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
4125            mainwindow methods.
4126            (show_session_tree, show_legend commands): Removed.
4127            (toggle_session_tree, toggle_legend commands): New commands to
4128            toggle the visibility of the dialogs
4129    
4130    2003-04-07  Jonathan Coles   <[email protected]>
4131    
4132            * Thuban/UI/classgen.py: Fix Windows problem.
4133    
4134            * Thuban/UI/dock.py: Fix Windows problem.
4135    
4136            * Thuban/UI/mainwindow.py: Use False instead of false.
4137            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
4138    
4139    2003-04-07  Jonathan Coles   <[email protected]>
4140    
4141            Since we now say that the order of the groups in a classification
4142            matters, it makes sense to be able to manipulate that order. Most
4143            of the changes to Thuban/Model/classification.py are to that end.
4144    
4145            * Thuban/Model/classification.py (Classification.AppendGroup,
4146            Classification.InsertGroup, Classification.ReplaceGroup,
4147            Classification.RemoveGroup, Classification.GetGroup): Do as the
4148            names imply.
4149            (Classification.FindGroup): This was called GetGroup, but GetGroup
4150            takes an index, while FindGroup takes a value.
4151            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
4152            REFERENCE. Currently there is a cyclic reference between the layer
4153            and its classification. If the classification doesn't need to know
4154            its owning layer we can change this, since it may make sense to be
4155            able to use the same classification with different layers.
4156    
4157            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
4158    
4159            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
4160            not AddGroup()
4161    
4162            * Thuban/UI/classifier.py: Now that we can depend on the order in
4163            a Classification and have methods to manipulate that order we don't
4164            need to use our own data structures in the grid. We can simply make
4165            the grid/table access the information they need from a copy of
4166            the classification object.
4167            (Classifier._OnCloseBtn): Event handler for when the user clicks
4168            'Close'. This is needed so if the user applies changes and then
4169            continues to change the table the user has the option of discarding
4170            the most recent changes and keeping what they applied.
4171    
4172            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
4173            into the same group.
4174    
4175            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
4176            with a really old version of proj, PJ_VERSION won't even be defined.
4177            If it isn't defined then just compile so that the function always
4178            returns Py_False.
4179    
4180            * test/test_classification.py: Fix tests to use the renamed methods.
4181            Still need to write tests for the new methods.
4182    
4183    2003-04-04  Jonathan Coles   <[email protected]>
4184    
4185            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
4186            call to SetSelection out of the method and before the call
4187            to __SelectField in __init__. This prevents a recursion of events
4188            when _OnFieldSelect is triggered by the user.
4189    
4190    2003-04-04  Jonathan Coles   <[email protected]>
4191    
4192            * Thuban/Model/classification.py: Rename Color.None to
4193            Color.Transparent.
4194            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
4195            Don't bother copying the color, since Colors are immutable.
4196    
4197            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
4198            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
4199            Thuban/UI/renderer.py, Thuban/UI/view.py:
4200            Rename Color.None to Color.Transparent.
4201        
4202            * test/test_classification.py, test/test_load.py: Rename Color.None
4203            to Color.Transparent.
4204    
4205    2003-04-04  Jonathan Coles   <[email protected]>
4206    
4207            * Thuban/Model/classification.py: Fix assert calls.
4208            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
4209            Copy the color parameter rather than hold onto a reference.
4210    
4211            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
4212            the color object.
4213            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
4214            are sure there exists only one refernce to Color.None in the system.
4215            This allows us to use 'is' rather than the comparision functions.
4216            
4217            * Thuban/Model/save.py: Fix assert calls.
4218            
4219            * Thuban/UI/classifier.py: Fix assert calls.
4220            (ClassGrid._OnCellDClick): Call up to the classifier to open the
4221            dialog to edit the groups properties.
4222            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
4223            correctly if a cell is resized.
4224            (ClassTable.SetClassification): New. Changes the classification
4225            that is in the table.
4226            (ClassTable.__SetRow): Allow groups to be prepended.
4227            (Classifier): New code for opening the EditProperties and
4228            GenerateRanges dialogs.
4229            (SelectPropertiesDialog.__GetColor): Only set the color in the
4230            color dialog if the current color is not None.
4231            
4232            * Thuban/UI/dock.py: Fix assert calls.
4233            
4234            * Thuban/UI/legend.py: Fix assert calls.
4235            
4236            * Thuban/UI/renderer.py: Fix assert calls.
4237            
4238            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
4239            classifications.
4240            (GenRangePanel): Panel specific to range generation.
4241            (GenSingletonPanel): Panel specific to singleton generation.
4242            (ClassGenerator): Class responsible for actually generating
4243            the classification from the data gathered in the dialog box.
4244            (PropertyRamp): Generates properties whose values range from
4245            a starting property to an ending property.
4246    
4247    2003-04-03  Bernhard Herzog  <[email protected]>
4248    
4249            * test/support.py (print_garbage_information): New function that
4250            prints information about still connected messages and memory
4251            leaks.
4252            (run_suite): Removed.
4253            (run_tests): New function for use as a replacement of
4254            unittest.main in the test_* files. This one calls
4255            print_garbage_information at the end.
4256    
4257            * test/runtests.py (main): Use support.print_garbage_information
4258    
4259            * test/test_layer.py: Use support.run_tests instead of
4260            unittest.main so we get memory leak information
4261            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4262            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
4263            (TestLayerLegend.test_visibility): Call the layer's Destroy method
4264            to fix a memory leak.
4265    
4266            * test/test_classification.py: Use support.run_tests instead of
4267            unittest.main so we get memory leak information
4268            (TestClassification.test_classification): Call the layer's Destroy
4269            method to fix a memory leak.
4270    
4271    2003-04-02  Bernhard Herzog  <[email protected]>
4272    
4273            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
4274            Handle the reference counts of the return value and errors in
4275            PyArg_ParseTuple correctly.
4276    
4277            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
4278            sure the filename is absolute to avoid problems when saving the
4279            session again
4280    
4281            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
4282    
4283    2003-04-01  Jonathan Coles   <[email protected]>
4284    
4285            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
4286            that there actually are points in the returned list of points
4287            before trying to index into the list. The list may be empty if
4288            the shape is a Null Shape.
4289    
4290    2003-04-01  Bernhard Herzog  <[email protected]>
4291    
4292            * test/test_map.py: Don't use from <module> import *
4293    
4294    2003-04-01  Jonathan Coles   <[email protected]>
4295    
4296            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
4297            LAYER_LEGEND_CHANGED
4298    
4299            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
4300            self.Destroy() to close the window after yesterday's changes.
4301    
4302            * test/test_map.py, test/test_session.py: Fix messages that
4303            are sent from maps and layers.
4304    
4305    2003-03-31  Jonathan Coles   <[email protected]>
4306    
4307            * Thuban/UI/classifier.py: Commented out some debugging statements.
4308            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
4309            RTbug #1769.
4310    
4311            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
4312            position (although position doesn't work yet under GTK).
4313            (DockableWindow.Destroy): New. Called when the window must be
4314            closed. Namely needed when the DockFrame closes and must close
4315            its children.
4316            (DockFrame): Listen for EVT_CLOSE and destroy all children.
4317    
4318            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
4319            when then window is told to close.
4320            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
4321            comment in source for more info.
4322    
4323            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
4324    
4325            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
4326            symmetry with other such methods.
4327            (MainWindow.ShowLegend): Show the legend docked by default.
4328    
4329    2003-03-28  Jonathan Coles   <[email protected]>
4330    
4331            * Thuban/UI/classifier.py: Support for highlighting a specific
4332            group within the grid when the classification dialog is opened.
4333            Also contains a lot of debugging printouts which will later
4334            be removed.
4335    
4336            * Thuban/UI/dock.py: Complete rework on the dock code so that
4337            that it is fairly removed from the rest of the Thuban application.
4338            It is easy to add new docks which the rest of the program having
4339            to be aware of them.
4340    
4341            * Thuban/UI/legend.py: Modifications to support selecting a
4342            specific group in the classification dialog. Changed how layers
4343            are drawn when the layer is visible/invisible.
4344    
4345            * Thuban/UI/mainwindow.py: Removed legend specific code and
4346            replaced it with calls to the new dock code.
4347    
4348            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
4349            to check if scale > 0. Trying to track down a divide by zero.
4350    
4351    2003-03-26  Jonathan Coles   <[email protected]>
4352    
4353            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
4354            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
4355            now part of DockableWindow.
4356            (LegendPanel.DoOnSelChanged): Select the current layer in the
4357            map.
4358            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
4359            with the selected layer and/or group.
4360    
4361    2003-03-26  Jonathan Coles   <[email protected]>
4362    
4363            This putback contains the code for dockable windows. There is
4364            no support in wxWindows as of this date for windows that can
4365            attach themselves to other windows.
4366    
4367            The current model contains a DockableWindow which has a parent
4368            window for when it is detached and a dock window that it puts
4369            its contents in when it is docked. The contents of a DockableWindow
4370            must be a DockPanel. DockPanel itself derives from wxPanel.
4371    
4372            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
4373            message, not a LAYER_LEGEND_CHANGED message.
4374    
4375            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
4376    
4377            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
4378            as one of the style properties for the fieldTypeText item to
4379            be sure that its size is correct when the text changes.
4380    
4381            * Thuban/UI/dock.py: New. Classes for the DockPanel and
4382            DockableWindow.
4383    
4384            * Thuban/UI/legend.py: Added some more buttons and made the
4385            LegendPanel a DockPanel.
4386    
4387            * Thuban/UI/mainwindow.py: Added sash windows to the main window
4388            and supporting functions for manipulating the sashes.
4389            (MainWindow.ShowLegend): Create a DockableWindow with the
4390            LegendPanel as the contents.
4391    
4392            * Thuban/UI/messages.py: Added DOCKABLE_* messages
4393    
4394            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
4395            not LAYER_LEGEND_CHANGED, messages.
4396    
4397    2003-03-25  Jonathan Coles   <[email protected]>
4398    
4399            * setup.py: Added custom script bdist_rpm_build_script so that
4400            when the rpm is built the path to wx-config is correct.
4401    
4402            * setup.cfg: Added line saying to use the custom build script
4403    
4404    2003-03-20  Jonathan Coles   <[email protected]>
4405    
4406            Initial implementation of the Legend.
4407    
4408            * Thuban/UI/legend.py: New. Creates a window that shows the map's
4409            Legend information and allows the user to add/modify classifications
4410            and how the layers are drawn on the map.
4411    
4412            * setup.py: New command 'build_docs' which currently uses
4413            happydoc to generate html documentation for Thuban.
4414    
4415            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
4416            Returns a string which is appropriately describes the group.
4417    
4418            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
4419            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
4420    
4421            * Thuban/Model/map.py (Map): Rename messages and use new, more
4422            specific, messages.
4423    
4424            * Thuban/Model/messages.py: New message to indicate that a layer's
4425            data has changed (LAYER_CHANGED). New map messages to indicate
4426            when layers have been added/removed/changed or if the stacking order
4427            of the layers has changed.
4428    
4429            * Thuban/Model/session.py: Rename and use new messages.
4430    
4431            * Thuban/UI/classifier.py: Remember if any changes have actually
4432            been applied so that if the dialog is cancelled without an application
4433            of changes we don't have to set a new classification.
4434            (ClassDataPreviewer): Pulled out the window specific code and put it
4435            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
4436            symbols on any DC.
4437            
4438            * Thuban/UI/mainwindow.py: New code to open the legend.
4439    
4440            * Thuban/UI/view.py: Use new message names.
4441    
4442    2003-03-19  Jonathan Coles   <[email protected]>
4443    
4444            * Thuban/UI/main.py (verify_versions): New. Checks the versions
4445            of Python, wxPython, and some other libraries.
4446    
4447            * extensions/thuban/wxproj.cpp (check_version): Checks the given
4448            version against what wxproj was compiled with.
4449            (check_version_gtk): If wxproj was compiled with gtk then check
4450            the given version against the version of the gtk library
4451            currently being used.
4452    
4453    2003-03-14  Bernhard Herzog  <[email protected]>
4454    
4455            * test/test_command.py: Run the tests when the module is run as a
4456            script
4457    
4458    2003-03-14  Bernhard Herzog  <[email protected]>
4459    
4460            Implement selection of multiple selected shapes in the same layer:
4461    
4462            - Introduce a new class to hold the selection. This basically
4463              replaces the interactor which was nothing more than the
4464              selection anyway. A major difference is of course that the new
4465              selection class supports multiple selected shapes in one layer
4466            
4467            - Move the object that represents the selection from the
4468              application to the canvas. The canvas is a better place than the
4469              application because the selection represents which shapes and
4470              layer of the map displayed by the canvas are selected and
4471              affects how the map is drawn.
4472    
4473            - Make the selection and its messages publicly available through
4474              the mainwindow.
4475    
4476            - The non-modal dialogs do not get a reference to the interactor
4477              anymore as they can simply refer to their parent, the
4478              mainwindow, for the what the interactor had to offer.
4479    
4480            * Thuban/UI/selection.py: New module with a class to represent the
4481            selection.
4482    
4483            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
4484            these unused messages
4485    
4486            * Thuban/UI/application.py (ThubanApplication.OnInit)
4487            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
4488            interactor is gone now.
4489            (ThubanApplication.CreateMainWindow): There is no interactor
4490            anymore so we pass None as the interactor argument for now for
4491            compatibility.
4492    
4493            * Thuban/UI/view.py (MapCanvas.delegated_messages)
4494            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
4495            Unsubscribe, delegate messages according to the delegated_messages
4496            class variable.
4497            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
4498            attributes from instance variables as described with the
4499            delegated_methods class variable.
4500            (MapCanvas.__init__): New instance variable selection holding the
4501            current selection
4502            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
4503            pass them on to the renderer
4504            (MapCanvas.SetMap): Clear the selection when a different map is
4505            selected.
4506            (MapCanvas.shape_selected): Simple force a complete redraw. The
4507            selection class now takes care of only issueing SHAPES_SELECTED
4508            messages when the set of selected shapes actually does change.
4509            (MapCanvas.SelectShapeAt): The selection is now managed in
4510            self.selection
4511    
4512            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
4513            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
4514            Unsubscribe, delegate messages according to the delegated_messages
4515            class variable.
4516            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
4517            attributes from instance variables as described with the
4518            delegated_methods class variable.
4519            (MainWindow.__init__): The interactor as ivar is gone. The
4520            parameter is still there for compatibility. The selection messages
4521            now come from the canvas.
4522            (MainWindow.current_layer, MainWindow.has_selected_layer):
4523            Delegate to the the canvas.
4524            (MainWindow.LayerShowTable, MainWindow.Classify)
4525            (MainWindow.identify_view_on_demand): The dialogs don't need the
4526            interactor parameter anymore.
4527    
4528            * Thuban/UI/tableview.py (TableFrame.__init__)
4529            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
4530            (LayerTableFrame.row_selected): The interactor is gone. It's job
4531            from the dialog's point of view is now done by the mainwindow,
4532            i.e. the parent. Subscribe to SHAPES_SELECTED instead
4533            of SELECTED_SHAPE
4534            
4535            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
4536            is gone. It's job from the dialog's point of view is now done by
4537            the mainwindow, i.e. the parent.
4538            
4539            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
4540            gone. It's job from the dialog's point of view is now done by the
4541            mainwindow, i.e. the parent.
4542    
4543            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
4544            gone. It's job from the dialog's point of view is now done by the
4545            mainwindow, i.e. the parent.
4546            (SessionTreeCtrl.__init__): New parameter mainwindow which is
4547            stored as self.mainwindow. The mainwindow is need so that the tree
4548            can still subscribe to the selection messages.
4549            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
4550            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
4551            selection is now accessible through the mainwindow. Subscribe to
4552            SHAPES_SELECTED instead of SELECTED_SHAPE
4553    
4554            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
4555            SHAPES_SELECTED message now.
4556            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
4557            so deal with multiple shapes
4558            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
4559            gone. It's job from the dialog's point of view is now done by the
4560            mainwindow, i.e. the parent.
4561    
4562            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
4563            parameter is now a list of shape ids.
4564            (RecordTable.SetTable): The second parameter is now a list of
4565            indices.
4566    
4567            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
4568            selected_shape parameter and ivar to selected_shapes. It's now a
4569            list of shape ids.
4570            (MapRenderer.draw_label_layer): Deal with multiple selected
4571            shapes. Rearrange the code a bit so that the setup and shape type
4572            distinctions are only executed once.
4573    
4574            * test/test_selection.py: Test cases for the selection class
4575    
4576    2003-03-11  Jonathan Coles   <[email protected]>
4577    
4578            * Thuban/Model/load.py: Temporary fix so that the xml reader
4579            doesn't cause Thuban to crash.
4580    
4581            * Thuban/Model/layer.py: Handle the cyclic references between
4582            a layer and its classification better, and be sure to disconnect
4583            the classification from the layer when the layer is destroyed
4584            so that we don't maintain a cyclic reference that may not be
4585            garbage collected.
4586    
4587            * Thuban/Model/classification.py: See comment for layer.py.
4588    
4589    2003-03-12  Jan-Oliver Wagner <[email protected]>
4590    
4591            * HOWTO-Release: New. Information on the steps for releasing
4592            a new version of Thuban.
4593    
4594    2003-03-11  Jonathan Coles   <[email protected]>
4595    
4596            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
4597            Use True instead of true.
4598            (Classifier): Should have a single panel in which all the controls lie.
4599    
4600            * Thuban/UI/proj4dialog.py: Add normal border.
4601    
4602            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
4603    
4604            * Thuban/UI/mainwindow.py: Use True instead of true.
4605    
4606            * setup.py: Update some definitions to use wxWindows2.4 files
4607    
4608            * Data/iceland_sample_class.thuban: Fixed file so that the
4609            field_type information is present.
4610    
4611    2003-03-10  Jonathan Coles   <[email protected]>
4612    
4613            * Thuban/UI/classifier.py (Classifier.__init__): Make the
4614            field type label grow so that when the text changes the
4615            size is updated correctly. This may be a wxWindows bug.
4616    
4617    2003-03-10  Jonathan Coles   <[email protected]>
4618    
4619            * Thuban/UI/application.py: Changed SESSION_CHANGED to
4620            SESSION_REPLACED.
4621    
4622            * Thuban/UI/classifier.py: Wrap text with _().
4623            (ClassGrid.CreateTable): Set dimensions and size hints here,
4624            instead of in Reset, so we only set the size once.
4625    
4626            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
4627    
4628            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
4629            Call Close() instead of Shutdown().
4630    
4631            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
4632    
4633            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
4634            Go back to using OnClose() instead of Shutdown().
4635    
4636    2003-03-10  Jonathan Coles   <[email protected]>
4637    
4638            * Thuban/UI/classifier.py (Classifier): SelectField() needed
4639            to know the old field index as well as the new one.
4640    
4641    2003-03-10  Jonathan Coles   <[email protected]>
4642    
4643            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
4644            to correctly set the table information and call this from
4645            __init__ and from _OnFieldSelect so that all the information
4646            is up to date when the dialog opens and when a field is changed.
4647    
4648    2003-03-10  Jonathan Coles   <[email protected]>
4649    
4650            * Thuban/Model/classification.py (Classification): Don't use
4651            layer's message function directly, use the ClassChanged() method
4652            when then classification changes. SetField/SetFieldType/SetLayer
4653            must keep the information about field name and field type in
4654            sync when an owning layer is set or removed.
4655    
4656            * Thuban/Model/layer.py: Added ClassChanged() so that the
4657            classification can tell the layer when its data has changed.
4658            (Layer.SetClassification): Accepts None as an arguement to
4659            remove the current classification and correctly handles
4660            adding a new classification.
4661    
4662            * Thuban/Model/load.py: Comment out print statement
4663    
4664            * test/test_classification.py, test/test_save.py: New and
4665            improved tests.
4666    
4667    2003-03-07  Jonathan Coles   <[email protected]>
4668    
4669            * Thuban/Model/classification.py: Implemented __copy__ and
4670            __deepcopy__ for ClassGroup* and ClassGroupProperites so
4671            they can easily be copied by the classifier dialog.
4672            (ClassGroupProperites.__init__): The default line color should
4673            have been Color.Black.
4674    
4675            * Thuban/UI/classifier.py: Setting and Getting table values now
4676            uses a consistent set of functions.
4677            (Classifier): Now non-modal. Has field type label which changes
4678            as the field changes. Keep track of buttons in a list so that
4679            we can enable/disable the buttons when the None field is selected.
4680            (SelectPropertiesDialog): Add buttons to make the colors transparent.
4681    
4682            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
4683            does what OnClose did, but can be called by the application to
4684            close a window. Needed when a session changes, and we have to
4685            close the classifier windows.
4686    
4687            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
4688            Shuts down open dialogs. Used when a new session is created
4689            or a session is opened.
4690            (MainWindow.SaveSession): Should only call application.SaveSession()
4691            if we don't call SaveSessionAs first.
4692            (MainWindow.Classify): Allow different classifier dialogs for
4693            different layers.
4694    
4695            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
4696            the parent class handle it. Add Shutdown() to unsubscibe from
4697            event notification and call the parent Shutdown(). This was
4698            necessary so the application can close the tree window.
4699    
4700    2003-03-06  Jonathan Coles   <[email protected]>
4701    
4702            * Thuban/Model/classification.py: Minor documentation changes,
4703            Addition of __eq__ and __ne__ methods.
4704            (Classification.SetLayer): prevent recursion between this method
4705            and Layer.SetClassification().
4706    
4707            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
4708    
4709            * Thuban/Model/layer.py (SetClassification): prevent recursion
4710            between this method and Classification.SetLayer().
4711    
4712            * test/test_classification.py, test/test_load.py,
4713            test/test_session.py: Fixed and added tests for the classification
4714            classes.
4715    
4716    2003-03-06  Bernhard Herzog  <[email protected]>
4717    
4718            * Thuban/UI/classifier.py (ClassGrid.__init__)
4719            (ClassGrid.CreateTable): Move the SetSelectionMode call to
4720            CreateTable because otherwise it triggers an assertion in
4721            wxPython/wxGTK 2.4.
4722    
4723    2003-03-05  Jonathan Coles   <[email protected]>
4724    
4725            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
4726    
4727            * Thuban/Model/load.py: import FIELDTYPE constants from table.
4728    
4729            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
4730    
4731            * Thuban/Model/table.py: Put FIELDTYPE constants back.
4732    
4733    2003-03-05  Jonathan Coles   <[email protected]>
4734    
4735            * Thuban/UI/classifier.py: Added class documentation.
4736            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
4737            Store just the groups in the table and generate the other
4738            column information when it is requested. Add "None" field
4739            to pull-down to select no classification.
4740    
4741            * Thuban/common.py: Moved FIELDTYPE constants from table.py
4742            (Str2Num): Only catch ValueError exceptions.
4743    
4744            * Thuban/Model/classification.py: Class documentation. Renaming
4745            of methods with Stroke to Line. Groups are stored in a single
4746            list with the default as the first element. Groups are searched
4747            in the order they appear in the list.
4748    
4749            * Thuban/Model/color.py: Documentation.
4750    
4751            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
4752            the kind of data represented by a field.
4753    
4754            * Thuban/Model/load.py (ProcessSession): Use proper string
4755            conversion function; fixes RTbug #1713.
4756    
4757            * Thuban/Model/save.py (Saver): Store field type information.
4758    
4759            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
4760            (Table): Add field_info_by_name() to retrieve field information
4761            by specifying the field name, not the number.
4762    
4763            * Thuban/UI/mainwindow.py: Function name changes.
4764    
4765            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
4766            get the layer classification once. Don't try to classify
4767            values when the field is None: just use the default properties.
4768    
4769            * Thuban/UI/view.py: Function name changes.
4770    
4771            * Doc/thuban.dtd: Add field_type attribute to a classification.
4772    
4773    2003-03-04  Bernhard Herzog  <[email protected]>
4774    
4775            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
4776            the fill and stroke layer attributes optional with suitable
4777            default values. Add the stroke_width layer attribute. Use correct
4778            syntax for empty elements. Make the attribute list for labels
4779            refer to the label element.
4780    
4781    2003-03-04  Bernhard Herzog  <[email protected]>
4782    
4783            * setup.py (thuban_build_py.build): Add a comment about distutils in
4784            Python 2.3 containing some of the functionality we implement in
4785            setup.py ourselves.
4786    
4787            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
4788            before the selection mode. Doing it the other way round triggers
4789            an assertion in wxWindows.
4790    
4791            * Thuban/Model/save.py (escape): Fix typo in doc-string
4792    
4793            * Thuban/Model/classification.py: Remove unnecessary wxPython
4794            import
4795    
4796    2003-03-04  Jonathan Coles   <[email protected]>
4797    
4798            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
4799            Parameter 'value' should default to None.
4800    
4801            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
4802            the class attribute __classification is now private.
4803    
4804            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
4805            Classifier to ClassGrid. Added support for removing selected rows,
4806            which including code for keeping track of when cells are selected,
4807            and deselected.
4808            (ClassTable): Support for added/removing rows. Fixed a problem
4809            with __ParseInput whereby it would not allow strings (only numbers)
4810            to be entered.
4811            (Classifier): Added button and supporting code for removing
4812            selected rows.
4813    
4814    2003-02-27  Jonathan Coles   <[email protected]>
4815    
4816            * Thuban/common.py: Moved color conversion functions into
4817            Thuban/UI/common.py.
4818            (Str2Num): Now converts the float (not the string) to a long/int
4819            so that an exception isn't thrown.
4820    
4821            * Thuban/UI/common.py: Common functions used in several UI modules
4822    
4823            * Thuban/Model/classification.py: Changed the class hierarchy
4824            so that a Classification consists of Groups which return
4825            Properties when a value matches a Group.
4826    
4827            * Thuban/Model/layer.py: Fixed name resolution problem.
4828    
4829            * Thuban/Model/load.py: Use new Classification and Group functions.
4830    
4831            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
4832            failure.
4833            (Saver.write_classification): Use new Classification and Group
4834            functions.
4835    
4836            * Thuban/UI/classifier.py: Changes to use new Classification and Group
4837            functions. Fix to create a tuple with a single value instead of
4838            simply returning the value.
4839    
4840            * Thuban/UI/renderer.py: Use new Classification and Group functions.
4841            Use common.py functions.
4842    
4843            * Thuban/UI/tree.py: Use common.py functions.
4844            
4845            * test/test_classification.py: Use new Classification and Group
4846            classes.
4847    
4848    2003-02-24  Jonathan Coles   <[email protected]>
4849    
4850            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
4851            functions from Thuban color objects to wxWindow colour objects.
4852    
4853            * Thuban/Model/classification.py (Classification): Renamed
4854            GetProperties() to GetClassData(). Used the new iterator
4855            in TreeInfo().
4856            (ClassIterator): Iterator implementation to iterate over the
4857            ClassData objects in a classification object.
4858    
4859            * Thuban/Model/save.py (Saver.write_classificaton): Uses
4860            the new iterator to save the classification information.
4861    
4862            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
4863            for changing the stroke and fill colors and previewing the
4864            changes.
4865    
4866            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
4867            MainWindow.SaveSessionAs): Text string changes so the dialogs
4868            have more meaningful titles.
4869    
4870            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
4871            Classification method name from GetProperties to GetClassData.
4872    
4873            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
4874            instead of accessing now non-existent class variables.
4875    
4876    2003-02-24  Bernhard Herzog  <[email protected]>
4877    
4878            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
4879            unneeded Shape() call. Rendering is substantially faster without
4880            it and it avoids some problems with broken shape files.
4881    
4882    2003-02-20  Frank Koormann   <[email protected]>
4883    
4884            Force minimal size of identify and label dialogs. The autosizing
4885            looked too ugly.
4886    
4887            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
4888            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
4889            Set size of listctrl.
4890            * Thuban/UI/identifyview.py (IdentifyView.__init__):
4891            Set size of dialog.
4892    
4893    2003-02-19  Jonathan Coles   <[email protected]>
4894    
4895            * test/test_classification.py, test/test_layer.py,
4896            test/test_load.py, test/test_map.py, test/test_session.py:
4897            Updated the tests to use the new functions that are in the
4898            respective classes.
4899    
4900            * Thuban/Model/classification.py (Classification):
4901            Uses the new ClassData* classes. Modification messages are
4902            passed up to the parent layer (if it exists).
4903            (ClassData): New class to encapsulate the common data in each
4904            classification property.
4905            (ClassDataDefault): Represents the Default class. data.
4906            (ClassDataPoint): Represents a single class. data point
4907            (ClassDataRange): Represents a class. range
4908            (ClassDataMap): Represents a class. map (unused).
4909    
4910            * Thuban/Model/color.py: Added Color.None to represent something
4911            with no color. Color.Black represents the color black.
4912            (NoColor): Helper class derived from Color to represent something
4913            with no color.
4914    
4915            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
4916            stroke_width attributes. Made the 'classification' attribute private.
4917            New methods for setting/getting the classification.
4918    
4919            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
4920            to get the classifcation and use the new ClassData* classes to
4921            hold the classification data. Use Str2Num to convert numbers
4922            properly.
4923    
4924            * Thuban/Model/save.py (Saver): Use new Color and Classification
4925            methods
4926    
4927            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
4928            custom grid.
4929            (ClassTable): Support for editing Values and Labels and for
4930            changing what type (point or range) of data is stored in each
4931            property based on how the user enters the data.
4932            (Classifier): Support for saving the new classifications and
4933            launching the dialog to edit a property.
4934            (SelectPropertiesDialog): New class for editing the visual
4935            properties of a classification (stroke color, width, and fill color)
4936            (ClassPreviewer): Took the Draw method from ClassRenderer and
4937            made most of it into this new class. Intend to use this class in
4938            the SelectPropertiesDialog for previewing changes.
4939    
4940            * Thuban/UI/renderer.py: Use new Color and Classification methods.
4941    
4942            * Thuban/UI/tree.py: Formatting changes.
4943    
4944            * Doc/thuban.dtd: Add 'label' element
4945    
4946            * Thuban/common.py: New. Contains common routines used throughout
4947            the code.
4948            (Str2Num): Takes a string and converts it to the "best" type of
4949            number.
4950    
4951    2003-02-14  Bernhard Herzog  <[email protected]>
4952    
4953            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
4954            dragging flag is always set to 0 even when the tool implementation
4955            raises an exception
4956    
4957    2003-02-11  Bernhard Herzog  <[email protected]>
4958    
4959            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
4960            method to create a splash screen.
4961            (ThubanApplication.ShowMainWindow): New. Show the main window.
4962            Needed so the splash screen can display the mainwindow
4963            (ThubanApplication.OnInit): Call the
4964            new splash_screen method to determine whether the application
4965            should display a splash screen. If it displays a splash screen do
4966            not immediately show the main window.
4967    
4968    2003-02-11  Jonathan Coles  <[email protected]>
4969    
4970            * Thuban/Model/classification.py: Added import line to fix
4971            feature conflicts between running on python2.2 and python2.1.
4972    
4973            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
4974            onto the clinfo parameter, so removed the deepcopy().
4975    
4976    2003-02-10  Jonathan Coles  <[email protected]>
4977    
4978            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
4979            Added element_open variable to track opening and closing of tags
4980            so that tags that don't span more than one line are closed with
4981            /> instead of </tag_name>. Use the GetDefault*() methods of
4982            the Classification class.
4983    
4984            * Thuban/Model/classification.py (Classificaton): Added set and
4985            get methods for the default data. The class also takes a layer
4986            reference so that modification messages can be sent. Fixed the
4987            methods to use the new ClassData class.
4988            (ClassData): New class to encapsulate the classification data
4989    
4990            * Thuban/Model/layer.py (Layer): Remove the
4991            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
4992            SetDefault*() methods on the layer's classification object.
4993            (Layer.__init__): Use the new SetDefault*() methods in the
4994            Classification class.
4995    
4996            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
4997            object instead of a dictionary.
4998    
4999            * Thuban/UI/classifier.py (ClassRenderer): New class to
5000            draw the classifications in the dialog box's table.
5001            (Classifier): Modified to use the ClassRenderer class.
5002    
5003            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
5004            methods of the Classification class.
5005    
5006            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
5007            of the ClassData class.
5008    
5009            * test/test_classification.py, test/test_layer.py,
5010            test/test_map.py, test/test_session.py: Fix the tests to work
5011            with the above code changes.
5012    
5013    2003-02-03  Jonathan Coles  <[email protected]>
5014    
5015            * Thuban/Model/classification.py (Classification): Added getNull()
5016            to return the NullData reference
5017    
5018            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
5019            Layer.SetStrokeWidth): Modified these functions to change the
5020            null data in the classification rather than keep these values
5021            directly in the Layer class. Menu options to change these values
5022            work again.
5023    
5024    2003-01-28  Jonathan Coles  <[email protected]>
5025    
5026            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
5027            Fixed crashing problem on some systems. Dialog box shows
5028            classification data.
5029    
5030            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
5031            Colors in the tree view.
5032    
5033            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
5034            the tree info for classifications. Commented out unnecessary lines.
5035    
5036            * Thuban/Model/classification.py (Classification.TreeInfo): New
5037            function to add information about the classification into the
5038            tree view.
5039    
5040    2003-01-27  Jan-Oliver Wagner <[email protected]>
5041    
5042            * Thuban/__init__.py (_): New.
5043    
5044            * Thuban/Model/classification.py, Thuban/Model/extension.py,
5045            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
5046            Thuban/Model/session.py, Thuban/UI/application.py,
5047            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
5048            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
5049            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
5050            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
5051            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
5052    
5053    2003-01-27  Jonathan Coles  <[email protected]>
5054    
5055            * Thuban/Model/layer.py: Classification initialization calls.
5056    
5057            * Thuban/Model/classification.py: Created class to encapsulate
5058            a layer classification. Supports specific data points and
5059            ranges.
5060    
5061            * Thuban/Model/load.py: Added support for loading classification
5062            information.
5063    
5064            * Thuban/Model/save.py: Added support for saving classification
5065            information.
5066    
5067            * Thuban/UI/classifier.py: Initial class for a dialog box for
5068            specifying classification information.
5069    
5070            * Thuban/UI/mainwindows.py: Support for opening the classifier
5071            dialog.
5072    
5073            * Thuban/UI/renderer.py: Support for drawing a layer with the
5074            classification information.
5075    
5076            * Data/iceland_sample_class.thuban: iceland_sample with
5077            classification data.
5078    
5079            * test/test_classification: Tests for the Classification class.
5080    
5081    2002-12-09  Bernhard Herzog  <[email protected]>
5082    
5083            * test/test_command.py: New. Tests for the command classes.
5084    
5085            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
5086            (Command.IsTool): New method to distinguish between command
5087            switching tools and other commands.
5088    
5089            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
5090            the tool to avoid direct assignments to instance variables
5091            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
5092            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
5093            change the tool
5094    
5095            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
5096            active tool's command turns insensitive, disable the tool.
5097            (_tool_command): Use the new ToolCommand class
5098    
5099            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
5100            SelectTool method to change the tool
5101            (iconfile): Use the ToolCommand class
5102    
5103    2002-12-03  Bernhard Herzog  <[email protected]>
5104    
5105            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
5106            the case of selected items that are not children of Layers or Maps
5107            properly. Previously this bug would trigger an assertion in
5108            wxWindows.
5109    
5110    2002-11-06  Frank Koormann  <[email protected]>
5111    
5112            * Thuban/UI/mainwindow.py: Altered the order of tools in the
5113            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
5114            Full Extent).
5115    
5116    2002-10-23  Bernhard Herzog  <[email protected]>
5117    
5118            * setup.py (setup call): version now 0.1.3
5119    
5120            * MANIFEST.in: Add the files in test/
5121    
5122            * test/README: Add note about tests requiring the iceland data
5123    
5124            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
5125            copyright notice.
5126    
5127    2002-10-18  Bernhard Herzog  <[email protected]>
5128    
5129            * test/test_map.py
5130            (TestMapWithContents.test_projected_bounding_box): Use an explicit
5131            epsilon.
5132    
5133            * test/support.py (FloatComparisonMixin.assertFloatEqual)
5134            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
5135            message if the assertion fails and don't return the return value
5136            of self.assert_. In assertFloatSeqEqual the return meant that not
5137            all items of the sequence were compared.
5138    
5139    2002-09-20  Bernhard Herzog  <[email protected]>
5140    
5141            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
5142    
5143            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
5144    
5145            * test/test_map.py (TestMapWithContents.test_tree_info): Create
5146            the string with the bounding box on the fly because of platform
5147            differences in the way %g is handled.
5148    
5149            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
5150            DBFfile too because Thuban layers can't yet cope missing DBF
5151            files.
5152    
5153    2002-09-20  Bernhard Herzog  <[email protected]>
5154    
5155            * test/test_menu.py: Use initthuban instead of
5156            add_thuban_dir_to_path to initialize Thuban.
5157    
5158            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
5159            Mixin class for float comparisons
5160            (SubscriberMixin): New. Mixin class to test messages sent through
5161            the Connector class
5162    
5163            * test/README: Fix a typo and add the -v flag to the command for
5164            individual tests
5165    
5166            * test/test_session.py: New. Test cases for Thuban.Model.session
5167    
5168            * test/test_proj.py: New. Test cases for Thuban.Model.proj
5169    
5170            * test/test_map.py: New. Test cases for Thuban.Model.map
5171    
5172            * test/test_layer.py: New. Test cases for Thuban.Model.layer
5173    
5174            * test/test_label.py: New. Test cases for Thuban.Model.label
5175    
5176            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
5177    
5178            * test/test_color.py: New. Test cases for Thuban.Model.color
5179    
5180            * test/test_base.py: New. Test cases for Thuban.Model.base
5181    
5182    2002-09-13  Bernhard Herzog  <[email protected]>
5183    
5184            * Thuban/Model/session.py (Session.forwarded_channels): Forward
5185            the CHANGED channel too.
5186    
5187            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
5188            CHANGED channel too.
5189            (Map.__init__): Call the Modifiable constructor as well.
5190    
5191            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
5192            event if the modified flag changes.
5193            (Modifiable.changed): Tweak the doc-string.
5194    
5195            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
5196            (MainWindow.set_position_text): Put the code that puts the text
5197            with the mouse position into the status bar into the new method
5198            set_position_text so that it can overwritten in derived classes.
5199    
5200    2002-09-12  Bernhard Herzog  <[email protected]>
5201    
5202            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
5203            message box on the main window.
5204    
5205    2002-09-11  Bernhard Herzog  <[email protected]>
5206    
5207            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
5208            the 'E' because it's less likely to interfere with other menu
5209            entries.
5210            (MainWindow.build_menu): remove an incorrect comment.
5211    
5212    2002-09-10  Bernhard Herzog  <[email protected]>
5213    
5214            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
5215            (_tool_command): Add sensitive parameter
5216            (_has_visible_map): Sensitivity callback to tools and other
5217            commands that require a visible map. Use it in map_zoom_in_tool,
5218            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
5219            and map_full_extent
5220    
5221    2002-09-06  Bernhard Herzog  <[email protected]>
5222    
5223            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
5224            VIEW_POSITION
5225    
5226    2002-09-04  Frank Koormann  <[email protected]>
5227    
5228            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
5229    
5230    2002-09-02  Bernhard Herzog  <[email protected]>
5231    
5232            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
5233            wxWindows already and our implementation doesn't work correctly
5234            with wxGTK 2.3:
5235            (MapCanvas.__init__): Remove the instance variable
5236            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
5237            be drawin
5238            (MapCanvas.OnIdle): Removed.
5239    
5240            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
5241            a parameter to determine the size of the rectangle.
5242            (MapCanvas.find_shape_at): Create the box around the point on a
5243            layer by layer basis and make the size depend on the shape type.
5244            This solves a problem with the selection of point shapes at the
5245            border of the layer's bounding box
5246    
5247    2002-08-30  Bernhard Herzog  <[email protected]>
5248    
5249            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
5250            for the sensitivity  of remove layer.
5251            (_can_remove_layer): New. Sensitivity callback for remove layer
5252            (Command layer_remove): Use _can_remove_layer
5253    
5254            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
5255            determine whether a given layer can be deleted.
5256    
5257            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
5258            (MapCanvas.do_redraw): Get rid of the unused update_region
5259            instance variable
5260    
5261            * Thuban/UI/view.py: Add/update some doc-strings.
5262    
5263            * test/: new subdirectory with a bunch of unit tests.
5264    
5265            * test/README, test/test_table.py, test/test_save.py,
5266            test/test_menu.py, test/test_load.py: Initial set of tests and
5267            brief instructions on how to run them
5268    
5269    2002-08-29  Bernhard Herzog  <[email protected]>
5270    
5271            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
5272            arcs with multiple parts.
5273    
5274            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
5275            Handle degenrate rectangles.
5276    
5277            * Thuban/Model/table.py: Make writing records work correctly:
5278            (Table.__init__): Keep track of whether the DBF is open for
5279            writing
5280            (Table.write_record): Open the DBF file for writing when necessary
5281    
5282    2002-08-27  Bernhard Herzog  <[email protected]>
5283    
5284            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
5285            dbf files only for reading by default. Use a new writable dbf
5286            object for writing.
5287    
5288    2002-08-26  Bernhard Herzog  <[email protected]>
5289    
5290            * Thuban/UI/mainwindow.py: Refactor the context creation:
5291            (MainWindow.Context): New method to return a context
5292            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
5293            new method
5294    
5295            * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
5296            layer table specific code from TableGrid into LayerTableGrid
5297            (TableFrame, LayerTableFrame): Split the layer table specific code
5298            from TableFrame into LayerTableFrame
5299            (LayerTableGrid.select_shape): Remove a debug print
5300    
5301            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
5302            LayerTableFrame
5303    
5304    2002-08-23  Bernhard Herzog  <[email protected]>
5305    
5306            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
5307            absolute filename.
5308    
5309    2002-08-22  Bernhard Herzog  <[email protected]>
5310    
5311            * Thuban/Model/table.py (Table.write_record): New method to write
5312            records.
5313            (Table.__init__): Open the DBF file for writing too.
5314    
5315            * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
5316            into the underlying table.
5317    
5318            * extensions/shapelib/shapefil.h (DBFCommit),
5319            extensions/shapelib/dbfopen.c (DBFCommit): New API function to
5320            commit any changes made to the DBF file.
5321    
5322            * Thuban/UI/mainwindow.py (make_check_current_tool)
5323            (_tool_command): Put the code that generates the "checked"
5324            callback into a separate function so that we can reuse it
5325            elsewhere
5326    
5327            * Thuban/Model/save.py (Saver): New class to handle serializing a
5328            session into an XML file. The main reason to introduce a class is
5329            that applications built on Thuban can derive from it so that they
5330            can save additional information in a session file.
5331            (save_session): Delegate almost all the work to the Saver class.
5332            Rename the filename argument to file because it may be a file like
5333            object now.
5334    
5335            * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
5336            code. Remove the little test code which would be executed when the
5337            module is run as a script which didn't work anymore since it can't
5338            import the other Thuban modules.
5339            (ProcessSession, load_session): Refactor the ProcessSession to
5340            have one method for each element start and end tag so that derived
5341            classes can easily override the processing of individual tags.
5342            Also, always parse with namespaces enabled because applications
5343            built on top of Thuban will likely use namespaces if they extend
5344            the session file format.
5345    
5346    2002-08-21  Bernhard Herzog  <[email protected]>
5347    
5348            * setup.py (ThubanInstall.run): Don't repr install_lib_orig
5349            because thubaninit_contents will do it for us.
5350    
5351    2002-08-16  Jan-Oliver Wagner <[email protected]>
5352    
5353            * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
5354            tree window already open
5355    
5356    2002-08-15  Bernhard Herzog  <[email protected]>
5357    
5358            * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
5359            with self.
5360    
5361            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
5362            when we have actually captured it.
5363    
5364            * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
5365            shapefile and destroy the table.
5366    
5367            * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
5368    
5369    2002-08-14  Bernhard Herzog  <[email protected]>
5370    
5371            * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
5372            instance variable columns
5373            (RecordTable.GetTypeName): row and col may be negative in some
5374            cases.
5375    
5376            * setup.py (InstallLocal.initialize_options)
5377            (InstallLocal.finalize_options, InstallLocal.user_options): New
5378            option create-init-file to build a thubaninit.py when running
5379            install_local
5380            (InstallLocal.run): Create the thubaninit.py module when requested
5381            (thubaninit_contents): Split the template into several parts and
5382            create a new function thubaninit_contents that creates the
5383            contents of a thubaninit module.
5384            (ThubanInstall.run): Use the new function to create the thubaninit
5385            module.
5386    
5387    2002-07-30  Bernhard Herzog  <[email protected]>
5388    
5389            * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
5390            cleanup.
5391            (ThubanApplication.MainLoop): Extend to automatically call OnExit.
5392    
5393            * Thuban/Model/session.py (Session.Destroy): Don't bypass the
5394            direct base class' Destroy method.
5395    
5396            * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
5397            layers.
5398            (Map.Destroy): Destroy the label_layer as well and call the
5399            inherited Desatroymethod first so that no more messages are
5400            issued.
5401            (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
5402            message if the stacking order actually has changed. Add
5403            doc-strings.
5404            (Map.BoundingBox): Correct the doc-string.
5405            (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
5406            (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
5407    
5408            * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
5409            all labels.
5410    
5411    2002-07-29  Bernhard Herzog  <[email protected]>
5412    
5413            * Thuban/Model/map.py (Map.subscribe_layer_channels)
5414            (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
5415            to a layer's channels into separate methods.
5416            (Map.RemoveLayer, Map.AddLayer): Call the new methods
5417            (Map.Destroy): Unsubscribe from a layer's channels before
5418            destroying it.
5419    
5420            * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
5421            selected_layer parameter to searched_layer which is the layer to
5422            search in.
5423            (MapCanvas.SelectShapeAt): New parameter layer to restrict the
5424            search to that layer. Return the selected layer and shape.
5425    
5426            * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
5427            typo
5428    
5429    2002-07-24  Bernhard Herzog  <[email protected]>
5430    
5431            * Thuban/UI/application.py (ThubanApplication.create_session):
5432            Extend the doc string.
5433            (ThubanApplication.subscribe_session)
5434            (ThubanApplication.unsubscribe_session): New methods to
5435            subscribe/unsubscribe to/from session channels.
5436            (ThubanApplication.SetSession): Call the new methods here.
5437            (ThubanApplication.maps_changed, ThubanApplication.set_map):
5438            Renamed set_map to maps_changed. Its now a subscriber for
5439            MAPS_CHANGED.
5440    
5441            * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
5442            x-coordinate in case of simple clicks
5443    
5444            * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
5445            don't pass it as a parameter
5446    
5447            * Thuban/Model/session.py (Session.RemoveMap): New
5448    
5449            * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
5450            window size into a parameter.
5451    
5452    2002-07-23  Bernhard Herzog  <[email protected]>
5453    
5454            * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
5455            just commands.
5456    
5457            * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
5458            parameter list a bit to allow setting the window title and the
5459            initial message in the status bar. Update the callers.
5460    
5461            * Thuban/UI/application.py (ThubanApplication.OnInit)
5462            (ThubanApplication.CreateMainWindow): Put the mainwindow
5463            instantiation into a separate method so that it can be overridden
5464            by a subclass.
5465    
5466    2002-07-19  Bernhard Herzog  <[email protected]>
5467    
5468            * Thuban/Model/session.py: Issue a CHANGED message every time
5469            another changed message is issued to make it easier to get
5470            notified of changes.
5471            (Session): Update the doc string
5472            (Session.forward): Issue changed-events as CHANGED as well.
5473            (Session.changed): Overwrite the inherited version to issue
5474            CHANGED events as well.
5475    
5476            * Thuban/UI/tree.py: We can now simply subscribe to the session's
5477            CHANGED channel to be informed of changes.
5478            (SessionTreeCtrl.session_channels): Not needed any longer.
5479            (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
5480            Only have to (un)subscribe CHANGED
5481    
5482            * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
5483    
5484            * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
5485            for the wxPython locale bug to __init__.py so that it's
5486            automatically executed by anybody using UI code from Thuban.
5487    
5488    2002-07-18  Bernhard Herzog  <[email protected]>
5489    
5490            * Thuban/UI/main.py (main): app no longer needs to be global
5491    
5492            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
5493            as parameter and store it in an instance variable
5494            (MainWindow.invoke_command, MainWindow.update_command_ui)
5495            (MainWindow.save_modified_session, MainWindow.NewSession)
5496            (MainWindow.OpenSession, MainWindow.SaveSession)
5497            (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
5498            application object.
5499    
5500            * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
5501            the main window with self.
5502    
5503            * Thuban/UI/context.py: New module with the context class
5504    
5505            * Thuban/UI/command.py (Command): Update doc string.
5506    
5507            * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
5508            MainWindow.update_command_ui): Pass an instance of the context
5509            class to the command's methods
5510            (check_current_tool, call_method): Handle the new context
5511            implementation
5512    
5513            * Examples/simple_extensions/simple_tool.py (simple_tool,
5514            check_simple_tool): Handle the new context implementation
5515    
5516            * Examples/simple_extensions/simple_command.py (simple_command):
5517            Handle the new context implementation. Update the comments about
5518            the context.
5519    
5520            * Thuban/UI/application.py (ThubanApplication.SetSession): Add
5521            doc-string
5522            (ThubanApplication.Session): New method to return the session
5523            object
5524    
5525            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
5526            interactor's selected_layer may not be a layer of the current
5527            session when the tree is updated while a new session is being set.
5528    
5529    2002-07-17  Bernhard Herzog  <[email protected]>
5530    
5531            * Thuban/UI/tree.py (color_string): Removed. No longer used.
5532            (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
5533            update_tree into update_tree and add_items. The tree now uses a
5534            more generic way to display the contents of the tree.
5535            (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
5536    
5537            * Thuban/Model/layer.py (Layer.TreeInfo),
5538            Thuban/Model/extension.py (Extension.TreeInfo),
5539            Thuban/Model/map.py (Map.TreeInfo),
5540            Thuban/Model/session.py (Session.TreeInfo):
5541            Add TreeInfo methods to implement the new tree view update scheme
5542    
5543    2002-07-16  Bernhard Herzog  <[email protected]>
5544    
5545            * Thuban/UI/application.py: Don't use "import from" for the
5546            MainWindow. It can't always be resolved.
5547            (ThubanApplication.OnInit): change reference to MainWindow
5548            accordingly.
5549    
5550            * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
5551            completely
5552    
5553    2002-07-10  Bernhard Herzog  <[email protected]>
5554    
5555            * setup.py (create_init_module): New configurable variable whose
5556            default depends on the platform we're running on.
5557            (ThubanInstall.initialize_options): Initialize
5558            self.create_init_module from the global create_init_module
5559            (ThubanInstall.user_options): indictate that the options
5560            create-init-module and init-module-dir have arguments.
5561    
5562            * setup.py: In the setup call change the version number to include
5563            cvs.
5564    
5565            * MANIFEST.in: Add the files in Examples
5566    
5567    2002-07-09  Bernhard Herzog  <[email protected]>
5568    
5569            * setup.py: In the setup call, use the thuban homepage as the
5570            value of the url parameter.
5571    
5572            * Examples: New subdirectory for examples.
5573    
5574            * Examples/simple_extensions/simple_tool.xpm,
5575            Examples/simple_extensions/simple_tool.py,
5576            Examples/simple_extensions/simple_command.py,
5577            Examples/simple_extensions/README: Simple examples showing how to
5578            add new commands and tools.
5579    
5580            * setup.cfg (bdist_rpm): Add the default value for prefix and tell
5581            bdist_rpm that we also have an install script.
5582            (bdist_inno): Add 2002 to the copyright notice.
5583    
5584            * setup.py: Create a file in python's site-packages directory to
5585            make installation of Thuban as a library easier.
5586            (ThubanInstall.user_options): Add two new options,
5587            create-init-module and init-module-dir
5588            (ThubanInstall.expand_with_pure_python_dirs): New method to expand
5589            filenames for installation in the default directories.
5590            (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
5591            the inherited methods to capture some filenames before they're
5592            transformed too much by distutils.
5593            (ThubanInstall.run): Create the init module if requested.
5594            (ThubanInstall.thuban_init_filename): New method to return the
5595            full name of the init module.
5596            (ThubanInstall.get_outputs): Append the filename of the init
5597            module.
5598    
5599    2002-07-08  Bernhard Herzog  <[email protected]>
5600    
5601            * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
5602            handle the prefix properly which means that the default for the
5603            installation prefix should be /usr for RPMs and /usr/local when
5604            doing a normal source install.
5605            (bdist_rpm_install_script): Script to override the default install
5606            commands in the specfile generated by the bdist_rpm command.
5607            (thuban_bdist_rpm.user_options): Add a prefix option
5608            (thuban_bdist_rpm.initialize_options): Init the prefix option.
5609            Create the script files for the spec files as empty files here
5610            (thuban_bdist_rpm._make_spec_file): Override the inherited method
5611            to fill the script files with content.
5612    
5613            * Thuban/Model/save.py (relative_filename): Wrapper around
5614            Thuban.Lib.fileutil.relative_filename that accepts an empty dir
5615            argument. save_session now automatically uses this version,
5616            solving a problem when saving to a relative filename.
5617    
5618            * setup.py: In the setup call, make sure that the library
5619            directories are under $prefix/lib not directly under $prefix.
5620    
5621    2002-06-20  Jan-Oliver Wagner <[email protected]>
5622    
5623            * Thuban/Model/extension.py: new module to handle extension objects.
5624            * Thuban/Model/messages.py: new messages for extensions.
5625            * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
5626            Session.AddExtension): new for handling extensions.
5627            Also some other minor changes to round up extension handling.
5628            * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
5629            of Extension titles and title and names of its objects.
5630    
5631    2002-05-29  Bernhard Herzog  <[email protected]>
5632    
5633            * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
5634            the events for a command.
5635            (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
5636            Call bind_command_events to bind the events. add_toolbar_command
5637            can now bind events too so that it's possible to have commands
5638            that are only available through the toolbar.
5639            (MainWindow.init_ids): New instance variable events_bound to keep
5640            track of for which commands events have been bound.
5641    
5642    2002-05-28  Bernhard Herzog  <[email protected]>
5643    
5644            * Thuban/UI/menu.py: New module to build and manage menus.
5645    
5646            * Thuban/UI/mainwindow.py: Remove some unused imports.
5647            (MainWindow.__init__, main_menu): move the definition of the main
5648            menu from __init__ to the Menu instance main_menu.
5649            (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
5650            build the menu bar and sub-menus from a menu description.
5651    
5652            * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
5653            startup file
5654            (ThubanApplication.read_startup_files): New method to run
5655            ~/.thuban/thubanstart.py
5656    
5657            * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
5658            Move the toolbar definition to the Menu instance main_toolbar.
5659            (MainWindow.build_toolbar): New method to build the toolbar
5660            similar to the build_menu methods
5661    
5662    2002-05-23  Bernhard Herzog  <[email protected]>
5663    
5664            * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
5665            layer_outline_color. Fix it in the definition of the command too.
5666    
5667            * Thuban/UI/command.py (Command): Fix typo in doc string
5668    
5669    2002-05-22  Bernhard Herzog  <[email protected]>
5670    
5671            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
5672            in the docstring
5673    
5674    2002-05-15  Bernhard Herzog  <[email protected]>
5675    
5676            * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
5677            when the shapefile is empty.
5678            (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
5679            now return None for empty shapefiles. Update doc-strings.
5680    
5681            * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
5682            the layer's bbox being None.
5683    
5684            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
5685            layer's bbox being None.
5686    
5687            * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
5688            necessary.
5689            (MapCanvas.__init__): New instance variables, last_selected_layer
5690            and last_selected_shape to determine how the selection has
5691            changed.
5692    
5693            * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
5694            AutoSizeColumns because it will cause a traversal of the entire
5695            table which for large .dbf files will take a very long time.
5696    
5697    2002-05-14  Bernhard Herzog  <[email protected]>
5698    
5699            * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
5700            maximum depth for the tree than shapelib does by default.
5701    
5702    2002-05-10  Bernhard Herzog  <[email protected]>
5703    
5704            * setup.py (py_modules): The shptree modules doesn't have a
5705            wrapper, so don't include it in the py_modules
5706    
5707    2002-05-08  Bernhard Herzog  <[email protected]>
5708    
5709            * extensions/shapelib/shptree.c (compare_ints): Make arguments
5710            const void * as in the qsort prototype
5711            (SHPTreeFindLikelyShapes): Remove some unused variables.
5712    
5713            * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
5714            maintains to redraw the window during a drag.
5715            (MapCanvas.unprojected_rect_around_point): New method to determine
5716            a small region around a point for hit-testing.
5717            (MapCanvas.find_shape_at): Only test the shapes in a small region
5718            around the point.
5719    
5720            * setup.py: Increment the version to 0.1.2
5721    
5722            * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
5723            debug print and set session to None after unsubscribing
5724    
5725    2002-05-07  Bernhard Herzog  <[email protected]>
5726    
5727            * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
5728            the file to have a .thuban extension.
5729    
5730            * Thuban/UI/tree.py (session_channels): New class constant with
5731            all the session channels to subscribe to to update the tree
5732            (SessionTreeCtrl.session_changed): Remember the session so that we
5733            can unsubscribe properly. Use the new class constant to
5734            unsubscribe from the old session and subscribe to the new one.
5735            (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
5736            subscriptions of the SessionTreeCtrl.
5737            (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
5738    
5739            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
5740            Session Tree" command to the file menu.
5741    
5742            * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
5743            as update_region to the renderer.
5744    
5745            * Thuban/UI/renderer.py
5746            (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
5747            update box is now directly a tuple, not a wxRect anymore.
5748    
5749            * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
5750            prints.
5751    
5752    2002-05-07  Bernhard Herzog  <[email protected]>
5753    
5754            * setup.py: Add the shptree extension module. See
5755            extensions/pyshapelib/ChangeLog for more details.
5756    
5757            * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
5758            extensions/shapelib/dbfopen.c: Really update to the versions of
5759            shapelib 1.2.9. For some reason it wasn't really done on
5760            2002-04-11.
5761    
5762            * extensions/shapelib/shptree.c: Modified version of shptree.c of
5763            shapelib 1.2.9. The only real difference is the use of qsort
5764            instead of a bubble sort implementation
5765    
5766            * Thuban/Model/layer.py (Layer.__init__): New instance variable
5767            shapetree to hold the shapelib quadtree for the shapefile
5768            (Layer.open_shapefile): Create the quad tree.
5769            (Layer.ShapesInRegion): New method to return the ids of shapes in
5770            a given region using the quad tree.
5771    
5772            * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
5773            comment
5774            (draw_polygon_shape): Accept both arcs and polygons.
5775            (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
5776            the api.
5777    
5778            * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
5779            return the shape ids to be rendered in a given layer.
5780            (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
5781            ids. Use draw_polygon_shape to draw arc shapes as well.
5782            (ScreenRenderer.RenderMap): New parameter for the rectangle that
5783            has to be updated
5784            (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
5785            calling it's ShapesInRegion method.
5786    
5787            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
5788            update_region for the update region.
5789            (MapCanvas.OnPaint): Maintain the update region
5790            (MapCanvas.do_redraw): Pass the bounding box of the update_region
5791            to the renderer when drawing the bitmap. Reset the update_region.
5792    
5793    2002-05-03  Bernhard Herzog  <[email protected]>
5794    
5795            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
5796            MainWindow.OpenSession): Change the file extension of the session
5797            files to .thuban
5798    
5799            * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
5800            Move the map channels to be forwarded by the session into the
5801            class constant with forwarded_channels. Also add
5802            LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
5803            forwarded_channels
5804    
5805            * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
5806            typo and some rewording).
5807    
5808    2002-05-02  Bernhard Herzog  <[email protected]>
5809    
5810            * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
5811            around to speed up most redraws:
5812            (MapCanvas.__init__): New instance variable bitmap which holds the
5813            bitmap
5814            (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
5815            self.bitmap to draw.
5816            (MapCanvas.full_redraw): New method to force a full redraw
5817            including the bitmap
5818            (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
5819            make sure the bitmap is redrawn.
5820            (MapCanvas.projection_changed, MapCanvas.set_view_transform,
5821            MapCanvas.shape_selected): Call full_redraw instead of readraw to
5822            make sure the bitmap is redrawn.
5823            (MapCanvas.OnSize): New method to handle size events so that the
5824            bitmap can be redrawn.
5825    
5826    2002-04-29  Bernhard Herzog  <[email protected]>
5827    
5828            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
5829            canvas' VIEW_POSITION event
5830            (MainWindow.view_position_changed): Handler for VIEW_POSITION.
5831            Update the text in the status-bar accordingly.
5832    
5833            * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
5834            (MapCanvas.__del__): Implement because Publisher.__del__ has to be
5835            called.
5836            (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
5837            current_position
5838            (MapCanvas.set_current_position): New method to set
5839            current_position. Issue a VIEW_POSITION event
5840            (MapCanvas.CurrentPosition): New public method to return the value
5841            of current_position. Should be called when the VIEW_POSITION event
5842            is processed.
5843            (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
5844            Update the position.
5845            (MapCanvas.OnLeaveWindow): Set the position to None.
5846    
5847            * Thuban/UI/messages.py (VIEW_POSITION): New message for the
5848            position in the statusbar
5849    
5850    2002-04-26  Frank Koormann <[email protected]>
5851    
5852            * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
5853    
5854    2002-04-24  Frank Koormann <[email protected]>
5855    
5856            * Resources/Bitmaps/identify.xpm: shadow added
5857    
5858            * Resources/Bitmaps/fullextent.xpm: new
5859    
5860    2002-04-22  Jan-Oliver Wagner <[email protected]>
5861    
5862            * Thuban/UI/tree.py (update_tree): added test for None on map bounding
5863            box
5864    
5865    2002-04-21  Jan-Oliver Wagner <[email protected]>
5866    
5867            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
5868    
5869            * Thuban/UI/tree.py (update_tree): added added map extent
5870    
5871            * Thuban/UI/mainwindow.py (_method_command): extended by parameter
5872            icon; added map_full_extend as tool
5873    
5874    2002-04-19  Jan-Oliver Wagner <[email protected]>
5875    
5876            * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
5877            saving _new_ sessions
5878    
5879            * Thuban/Model/session.py (create_empty_session): new session
5880            don't have a filename (set to None)
5881    
5882            * Thuban/UI/tree.py (update_tree): added filename and modified flag
5883    
5884            * Thuban/Model/load.py (ProcessSession): convert projection
5885            parameters from unicode to regular string
5886    
5887            * Data/iceland_sample.session: Added UTM Zone 26 projection.
5888    
5889    2002-04-11  Bernhard Herzog  <[email protected]>
5890    
5891            * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
5892            extensions/shapelib/dbfopen.c: Update to the versions of shapelib
5893            1.2.9
5894    
5895            * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
5896            the pyshapelib directoy into the list of include dirs, so that
5897            pyshapelib_api.h can be found.
5898    
5899            * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
5900            holds the pyshapelib C-API
5901            (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
5902            pyshapelib_api to access the shapelib functions.
5903            (initwxproj): Import the c_api from the shapelib module and
5904            initialize pyshapelib_api.
5905    
5906    2002-04-04  Bernhard Herzog  <[email protected]>
5907    
5908            * setup.py (thuban_bdist_rpm.initialize_options): Use
5909            initialize_options to create the scripts for the rpm.
5910    
5911            * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
5912    
5913    2002-04-03  Bernhard Herzog  <[email protected]>
5914    
5915            * setup.py: Increment version to 0.1.1
5916    
5917            * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
5918            Layer" and "Remove Layer" commands from the layer menu to the map
5919            menu
5920    
5921    2002-02-15  Bernhard Herzog  <[email protected]>
5922    
5923            * Thuban/Model/layer.py (Layer.Shape): list append only takes one
5924            argument (python <= 1.5.2 erroneously accepted multiuple
5925            arguments)
5926    
5927    2002-02-04  Bernhard Herzog  <[email protected]>
5928    
5929            * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
5930            RecordGrid in the identifyview.
5931            (IdentifyView.__init__): Use IdentifyGridCtrl instead of
5932            IdentifyListCtrl. The grid allows editing of the values.
5933    
5934            * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
5935            implementing a grid for a single row of a thuban table.
5936    
5937            * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
5938            layers by default. Easier to use than the previous default of only
5939            searching through the select layer which meant that if no layer
5940            was selected, you couldn't select a shape.
5941    
5942            * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
5943    
5944            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
5945            stroke_width attribute
5946    
5947            * Thuban/Model/save.py (save_session): Write the new stroke_width
5948            attribute
5949    
5950            * Thuban/Model/load.py (ProcessSession.startElement): Read the
5951            stroke_width attribute
5952    
5953            * Thuban/Model/layer.py (Layer.__init__): New parameter and
5954            instance variable stroke_width
5955            (Layer.SetStrokeWidth): Set the stroke_width.
5956    
5957    2002-02-01  Bernhard Herzog  <[email protected]>
5958    
5959            * extensions/thuban/wxproj.cpp (project_points): Fix two
5960            off-by-one errors in the last loop that joins the various parts
5961            together.
5962    
5963    2002-01-14  Bernhard Herzog  <[email protected]>
5964    
5965            * setup.py (data_dist.make_distribution): Fix some typos
5966    
5967    2001-09-18  Bernhard Herzog  <[email protected]>
5968    
5969            * README: Slight tweaking in preparation for the 0.1 release
5970    
5971            * setup.cfg: Add section for sdist to create both tgz and zip
5972            archives
5973    
5974            * setup.py: increase version number to 0.1
5975            (data_dist): New command class for data distribution
5976    
5977    2001-09-14  Bernhard Herzog  <[email protected]>
5978    
5979            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
5980            Handle the case of no layer (i.e. layer is None) properly.
5981    
5982            * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
5983            Set the initial selection of the combo boxes to reflect the
5984            projection we're starting with in a way that works on windows,
5985            too.
5986    
5987            * Thuban/Lib/connector.py (Connector.print_connections): Print the
5988            puiblisher's ids in hex to make it easier to compare them to the
5989            standard repr of python methods
5990    
5991            * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
5992            messages
5993    
5994    2001-09-13  Bernhard Herzog  <[email protected]>
5995    
5996            * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
5997            deselect the layer if no layer is selected
5998    
5999            * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
6000            idle time when there actually is something to draw. If there's
6001            nothing to draw simply clear the window
6002            (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
6003            (MapCanvas.SetMap): force a redraw in all cases because
6004            FitMapToWindow doesn't always do it.
6005            (MapCanvas.ZoomFactor): Add an optional parameter, center, to
6006            specify the point to move into the center of the window
6007            (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
6008            dragged, zoon in/out by a factor of 2
6009            (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
6010            index, i.e. reversed drawing order) so that objects appearing to
6011            be in from of others are selected first. This is probably mostly
6012            relevant for point shapes where the symbols used may overlap
6013    
6014            * Thuban/Model/session.py (create_empty_session): Unset the
6015            modified bit before returning it
6016    
6017            * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
6018            create_empty_session session to create the new, empty session.
6019    
6020            * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
6021            the tool bitmaps.
6022            (MainWindow.OnClose, MainWindow.save_modified_session): Separate
6023            the code that asks whether the session should be saved into the
6024            new method save_modified_session.
6025            (MainWindow.OpenSession, MainWindow.NewSession): Use the new
6026            method to save modified session here too.
6027    
6028  2001-09-11  Bernhard Herzog  <[email protected]>  2001-09-11  Bernhard Herzog  <[email protected]>
6029    
6030          * setup.py (InnoIconItem): fix typo          * setup.py (InnoIconItem): fix typo
# Line 62  Line 6089 
6089          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
6090          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
6091    
6092          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
6093          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
6094          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
6095          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
6096          the application's OnInit method          the application's OnInit method
# Line 79  Line 6106 
6106          layer to the tableview dialog.          layer to the tableview dialog.
6107    
6108          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
6109          (TableGrid):          (TableGrid):
6110          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
6111          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
6112          (TableFrame.__init__):          (TableFrame.__init__):
# Line 146  Line 6173 
6173  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
6174    
6175          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
6176            
6177          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
6178          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
6179            
6180          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
6181          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
6182          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 196  Line 6223 
6223          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
6224          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
6225          link_file method          link_file method
6226            
6227          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
6228          the window when the first layer is added to the map.          the window when the first layer is added to the map.
6229    
# Line 233  Line 6260 
6260          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
6261          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
6262          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
6263            
6264          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
6265          installer          installer
6266    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26