/[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 924 by frank, Mon May 19 09:12:42 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]>  2003-05-19  Frank Koormann  <[email protected]>
1686    
1687          Extended version information for Thuban          Extended version information for Thuban

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26