/[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 924 by frank, Mon May 19 09:12:42 2003 UTC revision 1376 by bh, Tue Jul 8 10:53:26 2003 UTC
# Line 1  Line 1 
1    2003-07-08  Bernhard Herzog  <[email protected]>
2    
3            * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
4            0.9.
5    
6            * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
7            New. Return the join type
8    
9            * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
10            DTD
11            (SessionSaver.write_data_containers): Save the join type for
12            joined tables
13    
14            * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
15            namespace
16            (SessionLoader.start_jointable): Handle the jointype attribute
17    
18            * test/test_load_0_8.py: New. Effectively a copy of test_load.py
19            as of Thuban 0.8. These are now tests to determine whether Thuban
20            can still read files generated by Thuban 0.8
21    
22            * test/test_load.py (LoadSessionTest.dtd)
23            (TestSingleLayer.file_contents)
24            (TestLayerVisibility.file_contents, TestLabels.file_contents)
25            (TestLayerProjection.file_contents)
26            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
27            (TestJoinedTable.file_contents)
28            (TestLoadError.file_contents): Update for new DTD
29            (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
30            for new join type attribute
31    
32            * test/test_save.py (SaveSessionTest.dtd)
33            (SaveSessionTest.testEmptySession)
34            (SaveSessionTest.testSingleLayer)
35            (SaveSessionTest.testLayerProjection)
36            (SaveSessionTest.testRasterLayer)
37            (SaveSessionTest.testClassifiedLayer)
38            (SaveSessionTest.test_dbf_table)
39            (SaveSessionTest.test_joined_table): Update for new DTD
40            (SaveSessionTest.test_joined_table): Add test for new join type
41            attribute
42    
43    2003-07-04  Bernhard Herzog  <[email protected]>
44    
45            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
46            function for table_to_dbf
47            (table_to_dbf): Deal with names longer than the 10 character limit
48    
49            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
50            doc-string
51            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
52            long column names
53    
54    2003-07-03  Bernhard Herzog  <[email protected]>
55    
56            * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
57    
58    2003-07-03  Bernhard Herzog  <[email protected]>
59    
60            * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
61            for the Thuban manual and README with some basic information about
62            the manual
63    
64    2003-07-03  Bernhard Herzog  <[email protected]>
65    
66            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
67            Update doc-string
68            (TransientJoinedTable.create): Do not modify the column objects of
69            the input tables in place and copy all columns of the input tables
70            into the joined table after all.
71    
72            * test/test_transientdb.py
73            (TestTransientTable.test_transient_joined_table_same_column_name):
74            Update to reflect the new behavior
75            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
76            Update to reflect the new behavior
77            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
78            New test case for a bug which modified the column objects in place
79    
80    2003-07-02  Jonathan Coles   <[email protected]>
81    
82            * Thuban/Model/classgen.py (generate_singletons,
83            generate_uniform_distribution, generate_quantiles,
84            GenQuantiles0): Make sure maxValue isn't less than
85            one, otherwise we could divide by zero.
86    
87            * test/test_classgen.py (ClassGenTest.doClassRangeTest,
88            ClassGenTest.doClassSingleTest): Call doBoundsTest to
89            check the end classification groups against the
90            proper property values.
91            (ClassGenTest.doBoundsTest): New. Checks the first and
92            last classification groups to make sure their properties
93            are the correct upper and lower bounds for a color ramp.
94    
95    2003-07-02  Jonathan Coles   <[email protected]>
96    
97            * Thuban/Model/classgen.py (generate_singletons,
98            generate_uniform_distribution, generate_quantiles,
99            GenQuantiles0): The denominator was one to high when
100            calculating the index for the ramp causing the index
101            to never to reach one.
102    
103    2003-07-02  Jonathan Coles   <[email protected]>
104    
105            Changed the singature of ClassGroupRange.__init__ and
106            ClassGroupRange.SetRange() so that the min/max values are
107            passed as a tuple. This makes a better calling scheme for
108            when a Range object is passed instead.
109    
110            * Thuban/Model/classgen.py: Fixed parameters to
111            ClassGroupRange constructor.
112    
113            * Thuban/Model/classification.py (ClassGroupRange.__init__):
114            Consolidate the min/max parameters into a single _range which
115            can either be a tuple or a Range object.
116            (ClassGroupRange.SetRange): Consolidate the min/max parameters
117            into a single _range which can either be a tuple or a Range object.
118    
119            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
120            call to ClassGroupRange constructor to use a tuple.
121    
122            * Thuban/Model/layer.py (Layer.SetClassification): Switch
123            the classification instance variable to the new class
124            before calling _set_layer otherwise subscribers to a
125            LAYER_CHANGED event will not see any difference.
126    
127            * test/test_classification.py: Fix tests of ClassGroupRange
128            so that they use the new signature.
129    
130            * test/test_load.py: Fix use of ClassGroupRange so that it
131            uses the new signature.
132    
133            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
134            uses the new signature.
135    
136            * test/test_save.py: Fix use of ClassGroupRange so that it
137            uses the new signature.
138    
139    
140    2003-07-01  Jonathan Coles   <[email protected]>
141    
142            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
143            Import used objects/class from color.
144            (generate_singletons): We don't
145            need the numGroups parameter anymore because we are using
146            the new ramps with GetProperties().
147            (generate_uniform_distribution): Use new ramp method
148            GetProperties().
149            (generate_quantiles, GenQuantiles0): Use new ramp method
150            GetProperties().
151            (CustomRamp.SetNumGroups): Removed. The ramps now map
152            a value from 0 to 1 to class properties so the number
153            of groups is not needed ahead of time.
154            (CustomRamp.next): Removed. CustomRamp does not support
155            interation anymore.
156            (CustomRamp.GetProperties): Returns a ClassGroupProperties
157            object based on the index value from 0 to 1 that is
158            passed to it.
159            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
160            Made into instances of Monochromatic class instread of
161            deriving from it.
162            (HotToCold.SetNumGroups): Removed. See CustomRamp.
163            (HotToCold.next): Removed. See CustomRamp.
164    
165            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
166            (Classification.SetField, Classification.SetFieldType):
167            Replaced with SetFieldInfo.
168            (Classification.SetFieldInfo): New. Does a better job of
169            what SetField and SetFieldType used to do by combining
170            their function since they should really always be done
171            at the same time.
172            (Classification.SetLayer): Renamed to _set_layer.
173            (Classification._set_layer): Should only be called from
174            Layer's SetClassification. This does not cause a recursive
175            call as SetLayer did because we know that Layer knows about
176            the classification.
177    
178            * Thuban/Model/color.py: Fixes RTbug #1971.
179            (_Transparent): Renamed from Transparent so it doesn't
180            conflict with the module variable.
181            (Transparent, Black): Renamed from Color.Transparent,
182            Color.Black so they are not class variables.
183    
184            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
185            (Layer.Destroy): We don't need to call SetClassification
186            anymore to clear out the back reference in the classifcation
187            to the layer. It's better to set it to None using _set_layer,
188            and we won't be creating another clas object too.
189            (Layer.SetClassification): Classification._set_layer is not
190            recursive so remove all the locking variables. Also clean
191            up the code so that it remains unchanged if something fails.
192    
193            * Thuban/Model/load.py: Fixes RTbug #1971.
194            (SessionLoader.start_classification): Call
195            Classification.SetFieldInfo().
196    
197            * Thuban/Model/save.py: Removed import of Color which wasn't
198            being used.
199    
200            * Thuban/UI/classgen.py: Fixes RTbug #1972.
201            (ClassGenDialog.__init__): Color ramps are now instances
202            already so we don't need to create any new objects.
203            (ClassGenDialog.OnOK): Check for numGroups is no longer
204            necessary because we never use it.
205    
206            * Thuban/UI/classifier.py: Fixes RTbug #1971.
207            (Classifier.__BuildClassification, Classifier.__SetGridTable):
208            Call Classification.SetFieldInfo() instead of SetFieldType.
209    
210            * Thuban/UI/renderer.py: Fixes RTbug #1971.
211    
212            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
213            (MapCanvas.__init__): Subscribe to the idle time event. Set
214            background color to white.
215            (MapCanvas.OnPaint): Set a flag indicating that we should
216            render the map during idle time. If we already have a bitmap
217            just draw it now.
218            (MapCanvas.OnIdle): New. Render the map only during idle time.
219            This also fixes a problem with the busy cursor under gtk.
220    
221            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
222            Fix calls to generate_singletons because the signature changed.
223    
224            * test/test_classification.py: Fix color references and
225            change calls to Classification.[SetField|SetFieldType] to
226            SetFieldInfo.
227    
228            * test/test_load.py: Fix color references.
229    
230            * test/test_load_0_2.py: Fix color references.
231    
232            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
233            Change calls to Classification.[SetField|SetFieldType] to
234            SetFieldInfo.
235    
236    2003-07-01  Frank Koormann   <[email protected]>
237    
238            MERGE from the greater-ms3 branch.
239    
240            * test/test_transientdb.py
241            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
242            New. Test join of two tables with partly equal column names.
243    
244            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
245            If duplicates in left and right tables column names are found,
246            append '_' (underscores) to the name until it is unique.
247            Create always new internal names for the resulting table and reference
248            columns in the join statement with <table>.<column>
249    
250    2003-07-01  Bernhard Herzog  <[email protected]>
251    
252            * test/test_transientdb.py
253            (TestTransientTable.test_transient_joined_table_same_column_name):
254            New. Test whether joining on columns with the same names in both
255            tables works.
256            
257            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
258            sure to use the right internal names even when joining on field
259            with the same names in both tables. Also, detect duplicate names
260            in the joined table correctly.
261    
262    2003-07-01  Frank Koormann   <[email protected]>
263    
264            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
265            Reverse List of layers to render in same order as in desktop legend.
266    
267    2003-06-30  Jonathan Coles   <[email protected]>
268    
269            * Thuban/version.py (make_tuple): Takes a version string
270            and splits it into a tuple of at most three integers.
271            Used make_tuple() to make tuple versions of the version
272            numbers.
273    
274            * Thuban/UI/about.py: Add Thuban email addresses.
275    
276    2003-06-30  Jonathan Coles   <[email protected]>
277    
278            * Thuban/version.py: SQLite/PySQLite version dependencies
279            were too high.
280    
281    2003-06-30  Jonathan Coles   <[email protected]>
282    
283            * Thuban/version.py: Update version to 0.8.1
284            
285            * MANIFEST.in: Added Projections so that default.proj is
286            included.
287    
288    2003-06-26  Jonathan Coles   <[email protected]>
289    
290            New About box with lots more information including library
291            versions and credits. More/better version checking before
292            Thuban starts.
293    
294            * Thuban/UI/about.py: New. New About box that displays
295            library version information and credits.
296    
297            * Thuban/version.py: Added new 'versions' dictionary which
298            contains the verions of various libraries which are checked
299            when the module loads.
300            (verify_versions): Check all version numbers and returns
301            a list of errors.
302    
303            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
304            Reset the status of the buttons as the situation warrants,
305            but in a better more reliable way by not relying on the
306            current status to determine what needs to change.
307    
308            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
309            (verify_versions): Remove most of the code since it is
310            now in Thuban.version.verify_versions.o
311    
312            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
313            About box in Thuban.UI.about.
314    
315            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
316            Returns the version of gdal library being used as a string.
317    
318            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
319            Removed.
320            (get_proj_version): Return the version of PROJ that the file
321            was compiled with.
322            (get_gtk_version): Return th version of GTK that the file
323            was compiled with.
324    
325    2003-06-25  Jonathan Coles   <[email protected]>
326    
327            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
328            of the SelectPropertiesDialog should be self so the window
329            appears on top.
330            (ClassGroupPropertiesCtrl.DoEdit): The parent
331            of the SelectPropertiesDialog should be self so the window
332            appears on top.
333    
334            * Thuban/UI/resource.py: Cleaned up how we determine file
335            extensions.
336            (GetImageResource): Return an wxImage from our Resources.
337    
338    2003-06-24  Jonathan Coles   <[email protected]>
339    
340            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
341            Check that a layer has a classification before trying
342            to get it. Raster layers don't have classifications.
343    
344    2003-06-23  Jonathan Coles   <[email protected]>
345            
346            * setup.py: Add Resources/XML to resource list.
347        
348    2003-06-23  Jonathan Coles   <[email protected]>
349    
350            * setup.cfg: Fix copyright dates
351        
352    2003-06-23  Jonathan Coles   <[email protected]>
353    
354            * MANIFEST.in: Update with Resources/XML
355    
356            * setup.py: Don't include Locale resources yet as we don't
357            have any and it causes problems building the distribution
358            for Windows. Update version to 0.8.0.
359    
360            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
361    
362            * Thuban/UI/mainwindow.py: Add blank line at the end because
363            file was not being read correctly building the Windows
364            distribution.
365    
366    2003-06-23  Jonathan Coles   <[email protected]>
367    
368            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
369    
370            * Thuban/version.py: Temporarily update longversion for
371            the 0.8 release so that it doesn't have the cvs revision.
372    
373    2003-06-23  Jonathan Coles   <[email protected]>
374    
375            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
376            to make sure that we don't create reentrant possibilities with
377            wxYield.
378    
379            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
380            directly to avoid the wxSafeYield() call which generates an
381            OnPaint event causing infinite recursion. Don't try to catch
382            exception anymore. This was for before there were limits on map
383            scaling.
384    
385    2003-06-23  Bernhard Herzog  <[email protected]>
386    
387            Bug fix for RT #1961:
388    
389            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
390            Register DerivedShapestores with the session
391    
392            * Thuban/Model/session.py (Session.Tables): Make sure each table
393            is only listed once.
394    
395            * test/test_load.py (TestJoinedTable.test): Add check_format call.
396            Update file contents to match the one written out.
397    
398    2003-06-20  Bernhard Herzog  <[email protected]>
399    
400            * test/xmlsupport.py (SaxEventLister.startElementNS)
401            (SaxEventLister.endElementNS): Do not include the qname. Python
402            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
403            is (presumably incorrectly) None, whereas it's a string with the
404            element name in the later versions.
405    
406            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
407            (TestEventList.test_even_list_namespace): Update tests to reflect
408            the new behaviour
409            (TestEventList.test_even_list_id_normalization): Fix doc-string
410    
411    2003-06-20  Jonathan Coles   <[email protected]>
412    
413            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
414            by deriving classes to determine if that layer supports shapes.
415            (Layer): Override HasShapes and return true.
416    
417            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
418            instead of a direct call to wx[Begin|End]CusyCursor().
419            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
420            table data.
421    
422            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
423            New. Wrappers around the wxWindows functions that allow us to
424            make additional calls such as wxYield which gives the native
425            system a chance to update the cursor correctly.
426    
427            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
428            instead of a direct call to wx[Begin|End]CusyCursor().
429    
430            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
431            instead of a direct call to wx[Begin|End]CusyCursor().
432            (MapCanvas.find_shape_at): Check if the current search layer
433            support shapes, otherwise go on to the next layer.
434    
435            * test/test_layer.py: Add tests in each type of layer for
436            HasClassification() and HasShapes()
437    
438    2003-06-20  Jonathan Coles   <[email protected]>
439    
440            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
441            turning on the busy cursor to allow the system to change the
442            cursor before we begin painting. This fixes a problem that
443            was occuring only under GTK. Fixes RTbug #1840.
444    
445    2003-06-20  Bernhard Herzog  <[email protected]>
446    
447            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
448            version.
449    
450            * Thuban/Model/save.py (sort_data_stores): New. Make topological
451            sort of the data sources so they can be written with sources that
452            data sources that depend on other data sources come after the
453            sources they depend on.
454            (SessionSaver.__init__): Add idmap instance variable to map from
455            objects to the ids used in the file.
456            (SessionSaver.get_id, SessionSaver.define_id)
457            (SessionSaver.has_id): New. Methods to manage the idmap
458            (SessionSaver.write): Use thuban-0.8.dtd
459            (SessionSaver.write_session): Add a namespace on the session and
460            write out the data sources before the maps.
461            (SessionSaver.write_data_containers): New. Write the data
462            containers.
463            (SessionSaver.write_layer): Layer elements now refer to a
464            shapestore and don't contain filenames anymore.
465    
466            * Thuban/Model/load.py (LoadError): Exception class to raise when
467            errors in the files are discovered
468            (SessionLoader.__init__): Define dispatchers for elements with a
469            thuban-0.8 namespace too.
470            (SessionLoader.check_attrs): New helper method to check and
471            convert attributes
472            (AttrDesc): New. Helper class for SessionLoader.check_attrs
473            (SessionLoader.start_fileshapesource)
474            (SessionLoader.start_derivedshapesource)
475            (SessionLoader.start_filetable, SessionLoader.start_jointable):
476            Handlers for the new elements in the new fileformat
477            (SessionLoader.start_layer): Handle the shapestore attribute in
478            addition to filename.
479            (SessionLoader.start_table, SessionLoader.end_table): Removed.
480            They were never used in the old formats and aren't needed for the
481            new.
482    
483            * Thuban/Model/session.py (Session.DataContainers): New method to
484            return all "data containers", i.e. shapestores and tables
485    
486            * test/xmlsupport.py (SaxEventLister.__init__)
487            (SaxEventLister.startElementNS, sax_eventlist): Add support to
488            normalize IDs.
489    
490            * test/test_xmlsupport.py
491            (TestEventList.test_even_list_id_normalization): New test case for
492            id normalization
493    
494            * test/test_load.py (LoadSessionTest.check_format): Use ID
495            normalization
496            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
497            class atrributes used for ID normalization
498            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
499            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
500            file format
501            (TestJoinedTable): New test for loading sessions with joined
502            tables.
503            (TestLoadError): New. Test whether missing required attributes
504            cause a LoadError.
505    
506            * test/test_save.py (SaveSessionTest.thubanids)
507            (SaveSessionTest.thubanidrefs): New class attributes for ID
508            normalization in .thuban files.
509            (SaveSessionTest.compare_xml): Use id-normalization.
510            (SaveSessionTest.testEmptySession)
511            (SaveSessionTest.testLayerProjection)
512            (SaveSessionTest.testRasterLayer)
513            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
514            (SaveSessionTest.testLayerProjection): The filename used was the
515            same as for testSingleLayer. Use a different one.
516            (SaveSessionTest.test_dbf_table)
517            (SaveSessionTest.test_joined_table): New test cases for saving the
518            new data sources structures.
519            (TestStoreSort, MockDataStore): Classes to test the sorting of the
520            data stores for writing.
521    
522            * test/runtests.py: Add CVS keywords
523    
524    2003-06-20  Jonathan Coles   <[email protected]>
525    
526            * test/test_session.py
527            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
528            Use the cultural_landmark-point.dbf file for the store so that
529            the table rows and shape count match.
530    
531    2003-06-20  Jonathan Coles   <[email protected]>
532    
533            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
534            an exception if the number of shapes is different from the
535            number of rows in the table. Address RTbug #1933.
536    
537            * test/test_layer.py (TestLayer.test_derived_store): Add
538            a test for the new exception in DerivedShapeStore.__init__.
539    
540            * test/support.py (FloatTestCase): Removed since there is
541            already FloatComparisonMixin. Fixes RTbug #1954.
542            (FloatComparisonMixin.assertFloatEqual): Include test for
543            infinity that was part of FloatTestCase.
544    
545            * test/test_range.py (RangeTest): Inherit from
546            support.FloatComparisonMixin now that we don't have
547            support.FloatTestCase.
548    
549    2003-06-20  Bernhard Herzog  <[email protected]>
550    
551            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
552            the implementation in xmlsupport instead.
553            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
554    
555            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
556            of test_save
557    
558    2003-06-20  Bernhard Herzog  <[email protected]>
559    
560            * test/test_load.py (LoadSessionTest.check_format): New helper
561            method to make sure the test files we load might have been written
562            by the current thuban version.
563            (ClassificationTest.TestLayers, TestSingleLayer.test)
564            (TestLayerVisibility.test, TestClassification.test)
565            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
566            Add check_format() calls and fix the thuban data to match the data
567            that would be written by saving the session loaded from it.
568    
569            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
570            the same class and function in test_save.
571    
572            * test/test_xmlsupport.py (TestEventList): New. test cases for
573            sax_eventlist
574    
575    2003-06-20  Bernhard Herzog  <[email protected]>
576    
577            * Resources/XML/thuban.dtd: Add comment about which versions of
578            Thuban are covered by this DTD
579            (map): Fix content model for layers and raster layers. There can
580            be any number or layers and raster layers in any order.
581    
582    2003-06-20  Jonathan Coles   <[email protected]>
583    
584            This is mainly about fixing RTbug #1949.
585    
586            * Thuban/Model/classification.py: Remove "from __future__"
587            import statement since python 2.2 is the earliest supported
588            version.
589    
590            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
591            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
592            depending on the units this projection *forwards* into.
593    
594            * Thuban/Model/save.py (SessionSaver.write_classification):
595            Remove unnecessary use of lambdas and nested functions.
596    
597            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
598            adjustment here if the map projection uses degrees.
599    
600            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
601            scale adjust code since it is now done before calling
602            this method. Don't do anything if the map projection
603            is None.
604    
605    2003-06-19  Bernhard Herzog  <[email protected]>
606    
607            Move version specific load tests to their own file.
608    
609            * test/test_load.py: Expand the doc-string to explain a bit how to
610            handle file format changes.
611            (TestClassification.test): Update the docstring as this test is
612            not about Thuban 0.2 anymore.
613    
614            * test/test_load_0_2.py: New file with the load tests for thuban
615            files created with Thuban 0.2 and earlier.
616    
617    2003-06-19  Bernhard Herzog  <[email protected]>
618    
619            Add XML validation to some of the tests. Validation will only be
620            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
621            To make the DTD available to the test cases it's moved into
622            Resources/XML
623    
624            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
625            for versions up to and including 0.2. Two slight changes: added an
626            encoding specification and fixed the comment which refered to
627            GRASS, not Thuban
628    
629            * test/xmlsupport.py: New support module for tests involving XML.
630            Currently there's a mix-in class for XML validation.
631    
632            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
633    
634            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
635            so that we can validate the
636            (SaveSessionTest.testEmptySession)
637            (SaveSessionTest.testSingleLayer)
638            (SaveSessionTest.testSingleLayer)
639            (SaveSessionTest.testLayerProjection)
640            (SaveSessionTest.testRasterLayer)
641            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
642    
643            * test/runtests.py (main): Call print_additional_summary instead
644            of print_garbage_information
645    
646            * test/support.py (resource_dir): New function to return the
647            "Resource" subdirectory
648            (print_additional_summary): New function to combine several
649            summary functions
650            (run_tests): Use print_additional_summary instead of calling
651            print_garbage_information directly
652    
653    2003-06-19  Bernhard Herzog  <[email protected]>
654    
655            * Doc/thuban.dtd (classification): Correct the content model of
656            the classification element.
657            (projection): Add the "name" attribute
658    
659    2003-06-19  Frank Koormann   <[email protected]>
660    
661            MERGE from the greater-ms3 branch.
662    
663            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
664            scale if projection is latlong to get better estimate.
665    
666            Fix problem of hidden properties dialog under windows after double
667            click on layer tree:
668            The tree control always gets an Expanded / Collapsed event after
669            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
670            raises the already displayed window.
671    
672            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
673            raiseProperties initialized to prevent endless loops
674            (LegendTree._OnItemActivated): Depending on self.raiseProperties
675            simply raise the properties or open the dialog and issue a second
676            event.
677    
678    2003-06-18  Jonathan Coles   <[email protected]>
679    
680            * setup.py: Fix a few problems that occured under Windows.
681    
682    2003-06-18  Jonathan Coles   <[email protected]>
683    
684            When Thuban loaded the map was redrawn twice because the
685            legend was being opened after the mainwindow was created
686            and not during its creation. This meant the map was drawn
687            initially and then had to be redrawn when the legend
688            caused the display to change. Now the legend is opened
689            in the mainwindow constructor which resolves this issue.
690    
691            Also, although we were checking for the existence of
692            gdal and gdalwarp modules, the gdalwarp extension was
693            still being compiled (which may fail if the system doesn't
694            have gdal installed). the build_ext command to setup.py
695            now accepts the flags --with-gdal and --without-gdal.
696            If --without-gdal is specified setup.py will try to
697            use the gdal parameters specified by gdal-config. Under
698            windows, those parameters have to be set in setup.py
699            as with proj4 an wxWindows.
700    
701            * setup.py: Use a list instead of seperate variables for
702            extension parameters so we can create a generic function
703            that runs an appropriate *-config script.
704            (run_cs_script): Renamed from run_wx_script and modified
705            to accept a second argument which is a list of lists to
706            be filled in by the values returned from running the command.
707            (thuban_build_ext): New. Extends the build_ext command and
708            provides the options --with-gdal/--without-gdal which then
709            optionally includes the gdalwarp extension.
710    
711            * Thuban/Model/resource.py: First check if we can import
712            the gdalwarp Thuban extension before checking for gdal.
713            Also added some comments.
714            
715            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
716            the map is None which may be the case if none has been loaded
717            yet.
718    
719            * Thuban/UI/main.py (main): Remove call to ShowLegend.
720    
721            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
722    
723            * Thuban/UI/renderer.py: Check for gdal support before importing
724            gdalwarp.
725            (MapRenderer.render_map): Only try to optimize if we have gdal
726            support otherwise nothing will get drawn.
727    
728            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
729            during startup before a map has been created. Check if map is None
730            before using it and do nothing if it is.
731    
732    2003-06-17  Jonathan Coles   <[email protected]>
733    
734            Fix the problem with raster layers under Windows that caused
735            Thuban to crash. The view should respond to layer projection
736            changed events to update the display. Changes to a projection
737            should not cause the map to be set to full extent.
738            
739            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
740            current_map_proj to remember the current map projection so that
741            when the projection changes we know what the previous projection
742            was.
743            (MapCanvas.SetMap): Unsubscribe and subscribe to
744            LAYER_PROJECTION_CHANGED events.
745            (MapCanvas.projection_changed): Split into two methods that respond
746            to map and layer projection changes.
747            (MapCanvas.map_projection_changed): New. Takes the current view and
748            projects it using the new projection. This does not cause the
749            map to be redrawn at full extent.
750            (MapCanvas.layer_projection_changed): New. Cause a redraw which
751            will draw each layer in its new projection.
752            
753            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
754            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
755            under Windows.
756            
757            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
758            to twice sizeof(void*) because there are two digits for each
759            hex byte.
760    
761    2003-06-16  Bernhard Herzog  <[email protected]>
762    
763            Update to the layer interface: Direct access to the table,
764            shapetable, shapefile and filename attributes is now actively
765            deprecated by issuing deprecation warnings for all places where
766            this happens.
767    
768            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
769            to the instance variables table, shapetable, shapefile and
770            filename via __getattr__ so that we can issue a deprecation
771            warning.
772            (Layer.SetShapeStore): Don't set the deprecated instance variables
773            any more
774            (Layer.SetShapeStore): Don't use deprecated layer instance
775            variables
776            (Layer.Destroy): No need to explicitly remove the instance
777            variables any more
778            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
779            instance variables
780    
781            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
782            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
783            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
784            use deprecated layer instance variables
785    
786            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
787            deprecated layer instance variables
788    
789            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
790            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
791            instance variables
792    
793            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
794            deprecated layer instance variables
795    
796            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
797            deprecated layer instance variables
798    
799            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
800            deprecated layer instance variables
801    
802            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
803            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
804            variables
805    
806            * test/runtests.py (main): Turn Thuban's deprecation warnings into
807            errors so that they're cought by the tests
808    
809            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
810            layer instance variables
811    
812    2003-06-16  Jonathan Coles   <[email protected]>
813    
814            Fix a problem under Windows whereby if the user double-clicks on a
815            layer in the legend that tree item will expand or collapse as well
816            as open the layer properties dialog. The state of the tree item
817            should not be affected.
818    
819            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
820            preventExpandCollapse and subscribe to expanding and collapsing
821            events.
822            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
823            collapsing events and will veto the event if it has been triggered
824            by the user double clicking on a layer.
825            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
826            that an expanding/collapsing event should be vetoed.
827    
828    2003-06-13  Bernhard Herzog  <[email protected]>
829    
830            * Thuban/UI/classifier.py (Classifier.OnClose)
831            (Classifier.map_layers_removed)
832            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
833            in OnClose and not in map_layers_removed or
834            layer_shapestore_replaced to make sure it always happens when the
835            dialog is closed
836    
837    2003-06-13  Jonathan Coles   <[email protected]>
838    
839            This puts back a fix for Windows where a panel is needed so that
840            the background of the table view appears correctly.
841    
842            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
843            object that can be used by derived classes to place any
844            controls (including the grid) onto.
845            (QueryTableFrame.__init__): Use the panel as the parent window
846            for all the controls. Reparent the grid so that the panel is
847            the parent. Call UpdateStatusText() to correctly initialize
848            the status bar.
849    
850    2003-06-13  Jonathan Coles   <[email protected]>
851    
852            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
853            from wxFrame (as opposed to wxDialog like the other classes)
854            but otherwise behaves like the other classes. This is needed
855            for the TableView which isn't really a dialog and needs to
856            have a status bar and control buttons.
857    
858            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
859            instance variable to keep track of how many rows are selected.
860            Subscribe once to the the events we are interested in.
861            (ThubanGrid.OnRangeSelect): Only handle event if event handling
862            hasn't been turned off.
863            (ThubanGrid.OnSelectCell): Only handle event if event handling
864            hasn't been turned off.
865            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
866            as an event listener (which changes the event handler stack)
867            simply set an instance variable to False. This is checked in
868            the event handlers.
869            (ThubanGrid.GetNumberSelected): Return the number of currently
870            selected rows.
871            (TableFrame): Inherit from ThubanFrame so we can have a
872            status bar and control buttons.
873            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
874            Explicitly set which items are selected in the operator choice and
875            action choice so there is always a valid selection. Fixes RTbug #1941.
876            Subscribe to grid cell selection events so we can update the
877            status bar.
878            (QueryTableFrame.UpdateStatusText): Update the status bar with
879            how many rows are in the grid, how many columns, and how many
880            rows are selected.
881            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
882            Call UpdateStatusText when cells are (de)selected.
883            (QueryTableFrame.OnQuery): Use the string value in the value
884            combo if either the selected item index is 0 or if the string
885            cannot be found in the predefined list (this happens if the
886            user changes the text). Fixes RTbug #1940.
887            Only turn off the grid event listeners if there a query comes
888            back with a none empty list of ids. in the case that the list
889            is empty this causes a grid.ClearSelection() call to actually
890            clear the grid selection which causes the selected items in
891            the map to be deselected. Fixes RTbug #1939.
892    
893            * test/test_save.py (XMLWriterTest.Encode): Check return values.
894            Fixes RTbug #1851.
895    
896    2003-06-13  Bernhard Herzog  <[email protected]>
897    
898            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
899            self.selected_shape with the current selection to make sure the
900            contents of the dialog are up to date when it's shown for the
901            first time.
902            The dialog used to work without this by luck. The recent fix to
903            the connector module 'broke' a 'feature' the identify view was
904            relying on, i.e that subscribing to a message in response to
905            receiving a message of that type would mean that the new
906            subscriber would also be called for the same message.
907            
908    2003-06-12  Jonathan Coles   <[email protected]>
909    
910            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
911            the image is rendered. Fixes RTbug #1937.
912    
913    2003-06-12  Jonathan Coles   <[email protected]>
914    
915            * Thuban/Lib/fileutil.py: As is done under Windows, create the
916            user directory if it doesn't exist on a posix system.
917            Fixes RTbug #1815.
918    
919            * Thuban/Model/resource.py (get_user_proj_files): Moved the
920            called to get_application_dir here, so that the directory
921            will only be called if this method is invoked.
922    
923            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
924            the projfilepath if no projection is selected.
925    
926    2003-06-12  Jonathan Coles   <[email protected]>
927    
928            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
929            the scalebar if the current map has no projection set.
930    
931            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
932            projfilepath label to just the basename of the projection file
933            rather than include the entire path.
934    
935            * Thuban/Model/resource.py: Fix missed proj functions that
936            needed to be renamed.
937    
938    2003-06-12  Jonathan Coles   <[email protected]>
939    
940            * Thuban/Model/classification.py: Removed assert statements that
941            tested if the variable was an instance of Color.
942    
943            * Thuban/Model/color.py (Color): Remove commented code that isn't
944            used.
945            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
946            Fixes RTbug #1835.
947            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
948            Needed now that the class doesn't inherit from Color.
949    
950    2003-06-12  Jonathan Coles   <[email protected]>
951    
952            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
953            check unicode strings.
954    
955            * test/test_layer.py: Check for existence of gdal.
956    
957    2003-06-12  Jonathan Coles   <[email protected]>
958        
959            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
960            that was in load.py
961    
962            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
963            that was in save.py
964    
965    2003-06-12  Jonathan Coles   <[email protected]>
966    
967            This is largely a collection of bug fixes. We also handle the
968            case where gdal is not on the system. The XMLReader and XMLWriter
969            classes were moved into there own files to resolve some circular
970            import references and because they shouldn't really be in the
971            file that is dediciated to reading/writing session files since
972            they are also used elsewhere.
973    
974            * Thuban/Model/classgen.py: Renamed functions to follow the
975            function_names_with_underscores style. Fixes RTbug #1903.
976            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
977    
978            * Thuban/Model/layer.py: Import gdal only if it available.
979            (RasterLayer): Handle the case where the gdal library is unavailable.
980            Addresses RTbug #1877.
981    
982            * Thuban/Model/load.py (XMLReader): Moved into seperate file
983            xmlreader.py.
984    
985    2003-06-12  Jonathan Coles   <[email protected]>
986    
987            This is largely a collection of bug fixes. We also handle the
988            case where gdal is not on the system. The XMLReader and XMLWriter
989            classes were moved into there own files to resolve some circular
990            import references and because they shouldn't really be in the
991            file that is dediciated to reading/writing session files since
992            they are also used elsewhere.
993    
994            * Thuban/Model/classgen.py: Renamed functions to follow the
995            function_names_with_underscores style. Fixes RTbug #1903.
996            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
997    
998            * Thuban/Model/layer.py: Import gdal only if it available.
999            (RasterLayer): Handle the case where the gdal library is unavailable.
1000            Addresses RTbug #1877.
1001    
1002            * Thuban/Model/load.py (XMLReader): Moved into seperate file
1003            xmlreader.py.
1004    
1005            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
1006            file xmlwriter.py.
1007    
1008            * Thuban/Model/resource.py: Renamed functions to following the
1009            function_names_with_underscores style.
1010            (has_gdal_support): New function that returns true if the gdal
1011            library is available. Addresses RTbug #1877.
1012    
1013            * Thuban/UI/application.py (ThubanApplication.OpenSession):
1014            Display a message box if the gdal library is not available, but
1015            only if there are any layers that would use it. Addresses RTbug #1877.
1016    
1017            * Thuban/UI/classgen.py: Use renamed projection resource functions.
1018            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
1019            when using integers versus floats.
1020    
1021            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
1022            determine if the "Add Image Layer" menu option should be
1023            greyed out or not. Addresses RTbug #1877.
1024    
1025            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
1026    
1027            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
1028            optimize if a raster layer is visible. Fixes RTbug #1931.
1029            Only draw the raster layer if the gdal library is available.
1030            Addresses RTbug #1877.
1031    
1032            * test/test_classgen.py: Add tests for generate_singletons,
1033            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
1034            (test_calculate_quantiles): Fix some tests to catch the new
1035            ValueError that is raised.
1036    
1037            * test/test_proj.py: Use renamed projection resource functions.
1038    
1039            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
1040            test for saving classified layers. Fixes RTbug #1902.
1041            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
1042    
1043    2003-06-12  Jan-Oliver Wagner <[email protected]>
1044    
1045            Fix for http://intevation.de/rt/webrt?serial_num=1900.
1046    
1047            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
1048    
1049            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
1050            multiplechoicedialog.py rather than from the wxPython library.
1051    
1052    2003-06-11  Frank Koormann  <[email protected]>
1053    
1054            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
1055            update.
1056    
1057    2003-06-11  Frank Koormann  <[email protected]>
1058    
1059            * Thuban/Lib/fileutil.py (get_application_dir): New function to
1060            determine the absolute .thuban/thuban directory under
1061            "posix" (os.expanduser) and "nt" (read AppData registry key).
1062    
1063            * Thuban/Model/resource.py: Use get_application_dir
1064    
1065            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
1066            Use get_application_dir.
1067    
1068    2003-06-10  Bernhard Herzog  <[email protected]>
1069    
1070            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
1071            the messages MAP_LAYERS_REMOVED messages
1072            (LayerTableFrame.OnClose): Unsubscribe from it.
1073            (LayerTableFrame.map_layers_removed): New. Receiver for
1074            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
1075            dialog is showing is removed.
1076    
1077    2003-06-10  Bernhard Herzog  <[email protected]>
1078    
1079            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
1080            of the receivers list so that unsubscribing in a receiver doesn't
1081            modify it while iterating over it.
1082    
1083            * test/test_connector.py
1084            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
1085            unsubscribing in a receiver works correctly. See docstring for
1086            details
1087    
1088    2003-06-10  Bernhard Herzog  <[email protected]>
1089    
1090            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
1091            message.
1092    
1093            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
1094            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
1095            LAYER_CHANGED will still be sent if the classification changes.
1096    
1097            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
1098            parameter so we can subscribe to some of its messages
1099            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
1100            and the layer's LAYER_SHAPESTORE_REPLACED
1101            (Classifier.unsubscribe_messages): New. Unsubscribe from message
1102            subscribed to in __init__
1103            (Classifier.map_layers_removed)
1104            (Classifier.layer_shapestore_replaced): receivers for the messages
1105            subscribed to in __init__. Unsubscribe and close the dialog
1106    
1107            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
1108            the map to the Classifier dialog
1109    
1110            * test/test_layer.py (SetShapeStoreTests): Derive from
1111            SubscriberMixin as well so we can test messages
1112            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
1113            messages
1114            (SetShapeStoreTests.tearDown): Clear the messages again
1115            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
1116            for the modified flag too
1117            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
1118            to check whether SetShapeStore sets the modified flag
1119            (SetShapeStoreTests.test_set_shape_store_different_field_name)
1120            (SetShapeStoreTests.test_set_shape_store_same_field)
1121            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
1122            Add tests for the messages. This checks both the new
1123            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
1124    
1125    2003-06-06  Jan-Oliver Wagner <[email protected]>
1126    
1127            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
1128            the menu items.
1129    
1130    2003-06-05  Frank Koormann  <[email protected]>
1131    
1132            * Thuban/UI/identifyview.py (IdentifyView.__init__):
1133            Layout reimplemented without panel. Make life easier to fit the list
1134            in the dialog.
1135    
1136    2003-06-05  Frank Koormann  <[email protected]>
1137    
1138            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
1139            once on initialisation (Former implementation resulted in multiple
1140            entries for each projection).
1141            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
1142            if set, select the projection found under the specified name. This
1143            overwrites any other selection estimate.
1144            Removed projchoice filling from this method.
1145            (ProjFrame._OnSave, ProjFrame._OnAddToList):
1146            Updated call of ProjFrame.__FillAvailList
1147            (LCCPanel._DoLayout): Moved parameter controls in more common order.
1148    
1149            * Resources/Projections/defaults.proj: Extended defaults representing
1150            various common European projections.
1151    
1152    2003-06-05  Frank Koormann  <[email protected]>
1153    
1154            * Thuban/UI/identifyview.py (IdentifyView.__init__):
1155            Use ListCtrl instead of GridCtrl
1156    
1157            * Thuban/Model/resource.py:
1158            Guess location of .thuban directory from tempdir parent directory.
1159    
1160            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
1161            Guess location of .thuban directory from tempdir parent directory.
1162    
1163    2003-06-04  Bernhard Herzog  <[email protected]>
1164    
1165            Do not cache the values returned by the tree widget's
1166            GetFirstChild and GetNextChild methods because it led to lots of
1167            segfaults. The new way requires more brute force but is more
1168            reliable.
1169    
1170            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
1171            variable layer2id
1172            (LegendTree.find_layer): New method to do with brute force what
1173            layer2id tried to accomplish
1174            (LegendTree._OnMsgLayerChanged)
1175            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
1176            Use find_layer instead of layer2id
1177            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
1178            update layer2id anymore
1179            (LegendTree._OnMsgMapLayersRemoved)
1180            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
1181    
1182    2003-06-03  Thomas Koester  <[email protected]>
1183    
1184            * Thuban/Model/classgen.py (GenQuantiles0): New function.
1185    
1186    2003-06-02  Bernhard Herzog  <[email protected]>
1187    
1188            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
1189            New commands.
1190            (main_menu): Add the new commands.
1191            (MainWindow.TableRename): New. Implementation of the table_rename
1192            command.
1193            (MainWindow.RenameLayer): New. Implementation of the layer_rename
1194            command.
1195    
1196            * Thuban/Model/session.py (Session.AddTable): call self.changed to
1197            set the modified flag
1198    
1199            * test/test_session.py (TestSessionSimple.test_add_table): Test
1200            whether the modified flag is set properly
1201    
1202            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
1203            instead of issue so that the modified flags get updated.
1204    
1205            * test/test_base.py (SomeTitledObject): Derive from Modifiable
1206            instead of Publisher to reflect reality better and to accomodate
1207            the fact that SetTitle now calls changed instead of issue
1208    
1209    2003-06-02  Bernhard Herzog  <[email protected]>
1210    
1211            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
1212            acquisition has to happen before the try in a try-finally.
1213    
1214    2003-06-02  Bernhard Herzog  <[email protected]>
1215    
1216            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
1217            possible that a layer is removed that is not currently selected in
1218            the legend so don't check for this.
1219    
1220    2003-05-30  Bernhard Herzog  <[email protected]>
1221    
1222            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
1223            variables to None that have direct or indirect references to
1224            shapefiles or dbf files to make sure that they do go away and the
1225            files are closed.
1226    
1227    2003-05-30  Bernhard Herzog  <[email protected]>
1228    
1229            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
1230            availImgListIndices when a new image list is created
1231            
1232    2003-05-30  Bernhard Herzog  <[email protected]>
1233    
1234            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
1235            changing_selection to indicate whether the LegendTree code itself
1236            is currently changing the selection
1237            (LegendTree.normalize_selection): New method to normalize the
1238            selection by selecting the layer item even if the user clicked on
1239            the classification.
1240            (LegendTree._OnSelChanged): normalize the selection. This works
1241            around a bug in wx which doesn't keep track of the selection
1242            properly when subtrees are deleted.
1243    
1244    2003-05-30  Bernhard Herzog  <[email protected]>
1245    
1246            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
1247            maximum and minimum scale factors.
1248    
1249            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
1250            changes in classgen.py
1251    
1252    2003-05-30  Jonathan Coles   <[email protected]>
1253    
1254            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
1255            all the methods functions. Fixes RTBug #1903.
1256    
1257            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
1258            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
1259            RTBug #1907.
1260    
1261            * Thuban/UI/classgen.py: Use classgen functions that were part
1262            of the ClassGenerator class. Put try/finally blocks around
1263            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
1264            RTBug #1904.
1265    
1266            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
1267    
1268            * Thuban/UI/legend.py: The legend was cleared and repopulated any
1269            time something changed which caused some state to be lost such
1270            as which children were expanded or collapsed. Fixes RTBug #1901.
1271            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
1272            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
1273            the legend but not in the map.
1274            (LegendTree.__FillTree): Move main functionality out into smaller
1275            methods that can be used by other methods.
1276            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
1277            if they are available.
1278            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
1279            that we override the wxTreeCtrl method. Iterate over children
1280            and call __RemoveLayer.
1281            (LegendTree.__AddLayer): New. Add a new layer to the legend.
1282            (LegendTree.__RemoveLayer): Remove a layer from the legend.
1283            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
1284            Should only be called with the id of a layer branch.
1285            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
1286            Returns the root item or creates one if necessary.
1287    
1288            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
1289            ProjectRasterFile with tuple arguments instead of strings.
1290    
1291            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
1292            with try/finally. Fixes RTBug #1904.
1293    
1294            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
1295            with try/finally. Fixes RTBug #1904.
1296            (MapCanvas.FitSelectedToWindow): If a single point is selected
1297            simply center it on the display. Fixes RTBug #1849.
1298    
1299            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
1300            to be compiled as a standalone app. Now the code can only be
1301            called from Python which simplifies the parameter passing.
1302            (ProjectRasterFile): Handle Python arguments. Remove code that
1303            checks for a destination dataset. Add more clean up code.
1304    
1305            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
1306            TestMapWithContents.test_lower_layer_bottom):
1307            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
1308            Fixes RTBug #1907.
1309    
1310            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
1311            extent to the map when the legend is toggled. Fixes RTBug #1881.
1312    
1313    2003-05-29  Jan-Oliver Wagner <[email protected]>
1314    
1315            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
1316            unsubscribes all that is subcribed in __init__.
1317    
1318    2003-05-28  Bernhard Herzog  <[email protected]>
1319    
1320            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
1321            (MainWindow.CanDuplicateLayer): New methods to implement the
1322            Layer/Duplicate command.
1323            (layer_duplicate command): New.
1324            (main_menu): Add layer_duplicate to the Layer menu.
1325    
1326    2003-05-28  Bernhard Herzog  <[email protected]>
1327    
1328            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
1329            renderer so that NULL/None values get displayed differently (by a
1330            gray rectangle).
1331            (TableGrid.__init__): Override the default renderers
1332    
1333    2003-05-28  Bernhard Herzog  <[email protected]>
1334    
1335            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
1336            classification to "None" if the type of the field has changed.
1337    
1338            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
1339            test for the Layer.SetShapeStore method
1340    
1341    2003-05-28  Jan-Oliver Wagner <[email protected]>
1342    
1343            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
1344            does not necessarily have a filename).
1345    
1346    2003-05-28  Jan-Oliver Wagner <[email protected]>
1347    
1348            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
1349            sort the selection list for the dialog.
1350    
1351    2003-05-28  Frank Koormann  <[email protected]>
1352    
1353            * extensions/thuban/wxproj.cpp
1354            (project_point): Removed cast to int for projected point coordinates.
1355            (shape_centroid): Return last point if all polygon vertices fall
1356            to one point.
1357    
1358    2003-05-28  Bernhard Herzog  <[email protected]>
1359    
1360            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
1361            with layers that don't have shapestores, i.e. raster layers.
1362    
1363    2003-05-28  Bernhard Herzog  <[email protected]>
1364    
1365            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
1366            when determining the title from the filename.
1367    
1368            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
1369            reflect changes in the way the title is derived from the filename
1370    
1371    2003-05-28  Frank Koormann  <[email protected]>
1372    
1373            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
1374            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
1375    
1376    2003-05-27  Bernhard Herzog  <[email protected]>
1377    
1378            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
1379            delegate SelectedLayer.
1380            (MainWindow.LayerUnjoinTable): Implement.
1381            (_can_unjoin): New. Helper function for the sensitivity of the
1382            layer/unjoin command.
1383    
1384            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
1385            (DerivedShapeStore.OrigShapeStore): New. Return the original
1386            shapestore. Used to figure out how to unjoin.
1387            (DerivedShapeStore.Shapefile): Fix a typo.
1388    
1389    2003-05-27  Bernhard Herzog  <[email protected]>
1390    
1391            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
1392            well
1393            (JoinDialog.__init__): Use the layer parameter and only build the
1394            left choice when a layer is given
1395            (JoinDialog.OnJoin): Handle layer joins as well
1396            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
1397            that the user selects the "Select..." item. The sensitivitly
1398            updating is now in update_sensitivity
1399            (JoinDialog.y): New method to refactor the sensitivity update of
1400            the join button into its own method.
1401    
1402            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
1403    
1404    2003-05-27  Bernhard Herzog  <[email protected]>
1405    
1406            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
1407            iff there are unreferenced tables in the session
1408    
1409    2003-05-27  Bernhard Herzog  <[email protected]>
1410    
1411            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
1412    
1413            * Thuban/Model/session.py (Session.UnreferencedTables): New method
1414            to return tables that are not referenced by other tables or shape
1415            stores and can be removed.
1416            (Session.RemoveTable): Issue a TABLE_REMOVED message after
1417            removing the table
1418    
1419            * Thuban/UI/mainwindow.py: Remove unused imports
1420            (MainWindow.TableClose): Implement.
1421    
1422            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
1423            messages so that the frame will be automatically closed when a new
1424            session is opened or the table is removed.
1425            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
1426            __init__
1427            (TableFrame.close_on_session_replaced)
1428            (TableFrame.close_on_table_removed): New. Subscribers that close
1429            the window
1430    
1431            * test/test_session.py (TestSessionMessages.test_remove_table)
1432            (TestSessionSimple.test_remove_table): Move the test to
1433            TestSessionSimple and add test for the TABLE_REMOVED message
1434            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
1435            (TestSessionSimple.test_unreferenced_tables) New. Test for the
1436            UnreferencedTables method.
1437            (UnreferencedTablesTests): New. Class with some more sophisticated
1438            tests for UnreferencedTables.
1439    
1440    2003-05-27  Frank Koormann  <[email protected]>
1441    
1442            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
1443            display has some unwanted side effects. Removed again.
1444    
1445    2003-05-27  Frank Koormann  <[email protected]>
1446    
1447            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
1448    
1449            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
1450    
1451    2003-05-27  Jan-Oliver Wagner <[email protected]>
1452    
1453            * test/test_menu.py (MenuTest.test): Added test for
1454            Menu.RemoveItem().
1455    
1456            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
1457            the menu.
1458    
1459    2003-05-27  Frank Koormann  <[email protected]>
1460            
1461            Nonmodal dialogs without parent (i.e. they can fall behind the main
1462            window)
1463    
1464            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
1465            all dialogs in the dialogs dictionary and the canvas.
1466    
1467            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
1468            parent, i.e. can fall behind other windows.
1469            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
1470            dictionary before removing it.
1471    
1472            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
1473    
1474            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
1475            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
1476            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
1477    
1478    2003-05-27  Bernhard Herzog  <[email protected]>
1479    
1480            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
1481            tableview dialog
1482            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
1483            Also, don't use the table's titles as the dialog names. The titles
1484            aren't guaranteed to be unique.
1485            (MainWindow.TableOpen): Open a table view dialog after opening the
1486            table
1487    
1488    2003-05-27  Bernhard Herzog  <[email protected]>
1489    
1490            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
1491            effect can be achieved by simply closing the window showing the
1492            table.
1493            (MainWindow.TableHide): Removed.
1494            (main_menu): Removed "table_hide"
1495    
1496    2003-05-27  Frank Koormann  <[email protected]>
1497    
1498            Fix legend tree display problems under Win32
1499    
1500            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
1501            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
1502            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
1503    
1504            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
1505    
1506    2003-05-27  Jan-Oliver Wagner <[email protected]>
1507    
1508            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
1509            'after' now allows to insert separators almost anywhere in the menu.
1510    
1511    2003-05-27  Frank Koormann  <[email protected]>
1512    
1513            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
1514            "S" of selection box label to hint on hot key (Alt-S). Works under
1515            Win32 but is ignored under GTK.
1516    
1517    2003-05-26  Frank Koormann  <[email protected]>
1518    
1519            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
1520            Center Choices.
1521    
1522    2003-05-26  Bernhard Herzog  <[email protected]>
1523    
1524            Remove the Precision methods again. They're too DBF specific to be
1525            part of the table interface and they're only used in table_to_dbf
1526            anyway.
1527            
1528            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
1529            fixed precision of 12 for doubles.
1530            (TransientTableBase.Precision): Removed
1531            (AutoTransientTable.Width): Delegate to self.table.
1532    
1533            * Thuban/Model/table.py (DBFTable.Precision)
1534            (MemoryTable.Precision): Removed.
1535            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
1536            (table_to_dbf): Use a fixed precision of 12 for floats unless the
1537            column object specifies something else.
1538    
1539            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
1540            test for table_to_dbf
1541    
1542    2003-05-26  Bernhard Herzog  <[email protected]>
1543    
1544            * test/test_transientdb.py
1545            (TestTransientTable.run_iceland_political_tests): Fix a comment.
1546    
1547    2003-05-26  Bernhard Herzog  <[email protected]>
1548    
1549            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
1550            implementation. Mark parts of the file format strings for
1551            localization.
1552    
1553            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
1554            file and add the table to the tables managed by the session
1555    
1556            * test/test_session.py (TestSessionSimple.test_open_table_file):
1557            New. test case for OpenTableFile
1558    
1559    2003-05-26  Jan-Oliver Wagner <[email protected]>
1560    
1561            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
1562            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
1563            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
1564            Replace the true/false of wxWindows by True/False of Python 2.2.1.
1565    
1566    2003-05-26  Jan-Oliver Wagner <[email protected]>
1567    
1568            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
1569            already a selection present, update the grid accordingly.
1570    
1571            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
1572            resizeable and increase its initial size.
1573    
1574    2003-05-26  Frank Koormann  <[email protected]>
1575    
1576            Table export functionality
1577    
1578            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
1579            Return width (in characters) for a column.
1580            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
1581            (table_to_dbf): Write table to dbf file.
1582            (table_to_csv): Write table to csv file.
1583    
1584            * Thuban/Model/transientdb.py (TransientTableBase.Width,
1585            TransientTableBase.Precision): Return column width and precision.
1586    
1587            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
1588            or table_to_csv depending on file selection.
1589    
1590            * test/test_dbf_table.py:
1591            Test table_to_dbf (extension of former part of test).
1592    
1593            * test/test_csv_table.py:
1594            Test table_to_csv.
1595    
1596    2003-05-23  Jan-Oliver Wagner <[email protected]>
1597    
1598            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
1599            Use QueryTableFrame instead of TableFrame.
1600    
1601            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
1602            table window with 'Layer Table:' instead of 'Table:'.
1603    
1604    2003-05-23  Jan-Oliver Wagner <[email protected]>
1605    
1606            Give all tables a title via mix-in TitledObject.LayerShowTable
1607    
1608            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
1609            only if it exists.
1610    
1611            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
1612            and call its init-method with a default title. Remove Title() method.
1613    
1614            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
1615            AutoTransientTable): mix-in TitledObject and call its init-method with
1616            a default title. Remove Title() method.
1617    
1618    2003-05-23  Bernhard Herzog  <[email protected]>
1619    
1620            * Thuban/Model/session.py (Session.AddShapeStore): Define
1621            AddShapeStore analogously to AddTable.
1622    
1623            * test/test_session.py (TestSessionSimple.test_add_shapestore):
1624            New. Test for AddShapeStore
1625    
1626    2003-05-23  Jan-Oliver Wagner <[email protected]>
1627    
1628            Introducing QueryTableFrame and a very coarse ShowTable implementation.
1629    
1630            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
1631            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
1632            The latter implements the selection GUI without dependency on a layer.
1633            LayerTableFrame now is derived from QueryTableFrame and connects
1634            to a layer.
1635    
1636            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
1637            implementation that still needs work.
1638    
1639            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
1640    
1641    2003-05-22  Frank Koormann  <[email protected]>
1642    
1643            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
1644            Added "outer_join = False" as optional parameter.
1645            (TransientJoinedTable.create): If outer join is true, perform a
1646            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
1647            the left table. Records not matching are filled with 0 / None.
1648    
1649            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
1650            (JoinDialog.OnJoin): Consider outer join check box.
1651    
1652    2003-05-22  Bernhard Herzog  <[email protected]>
1653    
1654            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
1655            somewhat safer way. Storing the traceback in a local variable can
1656            lead to memory leaks
1657    
1658    2003-05-22  Bernhard Herzog  <[email protected]>
1659    
1660            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
1661            the wxMessageDialog's Destroy() method.
1662    
1663    2003-05-22  Frank Koormann  <[email protected]>
1664    
1665            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
1666            TransientTable.Title()
1667    
1668    2003-05-22  Frank Koormann  <[email protected]>
1669    
1670            Join Dialog, initial version.
1671    
1672            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
1673    
1674            * Thuban/UI/join.py (JoinDialog): Functional implementation of
1675            former framework. Renamed Table1/Table2 to LeftTable/RightTable
1676            in all occurences.
1677    
1678            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
1679            Typo fixed.
1680    
1681    2003-05-22  Bernhard Herzog  <[email protected]>
1682    
1683            Give the tables titles so that the GUI can display more meaningful
1684            names. For now the titles are fixed but depend on e.g. filenames
1685            or the titles of the joined tables.
1686    
1687            * Thuban/Model/transientdb.py (TransientTable.Title)
1688            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
1689    
1690            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
1691    
1692            * test/test_transientdb.py
1693            (TestTransientTable.test_auto_transient_table_title): New. Test
1694            for the Title method
1695            (TestTransientTable.test_transient_joined_table)
1696            (TestTransientTable.test_transient_table): Add test for the Title
1697            methods
1698    
1699            * test/test_memory_table.py (TestMemoryTable.test_title): New.
1700            Test for the Title method
1701    
1702            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
1703            the Title method
1704    
1705    2003-05-22  Bernhard Herzog  <[email protected]>
1706    
1707            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
1708            Provide a better way to destroy the layers
1709            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
1710            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
1711            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
1712            the new way to destroy the layers.
1713            (TestLayer.test_derived_store): New. Test for using a layer with a
1714            DerivedShapeStore
1715    
1716            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
1717            filename if the shape store actually has one.
1718    
1719    2003-05-22  Bernhard Herzog  <[email protected]>
1720    
1721            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
1722            for the filename
1723    
1724            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
1725            for the FileName method
1726            (TestDBFTableWriting.test_write): Fix spelling of filename
1727    
1728    2003-05-22  Thomas Koester  <[email protected]>
1729    
1730            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
1731            from SciParam that now really is immutable.
1732    
1733    2003-05-22  Frank Koormann  <[email protected]>
1734    
1735            Layer Top/Bottom placement added to legend.
1736    
1737            * Thuban/UI/legend.py
1738            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
1739            bound to tool events.
1740            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
1741            New, methods binding the event methods with the map methods.
1742    
1743            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
1744            layer at top/bottom of layer stack.
1745    
1746            * Resources/Bitmaps/top_layer.xpm: New button icon.
1747    
1748            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
1749    
1750    2003-05-22  Bernhard Herzog  <[email protected]>
1751    
1752            * Thuban/Model/session.py (Session.RemoveTable): New method to
1753            remove tables
1754    
1755            * test/test_session.py (TestSessionSimple.test_remove_table): New.
1756            Test for RemoveTable
1757    
1758    2003-05-22  Thomas Koester  <[email protected]>
1759    
1760            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
1761            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
1762    
1763    2003-05-22  Bernhard Herzog  <[email protected]>
1764    
1765            Implement a way to discover dependencies between tables and
1766            shapestores.
1767    
1768            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
1769            (TransientJoinedTable.Dependencies)
1770            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
1771            interface
1772            (TransientJoinedTable.__init__): Keep tack of the original table
1773            objects in addition to the corresponding transient tables.
1774    
1775            * Thuban/Model/table.py (DBFTable.Dependencies)
1776            (MemoryTable.Dependencies): New. Implement the dependencies
1777            interface
1778    
1779            * Thuban/Model/data.py (ShapeTable): New. Helper class for
1780            ShapefileStore
1781            (ShapefileStore.__init__): Use ShapeTable instead of
1782            AutoTransientTable
1783            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
1784            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
1785            methods for filename and type
1786            (ShapefileStore.Dependencies): New. Implement the dependencies
1787            interface
1788            (DerivedShapeStore): New class to replace SimpleStore. The main
1789            difference to SimpleStore is that it depends not on a shapefile
1790            but another shapestore which expresses the dependencies a bit
1791            better
1792            (SimpleStore.__init__): Add deprecation warning.
1793    
1794            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
1795            Test for the Dependencies method.
1796    
1797            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
1798            New. Test for the Dependencies method.
1799    
1800            * test/test_transientdb.py
1801            (TestTransientTable.test_auto_transient_table_dependencies): New.
1802            Test for the Dependencies method.
1803            (TestTransientTable.test_transient_joined_table): Add test for the
1804            Dependencies method.
1805    
1806            * test/test_session.py (TestSessionSimple.setUp)
1807            (TestSessionSimple.tearDown): New. Implement a better way to
1808            destroy the sessions.
1809            (TestSessionSimple.test_initial_state)
1810            (TestSessionSimple.test_add_table): Bind session to self.session
1811            so that it's destroyed by tearDown
1812            (TestSessionSimple.test_open_shapefile): New. Test for
1813            OpenShapefile and the object it returns
1814    
1815    2003-05-22  Bernhard Herzog  <[email protected]>
1816    
1817            * Thuban/Model/session.py (Session.AddTable): New method to
1818            register tables with the session.
1819            (Session.Tables): Return the tables registered with AddTable too.
1820    
1821            * test/test_session.py (TestSessionSimple.test_add_table): New.
1822            Test case for the AddTable method
1823    
1824    2003-05-22  Frank Koormann  <[email protected]>
1825    
1826            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
1827            lower right corner, center labels for selections, initialize controls
1828            in reasonable order for keyboard navigation.
1829    
1830            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
1831            (ProjFrame.__DoOnProjAvail): Determine position of current projection
1832            using the wxListBox.FindString() method. Still a problem (#1886)
1833    
1834            * Thuban/UI/classifier.py
1835            (Classifier.__init__, SelectPropertiesDialog.__init__)
1836    
1837            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
1838            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
1839            different classification types from here to __init__.
1840            (GenUniquePanel.__init__): Set the column width of the first field
1841            in the Field ListCtrl to the full width.
1842    
1843            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
1844            Button to 'Export'. Center Buttons in Selection Box, set Focus to
1845            Grid.
1846            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
1847            changes focus to the Selection when pressing "Alt-S".
1848    
1849            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
1850            the text if not visible. The italic font sometimes exceeds the
1851            rendering area.
1852    
1853    2003-05-21  Jonathan Coles   <[email protected]>
1854    
1855            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
1856            to OnClose so that Thuban closes correctly.
1857    
1858            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
1859            DockFrame.OnClose, not DockFrame._OnClose.
1860    
1861    2003-05-21  Jonathan Coles   <[email protected]>
1862    
1863            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
1864            references to 'inf' and use new Range __init__ to pass floats
1865            directly rather than converting them to strings first.
1866            Fixes RTBug #1876.
1867    
1868            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
1869            Use new Range ___init__ to pass floats.
1870    
1871            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
1872            filename is a valid image file. Throw IOError otherwise.
1873    
1874            * Thuban/Model/range.py: Brought over new Range from SciParam that
1875            is immutable and has an __init__ which can accept floats.
1876    
1877            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
1878            into try block. AddLayer doesn't throw any exceptions anymore.
1879            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
1880            try block.
1881    
1882            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
1883            the first item in choices. Fixes RTBug #1882.
1884    
1885            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
1886            has gone to 0 which is a serious problem. abort.
1887            (MapRenderer.draw_raster_layer): Catch IOError seperately and
1888            print the error from GDAL.
1889    
1890            * Thuban/UI/tableview.py (TableGrid.__init__): Call
1891            ToggleEventListeners to turn on listening.
1892            (TableGrid.ToggleEventListeners): New. Turns event listening on
1893            and off so as to prevent excessive messages.
1894            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
1895            to suppress excessive messages when selecting many rows.
1896            Fixes RTBug #1880.
1897    
1898            * Thuban/UI/view.py: Added checks against if scale == 0. This
1899            is a serious problem that can occur when an image without
1900            geo data is loading and causes the map projection bounds to
1901            go to infinity. Right now, the solution is to simply try
1902            to recover.
1903    
1904            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
1905            to set the MFILEReceiver attributes even if the data is NULL.
1906    
1907            * extensions/thuban/gdalwarp.cpp: Improved the error handling
1908            and passed GDAL messages back up to the Python layer. Also
1909            tried to fix some memory leaks that were present in the original
1910            utility but didn't matter because the program aborted.
1911    
1912            * test/test_range.py: Copied over tests from SciParam. Removed
1913            tests against importing. Fixes RTBug #1867.
1914    
1915    2003-05-21  Bernhard Herzog  <[email protected]>
1916    
1917            * test/test_load.py: Remove unused imports and restructure the
1918            test code
1919            (LoadSessionTest): Split into one class for each test and turn
1920            LoadSessionTest itself into the base class for all such session
1921            tests.
1922            (ClassificationTest): New base class for load tests that test
1923            classifications
1924            (TestSingleLayer, TestLayerVisibility, TestClassification)
1925            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
1926            for the individual tests
1927    
1928            * test/support.py (FileLoadTestCase.filename): New base class for
1929            file loading tests
1930    
1931    2003-05-21  Jan-Oliver Wagner <[email protected]>
1932    
1933            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
1934            Mercator' to 'UTM Zone 32' as a more convenient example.
1935            Added 'Gauss Krueger Zone 6'.
1936    
1937            * Data/iceland_sample_raster.thuban: political polygon now
1938            filled transparent to have the raster image visible at once.
1939    
1940    2003-05-21  Frank Koormann  <[email protected]>
1941    
1942            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
1943            OnClose() to keep in sync with extensions. Internally Thuban
1944            still uses "underscored" names.
1945    
1946    2003-05-20  Jonathan Coles   <[email protected]>
1947    
1948            This puts back Raster layer support. These layers support projections
1949            through the GDAL library. Currently, the CVS version is being used.
1950            There are no Debian packages available although this may change soon.
1951            A GDAL driver was extended to support writing to memory rather to
1952            files.
1953    
1954            There is still some work that needs to be done, such as some error
1955            handling when loading invalid images or when there is a problem
1956            projecting the image. This putback simply checks in the majority
1957            of the work.
1958    
1959            * setup.py: Add gdalwarp library extension.
1960    
1961            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
1962            Defaults to False, but can be overridden by subclasses if they
1963            support classification.
1964            (RasterLayer): New. Defines a new layer that represents an
1965            image.
1966    
1967            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
1968            tag handler.
1969            (SessionLoader.start_layer): Encode the filename.
1970            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
1971            New. Supports reading a rasterlayer tag.
1972    
1973            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
1974    
1975            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
1976            get a string in Latin1. If we get such as string convert it to
1977            unicode first, otherwise leave if alone before encoding.
1978            (SessionSaver.write_layer): Add support for writing both Layers
1979            and RasterLayers.
1980    
1981            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1982            The right argument may not be a string, it could also be a Column.
1983    
1984            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
1985            Make initial window size 600x400. Fixes RTBug #1872.
1986    
1987            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
1988            the dialog is constructed so that we can support layers that
1989            do not have classifications.
1990            (Classifier._OnTry): Only build a classification if the layer
1991            supports one.
1992    
1993            * Thuban/UI/legend.py: Change all checks that a layer is an
1994            instance of Layer into checks against BaseLayer.
1995            (LegendTree.__FillTreeLayer): Only add children to a branch if
1996            the layer supports classification.
1997    
1998            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
1999            MainWindow.OpenSession): Don't proceed with an action if the
2000            user chooses Cancel when they are asked to save changes.
2001            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
2002            user to select an image file. Create a new RasterLayer and add
2003            it to the map.
2004    
2005            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
2006            for rendering RasterLayer layers.
2007            (MapRenderer.draw_raster_layer): Actually method that calls
2008            the GDALWarp python wrapper and constructs an image from the
2009            data returned.
2010    
2011            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
2012            Choices symbols to match those used in the table query method.
2013            Replace deprecated method calls on table with new method names.
2014    
2015            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
2016            how small the scale can get. This still needs more testing.
2017    
2018            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
2019            Provides a driver to output in .bmp format.
2020    
2021            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
2022            New. Provides IO routines which write to memory, rather than a file.
2023    
2024            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
2025            of the gdalwarp utility provided in GDAL. Added function calls
2026            that can be accessed from python.
2027    
2028            * Data/iceland_sample_raster.thuban: New. Sample file that uses
2029            a raster layer.
2030    
2031            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
2032            layer image data.
2033    
2034            * Doc/thuban.dtd: Added rasterlayer attribute definition.
2035    
2036            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
2037            tests associated with the raster layer code.
2038    
2039            * test/test_transientdb.py
2040            (TestTransientTable.test_auto_transient_table_query): Added a test
2041            for using a Column object as the "right" parameter to a query.
2042    
2043    2003-05-19  Frank Koormann  <[email protected]>
2044    
2045            * Thuban/version.py (get_changelog_date):
2046            Catch exceptions if ChangeLog does not exist.
2047    
2048            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
2049    
2050  2003-05-19  Frank Koormann  <[email protected]>  2003-05-19  Frank Koormann  <[email protected]>
2051    
2052          Extended version information for Thuban          Extended version information for Thuban

Legend:
Removed from v.924  
changed lines
  Added in v.1376

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26