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

Legend:
Removed from v.762  
changed lines
  Added in v.1318

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26