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

Legend:
Removed from v.766  
changed lines
  Added in v.1265

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26