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

Legend:
Removed from v.766  
changed lines
  Added in v.1451

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26