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

Legend:
Removed from v.848  
changed lines
  Added in v.1325

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26