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

Legend:
Removed from v.848  
changed lines
  Added in v.1372

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26