/[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 85 by bh, Wed Apr 3 15:21:58 2002 UTC revision 1349 by jonathan, Tue Jul 1 16:12:38 2003 UTC
# Line 1  Line 1 
1    2003-07-01  Jonathan Coles   <[email protected]>
2    
3            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
4            Import used objects/class from color.
5            (generate_singletons): We don't
6            need the numGroups parameter anymore because we are using
7            the new ramps with GetProperties().
8            (generate_uniform_distribution): Use new ramp method
9            GetProperties().
10            (generate_quantiles, GenQuantiles0): Use new ramp method
11            GetProperties().
12            (CustomRamp.SetNumGroups): Removed. The ramps now map
13            a value from 0 to 1 to class properties so the number
14            of groups is not needed ahead of time.
15            (CustomRamp.next): Removed. CustomRamp does not support
16            interation anymore.
17            (CustomRamp.GetProperties): Returns a ClassGroupProperties
18            object based on the index value from 0 to 1 that is
19            passed to it.
20            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
21            Made into instances of Monochromatic class instread of
22            deriving from it.
23            (HotToCold.SetNumGroups): Removed. See CustomRamp.
24            (HotToCold.next): Removed. See CustomRamp.
25    
26            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
27            (Classification.SetField, Classification.SetFieldType):
28            Replaced with SetFieldInfo.
29            (Classification.SetFieldInfo): New. Does a better job of
30            what SetField and SetFieldType used to do by combining
31            their function since they should really always be done
32            at the same time.
33            (Classification.SetLayer): Renamed to _set_layer.
34            (Classification._set_layer): Should only be called from
35            Layer's SetClassification. This does not cause a recursive
36            call as SetLayer did because we know that Layer knows about
37            the classification.
38    
39            * Thuban/Model/color.py: Fixes RTbug #1971.
40            (_Transparent): Renamed from Transparent so it doesn't
41            conflict with the module variable.
42            (Transparent, Black): Renamed from Color.Transparent,
43            Color.Black so they are not class variables.
44    
45            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
46            (Layer.Destroy): We don't need to call SetClassification
47            anymore to clear out the back reference in the classifcation
48            to the layer. It's better to set it to None using _set_layer,
49            and we won't be creating another clas object too.
50            (Layer.SetClassification): Classification._set_layer is not
51            recursive so remove all the locking variables. Also clean
52            up the code so that it remains unchanged if something fails.
53    
54            * Thuban/Model/load.py: Fixes RTbug #1971.
55            (SessionLoader.start_classification): Call
56            Classification.SetFieldInfo().
57    
58            * Thuban/Model/save.py: Removed import of Color which wasn't
59            being used.
60    
61            * Thuban/UI/classgen.py: Fixes RTbug #1972.
62            (ClassGenDialog.__init__): Color ramps are now instances
63            already so we don't need to create any new objects.
64            (ClassGenDialog.OnOK): Check for numGroups is no longer
65            necessary because we never use it.
66    
67            * Thuban/UI/classifier.py: Fixes RTbug #1971.
68            (Classifier.__BuildClassification, Classifier.__SetGridTable):
69            Call Classification.SetFieldInfo() instead of SetFieldType.
70    
71            * Thuban/UI/renderer.py: Fixes RTbug #1971.
72    
73            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
74            (MapCanvas.__init__): Subscribe to the idle time event. Set
75            background color to white.
76            (MapCanvas.OnPaint): Set a flag indicating that we should
77            render the map during idle time. If we already have a bitmap
78            just draw it now.
79            (MapCanvas.OnIdle): New. Render the map only during idle time.
80            This also fixes a problem with the busy cursor under gtk.
81    
82            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
83            Fix calls to generate_singletons because the signature changed.
84    
85            * test/test_classification.py: Fix color references and
86            change calls to Classification.[SetField|SetFieldType] to
87            SetFieldInfo.
88    
89            * test/test_load.py: Fix color references.
90    
91            * test/test_load_0_2.py: Fix color references.
92    
93            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
94            Change calls to Classification.[SetField|SetFieldType] to
95            SetFieldInfo.
96    
97    2003-07-01  Frank Koormann   <[email protected]>
98    
99            MERGE from the greater-ms3 branch.
100    
101            * test/test_transientdb.py
102            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
103            New. Test join of two tables with partly equal column names.
104    
105            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
106            If duplicates in left and right tables column names are found,
107            append '_' (underscores) to the name until it is unique.
108            Create always new internal names for the resulting table and reference
109            columns in the join statement with <table>.<column>
110    
111    2003-07-01  Bernhard Herzog  <[email protected]>
112    
113            * test/test_transientdb.py
114            (TestTransientTable.test_transient_joined_table_same_column_name):
115            New. Test whether joining on columns with the same names in both
116            tables works.
117            
118            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
119            sure to use the right internal names even when joining on field
120            with the same names in both tables. Also, detect duplicate names
121            in the joined table correctly.
122    
123    2003-07-01  Frank Koormann   <[email protected]>
124    
125            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
126            Reverse List of layers to render in same order as in desktop legend.
127    
128    2003-06-30  Jonathan Coles   <[email protected]>
129    
130            * Thuban/version.py (make_tuple): Takes a version string
131            and splits it into a tuple of at most three integers.
132            Used make_tuple() to make tuple versions of the version
133            numbers.
134    
135            * Thuban/UI/about.py: Add Thuban email addresses.
136    
137    2003-06-30  Jonathan Coles   <[email protected]>
138    
139            * Thuban/version.py: SQLite/PySQLite version dependencies
140            were too high.
141    
142    2003-06-30  Jonathan Coles   <[email protected]>
143    
144            * Thuban/version.py: Update version to 0.8.1
145            
146            * MANIFEST.in: Added Projections so that default.proj is
147            included.
148    
149    2003-06-26  Jonathan Coles   <[email protected]>
150    
151            New About box with lots more information including library
152            versions and credits. More/better version checking before
153            Thuban starts.
154    
155            * Thuban/UI/about.py: New. New About box that displays
156            library version information and credits.
157    
158            * Thuban/version.py: Added new 'versions' dictionary which
159            contains the verions of various libraries which are checked
160            when the module loads.
161            (verify_versions): Check all version numbers and returns
162            a list of errors.
163    
164            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
165            Reset the status of the buttons as the situation warrants,
166            but in a better more reliable way by not relying on the
167            current status to determine what needs to change.
168    
169            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
170            (verify_versions): Remove most of the code since it is
171            now in Thuban.version.verify_versions.o
172    
173            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
174            About box in Thuban.UI.about.
175    
176            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
177            Returns the version of gdal library being used as a string.
178    
179            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
180            Removed.
181            (get_proj_version): Return the version of PROJ that the file
182            was compiled with.
183            (get_gtk_version): Return th version of GTK that the file
184            was compiled with.
185    
186    2003-06-25  Jonathan Coles   <[email protected]>
187    
188            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
189            of the SelectPropertiesDialog should be self so the window
190            appears on top.
191            (ClassGroupPropertiesCtrl.DoEdit): The parent
192            of the SelectPropertiesDialog should be self so the window
193            appears on top.
194    
195            * Thuban/UI/resource.py: Cleaned up how we determine file
196            extensions.
197            (GetImageResource): Return an wxImage from our Resources.
198    
199    2003-06-24  Jonathan Coles   <[email protected]>
200    
201            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
202            Check that a layer has a classification before trying
203            to get it. Raster layers don't have classifications.
204    
205    2003-06-23  Jonathan Coles   <[email protected]>
206            
207            * setup.py: Add Resources/XML to resource list.
208        
209    2003-06-23  Jonathan Coles   <[email protected]>
210    
211            * setup.cfg: Fix copyright dates
212        
213    2003-06-23  Jonathan Coles   <[email protected]>
214    
215            * MANIFEST.in: Update with Resources/XML
216    
217            * setup.py: Don't include Locale resources yet as we don't
218            have any and it causes problems building the distribution
219            for Windows. Update version to 0.8.0.
220    
221            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
222    
223            * Thuban/UI/mainwindow.py: Add blank line at the end because
224            file was not being read correctly building the Windows
225            distribution.
226    
227    2003-06-23  Jonathan Coles   <[email protected]>
228    
229            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
230    
231            * Thuban/version.py: Temporarily update longversion for
232            the 0.8 release so that it doesn't have the cvs revision.
233    
234    2003-06-23  Jonathan Coles   <[email protected]>
235    
236            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
237            to make sure that we don't create reentrant possibilities with
238            wxYield.
239    
240            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
241            directly to avoid the wxSafeYield() call which generates an
242            OnPaint event causing infinite recursion. Don't try to catch
243            exception anymore. This was for before there were limits on map
244            scaling.
245    
246    2003-06-23  Bernhard Herzog  <[email protected]>
247    
248            Bug fix for RT #1961:
249    
250            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
251            Register DerivedShapestores with the session
252    
253            * Thuban/Model/session.py (Session.Tables): Make sure each table
254            is only listed once.
255    
256            * test/test_load.py (TestJoinedTable.test): Add check_format call.
257            Update file contents to match the one written out.
258    
259    2003-06-20  Bernhard Herzog  <[email protected]>
260    
261            * test/xmlsupport.py (SaxEventLister.startElementNS)
262            (SaxEventLister.endElementNS): Do not include the qname. Python
263            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
264            is (presumably incorrectly) None, whereas it's a string with the
265            element name in the later versions.
266    
267            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
268            (TestEventList.test_even_list_namespace): Update tests to reflect
269            the new behaviour
270            (TestEventList.test_even_list_id_normalization): Fix doc-string
271    
272    2003-06-20  Jonathan Coles   <[email protected]>
273    
274            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
275            by deriving classes to determine if that layer supports shapes.
276            (Layer): Override HasShapes and return true.
277    
278            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
279            instead of a direct call to wx[Begin|End]CusyCursor().
280            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
281            table data.
282    
283            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
284            New. Wrappers around the wxWindows functions that allow us to
285            make additional calls such as wxYield which gives the native
286            system a chance to update the cursor correctly.
287    
288            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
289            instead of a direct call to wx[Begin|End]CusyCursor().
290    
291            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
292            instead of a direct call to wx[Begin|End]CusyCursor().
293            (MapCanvas.find_shape_at): Check if the current search layer
294            support shapes, otherwise go on to the next layer.
295    
296            * test/test_layer.py: Add tests in each type of layer for
297            HasClassification() and HasShapes()
298    
299    2003-06-20  Jonathan Coles   <[email protected]>
300    
301            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
302            turning on the busy cursor to allow the system to change the
303            cursor before we begin painting. This fixes a problem that
304            was occuring only under GTK. Fixes RTbug #1840.
305    
306    2003-06-20  Bernhard Herzog  <[email protected]>
307    
308            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
309            version.
310    
311            * Thuban/Model/save.py (sort_data_stores): New. Make topological
312            sort of the data sources so they can be written with sources that
313            data sources that depend on other data sources come after the
314            sources they depend on.
315            (SessionSaver.__init__): Add idmap instance variable to map from
316            objects to the ids used in the file.
317            (SessionSaver.get_id, SessionSaver.define_id)
318            (SessionSaver.has_id): New. Methods to manage the idmap
319            (SessionSaver.write): Use thuban-0.8.dtd
320            (SessionSaver.write_session): Add a namespace on the session and
321            write out the data sources before the maps.
322            (SessionSaver.write_data_containers): New. Write the data
323            containers.
324            (SessionSaver.write_layer): Layer elements now refer to a
325            shapestore and don't contain filenames anymore.
326    
327            * Thuban/Model/load.py (LoadError): Exception class to raise when
328            errors in the files are discovered
329            (SessionLoader.__init__): Define dispatchers for elements with a
330            thuban-0.8 namespace too.
331            (SessionLoader.check_attrs): New helper method to check and
332            convert attributes
333            (AttrDesc): New. Helper class for SessionLoader.check_attrs
334            (SessionLoader.start_fileshapesource)
335            (SessionLoader.start_derivedshapesource)
336            (SessionLoader.start_filetable, SessionLoader.start_jointable):
337            Handlers for the new elements in the new fileformat
338            (SessionLoader.start_layer): Handle the shapestore attribute in
339            addition to filename.
340            (SessionLoader.start_table, SessionLoader.end_table): Removed.
341            They were never used in the old formats and aren't needed for the
342            new.
343    
344            * Thuban/Model/session.py (Session.DataContainers): New method to
345            return all "data containers", i.e. shapestores and tables
346    
347            * test/xmlsupport.py (SaxEventLister.__init__)
348            (SaxEventLister.startElementNS, sax_eventlist): Add support to
349            normalize IDs.
350    
351            * test/test_xmlsupport.py
352            (TestEventList.test_even_list_id_normalization): New test case for
353            id normalization
354    
355            * test/test_load.py (LoadSessionTest.check_format): Use ID
356            normalization
357            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
358            class atrributes used for ID normalization
359            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
360            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
361            file format
362            (TestJoinedTable): New test for loading sessions with joined
363            tables.
364            (TestLoadError): New. Test whether missing required attributes
365            cause a LoadError.
366    
367            * test/test_save.py (SaveSessionTest.thubanids)
368            (SaveSessionTest.thubanidrefs): New class attributes for ID
369            normalization in .thuban files.
370            (SaveSessionTest.compare_xml): Use id-normalization.
371            (SaveSessionTest.testEmptySession)
372            (SaveSessionTest.testLayerProjection)
373            (SaveSessionTest.testRasterLayer)
374            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
375            (SaveSessionTest.testLayerProjection): The filename used was the
376            same as for testSingleLayer. Use a different one.
377            (SaveSessionTest.test_dbf_table)
378            (SaveSessionTest.test_joined_table): New test cases for saving the
379            new data sources structures.
380            (TestStoreSort, MockDataStore): Classes to test the sorting of the
381            data stores for writing.
382    
383            * test/runtests.py: Add CVS keywords
384    
385    2003-06-20  Jonathan Coles   <[email protected]>
386    
387            * test/test_session.py
388            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
389            Use the cultural_landmark-point.dbf file for the store so that
390            the table rows and shape count match.
391    
392    2003-06-20  Jonathan Coles   <[email protected]>
393    
394            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
395            an exception if the number of shapes is different from the
396            number of rows in the table. Address RTbug #1933.
397    
398            * test/test_layer.py (TestLayer.test_derived_store): Add
399            a test for the new exception in DerivedShapeStore.__init__.
400    
401            * test/support.py (FloatTestCase): Removed since there is
402            already FloatComparisonMixin. Fixes RTbug #1954.
403            (FloatComparisonMixin.assertFloatEqual): Include test for
404            infinity that was part of FloatTestCase.
405    
406            * test/test_range.py (RangeTest): Inherit from
407            support.FloatComparisonMixin now that we don't have
408            support.FloatTestCase.
409    
410    2003-06-20  Bernhard Herzog  <[email protected]>
411    
412            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
413            the implementation in xmlsupport instead.
414            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
415    
416            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
417            of test_save
418    
419    2003-06-20  Bernhard Herzog  <[email protected]>
420    
421            * test/test_load.py (LoadSessionTest.check_format): New helper
422            method to make sure the test files we load might have been written
423            by the current thuban version.
424            (ClassificationTest.TestLayers, TestSingleLayer.test)
425            (TestLayerVisibility.test, TestClassification.test)
426            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
427            Add check_format() calls and fix the thuban data to match the data
428            that would be written by saving the session loaded from it.
429    
430            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
431            the same class and function in test_save.
432    
433            * test/test_xmlsupport.py (TestEventList): New. test cases for
434            sax_eventlist
435    
436    2003-06-20  Bernhard Herzog  <[email protected]>
437    
438            * Resources/XML/thuban.dtd: Add comment about which versions of
439            Thuban are covered by this DTD
440            (map): Fix content model for layers and raster layers. There can
441            be any number or layers and raster layers in any order.
442    
443    2003-06-20  Jonathan Coles   <[email protected]>
444    
445            This is mainly about fixing RTbug #1949.
446    
447            * Thuban/Model/classification.py: Remove "from __future__"
448            import statement since python 2.2 is the earliest supported
449            version.
450    
451            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
452            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
453            depending on the units this projection *forwards* into.
454    
455            * Thuban/Model/save.py (SessionSaver.write_classification):
456            Remove unnecessary use of lambdas and nested functions.
457    
458            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
459            adjustment here if the map projection uses degrees.
460    
461            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
462            scale adjust code since it is now done before calling
463            this method. Don't do anything if the map projection
464            is None.
465    
466    2003-06-19  Bernhard Herzog  <[email protected]>
467    
468            Move version specific load tests to their own file.
469    
470            * test/test_load.py: Expand the doc-string to explain a bit how to
471            handle file format changes.
472            (TestClassification.test): Update the docstring as this test is
473            not about Thuban 0.2 anymore.
474    
475            * test/test_load_0_2.py: New file with the load tests for thuban
476            files created with Thuban 0.2 and earlier.
477    
478    2003-06-19  Bernhard Herzog  <[email protected]>
479    
480            Add XML validation to some of the tests. Validation will only be
481            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
482            To make the DTD available to the test cases it's moved into
483            Resources/XML
484    
485            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
486            for versions up to and including 0.2. Two slight changes: added an
487            encoding specification and fixed the comment which refered to
488            GRASS, not Thuban
489    
490            * test/xmlsupport.py: New support module for tests involving XML.
491            Currently there's a mix-in class for XML validation.
492    
493            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
494    
495            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
496            so that we can validate the
497            (SaveSessionTest.testEmptySession)
498            (SaveSessionTest.testSingleLayer)
499            (SaveSessionTest.testSingleLayer)
500            (SaveSessionTest.testLayerProjection)
501            (SaveSessionTest.testRasterLayer)
502            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
503    
504            * test/runtests.py (main): Call print_additional_summary instead
505            of print_garbage_information
506    
507            * test/support.py (resource_dir): New function to return the
508            "Resource" subdirectory
509            (print_additional_summary): New function to combine several
510            summary functions
511            (run_tests): Use print_additional_summary instead of calling
512            print_garbage_information directly
513    
514    2003-06-19  Bernhard Herzog  <[email protected]>
515    
516            * Doc/thuban.dtd (classification): Correct the content model of
517            the classification element.
518            (projection): Add the "name" attribute
519    
520    2003-06-19  Frank Koormann   <[email protected]>
521    
522            MERGE from the greater-ms3 branch.
523    
524            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
525            scale if projection is latlong to get better estimate.
526    
527            Fix problem of hidden properties dialog under windows after double
528            click on layer tree:
529            The tree control always gets an Expanded / Collapsed event after
530            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
531            raises the already displayed window.
532    
533            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
534            raiseProperties initialized to prevent endless loops
535            (LegendTree._OnItemActivated): Depending on self.raiseProperties
536            simply raise the properties or open the dialog and issue a second
537            event.
538    
539    2003-06-18  Jonathan Coles   <[email protected]>
540    
541            * setup.py: Fix a few problems that occured under Windows.
542    
543    2003-06-18  Jonathan Coles   <[email protected]>
544    
545            When Thuban loaded the map was redrawn twice because the
546            legend was being opened after the mainwindow was created
547            and not during its creation. This meant the map was drawn
548            initially and then had to be redrawn when the legend
549            caused the display to change. Now the legend is opened
550            in the mainwindow constructor which resolves this issue.
551    
552            Also, although we were checking for the existence of
553            gdal and gdalwarp modules, the gdalwarp extension was
554            still being compiled (which may fail if the system doesn't
555            have gdal installed). the build_ext command to setup.py
556            now accepts the flags --with-gdal and --without-gdal.
557            If --without-gdal is specified setup.py will try to
558            use the gdal parameters specified by gdal-config. Under
559            windows, those parameters have to be set in setup.py
560            as with proj4 an wxWindows.
561    
562            * setup.py: Use a list instead of seperate variables for
563            extension parameters so we can create a generic function
564            that runs an appropriate *-config script.
565            (run_cs_script): Renamed from run_wx_script and modified
566            to accept a second argument which is a list of lists to
567            be filled in by the values returned from running the command.
568            (thuban_build_ext): New. Extends the build_ext command and
569            provides the options --with-gdal/--without-gdal which then
570            optionally includes the gdalwarp extension.
571    
572            * Thuban/Model/resource.py: First check if we can import
573            the gdalwarp Thuban extension before checking for gdal.
574            Also added some comments.
575            
576            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
577            the map is None which may be the case if none has been loaded
578            yet.
579    
580            * Thuban/UI/main.py (main): Remove call to ShowLegend.
581    
582            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
583    
584            * Thuban/UI/renderer.py: Check for gdal support before importing
585            gdalwarp.
586            (MapRenderer.render_map): Only try to optimize if we have gdal
587            support otherwise nothing will get drawn.
588    
589            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
590            during startup before a map has been created. Check if map is None
591            before using it and do nothing if it is.
592    
593    2003-06-17  Jonathan Coles   <[email protected]>
594    
595            Fix the problem with raster layers under Windows that caused
596            Thuban to crash. The view should respond to layer projection
597            changed events to update the display. Changes to a projection
598            should not cause the map to be set to full extent.
599            
600            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
601            current_map_proj to remember the current map projection so that
602            when the projection changes we know what the previous projection
603            was.
604            (MapCanvas.SetMap): Unsubscribe and subscribe to
605            LAYER_PROJECTION_CHANGED events.
606            (MapCanvas.projection_changed): Split into two methods that respond
607            to map and layer projection changes.
608            (MapCanvas.map_projection_changed): New. Takes the current view and
609            projects it using the new projection. This does not cause the
610            map to be redrawn at full extent.
611            (MapCanvas.layer_projection_changed): New. Cause a redraw which
612            will draw each layer in its new projection.
613            
614            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
615            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
616            under Windows.
617            
618            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
619            to twice sizeof(void*) because there are two digits for each
620            hex byte.
621    
622    2003-06-16  Bernhard Herzog  <[email protected]>
623    
624            Update to the layer interface: Direct access to the table,
625            shapetable, shapefile and filename attributes is now actively
626            deprecated by issuing deprecation warnings for all places where
627            this happens.
628    
629            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
630            to the instance variables table, shapetable, shapefile and
631            filename via __getattr__ so that we can issue a deprecation
632            warning.
633            (Layer.SetShapeStore): Don't set the deprecated instance variables
634            any more
635            (Layer.SetShapeStore): Don't use deprecated layer instance
636            variables
637            (Layer.Destroy): No need to explicitly remove the instance
638            variables any more
639            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
640            instance variables
641    
642            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
643            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
644            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
645            use deprecated layer instance variables
646    
647            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
648            deprecated layer instance variables
649    
650            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
651            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
652            instance variables
653    
654            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
655            deprecated layer instance variables
656    
657            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
658            deprecated layer instance variables
659    
660            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
661            deprecated layer instance variables
662    
663            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
664            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
665            variables
666    
667            * test/runtests.py (main): Turn Thuban's deprecation warnings into
668            errors so that they're cought by the tests
669    
670            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
671            layer instance variables
672    
673    2003-06-16  Jonathan Coles   <[email protected]>
674    
675            Fix a problem under Windows whereby if the user double-clicks on a
676            layer in the legend that tree item will expand or collapse as well
677            as open the layer properties dialog. The state of the tree item
678            should not be affected.
679    
680            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
681            preventExpandCollapse and subscribe to expanding and collapsing
682            events.
683            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
684            collapsing events and will veto the event if it has been triggered
685            by the user double clicking on a layer.
686            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
687            that an expanding/collapsing event should be vetoed.
688    
689    2003-06-13  Bernhard Herzog  <[email protected]>
690    
691            * Thuban/UI/classifier.py (Classifier.OnClose)
692            (Classifier.map_layers_removed)
693            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
694            in OnClose and not in map_layers_removed or
695            layer_shapestore_replaced to make sure it always happens when the
696            dialog is closed
697    
698    2003-06-13  Jonathan Coles   <[email protected]>
699    
700            This puts back a fix for Windows where a panel is needed so that
701            the background of the table view appears correctly.
702    
703            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
704            object that can be used by derived classes to place any
705            controls (including the grid) onto.
706            (QueryTableFrame.__init__): Use the panel as the parent window
707            for all the controls. Reparent the grid so that the panel is
708            the parent. Call UpdateStatusText() to correctly initialize
709            the status bar.
710    
711    2003-06-13  Jonathan Coles   <[email protected]>
712    
713            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
714            from wxFrame (as opposed to wxDialog like the other classes)
715            but otherwise behaves like the other classes. This is needed
716            for the TableView which isn't really a dialog and needs to
717            have a status bar and control buttons.
718    
719            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
720            instance variable to keep track of how many rows are selected.
721            Subscribe once to the the events we are interested in.
722            (ThubanGrid.OnRangeSelect): Only handle event if event handling
723            hasn't been turned off.
724            (ThubanGrid.OnSelectCell): Only handle event if event handling
725            hasn't been turned off.
726            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
727            as an event listener (which changes the event handler stack)
728            simply set an instance variable to False. This is checked in
729            the event handlers.
730            (ThubanGrid.GetNumberSelected): Return the number of currently
731            selected rows.
732            (TableFrame): Inherit from ThubanFrame so we can have a
733            status bar and control buttons.
734            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
735            Explicitly set which items are selected in the operator choice and
736            action choice so there is always a valid selection. Fixes RTbug #1941.
737            Subscribe to grid cell selection events so we can update the
738            status bar.
739            (QueryTableFrame.UpdateStatusText): Update the status bar with
740            how many rows are in the grid, how many columns, and how many
741            rows are selected.
742            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
743            Call UpdateStatusText when cells are (de)selected.
744            (QueryTableFrame.OnQuery): Use the string value in the value
745            combo if either the selected item index is 0 or if the string
746            cannot be found in the predefined list (this happens if the
747            user changes the text). Fixes RTbug #1940.
748            Only turn off the grid event listeners if there a query comes
749            back with a none empty list of ids. in the case that the list
750            is empty this causes a grid.ClearSelection() call to actually
751            clear the grid selection which causes the selected items in
752            the map to be deselected. Fixes RTbug #1939.
753    
754            * test/test_save.py (XMLWriterTest.Encode): Check return values.
755            Fixes RTbug #1851.
756    
757    2003-06-13  Bernhard Herzog  <[email protected]>
758    
759            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
760            self.selected_shape with the current selection to make sure the
761            contents of the dialog are up to date when it's shown for the
762            first time.
763            The dialog used to work without this by luck. The recent fix to
764            the connector module 'broke' a 'feature' the identify view was
765            relying on, i.e that subscribing to a message in response to
766            receiving a message of that type would mean that the new
767            subscriber would also be called for the same message.
768            
769    2003-06-12  Jonathan Coles   <[email protected]>
770    
771            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
772            the image is rendered. Fixes RTbug #1937.
773    
774    2003-06-12  Jonathan Coles   <[email protected]>
775    
776            * Thuban/Lib/fileutil.py: As is done under Windows, create the
777            user directory if it doesn't exist on a posix system.
778            Fixes RTbug #1815.
779    
780            * Thuban/Model/resource.py (get_user_proj_files): Moved the
781            called to get_application_dir here, so that the directory
782            will only be called if this method is invoked.
783    
784            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
785            the projfilepath if no projection is selected.
786    
787    2003-06-12  Jonathan Coles   <[email protected]>
788    
789            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
790            the scalebar if the current map has no projection set.
791    
792            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
793            projfilepath label to just the basename of the projection file
794            rather than include the entire path.
795    
796            * Thuban/Model/resource.py: Fix missed proj functions that
797            needed to be renamed.
798    
799    2003-06-12  Jonathan Coles   <[email protected]>
800    
801            * Thuban/Model/classification.py: Removed assert statements that
802            tested if the variable was an instance of Color.
803    
804            * Thuban/Model/color.py (Color): Remove commented code that isn't
805            used.
806            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
807            Fixes RTbug #1835.
808            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
809            Needed now that the class doesn't inherit from Color.
810    
811    2003-06-12  Jonathan Coles   <[email protected]>
812    
813            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
814            check unicode strings.
815    
816            * test/test_layer.py: Check for existence of gdal.
817    
818    2003-06-12  Jonathan Coles   <[email protected]>
819        
820            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
821            that was in load.py
822    
823            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
824            that was in save.py
825    
826    2003-06-12  Jonathan Coles   <[email protected]>
827    
828            This is largely a collection of bug fixes. We also handle the
829            case where gdal is not on the system. The XMLReader and XMLWriter
830            classes were moved into there own files to resolve some circular
831            import references and because they shouldn't really be in the
832            file that is dediciated to reading/writing session files since
833            they are also used elsewhere.
834    
835            * Thuban/Model/classgen.py: Renamed functions to follow the
836            function_names_with_underscores style. Fixes RTbug #1903.
837            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
838    
839            * Thuban/Model/layer.py: Import gdal only if it available.
840            (RasterLayer): Handle the case where the gdal library is unavailable.
841            Addresses RTbug #1877.
842    
843            * Thuban/Model/load.py (XMLReader): Moved into seperate file
844            xmlreader.py.
845    
846    2003-06-12  Jonathan Coles   <[email protected]>
847    
848            This is largely a collection of bug fixes. We also handle the
849            case where gdal is not on the system. The XMLReader and XMLWriter
850            classes were moved into there own files to resolve some circular
851            import references and because they shouldn't really be in the
852            file that is dediciated to reading/writing session files since
853            they are also used elsewhere.
854    
855            * Thuban/Model/classgen.py: Renamed functions to follow the
856            function_names_with_underscores style. Fixes RTbug #1903.
857            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
858    
859            * Thuban/Model/layer.py: Import gdal only if it available.
860            (RasterLayer): Handle the case where the gdal library is unavailable.
861            Addresses RTbug #1877.
862    
863            * Thuban/Model/load.py (XMLReader): Moved into seperate file
864            xmlreader.py.
865    
866            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
867            file xmlwriter.py.
868    
869            * Thuban/Model/resource.py: Renamed functions to following the
870            function_names_with_underscores style.
871            (has_gdal_support): New function that returns true if the gdal
872            library is available. Addresses RTbug #1877.
873    
874            * Thuban/UI/application.py (ThubanApplication.OpenSession):
875            Display a message box if the gdal library is not available, but
876            only if there are any layers that would use it. Addresses RTbug #1877.
877    
878            * Thuban/UI/classgen.py: Use renamed projection resource functions.
879            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
880            when using integers versus floats.
881    
882            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
883            determine if the "Add Image Layer" menu option should be
884            greyed out or not. Addresses RTbug #1877.
885    
886            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
887    
888            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
889            optimize if a raster layer is visible. Fixes RTbug #1931.
890            Only draw the raster layer if the gdal library is available.
891            Addresses RTbug #1877.
892    
893            * test/test_classgen.py: Add tests for generate_singletons,
894            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
895            (test_calculate_quantiles): Fix some tests to catch the new
896            ValueError that is raised.
897    
898            * test/test_proj.py: Use renamed projection resource functions.
899    
900            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
901            test for saving classified layers. Fixes RTbug #1902.
902            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
903    
904    2003-06-12  Jan-Oliver Wagner <[email protected]>
905    
906            Fix for http://intevation.de/rt/webrt?serial_num=1900.
907    
908            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
909    
910            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
911            multiplechoicedialog.py rather than from the wxPython library.
912    
913    2003-06-11  Frank Koormann  <[email protected]>
914    
915            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
916            update.
917    
918    2003-06-11  Frank Koormann  <[email protected]>
919    
920            * Thuban/Lib/fileutil.py (get_application_dir): New function to
921            determine the absolute .thuban/thuban directory under
922            "posix" (os.expanduser) and "nt" (read AppData registry key).
923    
924            * Thuban/Model/resource.py: Use get_application_dir
925    
926            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
927            Use get_application_dir.
928    
929    2003-06-10  Bernhard Herzog  <[email protected]>
930    
931            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
932            the messages MAP_LAYERS_REMOVED messages
933            (LayerTableFrame.OnClose): Unsubscribe from it.
934            (LayerTableFrame.map_layers_removed): New. Receiver for
935            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
936            dialog is showing is removed.
937    
938    2003-06-10  Bernhard Herzog  <[email protected]>
939    
940            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
941            of the receivers list so that unsubscribing in a receiver doesn't
942            modify it while iterating over it.
943    
944            * test/test_connector.py
945            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
946            unsubscribing in a receiver works correctly. See docstring for
947            details
948    
949    2003-06-10  Bernhard Herzog  <[email protected]>
950    
951            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
952            message.
953    
954            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
955            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
956            LAYER_CHANGED will still be sent if the classification changes.
957    
958            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
959            parameter so we can subscribe to some of its messages
960            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
961            and the layer's LAYER_SHAPESTORE_REPLACED
962            (Classifier.unsubscribe_messages): New. Unsubscribe from message
963            subscribed to in __init__
964            (Classifier.map_layers_removed)
965            (Classifier.layer_shapestore_replaced): receivers for the messages
966            subscribed to in __init__. Unsubscribe and close the dialog
967    
968            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
969            the map to the Classifier dialog
970    
971            * test/test_layer.py (SetShapeStoreTests): Derive from
972            SubscriberMixin as well so we can test messages
973            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
974            messages
975            (SetShapeStoreTests.tearDown): Clear the messages again
976            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
977            for the modified flag too
978            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
979            to check whether SetShapeStore sets the modified flag
980            (SetShapeStoreTests.test_set_shape_store_different_field_name)
981            (SetShapeStoreTests.test_set_shape_store_same_field)
982            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
983            Add tests for the messages. This checks both the new
984            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
985    
986    2003-06-06  Jan-Oliver Wagner <[email protected]>
987    
988            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
989            the menu items.
990    
991    2003-06-05  Frank Koormann  <[email protected]>
992    
993            * Thuban/UI/identifyview.py (IdentifyView.__init__):
994            Layout reimplemented without panel. Make life easier to fit the list
995            in the dialog.
996    
997    2003-06-05  Frank Koormann  <[email protected]>
998    
999            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
1000            once on initialisation (Former implementation resulted in multiple
1001            entries for each projection).
1002            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
1003            if set, select the projection found under the specified name. This
1004            overwrites any other selection estimate.
1005            Removed projchoice filling from this method.
1006            (ProjFrame._OnSave, ProjFrame._OnAddToList):
1007            Updated call of ProjFrame.__FillAvailList
1008            (LCCPanel._DoLayout): Moved parameter controls in more common order.
1009    
1010            * Resources/Projections/defaults.proj: Extended defaults representing
1011            various common European projections.
1012    
1013    2003-06-05  Frank Koormann  <[email protected]>
1014    
1015            * Thuban/UI/identifyview.py (IdentifyView.__init__):
1016            Use ListCtrl instead of GridCtrl
1017    
1018            * Thuban/Model/resource.py:
1019            Guess location of .thuban directory from tempdir parent directory.
1020    
1021            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
1022            Guess location of .thuban directory from tempdir parent directory.
1023    
1024    2003-06-04  Bernhard Herzog  <[email protected]>
1025    
1026            Do not cache the values returned by the tree widget's
1027            GetFirstChild and GetNextChild methods because it led to lots of
1028            segfaults. The new way requires more brute force but is more
1029            reliable.
1030    
1031            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
1032            variable layer2id
1033            (LegendTree.find_layer): New method to do with brute force what
1034            layer2id tried to accomplish
1035            (LegendTree._OnMsgLayerChanged)
1036            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
1037            Use find_layer instead of layer2id
1038            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
1039            update layer2id anymore
1040            (LegendTree._OnMsgMapLayersRemoved)
1041            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
1042    
1043    2003-06-03  Thomas Koester  <[email protected]>
1044    
1045            * Thuban/Model/classgen.py (GenQuantiles0): New function.
1046    
1047    2003-06-02  Bernhard Herzog  <[email protected]>
1048    
1049            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
1050            New commands.
1051            (main_menu): Add the new commands.
1052            (MainWindow.TableRename): New. Implementation of the table_rename
1053            command.
1054            (MainWindow.RenameLayer): New. Implementation of the layer_rename
1055            command.
1056    
1057            * Thuban/Model/session.py (Session.AddTable): call self.changed to
1058            set the modified flag
1059    
1060            * test/test_session.py (TestSessionSimple.test_add_table): Test
1061            whether the modified flag is set properly
1062    
1063            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
1064            instead of issue so that the modified flags get updated.
1065    
1066            * test/test_base.py (SomeTitledObject): Derive from Modifiable
1067            instead of Publisher to reflect reality better and to accomodate
1068            the fact that SetTitle now calls changed instead of issue
1069    
1070    2003-06-02  Bernhard Herzog  <[email protected]>
1071    
1072            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
1073            acquisition has to happen before the try in a try-finally.
1074    
1075    2003-06-02  Bernhard Herzog  <[email protected]>
1076    
1077            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
1078            possible that a layer is removed that is not currently selected in
1079            the legend so don't check for this.
1080    
1081    2003-05-30  Bernhard Herzog  <[email protected]>
1082    
1083            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
1084            variables to None that have direct or indirect references to
1085            shapefiles or dbf files to make sure that they do go away and the
1086            files are closed.
1087    
1088    2003-05-30  Bernhard Herzog  <[email protected]>
1089    
1090            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
1091            availImgListIndices when a new image list is created
1092            
1093    2003-05-30  Bernhard Herzog  <[email protected]>
1094    
1095            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
1096            changing_selection to indicate whether the LegendTree code itself
1097            is currently changing the selection
1098            (LegendTree.normalize_selection): New method to normalize the
1099            selection by selecting the layer item even if the user clicked on
1100            the classification.
1101            (LegendTree._OnSelChanged): normalize the selection. This works
1102            around a bug in wx which doesn't keep track of the selection
1103            properly when subtrees are deleted.
1104    
1105    2003-05-30  Bernhard Herzog  <[email protected]>
1106    
1107            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
1108            maximum and minimum scale factors.
1109    
1110            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
1111            changes in classgen.py
1112    
1113    2003-05-30  Jonathan Coles   <[email protected]>
1114    
1115            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
1116            all the methods functions. Fixes RTBug #1903.
1117    
1118            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
1119            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
1120            RTBug #1907.
1121    
1122            * Thuban/UI/classgen.py: Use classgen functions that were part
1123            of the ClassGenerator class. Put try/finally blocks around
1124            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
1125            RTBug #1904.
1126    
1127            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
1128    
1129            * Thuban/UI/legend.py: The legend was cleared and repopulated any
1130            time something changed which caused some state to be lost such
1131            as which children were expanded or collapsed. Fixes RTBug #1901.
1132            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
1133            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
1134            the legend but not in the map.
1135            (LegendTree.__FillTree): Move main functionality out into smaller
1136            methods that can be used by other methods.
1137            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
1138            if they are available.
1139            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
1140            that we override the wxTreeCtrl method. Iterate over children
1141            and call __RemoveLayer.
1142            (LegendTree.__AddLayer): New. Add a new layer to the legend.
1143            (LegendTree.__RemoveLayer): Remove a layer from the legend.
1144            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
1145            Should only be called with the id of a layer branch.
1146            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
1147            Returns the root item or creates one if necessary.
1148    
1149            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
1150            ProjectRasterFile with tuple arguments instead of strings.
1151    
1152            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
1153            with try/finally. Fixes RTBug #1904.
1154    
1155            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
1156            with try/finally. Fixes RTBug #1904.
1157            (MapCanvas.FitSelectedToWindow): If a single point is selected
1158            simply center it on the display. Fixes RTBug #1849.
1159    
1160            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
1161            to be compiled as a standalone app. Now the code can only be
1162            called from Python which simplifies the parameter passing.
1163            (ProjectRasterFile): Handle Python arguments. Remove code that
1164            checks for a destination dataset. Add more clean up code.
1165    
1166            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
1167            TestMapWithContents.test_lower_layer_bottom):
1168            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
1169            Fixes RTBug #1907.
1170    
1171            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
1172            extent to the map when the legend is toggled. Fixes RTBug #1881.
1173    
1174    2003-05-29  Jan-Oliver Wagner <[email protected]>
1175    
1176            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
1177            unsubscribes all that is subcribed in __init__.
1178    
1179    2003-05-28  Bernhard Herzog  <[email protected]>
1180    
1181            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
1182            (MainWindow.CanDuplicateLayer): New methods to implement the
1183            Layer/Duplicate command.
1184            (layer_duplicate command): New.
1185            (main_menu): Add layer_duplicate to the Layer menu.
1186    
1187    2003-05-28  Bernhard Herzog  <[email protected]>
1188    
1189            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
1190            renderer so that NULL/None values get displayed differently (by a
1191            gray rectangle).
1192            (TableGrid.__init__): Override the default renderers
1193    
1194    2003-05-28  Bernhard Herzog  <[email protected]>
1195    
1196            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
1197            classification to "None" if the type of the field has changed.
1198    
1199            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
1200            test for the Layer.SetShapeStore method
1201    
1202    2003-05-28  Jan-Oliver Wagner <[email protected]>
1203    
1204            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
1205            does not necessarily have a filename).
1206    
1207    2003-05-28  Jan-Oliver Wagner <[email protected]>
1208    
1209            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
1210            sort the selection list for the dialog.
1211    
1212    2003-05-28  Frank Koormann  <[email protected]>
1213    
1214            * extensions/thuban/wxproj.cpp
1215            (project_point): Removed cast to int for projected point coordinates.
1216            (shape_centroid): Return last point if all polygon vertices fall
1217            to one point.
1218    
1219    2003-05-28  Bernhard Herzog  <[email protected]>
1220    
1221            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
1222            with layers that don't have shapestores, i.e. raster layers.
1223    
1224    2003-05-28  Bernhard Herzog  <[email protected]>
1225    
1226            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
1227            when determining the title from the filename.
1228    
1229            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
1230            reflect changes in the way the title is derived from the filename
1231    
1232    2003-05-28  Frank Koormann  <[email protected]>
1233    
1234            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
1235            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
1236    
1237    2003-05-27  Bernhard Herzog  <[email protected]>
1238    
1239            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
1240            delegate SelectedLayer.
1241            (MainWindow.LayerUnjoinTable): Implement.
1242            (_can_unjoin): New. Helper function for the sensitivity of the
1243            layer/unjoin command.
1244    
1245            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
1246            (DerivedShapeStore.OrigShapeStore): New. Return the original
1247            shapestore. Used to figure out how to unjoin.
1248            (DerivedShapeStore.Shapefile): Fix a typo.
1249    
1250    2003-05-27  Bernhard Herzog  <[email protected]>
1251    
1252            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
1253            well
1254            (JoinDialog.__init__): Use the layer parameter and only build the
1255            left choice when a layer is given
1256            (JoinDialog.OnJoin): Handle layer joins as well
1257            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
1258            that the user selects the "Select..." item. The sensitivitly
1259            updating is now in update_sensitivity
1260            (JoinDialog.y): New method to refactor the sensitivity update of
1261            the join button into its own method.
1262    
1263            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
1264    
1265    2003-05-27  Bernhard Herzog  <[email protected]>
1266    
1267            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
1268            iff there are unreferenced tables in the session
1269    
1270    2003-05-27  Bernhard Herzog  <[email protected]>
1271    
1272            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
1273    
1274            * Thuban/Model/session.py (Session.UnreferencedTables): New method
1275            to return tables that are not referenced by other tables or shape
1276            stores and can be removed.
1277            (Session.RemoveTable): Issue a TABLE_REMOVED message after
1278            removing the table
1279    
1280            * Thuban/UI/mainwindow.py: Remove unused imports
1281            (MainWindow.TableClose): Implement.
1282    
1283            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
1284            messages so that the frame will be automatically closed when a new
1285            session is opened or the table is removed.
1286            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
1287            __init__
1288            (TableFrame.close_on_session_replaced)
1289            (TableFrame.close_on_table_removed): New. Subscribers that close
1290            the window
1291    
1292            * test/test_session.py (TestSessionMessages.test_remove_table)
1293            (TestSessionSimple.test_remove_table): Move the test to
1294            TestSessionSimple and add test for the TABLE_REMOVED message
1295            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
1296            (TestSessionSimple.test_unreferenced_tables) New. Test for the
1297            UnreferencedTables method.
1298            (UnreferencedTablesTests): New. Class with some more sophisticated
1299            tests for UnreferencedTables.
1300    
1301    2003-05-27  Frank Koormann  <[email protected]>
1302    
1303            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
1304            display has some unwanted side effects. Removed again.
1305    
1306    2003-05-27  Frank Koormann  <[email protected]>
1307    
1308            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
1309    
1310            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
1311    
1312    2003-05-27  Jan-Oliver Wagner <[email protected]>
1313    
1314            * test/test_menu.py (MenuTest.test): Added test for
1315            Menu.RemoveItem().
1316    
1317            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
1318            the menu.
1319    
1320    2003-05-27  Frank Koormann  <[email protected]>
1321            
1322            Nonmodal dialogs without parent (i.e. they can fall behind the main
1323            window)
1324    
1325            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
1326            all dialogs in the dialogs dictionary and the canvas.
1327    
1328            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
1329            parent, i.e. can fall behind other windows.
1330            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
1331            dictionary before removing it.
1332    
1333            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
1334    
1335            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
1336            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
1337            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
1338    
1339    2003-05-27  Bernhard Herzog  <[email protected]>
1340    
1341            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
1342            tableview dialog
1343            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
1344            Also, don't use the table's titles as the dialog names. The titles
1345            aren't guaranteed to be unique.
1346            (MainWindow.TableOpen): Open a table view dialog after opening the
1347            table
1348    
1349    2003-05-27  Bernhard Herzog  <[email protected]>
1350    
1351            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
1352            effect can be achieved by simply closing the window showing the
1353            table.
1354            (MainWindow.TableHide): Removed.
1355            (main_menu): Removed "table_hide"
1356    
1357    2003-05-27  Frank Koormann  <[email protected]>
1358    
1359            Fix legend tree display problems under Win32
1360    
1361            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
1362            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
1363            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
1364    
1365            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
1366    
1367    2003-05-27  Jan-Oliver Wagner <[email protected]>
1368    
1369            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
1370            'after' now allows to insert separators almost anywhere in the menu.
1371    
1372    2003-05-27  Frank Koormann  <[email protected]>
1373    
1374            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
1375            "S" of selection box label to hint on hot key (Alt-S). Works under
1376            Win32 but is ignored under GTK.
1377    
1378    2003-05-26  Frank Koormann  <[email protected]>
1379    
1380            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
1381            Center Choices.
1382    
1383    2003-05-26  Bernhard Herzog  <[email protected]>
1384    
1385            Remove the Precision methods again. They're too DBF specific to be
1386            part of the table interface and they're only used in table_to_dbf
1387            anyway.
1388            
1389            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
1390            fixed precision of 12 for doubles.
1391            (TransientTableBase.Precision): Removed
1392            (AutoTransientTable.Width): Delegate to self.table.
1393    
1394            * Thuban/Model/table.py (DBFTable.Precision)
1395            (MemoryTable.Precision): Removed.
1396            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
1397            (table_to_dbf): Use a fixed precision of 12 for floats unless the
1398            column object specifies something else.
1399    
1400            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
1401            test for table_to_dbf
1402    
1403    2003-05-26  Bernhard Herzog  <[email protected]>
1404    
1405            * test/test_transientdb.py
1406            (TestTransientTable.run_iceland_political_tests): Fix a comment.
1407    
1408    2003-05-26  Bernhard Herzog  <[email protected]>
1409    
1410            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
1411            implementation. Mark parts of the file format strings for
1412            localization.
1413    
1414            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
1415            file and add the table to the tables managed by the session
1416    
1417            * test/test_session.py (TestSessionSimple.test_open_table_file):
1418            New. test case for OpenTableFile
1419    
1420    2003-05-26  Jan-Oliver Wagner <[email protected]>
1421    
1422            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
1423            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
1424            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
1425            Replace the true/false of wxWindows by True/False of Python 2.2.1.
1426    
1427    2003-05-26  Jan-Oliver Wagner <[email protected]>
1428    
1429            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
1430            already a selection present, update the grid accordingly.
1431    
1432            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
1433            resizeable and increase its initial size.
1434    
1435    2003-05-26  Frank Koormann  <[email protected]>
1436    
1437            Table export functionality
1438    
1439            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
1440            Return width (in characters) for a column.
1441            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
1442            (table_to_dbf): Write table to dbf file.
1443            (table_to_csv): Write table to csv file.
1444    
1445            * Thuban/Model/transientdb.py (TransientTableBase.Width,
1446            TransientTableBase.Precision): Return column width and precision.
1447    
1448            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
1449            or table_to_csv depending on file selection.
1450    
1451            * test/test_dbf_table.py:
1452            Test table_to_dbf (extension of former part of test).
1453    
1454            * test/test_csv_table.py:
1455            Test table_to_csv.
1456    
1457    2003-05-23  Jan-Oliver Wagner <[email protected]>
1458    
1459            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
1460            Use QueryTableFrame instead of TableFrame.
1461    
1462            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
1463            table window with 'Layer Table:' instead of 'Table:'.
1464    
1465    2003-05-23  Jan-Oliver Wagner <[email protected]>
1466    
1467            Give all tables a title via mix-in TitledObject.LayerShowTable
1468    
1469            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
1470            only if it exists.
1471    
1472            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
1473            and call its init-method with a default title. Remove Title() method.
1474    
1475            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
1476            AutoTransientTable): mix-in TitledObject and call its init-method with
1477            a default title. Remove Title() method.
1478    
1479    2003-05-23  Bernhard Herzog  <[email protected]>
1480    
1481            * Thuban/Model/session.py (Session.AddShapeStore): Define
1482            AddShapeStore analogously to AddTable.
1483    
1484            * test/test_session.py (TestSessionSimple.test_add_shapestore):
1485            New. Test for AddShapeStore
1486    
1487    2003-05-23  Jan-Oliver Wagner <[email protected]>
1488    
1489            Introducing QueryTableFrame and a very coarse ShowTable implementation.
1490    
1491            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
1492            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
1493            The latter implements the selection GUI without dependency on a layer.
1494            LayerTableFrame now is derived from QueryTableFrame and connects
1495            to a layer.
1496    
1497            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
1498            implementation that still needs work.
1499    
1500            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
1501    
1502    2003-05-22  Frank Koormann  <[email protected]>
1503    
1504            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
1505            Added "outer_join = False" as optional parameter.
1506            (TransientJoinedTable.create): If outer join is true, perform a
1507            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
1508            the left table. Records not matching are filled with 0 / None.
1509    
1510            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
1511            (JoinDialog.OnJoin): Consider outer join check box.
1512    
1513    2003-05-22  Bernhard Herzog  <[email protected]>
1514    
1515            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
1516            somewhat safer way. Storing the traceback in a local variable can
1517            lead to memory leaks
1518    
1519    2003-05-22  Bernhard Herzog  <[email protected]>
1520    
1521            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
1522            the wxMessageDialog's Destroy() method.
1523    
1524    2003-05-22  Frank Koormann  <[email protected]>
1525    
1526            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
1527            TransientTable.Title()
1528    
1529    2003-05-22  Frank Koormann  <[email protected]>
1530    
1531            Join Dialog, initial version.
1532    
1533            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
1534    
1535            * Thuban/UI/join.py (JoinDialog): Functional implementation of
1536            former framework. Renamed Table1/Table2 to LeftTable/RightTable
1537            in all occurences.
1538    
1539            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
1540            Typo fixed.
1541    
1542    2003-05-22  Bernhard Herzog  <[email protected]>
1543    
1544            Give the tables titles so that the GUI can display more meaningful
1545            names. For now the titles are fixed but depend on e.g. filenames
1546            or the titles of the joined tables.
1547    
1548            * Thuban/Model/transientdb.py (TransientTable.Title)
1549            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
1550    
1551            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
1552    
1553            * test/test_transientdb.py
1554            (TestTransientTable.test_auto_transient_table_title): New. Test
1555            for the Title method
1556            (TestTransientTable.test_transient_joined_table)
1557            (TestTransientTable.test_transient_table): Add test for the Title
1558            methods
1559    
1560            * test/test_memory_table.py (TestMemoryTable.test_title): New.
1561            Test for the Title method
1562    
1563            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
1564            the Title method
1565    
1566    2003-05-22  Bernhard Herzog  <[email protected]>
1567    
1568            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
1569            Provide a better way to destroy the layers
1570            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
1571            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
1572            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
1573            the new way to destroy the layers.
1574            (TestLayer.test_derived_store): New. Test for using a layer with a
1575            DerivedShapeStore
1576    
1577            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
1578            filename if the shape store actually has one.
1579    
1580    2003-05-22  Bernhard Herzog  <[email protected]>
1581    
1582            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
1583            for the filename
1584    
1585            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
1586            for the FileName method
1587            (TestDBFTableWriting.test_write): Fix spelling of filename
1588    
1589    2003-05-22  Thomas Koester  <[email protected]>
1590    
1591            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
1592            from SciParam that now really is immutable.
1593    
1594    2003-05-22  Frank Koormann  <[email protected]>
1595    
1596            Layer Top/Bottom placement added to legend.
1597    
1598            * Thuban/UI/legend.py
1599            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
1600            bound to tool events.
1601            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
1602            New, methods binding the event methods with the map methods.
1603    
1604            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
1605            layer at top/bottom of layer stack.
1606    
1607            * Resources/Bitmaps/top_layer.xpm: New button icon.
1608    
1609            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
1610    
1611    2003-05-22  Bernhard Herzog  <[email protected]>
1612    
1613            * Thuban/Model/session.py (Session.RemoveTable): New method to
1614            remove tables
1615    
1616            * test/test_session.py (TestSessionSimple.test_remove_table): New.
1617            Test for RemoveTable
1618    
1619    2003-05-22  Thomas Koester  <[email protected]>
1620    
1621            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
1622            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
1623    
1624    2003-05-22  Bernhard Herzog  <[email protected]>
1625    
1626            Implement a way to discover dependencies between tables and
1627            shapestores.
1628    
1629            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
1630            (TransientJoinedTable.Dependencies)
1631            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
1632            interface
1633            (TransientJoinedTable.__init__): Keep tack of the original table
1634            objects in addition to the corresponding transient tables.
1635    
1636            * Thuban/Model/table.py (DBFTable.Dependencies)
1637            (MemoryTable.Dependencies): New. Implement the dependencies
1638            interface
1639    
1640            * Thuban/Model/data.py (ShapeTable): New. Helper class for
1641            ShapefileStore
1642            (ShapefileStore.__init__): Use ShapeTable instead of
1643            AutoTransientTable
1644            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
1645            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
1646            methods for filename and type
1647            (ShapefileStore.Dependencies): New. Implement the dependencies
1648            interface
1649            (DerivedShapeStore): New class to replace SimpleStore. The main
1650            difference to SimpleStore is that it depends not on a shapefile
1651            but another shapestore which expresses the dependencies a bit
1652            better
1653            (SimpleStore.__init__): Add deprecation warning.
1654    
1655            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
1656            Test for the Dependencies method.
1657    
1658            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
1659            New. Test for the Dependencies method.
1660    
1661            * test/test_transientdb.py
1662            (TestTransientTable.test_auto_transient_table_dependencies): New.
1663            Test for the Dependencies method.
1664            (TestTransientTable.test_transient_joined_table): Add test for the
1665            Dependencies method.
1666    
1667            * test/test_session.py (TestSessionSimple.setUp)
1668            (TestSessionSimple.tearDown): New. Implement a better way to
1669            destroy the sessions.
1670            (TestSessionSimple.test_initial_state)
1671            (TestSessionSimple.test_add_table): Bind session to self.session
1672            so that it's destroyed by tearDown
1673            (TestSessionSimple.test_open_shapefile): New. Test for
1674            OpenShapefile and the object it returns
1675    
1676    2003-05-22  Bernhard Herzog  <[email protected]>
1677    
1678            * Thuban/Model/session.py (Session.AddTable): New method to
1679            register tables with the session.
1680            (Session.Tables): Return the tables registered with AddTable too.
1681    
1682            * test/test_session.py (TestSessionSimple.test_add_table): New.
1683            Test case for the AddTable method
1684    
1685    2003-05-22  Frank Koormann  <[email protected]>
1686    
1687            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
1688            lower right corner, center labels for selections, initialize controls
1689            in reasonable order for keyboard navigation.
1690    
1691            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
1692            (ProjFrame.__DoOnProjAvail): Determine position of current projection
1693            using the wxListBox.FindString() method. Still a problem (#1886)
1694    
1695            * Thuban/UI/classifier.py
1696            (Classifier.__init__, SelectPropertiesDialog.__init__)
1697    
1698            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
1699            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
1700            different classification types from here to __init__.
1701            (GenUniquePanel.__init__): Set the column width of the first field
1702            in the Field ListCtrl to the full width.
1703    
1704            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
1705            Button to 'Export'. Center Buttons in Selection Box, set Focus to
1706            Grid.
1707            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
1708            changes focus to the Selection when pressing "Alt-S".
1709    
1710            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
1711            the text if not visible. The italic font sometimes exceeds the
1712            rendering area.
1713    
1714    2003-05-21  Jonathan Coles   <[email protected]>
1715    
1716            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
1717            to OnClose so that Thuban closes correctly.
1718    
1719            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
1720            DockFrame.OnClose, not DockFrame._OnClose.
1721    
1722    2003-05-21  Jonathan Coles   <[email protected]>
1723    
1724            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
1725            references to 'inf' and use new Range __init__ to pass floats
1726            directly rather than converting them to strings first.
1727            Fixes RTBug #1876.
1728    
1729            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
1730            Use new Range ___init__ to pass floats.
1731    
1732            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
1733            filename is a valid image file. Throw IOError otherwise.
1734    
1735            * Thuban/Model/range.py: Brought over new Range from SciParam that
1736            is immutable and has an __init__ which can accept floats.
1737    
1738            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
1739            into try block. AddLayer doesn't throw any exceptions anymore.
1740            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
1741            try block.
1742    
1743            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
1744            the first item in choices. Fixes RTBug #1882.
1745    
1746            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
1747            has gone to 0 which is a serious problem. abort.
1748            (MapRenderer.draw_raster_layer): Catch IOError seperately and
1749            print the error from GDAL.
1750    
1751            * Thuban/UI/tableview.py (TableGrid.__init__): Call
1752            ToggleEventListeners to turn on listening.
1753            (TableGrid.ToggleEventListeners): New. Turns event listening on
1754            and off so as to prevent excessive messages.
1755            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
1756            to suppress excessive messages when selecting many rows.
1757            Fixes RTBug #1880.
1758    
1759            * Thuban/UI/view.py: Added checks against if scale == 0. This
1760            is a serious problem that can occur when an image without
1761            geo data is loading and causes the map projection bounds to
1762            go to infinity. Right now, the solution is to simply try
1763            to recover.
1764    
1765            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
1766            to set the MFILEReceiver attributes even if the data is NULL.
1767    
1768            * extensions/thuban/gdalwarp.cpp: Improved the error handling
1769            and passed GDAL messages back up to the Python layer. Also
1770            tried to fix some memory leaks that were present in the original
1771            utility but didn't matter because the program aborted.
1772    
1773            * test/test_range.py: Copied over tests from SciParam. Removed
1774            tests against importing. Fixes RTBug #1867.
1775    
1776    2003-05-21  Bernhard Herzog  <[email protected]>
1777    
1778            * test/test_load.py: Remove unused imports and restructure the
1779            test code
1780            (LoadSessionTest): Split into one class for each test and turn
1781            LoadSessionTest itself into the base class for all such session
1782            tests.
1783            (ClassificationTest): New base class for load tests that test
1784            classifications
1785            (TestSingleLayer, TestLayerVisibility, TestClassification)
1786            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
1787            for the individual tests
1788    
1789            * test/support.py (FileLoadTestCase.filename): New base class for
1790            file loading tests
1791    
1792    2003-05-21  Jan-Oliver Wagner <[email protected]>
1793    
1794            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
1795            Mercator' to 'UTM Zone 32' as a more convenient example.
1796            Added 'Gauss Krueger Zone 6'.
1797    
1798            * Data/iceland_sample_raster.thuban: political polygon now
1799            filled transparent to have the raster image visible at once.
1800    
1801    2003-05-21  Frank Koormann  <[email protected]>
1802    
1803            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
1804            OnClose() to keep in sync with extensions. Internally Thuban
1805            still uses "underscored" names.
1806    
1807    2003-05-20  Jonathan Coles   <[email protected]>
1808    
1809            This puts back Raster layer support. These layers support projections
1810            through the GDAL library. Currently, the CVS version is being used.
1811            There are no Debian packages available although this may change soon.
1812            A GDAL driver was extended to support writing to memory rather to
1813            files.
1814    
1815            There is still some work that needs to be done, such as some error
1816            handling when loading invalid images or when there is a problem
1817            projecting the image. This putback simply checks in the majority
1818            of the work.
1819    
1820            * setup.py: Add gdalwarp library extension.
1821    
1822            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
1823            Defaults to False, but can be overridden by subclasses if they
1824            support classification.
1825            (RasterLayer): New. Defines a new layer that represents an
1826            image.
1827    
1828            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
1829            tag handler.
1830            (SessionLoader.start_layer): Encode the filename.
1831            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
1832            New. Supports reading a rasterlayer tag.
1833    
1834            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
1835    
1836            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
1837            get a string in Latin1. If we get such as string convert it to
1838            unicode first, otherwise leave if alone before encoding.
1839            (SessionSaver.write_layer): Add support for writing both Layers
1840            and RasterLayers.
1841    
1842            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1843            The right argument may not be a string, it could also be a Column.
1844    
1845            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
1846            Make initial window size 600x400. Fixes RTBug #1872.
1847    
1848            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
1849            the dialog is constructed so that we can support layers that
1850            do not have classifications.
1851            (Classifier._OnTry): Only build a classification if the layer
1852            supports one.
1853    
1854            * Thuban/UI/legend.py: Change all checks that a layer is an
1855            instance of Layer into checks against BaseLayer.
1856            (LegendTree.__FillTreeLayer): Only add children to a branch if
1857            the layer supports classification.
1858    
1859            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
1860            MainWindow.OpenSession): Don't proceed with an action if the
1861            user chooses Cancel when they are asked to save changes.
1862            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
1863            user to select an image file. Create a new RasterLayer and add
1864            it to the map.
1865    
1866            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
1867            for rendering RasterLayer layers.
1868            (MapRenderer.draw_raster_layer): Actually method that calls
1869            the GDALWarp python wrapper and constructs an image from the
1870            data returned.
1871    
1872            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
1873            Choices symbols to match those used in the table query method.
1874            Replace deprecated method calls on table with new method names.
1875    
1876            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
1877            how small the scale can get. This still needs more testing.
1878    
1879            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
1880            Provides a driver to output in .bmp format.
1881    
1882            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
1883            New. Provides IO routines which write to memory, rather than a file.
1884    
1885            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
1886            of the gdalwarp utility provided in GDAL. Added function calls
1887            that can be accessed from python.
1888    
1889            * Data/iceland_sample_raster.thuban: New. Sample file that uses
1890            a raster layer.
1891    
1892            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
1893            layer image data.
1894    
1895            * Doc/thuban.dtd: Added rasterlayer attribute definition.
1896    
1897            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
1898            tests associated with the raster layer code.
1899    
1900            * test/test_transientdb.py
1901            (TestTransientTable.test_auto_transient_table_query): Added a test
1902            for using a Column object as the "right" parameter to a query.
1903    
1904    2003-05-19  Frank Koormann  <[email protected]>
1905    
1906            * Thuban/version.py (get_changelog_date):
1907            Catch exceptions if ChangeLog does not exist.
1908    
1909            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
1910    
1911    2003-05-19  Frank Koormann  <[email protected]>
1912    
1913            Extended version information for Thuban
1914    
1915            * Thuban/version.py: New, version information for Thuban: Last
1916            modification date and last ChangeLog entry date.
1917    
1918            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
1919            information: Display Thuban, wxPython and Python version.
1920    
1921    2003-05-16  Bernhard Herzog  <[email protected]>
1922    
1923            * Thuban/Model/save.py: Remove some unused imports including the
1924            __future__ import for nested_scopes as Thuban relies on Python 2.2
1925            now.
1926            (XMLWriter.encode): Remove the special case for a None argument.
1927            In the saver encode is always called with a string argument.
1928    
1929    2003-05-16  Bernhard Herzog  <[email protected]>
1930    
1931            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
1932            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
1933            of the bug was that e.g. float("1.2") would fail. Thuban now
1934            requires 2.4.x.
1935            
1936    2003-05-16  Frank Koormann   <[email protected]>
1937    
1938            Printing enhancement and WMF export (under Win32)
1939    
1940            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
1941            ScreenRenderer. Renders Map, Legend and Scalebar for export.
1942            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
1943            PrintRender.
1944    
1945            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
1946            to fullfil information needed for PrinterRenderer.
1947            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
1948            (MapCanvas.Print): Adapted to new MapPrintout.
1949            (OutputTransform): General calculations to transform from canvas
1950            coordinates to export/printing devices.
1951    
1952            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
1953            new method_command to call ExportMap, with platform dependency (only
1954            __WXMSW__)
1955      
1956            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
1957            of scalebar drawing area as new parameters.
1958            
1959            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
1960    
1961            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
1962            Update to extended scalebar.DrawScalebar header.
1963    
1964            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
1965    
1966            * test/test_scalebar.py: Made test executable as standalone.
1967    
1968    2003-05-16  Bernhard Herzog  <[email protected]>
1969    
1970            * Thuban/Model/table.py (Table): Remove this compatibility alias
1971            for DBFTable.
1972    
1973            * test/test_table.py: Import DBFTable as Table because that alias
1974            doesn't exist anymore.
1975    
1976            * Thuban/UI/classgen.py: Remove some unused imports
1977    
1978    2003-05-14  Jonathan Coles   <[email protected]>
1979    
1980            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
1981            Fix docstring.
1982            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
1983            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
1984            values of the supplied range to determine the beginning and end
1985            bounds of the generated classes.
1986    
1987            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
1988            do not have a leading 0 (.5 is now accepted as well as 0.5).
1989    
1990            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
1991            call to ClassGenerator.GenUniformDistribution.
1992    
1993            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
1994            layout bug with the 'Projection' label.
1995    
1996            * test/support.py (FloatTestCase): New. Needed for the Range tests.
1997    
1998            * test/test_range.py: New. Imported from SciParam.
1999    
2000    2003-05-12  Jonathan Coles   <[email protected]>
2001    
2002            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
2003            to table.UniqueValues() with calls that retrieve all the values
2004            from the table. This will need to be replaced by a method on table
2005            which can simply return the list (perhaps more efficiently).
2006    
2007    2003-05-12  Jonathan Coles   <[email protected]>
2008    
2009            The return value of ClassGenerator.CalculateQuantiles has changed.
2010            Refer to the documentation for details.
2011    
2012            * test/test_classgen.py: Modified Quantile tests to use the
2013            new return values.
2014    
2015            * Thuban/Model/classgen.py
2016            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
2017            use new return values from CalculateQuantiles to produce the correct
2018            range bounds in the Classification.
2019            (ClassGenerator.CalculateQuantiles): Add more comments describing
2020            the return values and parameters. Make minor adjustments to improve
2021            the legibility of the code. Fix problem with adjusted not being set
2022            in most cases.
2023    
2024    2003-05-12  Frank Koormann <[email protected]>
2025            
2026            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
2027            and latin1. Fixes #1851 finally.
2028    
2029    2003-05-09  Jonathan Coles   <[email protected]>
2030    
2031            * test/test_classgen.py: New. Tests the Quantile algorithm.
2032    
2033            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
2034            Clean up debugging statement, add comments, fix a small bug in the
2035            returned adjusted percentiles.
2036            
2037    2003-05-09  Jonathan Coles   <[email protected]>
2038    
2039            Introduces Range class from SciParam into the ClassGroupRange class,
2040            and such ranges can now be saved and loaded from disk.
2041    
2042            Quantiles are now available in the Classification Generator.
2043    
2044            Initial support for building Queries on a table. Doesn't do anything
2045            but run some tests.
2046    
2047            * Thuban/Model/classification.py: Explicit imports.
2048            (ClassGroupRange): Use the Range class to store the underlying
2049            range information. The interface remains the same, except for
2050            GetRange(), and you can also supply a Range object as the min
2051            parameter to SetRange or __init__.
2052    
2053            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
2054            string appropriately for use in Thuban. Fixes RTbug #1851.
2055            (SessionLoader.end_projection): Handle the context of the
2056            projection tag a bit better by looking at what objects are not
2057            None. There was an assumption that a projection tag for a map
2058            could occur before any layers.
2059            (SessionLoader.start_clrange): Provide backward compatibility for
2060            reading min/max values as well as the new range parameter.
2061    
2062            * Thuban/Model/map.py: Explicit imports.
2063    
2064            * Thuban/Model/resource.py: Import _.
2065            (ProjFileSaver.write): write header using projfile.dtd.
2066    
2067            * Thuban/Model/save.py: Explicit imports.
2068            (XMLWriter.encode): New. Encode the given string from a format
2069            used by Thuban into UTF-8. Fixes RTbug #1851.
2070    
2071            * Thuban/UI/classgen.py: Explicit imports.
2072            (ClassGenDialog.__init__): Clean up the code and add support
2073            for Quantiles.
2074            (ClassGenDialog.OnOK): Add support for Quantiles.
2075            (GenQuantilesPanel): New. Input panel for Quantiles.
2076            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
2077            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
2078    
2079            * Thuban/Model/classgen.py: New. Contains all the classes named above.
2080    
2081            * Thuban/UI/classifier.py: Explicit imports.
2082            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
2083            ClassTable.SetValueAsCustom): Reworked to use new Range class.
2084    
2085            * Thuban/UI/legend.py: Explicit imports.
2086    
2087            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
2088            a Table menu and associated method calls.
2089            (MainWindow.choose_color): Removed. No longer needed.
2090    
2091            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
2092            should be disabled if no projection is selected in the available
2093            list.
2094    
2095            * Thuban/UI/renderer.py: Explicit imports.
2096    
2097            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
2098            with correctly selecting the rows and issuing the right events.
2099            Be sure to call Skip() to allow the grid to do some of its own
2100            handling which allows the rows to actually be selected.
2101            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
2102            selecting multiple shapes.
2103            (LayerTableFrame): Support for building Queries.
2104            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
2105    
2106            * Thuban/UI/tree.py: Explicit imports.
2107    
2108            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
2109            table view can call it.
2110    
2111            * test/test_classification.py: Explicit imports.
2112            (TestClassification.test_ClassGroupRange): Fix test for new
2113            Range class.
2114    
2115            * Doc/thuban.dtd: Add range parameter for clrange.
2116    
2117            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
2118            object in ClassGroupRange, and also uesd for inputting ranges in
2119            the classifer table and elsewhere.
2120    
2121            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
2122            yet.
2123    
2124    2003-05-09  Frank Koormann <[email protected]>
2125    
2126            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
2127    
2128    2003-05-08  Frank Koormann <[email protected]>
2129    
2130            Coding style updates
2131    
2132            * test/test_scalebar.py: Replaced tab indentation by spaces.
2133    
2134            * Thuban/UI/scalebar.py: Explicit imports.
2135    
2136    2003-05-08  Frank Koormann <[email protected]>
2137    
2138            * Thuban/UI/scalebar.py
2139            (ScaleBar.DrawScalebar): Format string bug fixed.
2140    
2141    2003-05-08  Frank Koormann <[email protected]>
2142    
2143            Reorganization of scalebar component (no wx in Thuban/Model)
2144    
2145            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
2146            (deriveInterval):
2147            Calculate scalebar interval and unit which fits in width for scale.
2148            (roundInterval): Round float.
2149    
2150            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
2151    
2152            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
2153    
2154            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
2155    
2156    2003-05-08  Frank Koormann <[email protected]>
2157    
2158            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
2159            Initialize ScaleBar with canvas.map
2160    
2161            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
2162            round intervals to display smarter lengths
2163            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
2164            layer. If the maps has no projection applied grey the scalebar.
2165    
2166    2003-05-07  Frank Koormann <[email protected]>
2167            
2168            Basic Scalebar features added.
2169    
2170            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
2171    
2172            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
2173            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
2174            and the renderer.
2175    
2176            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
2177    
2178            * Thuban/UI/messages.py: SCALE_CHANGED added.
2179    
2180    2003-05-07  Bernhard Herzog  <[email protected]>
2181    
2182            * Thuban/Model/session.py (Session.__init__): New instance
2183            variable shapestores to hold a list of all open shapestore objects
2184            (Session.ShapeStores): New. Accessor method for the shapestores
2185            list.
2186            (Session._add_shapestore, Session._clean_weak_store_refs): New.
2187            Internal methods to maintain the shapestores list.
2188            (Session.Tables): New. Return all tables open in the session.
2189            (Session.OpenShapefile): Insert the new ShapeStore into the
2190            shapestores list.
2191    
2192            * test/test_session.py (TestSessionSimple.test_initial_state): Add
2193            tests for ShapeStores and Tables
2194            (TestSessionWithContent.test_shape_stores)
2195            (TestSessionWithContent.test_tables): New. Test cases for
2196            ShapeStores and Tables
2197    
2198    2003-05-07  Bernhard Herzog  <[email protected]>
2199    
2200            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
2201            Add comments about the optimizations used.
2202            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
2203            Implement the ReadValue table interface method.
2204    
2205            * test/test_transientdb.py
2206            (TestTransientTable.run_iceland_political_tests)
2207            (TestTransientTable.test_transient_joined_table): Add tests for
2208            ReadValue
2209    
2210    2003-05-07  Frank Koormann <[email protected]>
2211    
2212            * Resources/Bitmaps/fulllayerextent.xpm,
2213            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
2214            new icons.
2215    
2216    2003-05-06  Bernhard Herzog  <[email protected]>
2217    
2218            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
2219            New. Simply delegate to the transient table's version.
2220    
2221            * test/test_transientdb.py
2222            (TestTransientTable.test_auto_transient_table_query): New. Test
2223            case for AutoTransientTable's SimpleQuery
2224    
2225    2003-05-06  Bernhard Herzog  <[email protected]>
2226    
2227            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
2228            Implement a simple query method for the query dialog
2229            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
2230            the row index or shapeid.
2231            (TransientTable.create): Insert the right value of the row index
2232            (TransientJoinedTable.create): Copy the row index of the left
2233            table to the joined result table
2234    
2235            * test/test_transientdb.py
2236            (TestTransientTable.test_transient_table_read_twice): Fix
2237            doc-string
2238            (TestTransientTable.test_transient_table_query): New. Test for the
2239            SimpleQuery method
2240    
2241    2003-05-06  Bernhard Herzog  <[email protected]>
2242    
2243            Convert all table users to use the new table interface. This only
2244            covers Thuban itself, not GREAT-ER or other applications built on
2245            Thuban yet, so the compatibility interface stays in place for the
2246            time being but it now issues DeprecationWarnings.
2247    
2248            Finally, the new Table interface has a new method, HasColumn.
2249    
2250            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
2251            issue deprecation warnings when they're. The warnings refer to the
2252            caller of the method.
2253            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
2254            for the deprecation warnings
2255    
2256            * test/test_table.py: Ignore the deprecation warnings for the old
2257            table in the tests in this module. The purpose of the tests is to
2258            test the old interface, after all.
2259    
2260            * test/test_transientdb.py
2261            (TestTransientTable.run_iceland_political_tests): Use the
2262            constants for the types. Add a test for HasColumn
2263            (TestTransientTable.test_transient_joined_table): Adapt to new
2264            table interface. Add a test for HasColumn
2265            (TestTransientTable.test_transient_table_read_twice): Adapt to new
2266            table interface
2267    
2268            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
2269            Adapt to new table interface
2270    
2271            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
2272            new table interface
2273    
2274            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
2275            (RecordTable.SetTable): Adapt to new table interface
2276    
2277            * Thuban/UI/classifier.py (Classifier.__init__)
2278            (Classifier.__init__): Adapt to new table interface
2279    
2280            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
2281            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
2282            to new table interface
2283    
2284            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
2285            (AutoTransientTable.HasColumn): Implement the new table interface
2286            method
2287            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
2288            (AutoTransientTable.UniqueValues): Adapt to new table interface
2289    
2290            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
2291            Adapt to new table interface
2292    
2293            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
2294            simplify opening shapefiles a bit easier.
2295            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2296            (TestLayer.test_point_layer): Use the new helper method
2297            (TestLayer.test_get_field_type): New. Test for the GetFieldType
2298            method
2299    
2300            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
2301            the new table method
2302    
2303            * test/test_memory_table.py (TestMemoryTable.test_has_column):
2304            Test for the new table method HasColumn
2305    
2306    2003-05-06  Jonathan Coles   <[email protected]>
2307    
2308            Addresses the "Selection Extent" wish of RTbug #1787.
2309    
2310            * Resources/Bitmaps/fulllayerextent.xpm,
2311            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
2312            extent. These are just place holders for the real bitmaps.
2313    
2314            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
2315            calculate the bounding box once (the first time compute_bbox() is
2316            called).
2317            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
2318            the bounding box for the shapes in lat/long coordinates.
2319    
2320            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
2321            option.
2322            (MainWindow.has_selected_shapes): New. Returns true if there are
2323            any selected shapes.
2324            (MainWindow.FullSelectionExtent): New. Calls
2325            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
2326            (_has_selected_shapes): New. Returns true if there are any
2327            selected shapes.
2328    
2329            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
2330            true if there are any selected shapes.
2331    
2332            * Thuban/UI/view.py (MapCanvas): Added delegated method
2333            HasSelectedShapes.
2334            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
2335            shapes on the canvas using the map projection (if any).
2336    
2337            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
2338            for Layer.ShapesBoundingBox().
2339    
2340    2003-05-06  Bernhard Herzog  <[email protected]>
2341    
2342            * Resources/Projections/defaults.proj: Fix spelling of Mercator
2343    
2344    2003-05-05  Jonathan Coles   <[email protected]>
2345    
2346            Addresses the "Full Layer Extent" wish of RTbug #1787.
2347    
2348            * Resources/Projections/defaults.proj: Added UK National Grid.
2349    
2350            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
2351            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
2352            when the user selects the menu option.
2353    
2354            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
2355            scales the given layer on the canvas using the map projection.
2356    
2357    2003-05-05  Bernhard Herzog  <[email protected]>
2358    
2359            Convert the table implementations to a new table interface. All
2360            tables use a common mixin class to provide backwards compatibility
2361            until all table users have been updated.
2362    
2363            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
2364            provide backwards compatibility for table classes implementing the
2365            new interface
2366            (DBFTable, MemoryTable): Implement the new table interface. Use
2367            OldTableInterfaceMixin as base for compatibility
2368            (DBFColumn, MemoryColumn): New. Column description for DBFTable
2369            and MemoryTable resp.
2370    
2371            * test/test_dbf_table.py: New. Test cases for the DBFTable with
2372            the new table interface.
2373    
2374            * test/test_memory_table.py: New. Test cases for the MemoryTable
2375            with the new table interface.
2376    
2377            * test/test_table.py: Document the all tests in this file as only
2378            for backwards compatibility. The equivalent tests for the new
2379            interface are in test_memory_table.py and test_dbf_table.py
2380            (MemoryTableTest.test_read): field_info should be returning tuples
2381            with four items
2382            (MemoryTableTest.test_write): Make doc-string a more precise.
2383    
2384            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
2385            table interface. Derive from from OldTableInterfaceMixin for
2386            compatibility.
2387            (TransientTableBase.create): New intance variable column_map to
2388            map from names and indices to column objects
2389            (TransientTable.create): Use the new table interface of the input
2390            table
2391            (AutoTransientTable): Convert to new table interface. Derive from
2392            from OldTableInterfaceMixin for compatibility.
2393            (AutoTransientTable.write_record): Removed. It's not implemented
2394            yet and we still have to decide how to handle writing with the new
2395            table and data framework.
2396    
2397            * test/test_transientdb.py
2398            (TestTransientTable.run_iceland_political_tests)
2399            (TestTransientTable.test_transient_joined_table): Use the new
2400            table interface
2401    
2402    2003-05-05  Jonathan Coles   <[email protected]>
2403    
2404            This is namely a collection of UI updates to improve user interactivity.
2405            Tabbing between controls now exists and you can use ESC to close dialog
2406            boxes; ENTER will active the default button.
2407    
2408            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
2409            order that the controls are created so that tabbing works correctly.
2410            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
2411            wxDialog can handle the default button correctly.
2412            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
2413            same reasons as for OnOK.
2414            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
2415            when we ask the table for the maximum/minimum values of a field
2416            which could take a very long time.
2417    
2418            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
2419            order that the controls are created so that tabbing works correctly.
2420            (SelectPropertiesDialog.__init__): Rearrange the order that the
2421            controls are created so that tabbing works correctly.
2422    
2423            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
2424            to derive from a wxDialog but behave like the original implementation
2425            which was derived from a wxFrame. wxDialog provides useful key
2426            handling functionality like ESC calling OnCancel and ENTER calling
2427            OnOK which is lost with wxFrame.
2428    
2429            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
2430            new dialogs.
2431    
2432            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
2433            order that the controls are created so that tabbing works correctly.
2434            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
2435            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
2436            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
2437            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
2438            can provide the "UK National Grid" as a default projection.
2439            (UTMPanel.__init__): Rearrange the order that the controls are
2440            created so that tabbing works correctly.
2441    
2442    2003-05-05  Bernhard Herzog  <[email protected]>
2443    
2444            * extensions/thuban/wxproj.cpp: Fix some of the comments.
2445            (project_point): If a map projection but no layer projection is
2446            given, convert degrees to radians before applying the map
2447            projection.
2448    
2449            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
2450            (TableGrid.allow_messages): New methods to make it possible to
2451            inhibit message sending.
2452            (TableGrid.issue): Only send the message if not inhibited.
2453            (LayerTableGrid.select_shape): Use the new methods to make sure
2454            that no ROW_SELECTED message is sent while we're updating the
2455            selected rows to match the selected shapes.
2456    
2457    2003-05-02  Jan-Oliver Wagner <[email protected]>
2458    
2459            Implementation of MemoryTable.
2460    
2461            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
2462            implementation that operates on a list of tuples. All of the data
2463            are kept in the memory.
2464    
2465            * test/test_table.py (MemoryTableTest): New.
2466    
2467            * test/test_transientdb.py (SimpleTable): Removed.
2468            (TestTransientTable.test_transient_joined_table,
2469            (TestTransientTable.test_transient_table_read_twice): Replaced
2470            SimpleTable by MemoryTable.
2471    
2472    2003-04-30  Jonathan Coles   <[email protected]>
2473    
2474            * Data/iceland_sample.thuban: Now contains correct projections
2475            for each of the layers.
2476    
2477            * Resources/Projections/defaults.proj: Geographic projection
2478            contains unit conversion parameter.
2479    
2480    2003-04-30  Jonathan Coles   <[email protected]>
2481    
2482            The most important part of this putback is the projection changes.
2483            It should now be possible to specify the projection that a layer
2484            is in and then specify a different projection for the map. The
2485            projection dialog has an extra parameter for a geographic projection
2486            which lets the user select if the input is in degrees or radians.
2487    
2488            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
2489            to say that the parameter is a tuple of unprojected
2490            points (which is what the callers to this method were assuming).
2491            Also, since the points are unprojected we need to projected them.
2492    
2493            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
2494            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
2495            groups are selected, move the layer up/down. Fixes RTbug #1833.
2496    
2497            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
2498    
2499            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
2500            parameter in call to SetClientData.
2501            (GeoPanel): Add support for selecting the units that the
2502            source data is in (Radians or Degrees).
2503    
2504            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
2505            the rendering loop by reducing the number of if's, removing the
2506            unnecessary try/except block, and checking if the old group
2507            is the same as the new one (which happens a lot if there is
2508            no classification, or lots of shapes are in the same group).
2509    
2510            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
2511            around the redraw routine to try to catch problems that the user
2512            may create by selecting invalid projections for the data set and
2513            map. Clears the display if there are any problems and prints the
2514            error.
2515            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
2516            rectangle.
2517    
2518            * extensions/thuban/wxproj.cpp (project_point): First invert the
2519            supplied point (which should be in projected coordinates) using
2520            the layer's projection and then project the point using the
2521            map's projection.
2522            (project_points): Use project_point() to project each point.
2523    
2524    2003-04-30  Jan-Oliver Wagner <[email protected]>
2525    
2526            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
2527            don't set the Classification to None if the classfication field
2528            is None (ie only a DEFAULT).
2529    
2530    2003-04-30  Bernhard Herzog  <[email protected]>
2531    
2532            * Thuban/UI/view.py: Fix some typos.
2533    
2534            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
2535            not pop up the dialog if the selection becomes empty (this could
2536            happen if e.g. a new selection is opened while the identify tool
2537            is active and dialog had been closed)
2538    
2539    2003-04-30  Bernhard Herzog  <[email protected]>
2540    
2541            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
2542            instance variable read_record_last_result
2543            (TransientTableBase.read_record): Make sure reading the same
2544            record twice works. The implementation uses the new instance
2545            variable read_record_last_result
2546    
2547            * test/test_transientdb.py
2548            (TestTransientTable.test_transient_table_read_twice): New test
2549            case for the above bug-fix.
2550    
2551    2003-04-29  Jonathan Coles   <[email protected]>
2552    
2553            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
2554    
2555            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
2556    
2557            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
2558            (ClassTable.SetValueAsCustom): Rename keyword argument in
2559            ClassGroup* constructors to match argument name.
2560    
2561    2003-04-29  Bernhard Herzog  <[email protected]>
2562    
2563            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
2564            transient DB if it exists to make sure it doesn't leave a journal
2565            file in the temp directory.
2566    
2567            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
2568            self.conn to None after closing the connection to make sure it's
2569            not closed twice
2570    
2571    2003-04-29  Jonathan Coles   <[email protected]>
2572    
2573            Add a visible parameter in the layer XML tag. The default value is
2574            "true". If anything other than "false" is specified we also assume
2575            "true". Addresses RTbug #1025.
2576    
2577            * Doc/thuban.dtd: Add visible parameter to a layer.
2578    
2579            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
2580            of visible from 1 to True.
2581            (Layer.__init__): Change default value of visible from 1 to True.
2582    
2583            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
2584            parameter.
2585    
2586            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
2587            parameter.
2588    
2589            * test/test_load.py: Add new test data contents_test_visible.
2590            (LoadSessionTest.setUp): save test data.
2591            (LoadSessionTest.testLayerVisibility): Test if the visible flag
2592            is loaded correctly.
2593    
2594            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
2595            for saving an invisible layer.
2596    
2597    2003-04-29  Jonathan Coles   <[email protected]>
2598    
2599            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
2600            legend dialog box and tell it to change its map to the one
2601            supplied to SetMap(). Fixes RTbug #1770.
2602    
2603    2003-04-29  Bernhard Herzog  <[email protected]>
2604    
2605            Next step of table implementation. Introduce a transient database
2606            using SQLite that some of the data is copied to on demand. This
2607            allows us to do joins and other operations that require an index
2608            for good performance with reasonable efficiency. Thuban now needs
2609            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
2610            haven't tested that.
2611            
2612            * Thuban/Model/transientdb.py: New. Transient database
2613            implementation.
2614    
2615            * test/test_transientdb.py: New. Tests for the transient DB
2616            classes.
2617    
2618            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
2619            classes to help automatically remove temporary files and
2620            directories.
2621            (Session.__init__): New instance variables temp_dir for the
2622            temporary directory and transient_db for the SQLite database
2623            (Session.temp_directory): New. Create a temporary directory if not
2624            yet done and return its name. Use AutoRemoveDir to have it
2625            automatically deleted
2626            (Session.TransientDB): Instantiate the transient database if not
2627            done yet and return it.
2628    
2629            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
2630            AutoTransientTable so that data is copied to the transient DB on
2631            demand.
2632            (SimpleStore): New class that simply combines a table and a
2633            shapefile
2634    
2635            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
2636            DBFTable and update its doc-string to reflect the fact that this
2637            is only the table interface to a DBF file. Table is now an alias
2638            for DBFTable for temporary backwards compatibility.
2639    
2640            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
2641            the last reference to the session goes away so that the temporary
2642            files are removed properly.
2643    
2644            * test/test_load.py (LoadSessionTest.tearDown): Remove the
2645            reference to the session to make sure the temporary files are
2646            removed.
2647    
2648    2003-04-29  Bernhard Herzog  <[email protected]>
2649    
2650            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
2651            the __parser instance variable into a normal local variable in
2652            read. It's only used there and read will never be called more than
2653            once. Plus it introduces a reference cycle that keeps can keep the
2654            session object alive for a long time.
2655    
2656    2003-04-29  Jonathan Coles   <[email protected]>
2657    
2658            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
2659            Projection an immutable item. Fixes RTbug #1825.
2660            (Projection.__init__): Initialize instance variables here.
2661            (ProjFile.Replace): New. Replace the given projection object with
2662            the new projection object. This solves the problem of needing the
2663            mutator Projection.SetProjection() in the ProjFrame class and
2664            allows a projection to change parameters without changing its
2665            location in the file.
2666    
2667            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
2668            be of type wxSAVE and should verify overwriting a file.
2669    
2670            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
2671            ProjFile.Replace() method instead of the mutator
2672            Projection.SetProjection(). Also requires that we reassign the
2673            client data to the new projection.
2674    
2675            * test/test_proj.py (TestProjection.test): Test GetName() and
2676            GetAllParameters()
2677            (TestProjFile.test): Remove tests for Set*() methods. Add tests
2678            for Replace().
2679    
2680    2003-04-25  Jonathan Coles   <[email protected]>
2681    
2682            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
2683            to save the name of the projection.
2684    
2685            * test/test_save.py (SaveSessionTest.testLayerProjection): New
2686            test to verify layer projections are saved correctly.
2687    
2688    2003-04-25  Jonathan Coles   <[email protected]>
2689    
2690            * Thuban/Model/proj.py (Projection.SetName): Set the name
2691            to "Unknown" if name is None.
2692            (Projection.SetAllParameters): New. Set the projection's
2693            parameter list to the one supplied.
2694            (Projection.SetProjection): New. Set the projection's
2695            properties to those of the supplied Projection.
2696    
2697            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
2698            the dialog title to include the map's title.
2699            (MainWindow.LayerProjection): Set the dialog title to include
2700            the layer's title.
2701    
2702            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
2703            error dialogs into a single method call.
2704            (ProjFrame.__VerifyButtons): Add more states to check.
2705            (ProjFrame.__GetProjection): Return the current state of an
2706            edited projection or None.
2707            (ProjFrame.__FillAvailList): Remove checks for states that
2708            shouldn't exist.
2709            (ProjFrame._OnNew): Clear all selected items and supply
2710            a projection panel if necessary.
2711    
2712            * test/test_proj.py (TestProjFile.test): Add tests for
2713            ProjFile.SetAllParameters, ProjFile.SetProjection,
2714            ProjFile.SetName.
2715    
2716    2003-04-25  Jonathan Coles   <[email protected]>
2717    
2718            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
2719            takes an optional argument to select the current projection.
2720            This does not guarantee that the item is visible due to
2721            limited wxWindows functionality. Fixes RTBug #1821.
2722    
2723    2003-04-25  Jonathan Coles   <[email protected]>
2724    
2725            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
2726            the projection name and use it when constructing the Projection
2727            object.
2728    
2729            * Thuban/Model/proj.py (Projection.__init__): Change the default
2730            value for 'name' to None and then test if name is equal to None
2731            in the body of the constructor. This way the caller doesn't have to
2732            know what the default value should be. Namely, useful in load.py
2733            where we have to pick a default value if the 'name' parameter
2734            doesn't exist in the XML file.
2735    
2736            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
2737            Tests a file where a layer has a projection.
2738    
2739    2003-04-25  Jonathan Coles   <[email protected]>
2740    
2741            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
2742            tree for projection information.
2743    
2744            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
2745            XMLReader.GetFileName.
2746            (SessionLoader): Added support for loading projection tags that
2747            appear inside a layer.
2748    
2749            * Thuban/Model/proj.py (ProjFile): Document the class. Move
2750            back to using a list because the order of the projections in
2751            the file is important to maintain. Fixes RTbug #1817.
2752    
2753            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
2754            to ProjFile.GetFilename.
2755    
2756            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
2757            information.
2758    
2759            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
2760            ProjFrame._OnSaveAs. Removed old dead code from previous
2761            implementation.
2762            (ProjFrame._OnExport): Add support for exporting more than one
2763            projection to a single file.
2764            (ProjFrame.__FillAvailList): use string formatting (% operator)
2765            to build strings that are (partly) translated. Fixes RTbug #1818.
2766    
2767            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
2768            class.
2769    
2770    2003-04-24  Bernhard Herzog  <[email protected]>
2771    
2772            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
2773    
2774            * po/fr.po: New. French translation by Daniel Calvelo Aros
2775    
2776            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
2777            empty strings.
2778    
2779    2003-04-24  Jonathan Coles   <[email protected]>
2780    
2781            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
2782            implement the interface that the ProjFrame dialog expects.
2783    
2784            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
2785            name of the projection to be changed.
2786            (ProjFile): Use a dictionary instead of a list so that removing
2787            projections is easier and we are sure about uniqueness.
2788            (ProjFile.Remove): Remove the given projection object.
2789    
2790            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
2791            Return a list with only one projection file instead of searching for
2792            any projection file. This simplifies many things if the user can
2793            only have one system file and one user file.
2794    
2795            * Thuban/UI/classgen.py: Change all references to
2796            genCombo to genChoice.
2797    
2798            * Thuban/UI/mainwindow.py: Add a Projection option under the
2799            layer menu.
2800            (MainWindow.LayerProjection): New. Open up a projection window
2801            for a layer.
2802    
2803            * Thuban/UI/projdialog.py: Large changes to how the dialog is
2804            laid out. Use three panels instead of one. One for the list of
2805            projections, one for the edit controls, and one for the buttons.
2806            Fixed resizing problems so that the dialog resizes correctly
2807            when the projection panel changes. Added import/export, save, and
2808            new buttons/functionality.
2809    
2810    2003-04-24  Bernhard Herzog  <[email protected]>
2811    
2812            First step towards table management. Introduce a simple data
2813            abstraction so that we replace the data a layer uses more easily
2814            in the next step.
2815    
2816            * Thuban/Model/data.py: New file with a simple data abstraction
2817            that bundles shapefile and dbffile into one object.
2818    
2819            * Thuban/Model/session.py (Session.OpenShapefile): New method to
2820            open shapefiles and return a shape store object
2821    
2822            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
2823            object instead of a shapefile filename. This introduces a new
2824            instance variable store holding the datastore. For intermediate
2825            backwards compatibility keep the old instance variables.
2826            (open_shapefile): Removed. No longer needed with the shape store.
2827            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
2828            get the shape store used by a layer.
2829            (Layer.Destroy): No need to explicitly destroy the shapefile or
2830            table anymore.
2831    
2832            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
2833            (MainWindow.AddLayer): Use the session's OpenShapefile method to
2834            open shapefiles
2835    
2836            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
2837            session's OpenShapefile method to open shapefiles
2838    
2839            * test/test_classification.py
2840            (TestClassification.test_classification): Use the session's
2841            OpenShapefile method to open shapefiles and build the filename in
2842            a more platform independed way
2843    
2844            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2845            Implement to have a session to use in the tests
2846            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2847            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
2848            session's OpenShapefile method to open shapefiles
2849            (TestLayerLegend.setUp): Instantiate a session so that we can use
2850            it to open shapefiles.
2851            (TestLayerLegend.tearDown): Make sure that all references to
2852            layers and session are removed otherwise we may get a resource
2853            leak
2854    
2855            * test/test_map.py (TestMapAddLayer.test_add_layer)
2856            (TestMapWithContents.setUp): Instantiate a session so that we can
2857            use it to open shapefiles.
2858            (TestMapWithContents.tearDown): Make sure that all references to
2859            layers, maps and sessions are removed otherwise we may get a
2860            resource leak
2861            ("__main__"): use support.run_tests() so that more info about
2862            uncollected garbage is printed
2863    
2864            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
2865            session's OpenShapefile method to open shapefiles
2866            ("__main__"): use support.run_tests() so that more info about
2867            uncollected garbage is printed
2868    
2869            * test/test_selection.py (TestSelection.tearDown): Make sure that
2870            all references to the session and the selection are removed
2871            otherwise we may get a resource leak
2872            (TestSelection.get_layer): Instantiate a session so that we can
2873            use it to open shapefiles.
2874            ("__main__"): use support.run_tests() so that more info about
2875            uncollected garbage is printed
2876    
2877            * test/test_session.py (TestSessionBase.tearDown)
2878            (TestSessionWithContent.tearDown): Make sure that all references
2879            to the session and layers are removed otherwise we may get a
2880            resource leak
2881            (TestSessionWithContent.setUp): Use the session's OpenShapefile
2882            method to open shapefiles
2883    
2884    2003-04-24  Jonathan Coles   <[email protected]>
2885    
2886            * Thuban/Model/load.py (XMLReader.read): Should have been checking
2887            if the file_or_filename object had the 'read' attribute.
2888    
2889    2003-04-23  Jonathan Coles   <[email protected]>
2890    
2891            * Thuban/Model/resource.py: Fixes RTbug #1813.
2892            (ReadProjFile): Add documentation about which exceptions are raised.
2893            Always pass the exceptions up to the caller.
2894            (GetProjFiles): If the directory can't be read return an empty list.
2895            If any of the proj files can't be read skip that file and go
2896            on to the next one.
2897    
2898            * test/test_proj.py: Added test cases to handle nonexistent files,
2899            unreadable files, and files that don't parse correctly.
2900    
2901    2003-04-23  Jonathan Coles   <[email protected]>
2902    
2903            Projection dialog. Allows the user to select from a list
2904            of projection templates and optionally edit them and save new ones.
2905    
2906            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
2907            (ProjPanel): Base class for projection specific panels.
2908            (TMPanel): Projection panel for Transverse Mercartor.
2909            (UTMPanel): Projection panel for Universal Transverse Mercartor.
2910            (LCCPanel): Projection panel for Lambert Conic Conformal.
2911            (GeoPanel): Projetion panel for Geographic Projection.
2912    
2913    2003-04-23  Jonathan Coles   <[email protected]>
2914    
2915            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
2916            promote symmetry. There now exists XMLReader and XMLWriter.
2917            (XMLReader.read): New. Call to read the given file descriptor or
2918            filename.
2919            (XMLReader.close): New. Make sure the file is closed.
2920            (XMLReader.GetFileName): New. Return just the file name that is being
2921            read from.
2922            (XMLReader.GetDirectory): New. Return just the directory of the file
2923            that is being read.
2924            (XMLReader.AddDispatchers): New. Take a dictionary which contains
2925            the names of functions to call as the XML tree is parsed.
2926            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
2927            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
2928            (SessionLoader): Removed class variables start_dispatcher and
2929            end_dispatcher since this functionality is now part of a class
2930            instance. Fixes RTbug #1808.
2931            (SessionLoader.__init__): Add dispatcher functions.
2932            (load_xmlfile): Code was moved into the XMLReader.read().
2933            (load_session): Use modified SessionLoader.
2934    
2935            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
2936            map's projection.
2937    
2938            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
2939            GetAllParameters.
2940            (Projection.GetParameter): Returns the value for the given parameter.
2941    
2942            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
2943            (GetProjFiles): Renamed from GetProjections. Now returns a list
2944            of ProjFile objects.
2945            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
2946            a list of ProjFile objects whose files are not user defined.
2947            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
2948            list of ProjFile objects whose files are user defined.
2949            (ProjFileReader): Extend new XMLReader.
2950    
2951            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
2952            promote symmetry.
2953    
2954            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
2955            control instead of a wxComboBox. wxChoice controls do not generate
2956            events as the uses highlights possible choices which fixes problems
2957            with resizing the dialog when the use selects an option.
2958    
2959            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
2960            control instead of a wxComboBox.
2961    
2962            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
2963            dialog.
2964    
2965            * test/test_proj.py (TestProjection.test): New tests for GetParameter
2966            method.
2967    
2968    2003-04-22  Bernhard Herzog  <[email protected]>
2969    
2970            * Thuban/UI/mainwindow.py: Remove some unused imports and global
2971            constants
2972    
2973            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
2974            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
2975    
2976    2003-04-17  Bernhard Herzog  <[email protected]>
2977    
2978            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
2979            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
2980            anymore.
2981            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
2982            (Layer.ShapeType, Layer.Shape): No need to call
2983            self.open_shapefile since it's always called in __init__
2984    
2985            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
2986            In wxPython 2.4 there's no need to extend MainLoop anymore since
2987            wxPython itself makes sure OnExit is called.
2988    
2989    2003-04-16  Jonathan Coles   <[email protected]>
2990    
2991            Initial putback of projection management code. Includes new
2992            classes to read and write projection files. The current load
2993            and save classes were abstracted a bit so they could be reused.
2994            The Projection class was extended to provide new methods and
2995            have a name.
2996    
2997            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
2998            general XML reading methods that were part of ProcessSession.
2999    
3000            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
3001            name.
3002            (ProjFile): New. Represents a file that contains projection
3003            information.
3004    
3005            * Thuban/Model/resource.py: New. Contains general utilities
3006            for read and writing projection files.
3007    
3008            * Thuban/Model/save.py (XMLSaver): New. Contains all the
3009            general XML writing methods that were part of SessionSaver.
3010            (SessionSaver): Renamed from Saver.
3011    
3012            * test/test_proj.py: New test cases for the projection
3013            file read and write functions.
3014    
3015    2003-04-16  Jonathan Coles   <[email protected]>
3016    
3017            * Thuban/Model/classification.py: Use repr() around values
3018            in the ClassGroup*.__repr__() methods so it is clearer when
3019            a value is a string and when it is a number.
3020    
3021            * test/test_load.py: Rework the classification test to test
3022            that we can load old files.
3023            (testLabels): Test a file where the groups have labels.
3024    
3025    2003-04-16  Bernhard Herzog  <[email protected]>
3026    
3027            Safer implementation of the performance enhancements of the
3028            low-level renderer:
3029            
3030            * extensions/thuban/wxproj.cpp (extract_projection)
3031            (extract_pointer): Rename extract_projection to extract_pointer
3032            and redefine its purpose to return the pointer stored in a CObject
3033            returned by the object's cobject method. Update all callers.
3034            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
3035            handling of these low-level parameters so that each s_draw_info
3036            instance is handled as a CObject at python level that also
3037            contains real references to the actual python objects which
3038            contain the values in the struct. Add free_draw_info as the
3039            destructor.
3040            (draw_polygon_shape): Add the py_draw_info parameter which must a
3041            cobject containing an s_draw_info pointer.
3042    
3043            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
3044            method to instantiat the low-level render parameter
3045            (MapRenderer.draw_shape_layer): Use the new method. Remove some
3046            commented out code.
3047            (MapRenderer.draw_polygon_shape): Make the first parameter not the
3048            layer but the low-level render parameter
3049            (ScreenRenderer.draw_shape_layer): Use the low-level render
3050            parameter.
3051    
3052    2003-04-15  Jonathan Coles   <[email protected]>
3053    
3054            * Thuban/Model/classification.py: Implemented __repr__ for
3055            the ClassGroup* classes to make debugging a bit easier.
3056            (ClassGroup.SetLabel): Check that the string is an instance
3057            of StringTypes not StringType. Accounts for Unicode strings.
3058    
3059            * Thuban/Model/color.py: Implemented __repr__ to make
3060            debugging a bit easier.
3061    
3062            * Thuban/Model/save.py (Saver.write_classification): Need to
3063            save the group label.
3064    
3065            * test/test_load.py (testClassification): New. Loads the
3066            iceland_sample_test.thuban file and checks if it was loaded
3067            correctly.
3068    
3069    2003-04-15  Jonathan Coles   <[email protected]>
3070    
3071            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
3072            to improve rendering performance by initializing the variables
3073            that are not change each time draw_polygon_shape() is called.
3074            The values are stored in a global struct draw_info.
3075            (draw_polygon_shape): Removed initialization code that is
3076            now in draw_polygon_init().
3077    
3078            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
3079            drawing initialization call to draw_polygon_init()
3080            (MapRenderer.draw_polygon_shape): Use new signature of
3081            draw_polygon_shape.
3082    
3083            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
3084            weirdness by setting the range to (1, maxint).
3085    
3086            * Thuban/Model/classification.py (ClassGroupProperties): Make
3087            instance variables private and optimize comparison operator
3088            by first checking if the color references are the same.
3089            (ClassGroupSingleton): Make instance variables private.
3090            (ClassGroupRange): Make instance variables private.
3091    
3092            * HOWTO-Release: Filled in missing steps for releasing packages.
3093    
3094    2003-04-15  Bernhard Herzog  <[email protected]>
3095    
3096            First stab at internationalized messages:
3097    
3098            * Thuban/__init__.py (_): Implement the translation function for
3099            real using the python gettext module.
3100    
3101            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
3102            translate empty strings.
3103    
3104            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
3105            Add a missing space to a warning message
3106    
3107            * po/README: New. Notes about the management of the translation
3108            files.
3109    
3110            * po/Makefile: New. Makefile to help manage the translation files.
3111    
3112            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
3113    
3114            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
3115            translations and support files in po/
3116    
3117            * setup.py (data_files): Add the *.mo files to the data_files too
3118    
3119            * README: Add note about the translations when building from CVS
3120    
3121    2003-04-14  Jonathan Coles   <[email protected]>
3122    
3123            * Thuban/UI/dock.py: Fixes some window resizing problems most
3124            noticable under windows. Always assume the button bitmaps will
3125            be there. Code clean up.
3126            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
3127            images for the dock/undock button to the same images.
3128            Work around for RTbug #1801.
3129    
3130            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
3131            be allowed to grow within the sizer. Fixes a bug under Windows
3132            where the toolbar wasn't being drawn.
3133    
3134    2003-04-14  Frank Koormann   <[email protected]>
3135    
3136            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
3137            Updated design to try to make the button functionality more
3138            transparent.
3139    
3140    2003-04-14  Jonathan Coles   <[email protected]>
3141    
3142            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
3143            finalize the intialization of the panel.
3144    
3145            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
3146            creation of the panel. Should be the last thing called in the
3147            initializer of a subclass.
3148    
3149            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
3150            set the current selections in the combo boxes. This is needed
3151            under Windows.
3152    
3153            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
3154            level panel to the dialog so that the background colors are
3155            consistent under Windows.
3156    
3157    2003-04-11  Jonathan Coles   <[email protected]>
3158    
3159            * Thuban/UI/classgen.py: Change color ramps to start at white
3160            not black.
3161    
3162            * Thuban/UI/legend.py: Enable/disable the legend buttons when
3163            the legend changes. Fixes RTbug #1793.
3164    
3165            * test/test_classification.py: Added test for copying of
3166            classifications.
3167    
3168    2003-04-11  Jonathan Coles   <[email protected]>
3169    
3170            * Thuban/UI/resource.py: New. Centralize the loading of resources
3171            such as bitmaps.
3172    
3173            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
3174            added images to the move buttons, added 'reverse' button.
3175            (CustomRampPanel.__init__): Added images to the move buttons.
3176            (GreyRamp): New. Generates a ramp from white to black.
3177            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
3178    
3179            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
3180            ID_PROPERTY_*.
3181            (Classifier.__init__): Minor changes to the layout.
3182            (Classifier._OnTitleChanged): Listen for when the user edits the
3183            title and update the dialog's title and the layer's title.
3184    
3185            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
3186    
3187            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
3188            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
3189            if the layer's title changes.
3190    
3191            * Thuban/UI/mainwindow.py: Added new menu item and associated code
3192            to open a dialog to rename the map.
3193            (MainWindow): Use new resource class to import bitmaps.
3194    
3195    2003-04-11  Jonathan Coles   <[email protected]>
3196    
3197            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
3198            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
3199            Resources/Bitmaps/group_use_none.xpm,
3200            Resources/Bitmaps/group_use_not.xpm,
3201            Resources/Bitmaps/hide_layer.xpm,
3202            Resources/Bitmaps/layer_properties.xpm,
3203            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
3204            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
3205            New.
3206    
3207    2003-04-10  Jonathan Coles   <[email protected]>
3208    
3209            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
3210            Should pass group to ClassGroup constructor.
3211    
3212    2003-04-10  Jonathan Coles   <[email protected]>
3213    
3214            * Thuban/Model/classification.py: (ClassGroup): Move all the common
3215            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
3216            here. Implement SetVisible(), IsVisible().
3217            (ClassGroup.__init__): Add group parameter which acts as a copy
3218            constructor.
3219    
3220            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
3221            "Visible" check boxes.
3222            (Classifier): Rename the buttons and refactor the code to match
3223            the new labels.
3224    
3225            * Thuban/UI/legend.py: Classify button is now called "Properties".
3226            Refactored the code to change variable names.
3227            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
3228    
3229            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
3230            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
3231            renamed to MainWindow.LayerEditProperties.
3232            (MainWindow.ToggleLegend): Don't include map name in legend title.
3233            (MainWindow.SetMap): Added the map name to the window title.
3234            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
3235            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
3236            Functionality is found in the layer properties dialog.
3237    
3238            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
3239            draw visible groups.
3240    
3241    2003-04-09  Jonathan Coles   <[email protected]>
3242    
3243            * Thuban/UI/classgen.py: Modifications to allow simple
3244            addition and selection of new color schemes.
3245            (MonochromaticRamp): New. Generates a ramp between two colors.
3246            (RedRamp): New. Generates a ramp of all red.
3247            (GreenRamp): New. Generates a ramp of all green.
3248            (BlueRamp): New. Generates a ramp of all blue.
3249    
3250    2003-04-09  Jonathan Coles   <[email protected]>
3251    
3252            * Thuban/Model/classification.py (Classification.__deepcopy__):
3253            Need to copy over field and fieldType attributes.
3254    
3255            * Thuban/Model/table.py (Table.field_range): New. Retrive the
3256            maximum and minimum values over the entire table for a given
3257            field.
3258            (Table.GetUniqueValues): New. Retrieve all the unique values
3259            in the table for a given field.
3260    
3261            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
3262            (GenUniquePanel): New. Controls to allow the user to select
3263            which unique field values they would like in the classification.
3264            (CustomRampPanel): Code that was in ClassGenDialog that allows
3265            the user to select the properties for a custom ramp.
3266            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
3267    
3268            * Thuban/UI/classifier.py: Removed a lot of debugging code.
3269            (Classifier._SetClassification): Callback method so that the
3270            class generator can set the classification in the grid.
3271            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
3272            editing of a group properties class into a wxWindows control.
3273    
3274            * Thuban/UI/dock.py: It was decided that if the user closes
3275            a dockable window the window should simply hide itself. That
3276            way if the user wants to show the dock again it appears in the
3277            same place as it was when it was closed.
3278            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
3279            (DockableWindow._OnButtonClose): Hide the window instead of
3280            destroying it.
3281            (DockableWindow._OnClose): Hide the window instead of
3282            destroying it.
3283    
3284            * Thuban/UI/legend.py (LegendTree): Use a private method to
3285            consistently set the font and style of the text. Fixes RTbug #1786.
3286    
3287            * Thuban/UI/mainwindow.py: Import just the Classifier class.
3288    
3289    2003-04-07  Bernhard Herzog  <[email protected]>
3290    
3291            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
3292            to the map module
3293    
3294    2003-04-07  Bernhard Herzog  <[email protected]>
3295    
3296            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
3297            favor of ToggleSessionTree
3298            (MainWindow.ToggleSessionTree): New method to toggle visibility of
3299            the session tree.
3300            (MainWindow.SessionTreeShown): New method to return whether the
3301            session tree is currently shown.
3302            (MainWindow.ToggleLegend): New method to toggle visibility of the
3303            legend
3304            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
3305            LegendShown
3306            (MainWindow.LegendShown): New method to return whether the legend
3307            is currently shown.
3308            (_method_command): Add checked parameter so we can define check
3309            menu items
3310            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
3311            mainwindow methods.
3312            (show_session_tree, show_legend commands): Removed.
3313            (toggle_session_tree, toggle_legend commands): New commands to
3314            toggle the visibility of the dialogs
3315    
3316    2003-04-07  Jonathan Coles   <[email protected]>
3317    
3318            * Thuban/UI/classgen.py: Fix Windows problem.
3319    
3320            * Thuban/UI/dock.py: Fix Windows problem.
3321    
3322            * Thuban/UI/mainwindow.py: Use False instead of false.
3323            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
3324    
3325    2003-04-07  Jonathan Coles   <[email protected]>
3326    
3327            Since we now say that the order of the groups in a classification
3328            matters, it makes sense to be able to manipulate that order. Most
3329            of the changes to Thuban/Model/classification.py are to that end.
3330    
3331            * Thuban/Model/classification.py (Classification.AppendGroup,
3332            Classification.InsertGroup, Classification.ReplaceGroup,
3333            Classification.RemoveGroup, Classification.GetGroup): Do as the
3334            names imply.
3335            (Classification.FindGroup): This was called GetGroup, but GetGroup
3336            takes an index, while FindGroup takes a value.
3337            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
3338            REFERENCE. Currently there is a cyclic reference between the layer
3339            and its classification. If the classification doesn't need to know
3340            its owning layer we can change this, since it may make sense to be
3341            able to use the same classification with different layers.
3342    
3343            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
3344    
3345            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
3346            not AddGroup()
3347    
3348            * Thuban/UI/classifier.py: Now that we can depend on the order in
3349            a Classification and have methods to manipulate that order we don't
3350            need to use our own data structures in the grid. We can simply make
3351            the grid/table access the information they need from a copy of
3352            the classification object.
3353            (Classifier._OnCloseBtn): Event handler for when the user clicks
3354            'Close'. This is needed so if the user applies changes and then
3355            continues to change the table the user has the option of discarding
3356            the most recent changes and keeping what they applied.
3357    
3358            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
3359            into the same group.
3360    
3361            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
3362            with a really old version of proj, PJ_VERSION won't even be defined.
3363            If it isn't defined then just compile so that the function always
3364            returns Py_False.
3365    
3366            * test/test_classification.py: Fix tests to use the renamed methods.
3367            Still need to write tests for the new methods.
3368    
3369    2003-04-04  Jonathan Coles   <[email protected]>
3370    
3371            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
3372            call to SetSelection out of the method and before the call
3373            to __SelectField in __init__. This prevents a recursion of events
3374            when _OnFieldSelect is triggered by the user.
3375    
3376    2003-04-04  Jonathan Coles   <[email protected]>
3377    
3378            * Thuban/Model/classification.py: Rename Color.None to
3379            Color.Transparent.
3380            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
3381            Don't bother copying the color, since Colors are immutable.
3382    
3383            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
3384            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
3385            Thuban/UI/renderer.py, Thuban/UI/view.py:
3386            Rename Color.None to Color.Transparent.
3387        
3388            * test/test_classification.py, test/test_load.py: Rename Color.None
3389            to Color.Transparent.
3390    
3391    2003-04-04  Jonathan Coles   <[email protected]>
3392    
3393            * Thuban/Model/classification.py: Fix assert calls.
3394            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
3395            Copy the color parameter rather than hold onto a reference.
3396    
3397            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
3398            the color object.
3399            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
3400            are sure there exists only one refernce to Color.None in the system.
3401            This allows us to use 'is' rather than the comparision functions.
3402            
3403            * Thuban/Model/save.py: Fix assert calls.
3404            
3405            * Thuban/UI/classifier.py: Fix assert calls.
3406            (ClassGrid._OnCellDClick): Call up to the classifier to open the
3407            dialog to edit the groups properties.
3408            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
3409            correctly if a cell is resized.
3410            (ClassTable.SetClassification): New. Changes the classification
3411            that is in the table.
3412            (ClassTable.__SetRow): Allow groups to be prepended.
3413            (Classifier): New code for opening the EditProperties and
3414            GenerateRanges dialogs.
3415            (SelectPropertiesDialog.__GetColor): Only set the color in the
3416            color dialog if the current color is not None.
3417            
3418            * Thuban/UI/dock.py: Fix assert calls.
3419            
3420            * Thuban/UI/legend.py: Fix assert calls.
3421            
3422            * Thuban/UI/renderer.py: Fix assert calls.
3423            
3424            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
3425            classifications.
3426            (GenRangePanel): Panel specific to range generation.
3427            (GenSingletonPanel): Panel specific to singleton generation.
3428            (ClassGenerator): Class responsible for actually generating
3429            the classification from the data gathered in the dialog box.
3430            (PropertyRamp): Generates properties whose values range from
3431            a starting property to an ending property.
3432    
3433    2003-04-03  Bernhard Herzog  <[email protected]>
3434    
3435            * test/support.py (print_garbage_information): New function that
3436            prints information about still connected messages and memory
3437            leaks.
3438            (run_suite): Removed.
3439            (run_tests): New function for use as a replacement of
3440            unittest.main in the test_* files. This one calls
3441            print_garbage_information at the end.
3442    
3443            * test/runtests.py (main): Use support.print_garbage_information
3444    
3445            * test/test_layer.py: Use support.run_tests instead of
3446            unittest.main so we get memory leak information
3447            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
3448            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
3449            (TestLayerLegend.test_visibility): Call the layer's Destroy method
3450            to fix a memory leak.
3451    
3452            * test/test_classification.py: Use support.run_tests instead of
3453            unittest.main so we get memory leak information
3454            (TestClassification.test_classification): Call the layer's Destroy
3455            method to fix a memory leak.
3456    
3457    2003-04-02  Bernhard Herzog  <[email protected]>
3458    
3459            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
3460            Handle the reference counts of the return value and errors in
3461            PyArg_ParseTuple correctly.
3462    
3463            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
3464            sure the filename is absolute to avoid problems when saving the
3465            session again
3466    
3467            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
3468    
3469    2003-04-01  Jonathan Coles   <[email protected]>
3470    
3471            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
3472            that there actually are points in the returned list of points
3473            before trying to index into the list. The list may be empty if
3474            the shape is a Null Shape.
3475    
3476    2003-04-01  Bernhard Herzog  <[email protected]>
3477    
3478            * test/test_map.py: Don't use from <module> import *
3479    
3480    2003-04-01  Jonathan Coles   <[email protected]>
3481    
3482            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
3483            LAYER_LEGEND_CHANGED
3484    
3485            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
3486            self.Destroy() to close the window after yesterday's changes.
3487    
3488            * test/test_map.py, test/test_session.py: Fix messages that
3489            are sent from maps and layers.
3490    
3491    2003-03-31  Jonathan Coles   <[email protected]>
3492    
3493            * Thuban/UI/classifier.py: Commented out some debugging statements.
3494            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
3495            RTbug #1769.
3496    
3497            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
3498            position (although position doesn't work yet under GTK).
3499            (DockableWindow.Destroy): New. Called when the window must be
3500            closed. Namely needed when the DockFrame closes and must close
3501            its children.
3502            (DockFrame): Listen for EVT_CLOSE and destroy all children.
3503    
3504            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
3505            when then window is told to close.
3506            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
3507            comment in source for more info.
3508    
3509            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
3510    
3511            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
3512            symmetry with other such methods.
3513            (MainWindow.ShowLegend): Show the legend docked by default.
3514    
3515    2003-03-28  Jonathan Coles   <[email protected]>
3516    
3517            * Thuban/UI/classifier.py: Support for highlighting a specific
3518            group within the grid when the classification dialog is opened.
3519            Also contains a lot of debugging printouts which will later
3520            be removed.
3521    
3522            * Thuban/UI/dock.py: Complete rework on the dock code so that
3523            that it is fairly removed from the rest of the Thuban application.
3524            It is easy to add new docks which the rest of the program having
3525            to be aware of them.
3526    
3527            * Thuban/UI/legend.py: Modifications to support selecting a
3528            specific group in the classification dialog. Changed how layers
3529            are drawn when the layer is visible/invisible.
3530    
3531            * Thuban/UI/mainwindow.py: Removed legend specific code and
3532            replaced it with calls to the new dock code.
3533    
3534            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
3535            to check if scale > 0. Trying to track down a divide by zero.
3536    
3537    2003-03-26  Jonathan Coles   <[email protected]>
3538    
3539            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
3540            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
3541            now part of DockableWindow.
3542            (LegendPanel.DoOnSelChanged): Select the current layer in the
3543            map.
3544            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
3545            with the selected layer and/or group.
3546    
3547    2003-03-26  Jonathan Coles   <[email protected]>
3548    
3549            This putback contains the code for dockable windows. There is
3550            no support in wxWindows as of this date for windows that can
3551            attach themselves to other windows.
3552    
3553            The current model contains a DockableWindow which has a parent
3554            window for when it is detached and a dock window that it puts
3555            its contents in when it is docked. The contents of a DockableWindow
3556            must be a DockPanel. DockPanel itself derives from wxPanel.
3557    
3558            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
3559            message, not a LAYER_LEGEND_CHANGED message.
3560    
3561            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
3562    
3563            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
3564            as one of the style properties for the fieldTypeText item to
3565            be sure that its size is correct when the text changes.
3566    
3567            * Thuban/UI/dock.py: New. Classes for the DockPanel and
3568            DockableWindow.
3569    
3570            * Thuban/UI/legend.py: Added some more buttons and made the
3571            LegendPanel a DockPanel.
3572    
3573            * Thuban/UI/mainwindow.py: Added sash windows to the main window
3574            and supporting functions for manipulating the sashes.
3575            (MainWindow.ShowLegend): Create a DockableWindow with the
3576            LegendPanel as the contents.
3577    
3578            * Thuban/UI/messages.py: Added DOCKABLE_* messages
3579    
3580            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
3581            not LAYER_LEGEND_CHANGED, messages.
3582    
3583    2003-03-25  Jonathan Coles   <[email protected]>
3584    
3585            * setup.py: Added custom script bdist_rpm_build_script so that
3586            when the rpm is built the path to wx-config is correct.
3587    
3588            * setup.cfg: Added line saying to use the custom build script
3589    
3590    2003-03-20  Jonathan Coles   <[email protected]>
3591    
3592            Initial implementation of the Legend.
3593    
3594            * Thuban/UI/legend.py: New. Creates a window that shows the map's
3595            Legend information and allows the user to add/modify classifications
3596            and how the layers are drawn on the map.
3597    
3598            * setup.py: New command 'build_docs' which currently uses
3599            happydoc to generate html documentation for Thuban.
3600    
3601            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
3602            Returns a string which is appropriately describes the group.
3603    
3604            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
3605            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
3606    
3607            * Thuban/Model/map.py (Map): Rename messages and use new, more
3608            specific, messages.
3609    
3610            * Thuban/Model/messages.py: New message to indicate that a layer's
3611            data has changed (LAYER_CHANGED). New map messages to indicate
3612            when layers have been added/removed/changed or if the stacking order
3613            of the layers has changed.
3614    
3615            * Thuban/Model/session.py: Rename and use new messages.
3616    
3617            * Thuban/UI/classifier.py: Remember if any changes have actually
3618            been applied so that if the dialog is cancelled without an application
3619            of changes we don't have to set a new classification.
3620            (ClassDataPreviewer): Pulled out the window specific code and put it
3621            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
3622            symbols on any DC.
3623            
3624            * Thuban/UI/mainwindow.py: New code to open the legend.
3625    
3626            * Thuban/UI/view.py: Use new message names.
3627    
3628    2003-03-19  Jonathan Coles   <[email protected]>
3629    
3630            * Thuban/UI/main.py (verify_versions): New. Checks the versions
3631            of Python, wxPython, and some other libraries.
3632    
3633            * extensions/thuban/wxproj.cpp (check_version): Checks the given
3634            version against what wxproj was compiled with.
3635            (check_version_gtk): If wxproj was compiled with gtk then check
3636            the given version against the version of the gtk library
3637            currently being used.
3638    
3639    2003-03-14  Bernhard Herzog  <[email protected]>
3640    
3641            * test/test_command.py: Run the tests when the module is run as a
3642            script
3643    
3644    2003-03-14  Bernhard Herzog  <[email protected]>
3645    
3646            Implement selection of multiple selected shapes in the same layer:
3647    
3648            - Introduce a new class to hold the selection. This basically
3649              replaces the interactor which was nothing more than the
3650              selection anyway. A major difference is of course that the new
3651              selection class supports multiple selected shapes in one layer
3652            
3653            - Move the object that represents the selection from the
3654              application to the canvas. The canvas is a better place than the
3655              application because the selection represents which shapes and
3656              layer of the map displayed by the canvas are selected and
3657              affects how the map is drawn.
3658    
3659            - Make the selection and its messages publicly available through
3660              the mainwindow.
3661    
3662            - The non-modal dialogs do not get a reference to the interactor
3663              anymore as they can simply refer to their parent, the
3664              mainwindow, for the what the interactor had to offer.
3665    
3666            * Thuban/UI/selection.py: New module with a class to represent the
3667            selection.
3668    
3669            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
3670            these unused messages
3671    
3672            * Thuban/UI/application.py (ThubanApplication.OnInit)
3673            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
3674            interactor is gone now.
3675            (ThubanApplication.CreateMainWindow): There is no interactor
3676            anymore so we pass None as the interactor argument for now for
3677            compatibility.
3678    
3679            * Thuban/UI/view.py (MapCanvas.delegated_messages)
3680            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
3681            Unsubscribe, delegate messages according to the delegated_messages
3682            class variable.
3683            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
3684            attributes from instance variables as described with the
3685            delegated_methods class variable.
3686            (MapCanvas.__init__): New instance variable selection holding the
3687            current selection
3688            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
3689            pass them on to the renderer
3690            (MapCanvas.SetMap): Clear the selection when a different map is
3691            selected.
3692            (MapCanvas.shape_selected): Simple force a complete redraw. The
3693            selection class now takes care of only issueing SHAPES_SELECTED
3694            messages when the set of selected shapes actually does change.
3695            (MapCanvas.SelectShapeAt): The selection is now managed in
3696            self.selection
3697    
3698            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
3699            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
3700            Unsubscribe, delegate messages according to the delegated_messages
3701            class variable.
3702            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
3703            attributes from instance variables as described with the
3704            delegated_methods class variable.
3705            (MainWindow.__init__): The interactor as ivar is gone. The
3706            parameter is still there for compatibility. The selection messages
3707            now come from the canvas.
3708            (MainWindow.current_layer, MainWindow.has_selected_layer):
3709            Delegate to the the canvas.
3710            (MainWindow.LayerShowTable, MainWindow.Classify)
3711            (MainWindow.identify_view_on_demand): The dialogs don't need the
3712            interactor parameter anymore.
3713    
3714            * Thuban/UI/tableview.py (TableFrame.__init__)
3715            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
3716            (LayerTableFrame.row_selected): The interactor is gone. It's job
3717            from the dialog's point of view is now done by the mainwindow,
3718            i.e. the parent. Subscribe to SHAPES_SELECTED instead
3719            of SELECTED_SHAPE
3720            
3721            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
3722            is gone. It's job from the dialog's point of view is now done by
3723            the mainwindow, i.e. the parent.
3724            
3725            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
3726            gone. It's job from the dialog's point of view is now done by the
3727            mainwindow, i.e. the parent.
3728    
3729            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
3730            gone. It's job from the dialog's point of view is now done by the
3731            mainwindow, i.e. the parent.
3732            (SessionTreeCtrl.__init__): New parameter mainwindow which is
3733            stored as self.mainwindow. The mainwindow is need so that the tree
3734            can still subscribe to the selection messages.
3735            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
3736            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
3737            selection is now accessible through the mainwindow. Subscribe to
3738            SHAPES_SELECTED instead of SELECTED_SHAPE
3739    
3740            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
3741            SHAPES_SELECTED message now.
3742            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
3743            so deal with multiple shapes
3744            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
3745            gone. It's job from the dialog's point of view is now done by the
3746            mainwindow, i.e. the parent.
3747    
3748            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
3749            parameter is now a list of shape ids.
3750            (RecordTable.SetTable): The second parameter is now a list of
3751            indices.
3752    
3753            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
3754            selected_shape parameter and ivar to selected_shapes. It's now a
3755            list of shape ids.
3756            (MapRenderer.draw_label_layer): Deal with multiple selected
3757            shapes. Rearrange the code a bit so that the setup and shape type
3758            distinctions are only executed once.
3759    
3760            * test/test_selection.py: Test cases for the selection class
3761    
3762    2003-03-11  Jonathan Coles   <[email protected]>
3763    
3764            * Thuban/Model/load.py: Temporary fix so that the xml reader
3765            doesn't cause Thuban to crash.
3766    
3767            * Thuban/Model/layer.py: Handle the cyclic references between
3768            a layer and its classification better, and be sure to disconnect
3769            the classification from the layer when the layer is destroyed
3770            so that we don't maintain a cyclic reference that may not be
3771            garbage collected.
3772    
3773            * Thuban/Model/classification.py: See comment for layer.py.
3774    
3775    2003-03-12  Jan-Oliver Wagner <[email protected]>
3776    
3777            * HOWTO-Release: New. Information on the steps for releasing
3778            a new version of Thuban.
3779    
3780    2003-03-11  Jonathan Coles   <[email protected]>
3781    
3782            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
3783            Use True instead of true.
3784            (Classifier): Should have a single panel in which all the controls lie.
3785    
3786            * Thuban/UI/proj4dialog.py: Add normal border.
3787    
3788            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
3789    
3790            * Thuban/UI/mainwindow.py: Use True instead of true.
3791    
3792            * setup.py: Update some definitions to use wxWindows2.4 files
3793    
3794            * Data/iceland_sample_class.thuban: Fixed file so that the
3795            field_type information is present.
3796    
3797    2003-03-10  Jonathan Coles   <[email protected]>
3798    
3799            * Thuban/UI/classifier.py (Classifier.__init__): Make the
3800            field type label grow so that when the text changes the
3801            size is updated correctly. This may be a wxWindows bug.
3802    
3803    2003-03-10  Jonathan Coles   <[email protected]>
3804    
3805            * Thuban/UI/application.py: Changed SESSION_CHANGED to
3806            SESSION_REPLACED.
3807    
3808            * Thuban/UI/classifier.py: Wrap text with _().
3809            (ClassGrid.CreateTable): Set dimensions and size hints here,
3810            instead of in Reset, so we only set the size once.
3811    
3812            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
3813    
3814            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3815            Call Close() instead of Shutdown().
3816    
3817            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3818    
3819            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3820            Go back to using OnClose() instead of Shutdown().
3821    
3822    2003-03-10  Jonathan Coles   <[email protected]>
3823    
3824            * Thuban/UI/classifier.py (Classifier): SelectField() needed
3825            to know the old field index as well as the new one.
3826    
3827    2003-03-10  Jonathan Coles   <[email protected]>
3828    
3829            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
3830            to correctly set the table information and call this from
3831            __init__ and from _OnFieldSelect so that all the information
3832            is up to date when the dialog opens and when a field is changed.
3833    
3834    2003-03-10  Jonathan Coles   <[email protected]>
3835    
3836            * Thuban/Model/classification.py (Classification): Don't use
3837            layer's message function directly, use the ClassChanged() method
3838            when then classification changes. SetField/SetFieldType/SetLayer
3839            must keep the information about field name and field type in
3840            sync when an owning layer is set or removed.
3841    
3842            * Thuban/Model/layer.py: Added ClassChanged() so that the
3843            classification can tell the layer when its data has changed.
3844            (Layer.SetClassification): Accepts None as an arguement to
3845            remove the current classification and correctly handles
3846            adding a new classification.
3847    
3848            * Thuban/Model/load.py: Comment out print statement
3849    
3850            * test/test_classification.py, test/test_save.py: New and
3851            improved tests.
3852    
3853    2003-03-07  Jonathan Coles   <[email protected]>
3854    
3855            * Thuban/Model/classification.py: Implemented __copy__ and
3856            __deepcopy__ for ClassGroup* and ClassGroupProperites so
3857            they can easily be copied by the classifier dialog.
3858            (ClassGroupProperites.__init__): The default line color should
3859            have been Color.Black.
3860    
3861            * Thuban/UI/classifier.py: Setting and Getting table values now
3862            uses a consistent set of functions.
3863            (Classifier): Now non-modal. Has field type label which changes
3864            as the field changes. Keep track of buttons in a list so that
3865            we can enable/disable the buttons when the None field is selected.
3866            (SelectPropertiesDialog): Add buttons to make the colors transparent.
3867    
3868            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
3869            does what OnClose did, but can be called by the application to
3870            close a window. Needed when a session changes, and we have to
3871            close the classifier windows.
3872    
3873            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3874            Shuts down open dialogs. Used when a new session is created
3875            or a session is opened.
3876            (MainWindow.SaveSession): Should only call application.SaveSession()
3877            if we don't call SaveSessionAs first.
3878            (MainWindow.Classify): Allow different classifier dialogs for
3879            different layers.
3880    
3881            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
3882            the parent class handle it. Add Shutdown() to unsubscibe from
3883            event notification and call the parent Shutdown(). This was
3884            necessary so the application can close the tree window.
3885    
3886    2003-03-06  Jonathan Coles   <[email protected]>
3887    
3888            * Thuban/Model/classification.py: Minor documentation changes,
3889            Addition of __eq__ and __ne__ methods.
3890            (Classification.SetLayer): prevent recursion between this method
3891            and Layer.SetClassification().
3892    
3893            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
3894    
3895            * Thuban/Model/layer.py (SetClassification): prevent recursion
3896            between this method and Classification.SetLayer().
3897    
3898            * test/test_classification.py, test/test_load.py,
3899            test/test_session.py: Fixed and added tests for the classification
3900            classes.
3901    
3902    2003-03-06  Bernhard Herzog  <[email protected]>
3903    
3904            * Thuban/UI/classifier.py (ClassGrid.__init__)
3905            (ClassGrid.CreateTable): Move the SetSelectionMode call to
3906            CreateTable because otherwise it triggers an assertion in
3907            wxPython/wxGTK 2.4.
3908    
3909    2003-03-05  Jonathan Coles   <[email protected]>
3910    
3911            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
3912    
3913            * Thuban/Model/load.py: import FIELDTYPE constants from table.
3914    
3915            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
3916    
3917            * Thuban/Model/table.py: Put FIELDTYPE constants back.
3918    
3919    2003-03-05  Jonathan Coles   <[email protected]>
3920    
3921            * Thuban/UI/classifier.py: Added class documentation.
3922            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
3923            Store just the groups in the table and generate the other
3924            column information when it is requested. Add "None" field
3925            to pull-down to select no classification.
3926    
3927            * Thuban/common.py: Moved FIELDTYPE constants from table.py
3928            (Str2Num): Only catch ValueError exceptions.
3929    
3930            * Thuban/Model/classification.py: Class documentation. Renaming
3931            of methods with Stroke to Line. Groups are stored in a single
3932            list with the default as the first element. Groups are searched
3933            in the order they appear in the list.
3934    
3935            * Thuban/Model/color.py: Documentation.
3936    
3937            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
3938            the kind of data represented by a field.
3939    
3940            * Thuban/Model/load.py (ProcessSession): Use proper string
3941            conversion function; fixes RTbug #1713.
3942    
3943            * Thuban/Model/save.py (Saver): Store field type information.
3944    
3945            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
3946            (Table): Add field_info_by_name() to retrieve field information
3947            by specifying the field name, not the number.
3948    
3949            * Thuban/UI/mainwindow.py: Function name changes.
3950    
3951            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
3952            get the layer classification once. Don't try to classify
3953            values when the field is None: just use the default properties.
3954    
3955            * Thuban/UI/view.py: Function name changes.
3956    
3957            * Doc/thuban.dtd: Add field_type attribute to a classification.
3958    
3959    2003-03-04  Bernhard Herzog  <[email protected]>
3960    
3961            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
3962            the fill and stroke layer attributes optional with suitable
3963            default values. Add the stroke_width layer attribute. Use correct
3964            syntax for empty elements. Make the attribute list for labels
3965            refer to the label element.
3966    
3967    2003-03-04  Bernhard Herzog  <[email protected]>
3968    
3969            * setup.py (thuban_build_py.build): Add a comment about distutils in
3970            Python 2.3 containing some of the functionality we implement in
3971            setup.py ourselves.
3972    
3973            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
3974            before the selection mode. Doing it the other way round triggers
3975            an assertion in wxWindows.
3976    
3977            * Thuban/Model/save.py (escape): Fix typo in doc-string
3978    
3979            * Thuban/Model/classification.py: Remove unnecessary wxPython
3980            import
3981    
3982    2003-03-04  Jonathan Coles   <[email protected]>
3983    
3984            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
3985            Parameter 'value' should default to None.
3986    
3987            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
3988            the class attribute __classification is now private.
3989    
3990            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
3991            Classifier to ClassGrid. Added support for removing selected rows,
3992            which including code for keeping track of when cells are selected,
3993            and deselected.
3994            (ClassTable): Support for added/removing rows. Fixed a problem
3995            with __ParseInput whereby it would not allow strings (only numbers)
3996            to be entered.
3997            (Classifier): Added button and supporting code for removing
3998            selected rows.
3999    
4000    2003-02-27  Jonathan Coles   <[email protected]>
4001    
4002            * Thuban/common.py: Moved color conversion functions into
4003            Thuban/UI/common.py.
4004            (Str2Num): Now converts the float (not the string) to a long/int
4005            so that an exception isn't thrown.
4006    
4007            * Thuban/UI/common.py: Common functions used in several UI modules
4008    
4009            * Thuban/Model/classification.py: Changed the class hierarchy
4010            so that a Classification consists of Groups which return
4011            Properties when a value matches a Group.
4012    
4013            * Thuban/Model/layer.py: Fixed name resolution problem.
4014    
4015            * Thuban/Model/load.py: Use new Classification and Group functions.
4016    
4017            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
4018            failure.
4019            (Saver.write_classification): Use new Classification and Group
4020            functions.
4021    
4022            * Thuban/UI/classifier.py: Changes to use new Classification and Group
4023            functions. Fix to create a tuple with a single value instead of
4024            simply returning the value.
4025    
4026            * Thuban/UI/renderer.py: Use new Classification and Group functions.
4027            Use common.py functions.
4028    
4029            * Thuban/UI/tree.py: Use common.py functions.
4030            
4031            * test/test_classification.py: Use new Classification and Group
4032            classes.
4033    
4034    2003-02-24  Jonathan Coles   <[email protected]>
4035    
4036            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
4037            functions from Thuban color objects to wxWindow colour objects.
4038    
4039            * Thuban/Model/classification.py (Classification): Renamed
4040            GetProperties() to GetClassData(). Used the new iterator
4041            in TreeInfo().
4042            (ClassIterator): Iterator implementation to iterate over the
4043            ClassData objects in a classification object.
4044    
4045            * Thuban/Model/save.py (Saver.write_classificaton): Uses
4046            the new iterator to save the classification information.
4047    
4048            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
4049            for changing the stroke and fill colors and previewing the
4050            changes.
4051    
4052            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
4053            MainWindow.SaveSessionAs): Text string changes so the dialogs
4054            have more meaningful titles.
4055    
4056            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
4057            Classification method name from GetProperties to GetClassData.
4058    
4059            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
4060            instead of accessing now non-existent class variables.
4061    
4062    2003-02-24  Bernhard Herzog  <[email protected]>
4063    
4064            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
4065            unneeded Shape() call. Rendering is substantially faster without
4066            it and it avoids some problems with broken shape files.
4067    
4068    2003-02-20  Frank Koormann   <[email protected]>
4069    
4070            Force minimal size of identify and label dialogs. The autosizing
4071            looked too ugly.
4072    
4073            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
4074            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
4075            Set size of listctrl.
4076            * Thuban/UI/identifyview.py (IdentifyView.__init__):
4077            Set size of dialog.
4078    
4079    2003-02-19  Jonathan Coles   <[email protected]>
4080    
4081            * test/test_classification.py, test/test_layer.py,
4082            test/test_load.py, test/test_map.py, test/test_session.py:
4083            Updated the tests to use the new functions that are in the
4084            respective classes.
4085    
4086            * Thuban/Model/classification.py (Classification):
4087            Uses the new ClassData* classes. Modification messages are
4088            passed up to the parent layer (if it exists).
4089            (ClassData): New class to encapsulate the common data in each
4090            classification property.
4091            (ClassDataDefault): Represents the Default class. data.
4092            (ClassDataPoint): Represents a single class. data point
4093            (ClassDataRange): Represents a class. range
4094            (ClassDataMap): Represents a class. map (unused).
4095    
4096            * Thuban/Model/color.py: Added Color.None to represent something
4097            with no color. Color.Black represents the color black.
4098            (NoColor): Helper class derived from Color to represent something
4099            with no color.
4100    
4101            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
4102            stroke_width attributes. Made the 'classification' attribute private.
4103            New methods for setting/getting the classification.
4104    
4105            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
4106            to get the classifcation and use the new ClassData* classes to
4107            hold the classification data. Use Str2Num to convert numbers
4108            properly.
4109    
4110            * Thuban/Model/save.py (Saver): Use new Color and Classification
4111            methods
4112    
4113            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
4114            custom grid.
4115            (ClassTable): Support for editing Values and Labels and for
4116            changing what type (point or range) of data is stored in each
4117            property based on how the user enters the data.
4118            (Classifier): Support for saving the new classifications and
4119            launching the dialog to edit a property.
4120            (SelectPropertiesDialog): New class for editing the visual
4121            properties of a classification (stroke color, width, and fill color)
4122            (ClassPreviewer): Took the Draw method from ClassRenderer and
4123            made most of it into this new class. Intend to use this class in
4124            the SelectPropertiesDialog for previewing changes.
4125    
4126            * Thuban/UI/renderer.py: Use new Color and Classification methods.
4127    
4128            * Thuban/UI/tree.py: Formatting changes.
4129    
4130            * Doc/thuban.dtd: Add 'label' element
4131    
4132            * Thuban/common.py: New. Contains common routines used throughout
4133            the code.
4134            (Str2Num): Takes a string and converts it to the "best" type of
4135            number.
4136    
4137    2003-02-14  Bernhard Herzog  <[email protected]>
4138    
4139            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
4140            dragging flag is always set to 0 even when the tool implementation
4141            raises an exception
4142    
4143    2003-02-11  Bernhard Herzog  <[email protected]>
4144    
4145            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
4146            method to create a splash screen.
4147            (ThubanApplication.ShowMainWindow): New. Show the main window.
4148            Needed so the splash screen can display the mainwindow
4149            (ThubanApplication.OnInit): Call the
4150            new splash_screen method to determine whether the application
4151            should display a splash screen. If it displays a splash screen do
4152            not immediately show the main window.
4153    
4154    2003-02-11  Jonathan Coles  <[email protected]>
4155    
4156            * Thuban/Model/classification.py: Added import line to fix
4157            feature conflicts between running on python2.2 and python2.1.
4158    
4159            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
4160            onto the clinfo parameter, so removed the deepcopy().
4161    
4162    2003-02-10  Jonathan Coles  <[email protected]>
4163    
4164            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
4165            Added element_open variable to track opening and closing of tags
4166            so that tags that don't span more than one line are closed with
4167            /> instead of </tag_name>. Use the GetDefault*() methods of
4168            the Classification class.
4169    
4170            * Thuban/Model/classification.py (Classificaton): Added set and
4171            get methods for the default data. The class also takes a layer
4172            reference so that modification messages can be sent. Fixed the
4173            methods to use the new ClassData class.
4174            (ClassData): New class to encapsulate the classification data
4175    
4176            * Thuban/Model/layer.py (Layer): Remove the
4177            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
4178            SetDefault*() methods on the layer's classification object.
4179            (Layer.__init__): Use the new SetDefault*() methods in the
4180            Classification class.
4181    
4182            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
4183            object instead of a dictionary.
4184    
4185            * Thuban/UI/classifier.py (ClassRenderer): New class to
4186            draw the classifications in the dialog box's table.
4187            (Classifier): Modified to use the ClassRenderer class.
4188    
4189            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
4190            methods of the Classification class.
4191    
4192            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
4193            of the ClassData class.
4194    
4195            * test/test_classification.py, test/test_layer.py,
4196            test/test_map.py, test/test_session.py: Fix the tests to work
4197            with the above code changes.
4198    
4199    2003-02-03  Jonathan Coles  <[email protected]>
4200    
4201            * Thuban/Model/classification.py (Classification): Added getNull()
4202            to return the NullData reference
4203    
4204            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
4205            Layer.SetStrokeWidth): Modified these functions to change the
4206            null data in the classification rather than keep these values
4207            directly in the Layer class. Menu options to change these values
4208            work again.
4209    
4210    2003-01-28  Jonathan Coles  <[email protected]>
4211    
4212            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
4213            Fixed crashing problem on some systems. Dialog box shows
4214            classification data.
4215    
4216            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
4217            Colors in the tree view.
4218    
4219            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
4220            the tree info for classifications. Commented out unnecessary lines.
4221    
4222            * Thuban/Model/classification.py (Classification.TreeInfo): New
4223            function to add information about the classification into the
4224            tree view.
4225    
4226    2003-01-27  Jan-Oliver Wagner <[email protected]>
4227    
4228            * Thuban/__init__.py (_): New.
4229    
4230            * Thuban/Model/classification.py, Thuban/Model/extension.py,
4231            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
4232            Thuban/Model/session.py, Thuban/UI/application.py,
4233            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
4234            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
4235            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
4236            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
4237            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
4238    
4239    2003-01-27  Jonathan Coles  <[email protected]>
4240    
4241            * Thuban/Model/layer.py: Classification initialization calls.
4242    
4243            * Thuban/Model/classification.py: Created class to encapsulate
4244            a layer classification. Supports specific data points and
4245            ranges.
4246    
4247            * Thuban/Model/load.py: Added support for loading classification
4248            information.
4249    
4250            * Thuban/Model/save.py: Added support for saving classification
4251            information.
4252    
4253            * Thuban/UI/classifier.py: Initial class for a dialog box for
4254            specifying classification information.
4255    
4256            * Thuban/UI/mainwindows.py: Support for opening the classifier
4257            dialog.
4258    
4259            * Thuban/UI/renderer.py: Support for drawing a layer with the
4260            classification information.
4261    
4262            * Data/iceland_sample_class.thuban: iceland_sample with
4263            classification data.
4264    
4265            * test/test_classification: Tests for the Classification class.
4266    
4267    2002-12-09  Bernhard Herzog  <[email protected]>
4268    
4269            * test/test_command.py: New. Tests for the command classes.
4270    
4271            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
4272            (Command.IsTool): New method to distinguish between command
4273            switching tools and other commands.
4274    
4275            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
4276            the tool to avoid direct assignments to instance variables
4277            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
4278            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
4279            change the tool
4280    
4281            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
4282            active tool's command turns insensitive, disable the tool.
4283            (_tool_command): Use the new ToolCommand class
4284    
4285            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
4286            SelectTool method to change the tool
4287            (iconfile): Use the ToolCommand class
4288    
4289    2002-12-03  Bernhard Herzog  <[email protected]>
4290    
4291            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
4292            the case of selected items that are not children of Layers or Maps
4293            properly. Previously this bug would trigger an assertion in
4294            wxWindows.
4295    
4296    2002-11-06  Frank Koormann  <[email protected]>
4297    
4298            * Thuban/UI/mainwindow.py: Altered the order of tools in the
4299            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
4300            Full Extent).
4301    
4302    2002-10-23  Bernhard Herzog  <[email protected]>
4303    
4304            * setup.py (setup call): version now 0.1.3
4305    
4306            * MANIFEST.in: Add the files in test/
4307    
4308            * test/README: Add note about tests requiring the iceland data
4309    
4310            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
4311            copyright notice.
4312    
4313    2002-10-18  Bernhard Herzog  <[email protected]>
4314    
4315            * test/test_map.py
4316            (TestMapWithContents.test_projected_bounding_box): Use an explicit
4317            epsilon.
4318    
4319            * test/support.py (FloatComparisonMixin.assertFloatEqual)
4320            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
4321            message if the assertion fails and don't return the return value
4322            of self.assert_. In assertFloatSeqEqual the return meant that not
4323            all items of the sequence were compared.
4324    
4325    2002-09-20  Bernhard Herzog  <[email protected]>
4326    
4327            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
4328    
4329            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
4330    
4331            * test/test_map.py (TestMapWithContents.test_tree_info): Create
4332            the string with the bounding box on the fly because of platform
4333            differences in the way %g is handled.
4334    
4335            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
4336            DBFfile too because Thuban layers can't yet cope missing DBF
4337            files.
4338    
4339    2002-09-20  Bernhard Herzog  <[email protected]>
4340    
4341            * test/test_menu.py: Use initthuban instead of
4342            add_thuban_dir_to_path to initialize Thuban.
4343    
4344            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
4345            Mixin class for float comparisons
4346            (SubscriberMixin): New. Mixin class to test messages sent through
4347            the Connector class
4348    
4349            * test/README: Fix a typo and add the -v flag to the command for
4350            individual tests
4351    
4352            * test/test_session.py: New. Test cases for Thuban.Model.session
4353    
4354            * test/test_proj.py: New. Test cases for Thuban.Model.proj
4355    
4356            * test/test_map.py: New. Test cases for Thuban.Model.map
4357    
4358            * test/test_layer.py: New. Test cases for Thuban.Model.layer
4359    
4360            * test/test_label.py: New. Test cases for Thuban.Model.label
4361    
4362            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
4363    
4364            * test/test_color.py: New. Test cases for Thuban.Model.color
4365    
4366            * test/test_base.py: New. Test cases for Thuban.Model.base
4367    
4368    2002-09-13  Bernhard Herzog  <[email protected]>
4369    
4370            * Thuban/Model/session.py (Session.forwarded_channels): Forward
4371            the CHANGED channel too.
4372    
4373            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
4374            CHANGED channel too.
4375            (Map.__init__): Call the Modifiable constructor as well.
4376    
4377            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
4378            event if the modified flag changes.
4379            (Modifiable.changed): Tweak the doc-string.
4380    
4381            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
4382            (MainWindow.set_position_text): Put the code that puts the text
4383            with the mouse position into the status bar into the new method
4384            set_position_text so that it can overwritten in derived classes.
4385    
4386    2002-09-12  Bernhard Herzog  <[email protected]>
4387    
4388            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
4389            message box on the main window.
4390    
4391    2002-09-11  Bernhard Herzog  <[email protected]>
4392    
4393            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
4394            the 'E' because it's less likely to interfere with other menu
4395            entries.
4396            (MainWindow.build_menu): remove an incorrect comment.
4397    
4398    2002-09-10  Bernhard Herzog  <[email protected]>
4399    
4400            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
4401            (_tool_command): Add sensitive parameter
4402            (_has_visible_map): Sensitivity callback to tools and other
4403            commands that require a visible map. Use it in map_zoom_in_tool,
4404            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
4405            and map_full_extent
4406    
4407    2002-09-06  Bernhard Herzog  <[email protected]>
4408    
4409            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
4410            VIEW_POSITION
4411    
4412    2002-09-04  Frank Koormann  <[email protected]>
4413    
4414            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
4415    
4416    2002-09-02  Bernhard Herzog  <[email protected]>
4417    
4418            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
4419            wxWindows already and our implementation doesn't work correctly
4420            with wxGTK 2.3:
4421            (MapCanvas.__init__): Remove the instance variable
4422            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
4423            be drawin
4424            (MapCanvas.OnIdle): Removed.
4425    
4426            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
4427            a parameter to determine the size of the rectangle.
4428            (MapCanvas.find_shape_at): Create the box around the point on a
4429            layer by layer basis and make the size depend on the shape type.
4430            This solves a problem with the selection of point shapes at the
4431            border of the layer's bounding box
4432    
4433    2002-08-30  Bernhard Herzog  <[email protected]>
4434    
4435            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
4436            for the sensitivity  of remove layer.
4437            (_can_remove_layer): New. Sensitivity callback for remove layer
4438            (Command layer_remove): Use _can_remove_layer
4439    
4440            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
4441            determine whether a given layer can be deleted.
4442    
4443            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
4444            (MapCanvas.do_redraw): Get rid of the unused update_region
4445            instance variable
4446    
4447            * Thuban/UI/view.py: Add/update some doc-strings.
4448    
4449            * test/: new subdirectory with a bunch of unit tests.
4450    
4451            * test/README, test/test_table.py, test/test_save.py,
4452            test/test_menu.py, test/test_load.py: Initial set of tests and
4453            brief instructions on how to run them
4454    
4455    2002-08-29  Bernhard Herzog  <[email protected]>
4456    
4457            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
4458            arcs with multiple parts.
4459    
4460            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
4461            Handle degenrate rectangles.
4462    
4463            * Thuban/Model/table.py: Make writing records work correctly:
4464            (Table.__init__): Keep track of whether the DBF is open for
4465            writing
4466            (Table.write_record): Open the DBF file for writing when necessary
4467    
4468    2002-08-27  Bernhard Herzog  <[email protected]>
4469    
4470            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
4471            dbf files only for reading by default. Use a new writable dbf
4472            object for writing.
4473    
4474    2002-08-26  Bernhard Herzog  <[email protected]>
4475    
4476            * Thuban/UI/mainwindow.py: Refactor the context creation:
4477            (MainWindow.Context): New method to return a context
4478            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
4479            new method
4480    
4481            * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
4482            layer table specific code from TableGrid into LayerTableGrid
4483            (TableFrame, LayerTableFrame): Split the layer table specific code
4484            from TableFrame into LayerTableFrame
4485            (LayerTableGrid.select_shape): Remove a debug print
4486    
4487            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
4488            LayerTableFrame
4489    
4490    2002-08-23  Bernhard Herzog  <[email protected]>
4491    
4492            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
4493            absolute filename.
4494    
4495    2002-08-22  Bernhard Herzog  <[email protected]>
4496    
4497            * Thuban/Model/table.py (Table.write_record): New method to write
4498            records.
4499            (Table.__init__): Open the DBF file for writing too.
4500    
4501            * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
4502            into the underlying table.
4503    
4504            * extensions/shapelib/shapefil.h (DBFCommit),
4505            extensions/shapelib/dbfopen.c (DBFCommit): New API function to
4506            commit any changes made to the DBF file.
4507    
4508            * Thuban/UI/mainwindow.py (make_check_current_tool)
4509            (_tool_command): Put the code that generates the "checked"
4510            callback into a separate function so that we can reuse it
4511            elsewhere
4512    
4513            * Thuban/Model/save.py (Saver): New class to handle serializing a
4514            session into an XML file. The main reason to introduce a class is
4515            that applications built on Thuban can derive from it so that they
4516            can save additional information in a session file.
4517            (save_session): Delegate almost all the work to the Saver class.
4518            Rename the filename argument to file because it may be a file like
4519            object now.
4520    
4521            * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
4522            code. Remove the little test code which would be executed when the
4523            module is run as a script which didn't work anymore since it can't
4524            import the other Thuban modules.
4525            (ProcessSession, load_session): Refactor the ProcessSession to
4526            have one method for each element start and end tag so that derived
4527            classes can easily override the processing of individual tags.
4528            Also, always parse with namespaces enabled because applications
4529            built on top of Thuban will likely use namespaces if they extend
4530            the session file format.
4531    
4532    2002-08-21  Bernhard Herzog  <[email protected]>
4533    
4534            * setup.py (ThubanInstall.run): Don't repr install_lib_orig
4535            because thubaninit_contents will do it for us.
4536    
4537    2002-08-16  Jan-Oliver Wagner <[email protected]>
4538    
4539            * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
4540            tree window already open
4541    
4542    2002-08-15  Bernhard Herzog  <[email protected]>
4543    
4544            * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
4545            with self.
4546    
4547            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
4548            when we have actually captured it.
4549    
4550            * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
4551            shapefile and destroy the table.
4552    
4553            * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
4554    
4555    2002-08-14  Bernhard Herzog  <[email protected]>
4556    
4557            * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
4558            instance variable columns
4559            (RecordTable.GetTypeName): row and col may be negative in some
4560            cases.
4561    
4562            * setup.py (InstallLocal.initialize_options)
4563            (InstallLocal.finalize_options, InstallLocal.user_options): New
4564            option create-init-file to build a thubaninit.py when running
4565            install_local
4566            (InstallLocal.run): Create the thubaninit.py module when requested
4567            (thubaninit_contents): Split the template into several parts and
4568            create a new function thubaninit_contents that creates the
4569            contents of a thubaninit module.
4570            (ThubanInstall.run): Use the new function to create the thubaninit
4571            module.
4572    
4573    2002-07-30  Bernhard Herzog  <[email protected]>
4574    
4575            * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
4576            cleanup.
4577            (ThubanApplication.MainLoop): Extend to automatically call OnExit.
4578    
4579            * Thuban/Model/session.py (Session.Destroy): Don't bypass the
4580            direct base class' Destroy method.
4581    
4582            * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
4583            layers.
4584            (Map.Destroy): Destroy the label_layer as well and call the
4585            inherited Desatroymethod first so that no more messages are
4586            issued.
4587            (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
4588            message if the stacking order actually has changed. Add
4589            doc-strings.
4590            (Map.BoundingBox): Correct the doc-string.
4591            (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
4592            (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
4593    
4594            * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
4595            all labels.
4596    
4597    2002-07-29  Bernhard Herzog  <[email protected]>
4598    
4599            * Thuban/Model/map.py (Map.subscribe_layer_channels)
4600            (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
4601            to a layer's channels into separate methods.
4602            (Map.RemoveLayer, Map.AddLayer): Call the new methods
4603            (Map.Destroy): Unsubscribe from a layer's channels before
4604            destroying it.
4605    
4606            * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
4607            selected_layer parameter to searched_layer which is the layer to
4608            search in.
4609            (MapCanvas.SelectShapeAt): New parameter layer to restrict the
4610            search to that layer. Return the selected layer and shape.
4611    
4612            * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
4613            typo
4614    
4615    2002-07-24  Bernhard Herzog  <[email protected]>
4616    
4617            * Thuban/UI/application.py (ThubanApplication.create_session):
4618            Extend the doc string.
4619            (ThubanApplication.subscribe_session)
4620            (ThubanApplication.unsubscribe_session): New methods to
4621            subscribe/unsubscribe to/from session channels.
4622            (ThubanApplication.SetSession): Call the new methods here.
4623            (ThubanApplication.maps_changed, ThubanApplication.set_map):
4624            Renamed set_map to maps_changed. Its now a subscriber for
4625            MAPS_CHANGED.
4626    
4627            * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
4628            x-coordinate in case of simple clicks
4629    
4630            * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
4631            don't pass it as a parameter
4632    
4633            * Thuban/Model/session.py (Session.RemoveMap): New
4634    
4635            * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
4636            window size into a parameter.
4637    
4638    2002-07-23  Bernhard Herzog  <[email protected]>
4639    
4640            * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
4641            just commands.
4642    
4643            * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
4644            parameter list a bit to allow setting the window title and the
4645            initial message in the status bar. Update the callers.
4646    
4647            * Thuban/UI/application.py (ThubanApplication.OnInit)
4648            (ThubanApplication.CreateMainWindow): Put the mainwindow
4649            instantiation into a separate method so that it can be overridden
4650            by a subclass.
4651    
4652    2002-07-19  Bernhard Herzog  <[email protected]>
4653    
4654            * Thuban/Model/session.py: Issue a CHANGED message every time
4655            another changed message is issued to make it easier to get
4656            notified of changes.
4657            (Session): Update the doc string
4658            (Session.forward): Issue changed-events as CHANGED as well.
4659            (Session.changed): Overwrite the inherited version to issue
4660            CHANGED events as well.
4661    
4662            * Thuban/UI/tree.py: We can now simply subscribe to the session's
4663            CHANGED channel to be informed of changes.
4664            (SessionTreeCtrl.session_channels): Not needed any longer.
4665            (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
4666            Only have to (un)subscribe CHANGED
4667    
4668            * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
4669    
4670            * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
4671            for the wxPython locale bug to __init__.py so that it's
4672            automatically executed by anybody using UI code from Thuban.
4673    
4674    2002-07-18  Bernhard Herzog  <[email protected]>
4675    
4676            * Thuban/UI/main.py (main): app no longer needs to be global
4677    
4678            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
4679            as parameter and store it in an instance variable
4680            (MainWindow.invoke_command, MainWindow.update_command_ui)
4681            (MainWindow.save_modified_session, MainWindow.NewSession)
4682            (MainWindow.OpenSession, MainWindow.SaveSession)
4683            (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
4684            application object.
4685    
4686            * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
4687            the main window with self.
4688    
4689            * Thuban/UI/context.py: New module with the context class
4690    
4691            * Thuban/UI/command.py (Command): Update doc string.
4692    
4693            * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
4694            MainWindow.update_command_ui): Pass an instance of the context
4695            class to the command's methods
4696            (check_current_tool, call_method): Handle the new context
4697            implementation
4698    
4699            * Examples/simple_extensions/simple_tool.py (simple_tool,
4700            check_simple_tool): Handle the new context implementation
4701    
4702            * Examples/simple_extensions/simple_command.py (simple_command):
4703            Handle the new context implementation. Update the comments about
4704            the context.
4705    
4706            * Thuban/UI/application.py (ThubanApplication.SetSession): Add
4707            doc-string
4708            (ThubanApplication.Session): New method to return the session
4709            object
4710    
4711            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
4712            interactor's selected_layer may not be a layer of the current
4713            session when the tree is updated while a new session is being set.
4714    
4715    2002-07-17  Bernhard Herzog  <[email protected]>
4716    
4717            * Thuban/UI/tree.py (color_string): Removed. No longer used.
4718            (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
4719            update_tree into update_tree and add_items. The tree now uses a
4720            more generic way to display the contents of the tree.
4721            (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
4722    
4723            * Thuban/Model/layer.py (Layer.TreeInfo),
4724            Thuban/Model/extension.py (Extension.TreeInfo),
4725            Thuban/Model/map.py (Map.TreeInfo),
4726            Thuban/Model/session.py (Session.TreeInfo):
4727            Add TreeInfo methods to implement the new tree view update scheme
4728    
4729    2002-07-16  Bernhard Herzog  <[email protected]>
4730    
4731            * Thuban/UI/application.py: Don't use "import from" for the
4732            MainWindow. It can't always be resolved.
4733            (ThubanApplication.OnInit): change reference to MainWindow
4734            accordingly.
4735    
4736            * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
4737            completely
4738    
4739    2002-07-10  Bernhard Herzog  <[email protected]>
4740    
4741            * setup.py (create_init_module): New configurable variable whose
4742            default depends on the platform we're running on.
4743            (ThubanInstall.initialize_options): Initialize
4744            self.create_init_module from the global create_init_module
4745            (ThubanInstall.user_options): indictate that the options
4746            create-init-module and init-module-dir have arguments.
4747    
4748            * setup.py: In the setup call change the version number to include
4749            cvs.
4750    
4751            * MANIFEST.in: Add the files in Examples
4752    
4753    2002-07-09  Bernhard Herzog  <[email protected]>
4754    
4755            * setup.py: In the setup call, use the thuban homepage as the
4756            value of the url parameter.
4757    
4758            * Examples: New subdirectory for examples.
4759    
4760            * Examples/simple_extensions/simple_tool.xpm,
4761            Examples/simple_extensions/simple_tool.py,
4762            Examples/simple_extensions/simple_command.py,
4763            Examples/simple_extensions/README: Simple examples showing how to
4764            add new commands and tools.
4765    
4766            * setup.cfg (bdist_rpm): Add the default value for prefix and tell
4767            bdist_rpm that we also have an install script.
4768            (bdist_inno): Add 2002 to the copyright notice.
4769    
4770            * setup.py: Create a file in python's site-packages directory to
4771            make installation of Thuban as a library easier.
4772            (ThubanInstall.user_options): Add two new options,
4773            create-init-module and init-module-dir
4774            (ThubanInstall.expand_with_pure_python_dirs): New method to expand
4775            filenames for installation in the default directories.
4776            (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
4777            the inherited methods to capture some filenames before they're
4778            transformed too much by distutils.
4779            (ThubanInstall.run): Create the init module if requested.
4780            (ThubanInstall.thuban_init_filename): New method to return the
4781            full name of the init module.
4782            (ThubanInstall.get_outputs): Append the filename of the init
4783            module.
4784    
4785    2002-07-08  Bernhard Herzog  <[email protected]>
4786    
4787            * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
4788            handle the prefix properly which means that the default for the
4789            installation prefix should be /usr for RPMs and /usr/local when
4790            doing a normal source install.
4791            (bdist_rpm_install_script): Script to override the default install
4792            commands in the specfile generated by the bdist_rpm command.
4793            (thuban_bdist_rpm.user_options): Add a prefix option
4794            (thuban_bdist_rpm.initialize_options): Init the prefix option.
4795            Create the script files for the spec files as empty files here
4796            (thuban_bdist_rpm._make_spec_file): Override the inherited method
4797            to fill the script files with content.
4798    
4799            * Thuban/Model/save.py (relative_filename): Wrapper around
4800            Thuban.Lib.fileutil.relative_filename that accepts an empty dir
4801            argument. save_session now automatically uses this version,
4802            solving a problem when saving to a relative filename.
4803    
4804            * setup.py: In the setup call, make sure that the library
4805            directories are under $prefix/lib not directly under $prefix.
4806    
4807    2002-06-20  Jan-Oliver Wagner <[email protected]>
4808    
4809            * Thuban/Model/extension.py: new module to handle extension objects.
4810            * Thuban/Model/messages.py: new messages for extensions.
4811            * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
4812            Session.AddExtension): new for handling extensions.
4813            Also some other minor changes to round up extension handling.
4814            * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
4815            of Extension titles and title and names of its objects.
4816    
4817    2002-05-29  Bernhard Herzog  <[email protected]>
4818    
4819            * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
4820            the events for a command.
4821            (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
4822            Call bind_command_events to bind the events. add_toolbar_command
4823            can now bind events too so that it's possible to have commands
4824            that are only available through the toolbar.
4825            (MainWindow.init_ids): New instance variable events_bound to keep
4826            track of for which commands events have been bound.
4827    
4828    2002-05-28  Bernhard Herzog  <[email protected]>
4829    
4830            * Thuban/UI/menu.py: New module to build and manage menus.
4831    
4832            * Thuban/UI/mainwindow.py: Remove some unused imports.
4833            (MainWindow.__init__, main_menu): move the definition of the main
4834            menu from __init__ to the Menu instance main_menu.
4835            (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
4836            build the menu bar and sub-menus from a menu description.
4837    
4838            * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
4839            startup file
4840            (ThubanApplication.read_startup_files): New method to run
4841            ~/.thuban/thubanstart.py
4842    
4843            * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
4844            Move the toolbar definition to the Menu instance main_toolbar.
4845            (MainWindow.build_toolbar): New method to build the toolbar
4846            similar to the build_menu methods
4847    
4848    2002-05-23  Bernhard Herzog  <[email protected]>
4849    
4850            * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
4851            layer_outline_color. Fix it in the definition of the command too.
4852    
4853            * Thuban/UI/command.py (Command): Fix typo in doc string
4854    
4855    2002-05-22  Bernhard Herzog  <[email protected]>
4856    
4857            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
4858            in the docstring
4859    
4860    2002-05-15  Bernhard Herzog  <[email protected]>
4861    
4862            * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
4863            when the shapefile is empty.
4864            (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
4865            now return None for empty shapefiles. Update doc-strings.
4866    
4867            * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
4868            the layer's bbox being None.
4869    
4870            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
4871            layer's bbox being None.
4872    
4873            * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
4874            necessary.
4875            (MapCanvas.__init__): New instance variables, last_selected_layer
4876            and last_selected_shape to determine how the selection has
4877            changed.
4878    
4879            * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
4880            AutoSizeColumns because it will cause a traversal of the entire
4881            table which for large .dbf files will take a very long time.
4882    
4883    2002-05-14  Bernhard Herzog  <[email protected]>
4884    
4885            * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
4886            maximum depth for the tree than shapelib does by default.
4887    
4888    2002-05-10  Bernhard Herzog  <[email protected]>
4889    
4890            * setup.py (py_modules): The shptree modules doesn't have a
4891            wrapper, so don't include it in the py_modules
4892    
4893    2002-05-08  Bernhard Herzog  <[email protected]>
4894    
4895            * extensions/shapelib/shptree.c (compare_ints): Make arguments
4896            const void * as in the qsort prototype
4897            (SHPTreeFindLikelyShapes): Remove some unused variables.
4898    
4899            * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
4900            maintains to redraw the window during a drag.
4901            (MapCanvas.unprojected_rect_around_point): New method to determine
4902            a small region around a point for hit-testing.
4903            (MapCanvas.find_shape_at): Only test the shapes in a small region
4904            around the point.
4905    
4906            * setup.py: Increment the version to 0.1.2
4907    
4908            * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
4909            debug print and set session to None after unsubscribing
4910    
4911    2002-05-07  Bernhard Herzog  <[email protected]>
4912    
4913            * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
4914            the file to have a .thuban extension.
4915    
4916            * Thuban/UI/tree.py (session_channels): New class constant with
4917            all the session channels to subscribe to to update the tree
4918            (SessionTreeCtrl.session_changed): Remember the session so that we
4919            can unsubscribe properly. Use the new class constant to
4920            unsubscribe from the old session and subscribe to the new one.
4921            (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
4922            subscriptions of the SessionTreeCtrl.
4923            (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
4924    
4925            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
4926            Session Tree" command to the file menu.
4927    
4928            * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
4929            as update_region to the renderer.
4930    
4931            * Thuban/UI/renderer.py
4932            (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
4933            update box is now directly a tuple, not a wxRect anymore.
4934    
4935            * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
4936            prints.
4937    
4938    2002-05-07  Bernhard Herzog  <[email protected]>
4939    
4940            * setup.py: Add the shptree extension module. See
4941            extensions/pyshapelib/ChangeLog for more details.
4942    
4943            * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
4944            extensions/shapelib/dbfopen.c: Really update to the versions of
4945            shapelib 1.2.9. For some reason it wasn't really done on
4946            2002-04-11.
4947    
4948            * extensions/shapelib/shptree.c: Modified version of shptree.c of
4949            shapelib 1.2.9. The only real difference is the use of qsort
4950            instead of a bubble sort implementation
4951    
4952            * Thuban/Model/layer.py (Layer.__init__): New instance variable
4953            shapetree to hold the shapelib quadtree for the shapefile
4954            (Layer.open_shapefile): Create the quad tree.
4955            (Layer.ShapesInRegion): New method to return the ids of shapes in
4956            a given region using the quad tree.
4957    
4958            * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
4959            comment
4960            (draw_polygon_shape): Accept both arcs and polygons.
4961            (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
4962            the api.
4963    
4964            * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
4965            return the shape ids to be rendered in a given layer.
4966            (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
4967            ids. Use draw_polygon_shape to draw arc shapes as well.
4968            (ScreenRenderer.RenderMap): New parameter for the rectangle that
4969            has to be updated
4970            (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
4971            calling it's ShapesInRegion method.
4972    
4973            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4974            update_region for the update region.
4975            (MapCanvas.OnPaint): Maintain the update region
4976            (MapCanvas.do_redraw): Pass the bounding box of the update_region
4977            to the renderer when drawing the bitmap. Reset the update_region.
4978    
4979    2002-05-03  Bernhard Herzog  <[email protected]>
4980    
4981            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
4982            MainWindow.OpenSession): Change the file extension of the session
4983            files to .thuban
4984    
4985            * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
4986            Move the map channels to be forwarded by the session into the
4987            class constant with forwarded_channels. Also add
4988            LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
4989            forwarded_channels
4990    
4991            * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
4992            typo and some rewording).
4993    
4994    2002-05-02  Bernhard Herzog  <[email protected]>
4995    
4996            * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
4997            around to speed up most redraws:
4998            (MapCanvas.__init__): New instance variable bitmap which holds the
4999            bitmap
5000            (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
5001            self.bitmap to draw.
5002            (MapCanvas.full_redraw): New method to force a full redraw
5003            including the bitmap
5004            (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
5005            make sure the bitmap is redrawn.
5006            (MapCanvas.projection_changed, MapCanvas.set_view_transform,
5007            MapCanvas.shape_selected): Call full_redraw instead of readraw to
5008            make sure the bitmap is redrawn.
5009            (MapCanvas.OnSize): New method to handle size events so that the
5010            bitmap can be redrawn.
5011    
5012    2002-04-29  Bernhard Herzog  <[email protected]>
5013    
5014            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
5015            canvas' VIEW_POSITION event
5016            (MainWindow.view_position_changed): Handler for VIEW_POSITION.
5017            Update the text in the status-bar accordingly.
5018    
5019            * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
5020            (MapCanvas.__del__): Implement because Publisher.__del__ has to be
5021            called.
5022            (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
5023            current_position
5024            (MapCanvas.set_current_position): New method to set
5025            current_position. Issue a VIEW_POSITION event
5026            (MapCanvas.CurrentPosition): New public method to return the value
5027            of current_position. Should be called when the VIEW_POSITION event
5028            is processed.
5029            (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
5030            Update the position.
5031            (MapCanvas.OnLeaveWindow): Set the position to None.
5032    
5033            * Thuban/UI/messages.py (VIEW_POSITION): New message for the
5034            position in the statusbar
5035    
5036    2002-04-26  Frank Koormann <[email protected]>
5037    
5038            * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
5039    
5040    2002-04-24  Frank Koormann <[email protected]>
5041    
5042            * Resources/Bitmaps/identify.xpm: shadow added
5043    
5044            * Resources/Bitmaps/fullextent.xpm: new
5045    
5046    2002-04-22  Jan-Oliver Wagner <[email protected]>
5047    
5048            * Thuban/UI/tree.py (update_tree): added test for None on map bounding
5049            box
5050    
5051    2002-04-21  Jan-Oliver Wagner <[email protected]>
5052    
5053            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
5054    
5055            * Thuban/UI/tree.py (update_tree): added added map extent
5056    
5057            * Thuban/UI/mainwindow.py (_method_command): extended by parameter
5058            icon; added map_full_extend as tool
5059    
5060    2002-04-19  Jan-Oliver Wagner <[email protected]>
5061    
5062            * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
5063            saving _new_ sessions
5064    
5065            * Thuban/Model/session.py (create_empty_session): new session
5066            don't have a filename (set to None)
5067    
5068            * Thuban/UI/tree.py (update_tree): added filename and modified flag
5069    
5070            * Thuban/Model/load.py (ProcessSession): convert projection
5071            parameters from unicode to regular string
5072    
5073            * Data/iceland_sample.session: Added UTM Zone 26 projection.
5074    
5075    2002-04-11  Bernhard Herzog  <[email protected]>
5076    
5077            * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
5078            extensions/shapelib/dbfopen.c: Update to the versions of shapelib
5079            1.2.9
5080    
5081            * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
5082            the pyshapelib directoy into the list of include dirs, so that
5083            pyshapelib_api.h can be found.
5084    
5085            * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
5086            holds the pyshapelib C-API
5087            (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
5088            pyshapelib_api to access the shapelib functions.
5089            (initwxproj): Import the c_api from the shapelib module and
5090            initialize pyshapelib_api.
5091    
5092    2002-04-04  Bernhard Herzog  <[email protected]>
5093    
5094            * setup.py (thuban_bdist_rpm.initialize_options): Use
5095            initialize_options to create the scripts for the rpm.
5096    
5097            * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
5098    
5099  2002-04-03  Bernhard Herzog  <[email protected]>  2002-04-03  Bernhard Herzog  <[email protected]>
5100    
5101            * setup.py: Increment version to 0.1.1
5102    
5103          * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add          * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
5104          Layer" and "Remove Layer" commands from the layer menu to the map          Layer" and "Remove Layer" commands from the layer menu to the map
5105          menu          menu
# Line 59  Line 5159 
5159    
5160          * setup.py: increase version number to 0.1          * setup.py: increase version number to 0.1
5161          (data_dist): New command class for data distribution          (data_dist): New command class for data distribution
           
5162    
5163  2001-09-14  Bernhard Herzog  <[email protected]>  2001-09-14  Bernhard Herzog  <[email protected]>
5164    
5165          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
5166          Handle the case of no layer (i.e. layer is None) properly.          Handle the case of no layer (i.e. layer is None) properly.
5167    
5168          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
5169          Set the initial selection of the combo boxes to reflect the          Set the initial selection of the combo boxes to reflect the
5170          projection we're starting with in a way that works on windows,          projection we're starting with in a way that works on windows,
5171          too.          too.
# Line 176  Line 5275 
5275          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
5276          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
5277    
5278          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
5279          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
5280          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
5281          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
5282          the application's OnInit method          the application's OnInit method
# Line 193  Line 5292 
5292          layer to the tableview dialog.          layer to the tableview dialog.
5293    
5294          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
5295          (TableGrid):          (TableGrid):
5296          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
5297          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
5298          (TableFrame.__init__):          (TableFrame.__init__):
# Line 260  Line 5359 
5359  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
5360    
5361          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
5362            
5363          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
5364          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
5365            
5366          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
5367          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
5368          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 310  Line 5409 
5409          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
5410          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
5411          link_file method          link_file method
5412            
5413          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
5414          the window when the first layer is added to the map.          the window when the first layer is added to the map.
5415    
# Line 347  Line 5446 
5446          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
5447          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
5448          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
5449            
5450          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
5451          installer          installer
5452    

Legend:
Removed from v.85  
changed lines
  Added in v.1349

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26