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

Legend:
Removed from v.803  
changed lines
  Added in v.1294

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26