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

Legend:
Removed from v.595  
changed lines
  Added in v.1360

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26