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

Legend:
Removed from v.971  
changed lines
  Added in v.1422

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26