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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26