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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26