/[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 184 by bh, Thu May 23 14:59:28 2002 UTC revision 1318 by jonathan, Mon Jun 30 09:57:16 2003 UTC
# Line 1  Line 1 
1    2003-06-30  Jonathan Coles   <[email protected]>
2    
3            * Thuban/version.py: Update version to 0.8.1
4            
5            * MANIFEST.in: Added Projections so that default.proj is
6            included.
7    
8    2003-06-26  Jonathan Coles   <[email protected]>
9    
10            New About box with lots more information including library
11            versions and credits. More/better version checking before
12            Thuban starts.
13    
14            * Thuban/UI/about.py: New. New About box that displays
15            library version information and credits.
16    
17            * Thuban/version.py: Added new 'versions' dictionary which
18            contains the verions of various libraries which are checked
19            when the module loads.
20            (verify_versions): Check all version numbers and returns
21            a list of errors.
22    
23            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
24            Reset the status of the buttons as the situation warrants,
25            but in a better more reliable way by not relying on the
26            current status to determine what needs to change.
27    
28            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
29            (verify_versions): Remove most of the code since it is
30            now in Thuban.version.verify_versions.o
31    
32            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
33            About box in Thuban.UI.about.
34    
35            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
36            Returns the version of gdal library being used as a string.
37    
38            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
39            Removed.
40            (get_proj_version): Return the version of PROJ that the file
41            was compiled with.
42            (get_gtk_version): Return th version of GTK that the file
43            was compiled with.
44    
45    2003-06-25  Jonathan Coles   <[email protected]>
46    
47            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
48            of the SelectPropertiesDialog should be self so the window
49            appears on top.
50            (ClassGroupPropertiesCtrl.DoEdit): The parent
51            of the SelectPropertiesDialog should be self so the window
52            appears on top.
53    
54            * Thuban/UI/resource.py: Cleaned up how we determine file
55            extensions.
56            (GetImageResource): Return an wxImage from our Resources.
57    
58    2003-06-24  Jonathan Coles   <[email protected]>
59    
60            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
61            Check that a layer has a classification before trying
62            to get it. Raster layers don't have classifications.
63    
64    2003-06-23  Jonathan Coles   <[email protected]>
65            
66            * setup.py: Add Resources/XML to resource list.
67        
68    2003-06-23  Jonathan Coles   <[email protected]>
69    
70            * setup.cfg: Fix copyright dates
71        
72    2003-06-23  Jonathan Coles   <[email protected]>
73    
74            * MANIFEST.in: Update with Resources/XML
75    
76            * setup.py: Don't include Locale resources yet as we don't
77            have any and it causes problems building the distribution
78            for Windows. Update version to 0.8.0.
79    
80            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
81    
82            * Thuban/UI/mainwindow.py: Add blank line at the end because
83            file was not being read correctly building the Windows
84            distribution.
85    
86    2003-06-23  Jonathan Coles   <[email protected]>
87    
88            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
89    
90            * Thuban/version.py: Temporarily update longversion for
91            the 0.8 release so that it doesn't have the cvs revision.
92    
93    2003-06-23  Jonathan Coles   <[email protected]>
94    
95            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
96            to make sure that we don't create reentrant possibilities with
97            wxYield.
98    
99            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
100            directly to avoid the wxSafeYield() call which generates an
101            OnPaint event causing infinite recursion. Don't try to catch
102            exception anymore. This was for before there were limits on map
103            scaling.
104    
105    2003-06-23  Bernhard Herzog  <[email protected]>
106    
107            Bug fix for RT #1961:
108    
109            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
110            Register DerivedShapestores with the session
111    
112            * Thuban/Model/session.py (Session.Tables): Make sure each table
113            is only listed once.
114    
115            * test/test_load.py (TestJoinedTable.test): Add check_format call.
116            Update file contents to match the one written out.
117    
118    2003-06-20  Bernhard Herzog  <[email protected]>
119    
120            * test/xmlsupport.py (SaxEventLister.startElementNS)
121            (SaxEventLister.endElementNS): Do not include the qname. Python
122            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
123            is (presumably incorrectly) None, whereas it's a string with the
124            element name in the later versions.
125    
126            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
127            (TestEventList.test_even_list_namespace): Update tests to reflect
128            the new behaviour
129            (TestEventList.test_even_list_id_normalization): Fix doc-string
130    
131    2003-06-20  Jonathan Coles   <[email protected]>
132    
133            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
134            by deriving classes to determine if that layer supports shapes.
135            (Layer): Override HasShapes and return true.
136    
137            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
138            instead of a direct call to wx[Begin|End]CusyCursor().
139            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
140            table data.
141    
142            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
143            New. Wrappers around the wxWindows functions that allow us to
144            make additional calls such as wxYield which gives the native
145            system a chance to update the cursor correctly.
146    
147            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
148            instead of a direct call to wx[Begin|End]CusyCursor().
149    
150            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
151            instead of a direct call to wx[Begin|End]CusyCursor().
152            (MapCanvas.find_shape_at): Check if the current search layer
153            support shapes, otherwise go on to the next layer.
154    
155            * test/test_layer.py: Add tests in each type of layer for
156            HasClassification() and HasShapes()
157    
158    2003-06-20  Jonathan Coles   <[email protected]>
159    
160            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
161            turning on the busy cursor to allow the system to change the
162            cursor before we begin painting. This fixes a problem that
163            was occuring only under GTK. Fixes RTbug #1840.
164    
165    2003-06-20  Bernhard Herzog  <[email protected]>
166    
167            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
168            version.
169    
170            * Thuban/Model/save.py (sort_data_stores): New. Make topological
171            sort of the data sources so they can be written with sources that
172            data sources that depend on other data sources come after the
173            sources they depend on.
174            (SessionSaver.__init__): Add idmap instance variable to map from
175            objects to the ids used in the file.
176            (SessionSaver.get_id, SessionSaver.define_id)
177            (SessionSaver.has_id): New. Methods to manage the idmap
178            (SessionSaver.write): Use thuban-0.8.dtd
179            (SessionSaver.write_session): Add a namespace on the session and
180            write out the data sources before the maps.
181            (SessionSaver.write_data_containers): New. Write the data
182            containers.
183            (SessionSaver.write_layer): Layer elements now refer to a
184            shapestore and don't contain filenames anymore.
185    
186            * Thuban/Model/load.py (LoadError): Exception class to raise when
187            errors in the files are discovered
188            (SessionLoader.__init__): Define dispatchers for elements with a
189            thuban-0.8 namespace too.
190            (SessionLoader.check_attrs): New helper method to check and
191            convert attributes
192            (AttrDesc): New. Helper class for SessionLoader.check_attrs
193            (SessionLoader.start_fileshapesource)
194            (SessionLoader.start_derivedshapesource)
195            (SessionLoader.start_filetable, SessionLoader.start_jointable):
196            Handlers for the new elements in the new fileformat
197            (SessionLoader.start_layer): Handle the shapestore attribute in
198            addition to filename.
199            (SessionLoader.start_table, SessionLoader.end_table): Removed.
200            They were never used in the old formats and aren't needed for the
201            new.
202    
203            * Thuban/Model/session.py (Session.DataContainers): New method to
204            return all "data containers", i.e. shapestores and tables
205    
206            * test/xmlsupport.py (SaxEventLister.__init__)
207            (SaxEventLister.startElementNS, sax_eventlist): Add support to
208            normalize IDs.
209    
210            * test/test_xmlsupport.py
211            (TestEventList.test_even_list_id_normalization): New test case for
212            id normalization
213    
214            * test/test_load.py (LoadSessionTest.check_format): Use ID
215            normalization
216            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
217            class atrributes used for ID normalization
218            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
219            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
220            file format
221            (TestJoinedTable): New test for loading sessions with joined
222            tables.
223            (TestLoadError): New. Test whether missing required attributes
224            cause a LoadError.
225    
226            * test/test_save.py (SaveSessionTest.thubanids)
227            (SaveSessionTest.thubanidrefs): New class attributes for ID
228            normalization in .thuban files.
229            (SaveSessionTest.compare_xml): Use id-normalization.
230            (SaveSessionTest.testEmptySession)
231            (SaveSessionTest.testLayerProjection)
232            (SaveSessionTest.testRasterLayer)
233            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
234            (SaveSessionTest.testLayerProjection): The filename used was the
235            same as for testSingleLayer. Use a different one.
236            (SaveSessionTest.test_dbf_table)
237            (SaveSessionTest.test_joined_table): New test cases for saving the
238            new data sources structures.
239            (TestStoreSort, MockDataStore): Classes to test the sorting of the
240            data stores for writing.
241    
242            * test/runtests.py: Add CVS keywords
243    
244    2003-06-20  Jonathan Coles   <[email protected]>
245    
246            * test/test_session.py
247            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
248            Use the cultural_landmark-point.dbf file for the store so that
249            the table rows and shape count match.
250    
251    2003-06-20  Jonathan Coles   <[email protected]>
252    
253            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
254            an exception if the number of shapes is different from the
255            number of rows in the table. Address RTbug #1933.
256    
257            * test/test_layer.py (TestLayer.test_derived_store): Add
258            a test for the new exception in DerivedShapeStore.__init__.
259    
260            * test/support.py (FloatTestCase): Removed since there is
261            already FloatComparisonMixin. Fixes RTbug #1954.
262            (FloatComparisonMixin.assertFloatEqual): Include test for
263            infinity that was part of FloatTestCase.
264    
265            * test/test_range.py (RangeTest): Inherit from
266            support.FloatComparisonMixin now that we don't have
267            support.FloatTestCase.
268    
269    2003-06-20  Bernhard Herzog  <[email protected]>
270    
271            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
272            the implementation in xmlsupport instead.
273            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
274    
275            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
276            of test_save
277    
278    2003-06-20  Bernhard Herzog  <[email protected]>
279    
280            * test/test_load.py (LoadSessionTest.check_format): New helper
281            method to make sure the test files we load might have been written
282            by the current thuban version.
283            (ClassificationTest.TestLayers, TestSingleLayer.test)
284            (TestLayerVisibility.test, TestClassification.test)
285            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
286            Add check_format() calls and fix the thuban data to match the data
287            that would be written by saving the session loaded from it.
288    
289            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
290            the same class and function in test_save.
291    
292            * test/test_xmlsupport.py (TestEventList): New. test cases for
293            sax_eventlist
294    
295    2003-06-20  Bernhard Herzog  <[email protected]>
296    
297            * Resources/XML/thuban.dtd: Add comment about which versions of
298            Thuban are covered by this DTD
299            (map): Fix content model for layers and raster layers. There can
300            be any number or layers and raster layers in any order.
301    
302    2003-06-20  Jonathan Coles   <[email protected]>
303    
304            This is mainly about fixing RTbug #1949.
305    
306            * Thuban/Model/classification.py: Remove "from __future__"
307            import statement since python 2.2 is the earliest supported
308            version.
309    
310            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
311            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
312            depending on the units this projection *forwards* into.
313    
314            * Thuban/Model/save.py (SessionSaver.write_classification):
315            Remove unnecessary use of lambdas and nested functions.
316    
317            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
318            adjustment here if the map projection uses degrees.
319    
320            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
321            scale adjust code since it is now done before calling
322            this method. Don't do anything if the map projection
323            is None.
324    
325    2003-06-19  Bernhard Herzog  <[email protected]>
326    
327            Move version specific load tests to their own file.
328    
329            * test/test_load.py: Expand the doc-string to explain a bit how to
330            handle file format changes.
331            (TestClassification.test): Update the docstring as this test is
332            not about Thuban 0.2 anymore.
333    
334            * test/test_load_0_2.py: New file with the load tests for thuban
335            files created with Thuban 0.2 and earlier.
336    
337    2003-06-19  Bernhard Herzog  <[email protected]>
338    
339            Add XML validation to some of the tests. Validation will only be
340            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
341            To make the DTD available to the test cases it's moved into
342            Resources/XML
343    
344            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
345            for versions up to and including 0.2. Two slight changes: added an
346            encoding specification and fixed the comment which refered to
347            GRASS, not Thuban
348    
349            * test/xmlsupport.py: New support module for tests involving XML.
350            Currently there's a mix-in class for XML validation.
351    
352            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
353    
354            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
355            so that we can validate the
356            (SaveSessionTest.testEmptySession)
357            (SaveSessionTest.testSingleLayer)
358            (SaveSessionTest.testSingleLayer)
359            (SaveSessionTest.testLayerProjection)
360            (SaveSessionTest.testRasterLayer)
361            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
362    
363            * test/runtests.py (main): Call print_additional_summary instead
364            of print_garbage_information
365    
366            * test/support.py (resource_dir): New function to return the
367            "Resource" subdirectory
368            (print_additional_summary): New function to combine several
369            summary functions
370            (run_tests): Use print_additional_summary instead of calling
371            print_garbage_information directly
372    
373    2003-06-19  Bernhard Herzog  <[email protected]>
374    
375            * Doc/thuban.dtd (classification): Correct the content model of
376            the classification element.
377            (projection): Add the "name" attribute
378    
379    2003-06-19  Frank Koormann   <[email protected]>
380    
381            MERGE from the greater-ms3 branch.
382    
383            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
384            scale if projection is latlong to get better estimate.
385    
386            Fix problem of hidden properties dialog under windows after double
387            click on layer tree:
388            The tree control always gets an Expanded / Collapsed event after
389            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
390            raises the already displayed window.
391    
392            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
393            raiseProperties initialized to prevent endless loops
394            (LegendTree._OnItemActivated): Depending on self.raiseProperties
395            simply raise the properties or open the dialog and issue a second
396            event.
397    
398    2003-06-18  Jonathan Coles   <[email protected]>
399    
400            * setup.py: Fix a few problems that occured under Windows.
401    
402    2003-06-18  Jonathan Coles   <[email protected]>
403    
404            When Thuban loaded the map was redrawn twice because the
405            legend was being opened after the mainwindow was created
406            and not during its creation. This meant the map was drawn
407            initially and then had to be redrawn when the legend
408            caused the display to change. Now the legend is opened
409            in the mainwindow constructor which resolves this issue.
410    
411            Also, although we were checking for the existence of
412            gdal and gdalwarp modules, the gdalwarp extension was
413            still being compiled (which may fail if the system doesn't
414            have gdal installed). the build_ext command to setup.py
415            now accepts the flags --with-gdal and --without-gdal.
416            If --without-gdal is specified setup.py will try to
417            use the gdal parameters specified by gdal-config. Under
418            windows, those parameters have to be set in setup.py
419            as with proj4 an wxWindows.
420    
421            * setup.py: Use a list instead of seperate variables for
422            extension parameters so we can create a generic function
423            that runs an appropriate *-config script.
424            (run_cs_script): Renamed from run_wx_script and modified
425            to accept a second argument which is a list of lists to
426            be filled in by the values returned from running the command.
427            (thuban_build_ext): New. Extends the build_ext command and
428            provides the options --with-gdal/--without-gdal which then
429            optionally includes the gdalwarp extension.
430    
431            * Thuban/Model/resource.py: First check if we can import
432            the gdalwarp Thuban extension before checking for gdal.
433            Also added some comments.
434            
435            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
436            the map is None which may be the case if none has been loaded
437            yet.
438    
439            * Thuban/UI/main.py (main): Remove call to ShowLegend.
440    
441            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
442    
443            * Thuban/UI/renderer.py: Check for gdal support before importing
444            gdalwarp.
445            (MapRenderer.render_map): Only try to optimize if we have gdal
446            support otherwise nothing will get drawn.
447    
448            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
449            during startup before a map has been created. Check if map is None
450            before using it and do nothing if it is.
451    
452    2003-06-17  Jonathan Coles   <[email protected]>
453    
454            Fix the problem with raster layers under Windows that caused
455            Thuban to crash. The view should respond to layer projection
456            changed events to update the display. Changes to a projection
457            should not cause the map to be set to full extent.
458            
459            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
460            current_map_proj to remember the current map projection so that
461            when the projection changes we know what the previous projection
462            was.
463            (MapCanvas.SetMap): Unsubscribe and subscribe to
464            LAYER_PROJECTION_CHANGED events.
465            (MapCanvas.projection_changed): Split into two methods that respond
466            to map and layer projection changes.
467            (MapCanvas.map_projection_changed): New. Takes the current view and
468            projects it using the new projection. This does not cause the
469            map to be redrawn at full extent.
470            (MapCanvas.layer_projection_changed): New. Cause a redraw which
471            will draw each layer in its new projection.
472            
473            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
474            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
475            under Windows.
476            
477            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
478            to twice sizeof(void*) because there are two digits for each
479            hex byte.
480    
481    2003-06-16  Bernhard Herzog  <[email protected]>
482    
483            Update to the layer interface: Direct access to the table,
484            shapetable, shapefile and filename attributes is now actively
485            deprecated by issuing deprecation warnings for all places where
486            this happens.
487    
488            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
489            to the instance variables table, shapetable, shapefile and
490            filename via __getattr__ so that we can issue a deprecation
491            warning.
492            (Layer.SetShapeStore): Don't set the deprecated instance variables
493            any more
494            (Layer.SetShapeStore): Don't use deprecated layer instance
495            variables
496            (Layer.Destroy): No need to explicitly remove the instance
497            variables any more
498            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
499            instance variables
500    
501            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
502            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
503            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
504            use deprecated layer instance variables
505    
506            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
507            deprecated layer instance variables
508    
509            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
510            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
511            instance variables
512    
513            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
514            deprecated layer instance variables
515    
516            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
517            deprecated layer instance variables
518    
519            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
520            deprecated layer instance variables
521    
522            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
523            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
524            variables
525    
526            * test/runtests.py (main): Turn Thuban's deprecation warnings into
527            errors so that they're cought by the tests
528    
529            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
530            layer instance variables
531    
532    2003-06-16  Jonathan Coles   <[email protected]>
533    
534            Fix a problem under Windows whereby if the user double-clicks on a
535            layer in the legend that tree item will expand or collapse as well
536            as open the layer properties dialog. The state of the tree item
537            should not be affected.
538    
539            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
540            preventExpandCollapse and subscribe to expanding and collapsing
541            events.
542            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
543            collapsing events and will veto the event if it has been triggered
544            by the user double clicking on a layer.
545            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
546            that an expanding/collapsing event should be vetoed.
547    
548    2003-06-13  Bernhard Herzog  <[email protected]>
549    
550            * Thuban/UI/classifier.py (Classifier.OnClose)
551            (Classifier.map_layers_removed)
552            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
553            in OnClose and not in map_layers_removed or
554            layer_shapestore_replaced to make sure it always happens when the
555            dialog is closed
556    
557    2003-06-13  Jonathan Coles   <[email protected]>
558    
559            This puts back a fix for Windows where a panel is needed so that
560            the background of the table view appears correctly.
561    
562            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
563            object that can be used by derived classes to place any
564            controls (including the grid) onto.
565            (QueryTableFrame.__init__): Use the panel as the parent window
566            for all the controls. Reparent the grid so that the panel is
567            the parent. Call UpdateStatusText() to correctly initialize
568            the status bar.
569    
570    2003-06-13  Jonathan Coles   <[email protected]>
571    
572            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
573            from wxFrame (as opposed to wxDialog like the other classes)
574            but otherwise behaves like the other classes. This is needed
575            for the TableView which isn't really a dialog and needs to
576            have a status bar and control buttons.
577    
578            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
579            instance variable to keep track of how many rows are selected.
580            Subscribe once to the the events we are interested in.
581            (ThubanGrid.OnRangeSelect): Only handle event if event handling
582            hasn't been turned off.
583            (ThubanGrid.OnSelectCell): Only handle event if event handling
584            hasn't been turned off.
585            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
586            as an event listener (which changes the event handler stack)
587            simply set an instance variable to False. This is checked in
588            the event handlers.
589            (ThubanGrid.GetNumberSelected): Return the number of currently
590            selected rows.
591            (TableFrame): Inherit from ThubanFrame so we can have a
592            status bar and control buttons.
593            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
594            Explicitly set which items are selected in the operator choice and
595            action choice so there is always a valid selection. Fixes RTbug #1941.
596            Subscribe to grid cell selection events so we can update the
597            status bar.
598            (QueryTableFrame.UpdateStatusText): Update the status bar with
599            how many rows are in the grid, how many columns, and how many
600            rows are selected.
601            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
602            Call UpdateStatusText when cells are (de)selected.
603            (QueryTableFrame.OnQuery): Use the string value in the value
604            combo if either the selected item index is 0 or if the string
605            cannot be found in the predefined list (this happens if the
606            user changes the text). Fixes RTbug #1940.
607            Only turn off the grid event listeners if there a query comes
608            back with a none empty list of ids. in the case that the list
609            is empty this causes a grid.ClearSelection() call to actually
610            clear the grid selection which causes the selected items in
611            the map to be deselected. Fixes RTbug #1939.
612    
613            * test/test_save.py (XMLWriterTest.Encode): Check return values.
614            Fixes RTbug #1851.
615    
616    2003-06-13  Bernhard Herzog  <[email protected]>
617    
618            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
619            self.selected_shape with the current selection to make sure the
620            contents of the dialog are up to date when it's shown for the
621            first time.
622            The dialog used to work without this by luck. The recent fix to
623            the connector module 'broke' a 'feature' the identify view was
624            relying on, i.e that subscribing to a message in response to
625            receiving a message of that type would mean that the new
626            subscriber would also be called for the same message.
627            
628    2003-06-12  Jonathan Coles   <[email protected]>
629    
630            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
631            the image is rendered. Fixes RTbug #1937.
632    
633    2003-06-12  Jonathan Coles   <[email protected]>
634    
635            * Thuban/Lib/fileutil.py: As is done under Windows, create the
636            user directory if it doesn't exist on a posix system.
637            Fixes RTbug #1815.
638    
639            * Thuban/Model/resource.py (get_user_proj_files): Moved the
640            called to get_application_dir here, so that the directory
641            will only be called if this method is invoked.
642    
643            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
644            the projfilepath if no projection is selected.
645    
646    2003-06-12  Jonathan Coles   <[email protected]>
647    
648            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
649            the scalebar if the current map has no projection set.
650    
651            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
652            projfilepath label to just the basename of the projection file
653            rather than include the entire path.
654    
655            * Thuban/Model/resource.py: Fix missed proj functions that
656            needed to be renamed.
657    
658    2003-06-12  Jonathan Coles   <[email protected]>
659    
660            * Thuban/Model/classification.py: Removed assert statements that
661            tested if the variable was an instance of Color.
662    
663            * Thuban/Model/color.py (Color): Remove commented code that isn't
664            used.
665            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
666            Fixes RTbug #1835.
667            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
668            Needed now that the class doesn't inherit from Color.
669    
670    2003-06-12  Jonathan Coles   <[email protected]>
671    
672            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
673            check unicode strings.
674    
675            * test/test_layer.py: Check for existence of gdal.
676    
677    2003-06-12  Jonathan Coles   <[email protected]>
678        
679            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
680            that was in load.py
681    
682            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
683            that was in save.py
684    
685    2003-06-12  Jonathan Coles   <[email protected]>
686    
687            This is largely a collection of bug fixes. We also handle the
688            case where gdal is not on the system. The XMLReader and XMLWriter
689            classes were moved into there own files to resolve some circular
690            import references and because they shouldn't really be in the
691            file that is dediciated to reading/writing session files since
692            they are also used elsewhere.
693    
694            * Thuban/Model/classgen.py: Renamed functions to follow the
695            function_names_with_underscores style. Fixes RTbug #1903.
696            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
697    
698            * Thuban/Model/layer.py: Import gdal only if it available.
699            (RasterLayer): Handle the case where the gdal library is unavailable.
700            Addresses RTbug #1877.
701    
702            * Thuban/Model/load.py (XMLReader): Moved into seperate file
703            xmlreader.py.
704    
705    2003-06-12  Jonathan Coles   <[email protected]>
706    
707            This is largely a collection of bug fixes. We also handle the
708            case where gdal is not on the system. The XMLReader and XMLWriter
709            classes were moved into there own files to resolve some circular
710            import references and because they shouldn't really be in the
711            file that is dediciated to reading/writing session files since
712            they are also used elsewhere.
713    
714            * Thuban/Model/classgen.py: Renamed functions to follow the
715            function_names_with_underscores style. Fixes RTbug #1903.
716            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
717    
718            * Thuban/Model/layer.py: Import gdal only if it available.
719            (RasterLayer): Handle the case where the gdal library is unavailable.
720            Addresses RTbug #1877.
721    
722            * Thuban/Model/load.py (XMLReader): Moved into seperate file
723            xmlreader.py.
724    
725            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
726            file xmlwriter.py.
727    
728            * Thuban/Model/resource.py: Renamed functions to following the
729            function_names_with_underscores style.
730            (has_gdal_support): New function that returns true if the gdal
731            library is available. Addresses RTbug #1877.
732    
733            * Thuban/UI/application.py (ThubanApplication.OpenSession):
734            Display a message box if the gdal library is not available, but
735            only if there are any layers that would use it. Addresses RTbug #1877.
736    
737            * Thuban/UI/classgen.py: Use renamed projection resource functions.
738            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
739            when using integers versus floats.
740    
741            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
742            determine if the "Add Image Layer" menu option should be
743            greyed out or not. Addresses RTbug #1877.
744    
745            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
746    
747            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
748            optimize if a raster layer is visible. Fixes RTbug #1931.
749            Only draw the raster layer if the gdal library is available.
750            Addresses RTbug #1877.
751    
752            * test/test_classgen.py: Add tests for generate_singletons,
753            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
754            (test_calculate_quantiles): Fix some tests to catch the new
755            ValueError that is raised.
756    
757            * test/test_proj.py: Use renamed projection resource functions.
758    
759            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
760            test for saving classified layers. Fixes RTbug #1902.
761            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
762    
763    2003-06-12  Jan-Oliver Wagner <[email protected]>
764    
765            Fix for http://intevation.de/rt/webrt?serial_num=1900.
766    
767            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
768    
769            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
770            multiplechoicedialog.py rather than from the wxPython library.
771    
772    2003-06-11  Frank Koormann  <[email protected]>
773    
774            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
775            update.
776    
777    2003-06-11  Frank Koormann  <[email protected]>
778    
779            * Thuban/Lib/fileutil.py (get_application_dir): New function to
780            determine the absolute .thuban/thuban directory under
781            "posix" (os.expanduser) and "nt" (read AppData registry key).
782    
783            * Thuban/Model/resource.py: Use get_application_dir
784    
785            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
786            Use get_application_dir.
787    
788    2003-06-10  Bernhard Herzog  <[email protected]>
789    
790            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
791            the messages MAP_LAYERS_REMOVED messages
792            (LayerTableFrame.OnClose): Unsubscribe from it.
793            (LayerTableFrame.map_layers_removed): New. Receiver for
794            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
795            dialog is showing is removed.
796    
797    2003-06-10  Bernhard Herzog  <[email protected]>
798    
799            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
800            of the receivers list so that unsubscribing in a receiver doesn't
801            modify it while iterating over it.
802    
803            * test/test_connector.py
804            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
805            unsubscribing in a receiver works correctly. See docstring for
806            details
807    
808    2003-06-10  Bernhard Herzog  <[email protected]>
809    
810            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
811            message.
812    
813            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
814            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
815            LAYER_CHANGED will still be sent if the classification changes.
816    
817            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
818            parameter so we can subscribe to some of its messages
819            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
820            and the layer's LAYER_SHAPESTORE_REPLACED
821            (Classifier.unsubscribe_messages): New. Unsubscribe from message
822            subscribed to in __init__
823            (Classifier.map_layers_removed)
824            (Classifier.layer_shapestore_replaced): receivers for the messages
825            subscribed to in __init__. Unsubscribe and close the dialog
826    
827            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
828            the map to the Classifier dialog
829    
830            * test/test_layer.py (SetShapeStoreTests): Derive from
831            SubscriberMixin as well so we can test messages
832            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
833            messages
834            (SetShapeStoreTests.tearDown): Clear the messages again
835            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
836            for the modified flag too
837            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
838            to check whether SetShapeStore sets the modified flag
839            (SetShapeStoreTests.test_set_shape_store_different_field_name)
840            (SetShapeStoreTests.test_set_shape_store_same_field)
841            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
842            Add tests for the messages. This checks both the new
843            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
844    
845    2003-06-06  Jan-Oliver Wagner <[email protected]>
846    
847            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
848            the menu items.
849    
850    2003-06-05  Frank Koormann  <[email protected]>
851    
852            * Thuban/UI/identifyview.py (IdentifyView.__init__):
853            Layout reimplemented without panel. Make life easier to fit the list
854            in the dialog.
855    
856    2003-06-05  Frank Koormann  <[email protected]>
857    
858            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
859            once on initialisation (Former implementation resulted in multiple
860            entries for each projection).
861            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
862            if set, select the projection found under the specified name. This
863            overwrites any other selection estimate.
864            Removed projchoice filling from this method.
865            (ProjFrame._OnSave, ProjFrame._OnAddToList):
866            Updated call of ProjFrame.__FillAvailList
867            (LCCPanel._DoLayout): Moved parameter controls in more common order.
868    
869            * Resources/Projections/defaults.proj: Extended defaults representing
870            various common European projections.
871    
872    2003-06-05  Frank Koormann  <[email protected]>
873    
874            * Thuban/UI/identifyview.py (IdentifyView.__init__):
875            Use ListCtrl instead of GridCtrl
876    
877            * Thuban/Model/resource.py:
878            Guess location of .thuban directory from tempdir parent directory.
879    
880            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
881            Guess location of .thuban directory from tempdir parent directory.
882    
883    2003-06-04  Bernhard Herzog  <[email protected]>
884    
885            Do not cache the values returned by the tree widget's
886            GetFirstChild and GetNextChild methods because it led to lots of
887            segfaults. The new way requires more brute force but is more
888            reliable.
889    
890            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
891            variable layer2id
892            (LegendTree.find_layer): New method to do with brute force what
893            layer2id tried to accomplish
894            (LegendTree._OnMsgLayerChanged)
895            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
896            Use find_layer instead of layer2id
897            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
898            update layer2id anymore
899            (LegendTree._OnMsgMapLayersRemoved)
900            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
901    
902    2003-06-03  Thomas Koester  <[email protected]>
903    
904            * Thuban/Model/classgen.py (GenQuantiles0): New function.
905    
906    2003-06-02  Bernhard Herzog  <[email protected]>
907    
908            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
909            New commands.
910            (main_menu): Add the new commands.
911            (MainWindow.TableRename): New. Implementation of the table_rename
912            command.
913            (MainWindow.RenameLayer): New. Implementation of the layer_rename
914            command.
915    
916            * Thuban/Model/session.py (Session.AddTable): call self.changed to
917            set the modified flag
918    
919            * test/test_session.py (TestSessionSimple.test_add_table): Test
920            whether the modified flag is set properly
921    
922            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
923            instead of issue so that the modified flags get updated.
924    
925            * test/test_base.py (SomeTitledObject): Derive from Modifiable
926            instead of Publisher to reflect reality better and to accomodate
927            the fact that SetTitle now calls changed instead of issue
928    
929    2003-06-02  Bernhard Herzog  <[email protected]>
930    
931            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
932            acquisition has to happen before the try in a try-finally.
933    
934    2003-06-02  Bernhard Herzog  <[email protected]>
935    
936            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
937            possible that a layer is removed that is not currently selected in
938            the legend so don't check for this.
939    
940    2003-05-30  Bernhard Herzog  <[email protected]>
941    
942            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
943            variables to None that have direct or indirect references to
944            shapefiles or dbf files to make sure that they do go away and the
945            files are closed.
946    
947    2003-05-30  Bernhard Herzog  <[email protected]>
948    
949            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
950            availImgListIndices when a new image list is created
951            
952    2003-05-30  Bernhard Herzog  <[email protected]>
953    
954            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
955            changing_selection to indicate whether the LegendTree code itself
956            is currently changing the selection
957            (LegendTree.normalize_selection): New method to normalize the
958            selection by selecting the layer item even if the user clicked on
959            the classification.
960            (LegendTree._OnSelChanged): normalize the selection. This works
961            around a bug in wx which doesn't keep track of the selection
962            properly when subtrees are deleted.
963    
964    2003-05-30  Bernhard Herzog  <[email protected]>
965    
966            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
967            maximum and minimum scale factors.
968    
969            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
970            changes in classgen.py
971    
972    2003-05-30  Jonathan Coles   <[email protected]>
973    
974            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
975            all the methods functions. Fixes RTBug #1903.
976    
977            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
978            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
979            RTBug #1907.
980    
981            * Thuban/UI/classgen.py: Use classgen functions that were part
982            of the ClassGenerator class. Put try/finally blocks around
983            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
984            RTBug #1904.
985    
986            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
987    
988            * Thuban/UI/legend.py: The legend was cleared and repopulated any
989            time something changed which caused some state to be lost such
990            as which children were expanded or collapsed. Fixes RTBug #1901.
991            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
992            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
993            the legend but not in the map.
994            (LegendTree.__FillTree): Move main functionality out into smaller
995            methods that can be used by other methods.
996            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
997            if they are available.
998            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
999            that we override the wxTreeCtrl method. Iterate over children
1000            and call __RemoveLayer.
1001            (LegendTree.__AddLayer): New. Add a new layer to the legend.
1002            (LegendTree.__RemoveLayer): Remove a layer from the legend.
1003            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
1004            Should only be called with the id of a layer branch.
1005            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
1006            Returns the root item or creates one if necessary.
1007    
1008            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
1009            ProjectRasterFile with tuple arguments instead of strings.
1010    
1011            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
1012            with try/finally. Fixes RTBug #1904.
1013    
1014            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
1015            with try/finally. Fixes RTBug #1904.
1016            (MapCanvas.FitSelectedToWindow): If a single point is selected
1017            simply center it on the display. Fixes RTBug #1849.
1018    
1019            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
1020            to be compiled as a standalone app. Now the code can only be
1021            called from Python which simplifies the parameter passing.
1022            (ProjectRasterFile): Handle Python arguments. Remove code that
1023            checks for a destination dataset. Add more clean up code.
1024    
1025            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
1026            TestMapWithContents.test_lower_layer_bottom):
1027            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
1028            Fixes RTBug #1907.
1029    
1030            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
1031            extent to the map when the legend is toggled. Fixes RTBug #1881.
1032    
1033    2003-05-29  Jan-Oliver Wagner <[email protected]>
1034    
1035            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
1036            unsubscribes all that is subcribed in __init__.
1037    
1038    2003-05-28  Bernhard Herzog  <[email protected]>
1039    
1040            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
1041            (MainWindow.CanDuplicateLayer): New methods to implement the
1042            Layer/Duplicate command.
1043            (layer_duplicate command): New.
1044            (main_menu): Add layer_duplicate to the Layer menu.
1045    
1046    2003-05-28  Bernhard Herzog  <[email protected]>
1047    
1048            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
1049            renderer so that NULL/None values get displayed differently (by a
1050            gray rectangle).
1051            (TableGrid.__init__): Override the default renderers
1052    
1053    2003-05-28  Bernhard Herzog  <[email protected]>
1054    
1055            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
1056            classification to "None" if the type of the field has changed.
1057    
1058            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
1059            test for the Layer.SetShapeStore method
1060    
1061    2003-05-28  Jan-Oliver Wagner <[email protected]>
1062    
1063            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
1064            does not necessarily have a filename).
1065    
1066    2003-05-28  Jan-Oliver Wagner <[email protected]>
1067    
1068            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
1069            sort the selection list for the dialog.
1070    
1071    2003-05-28  Frank Koormann  <[email protected]>
1072    
1073            * extensions/thuban/wxproj.cpp
1074            (project_point): Removed cast to int for projected point coordinates.
1075            (shape_centroid): Return last point if all polygon vertices fall
1076            to one point.
1077    
1078    2003-05-28  Bernhard Herzog  <[email protected]>
1079    
1080            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
1081            with layers that don't have shapestores, i.e. raster layers.
1082    
1083    2003-05-28  Bernhard Herzog  <[email protected]>
1084    
1085            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
1086            when determining the title from the filename.
1087    
1088            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
1089            reflect changes in the way the title is derived from the filename
1090    
1091    2003-05-28  Frank Koormann  <[email protected]>
1092    
1093            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
1094            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
1095    
1096    2003-05-27  Bernhard Herzog  <[email protected]>
1097    
1098            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
1099            delegate SelectedLayer.
1100            (MainWindow.LayerUnjoinTable): Implement.
1101            (_can_unjoin): New. Helper function for the sensitivity of the
1102            layer/unjoin command.
1103    
1104            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
1105            (DerivedShapeStore.OrigShapeStore): New. Return the original
1106            shapestore. Used to figure out how to unjoin.
1107            (DerivedShapeStore.Shapefile): Fix a typo.
1108    
1109    2003-05-27  Bernhard Herzog  <[email protected]>
1110    
1111            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
1112            well
1113            (JoinDialog.__init__): Use the layer parameter and only build the
1114            left choice when a layer is given
1115            (JoinDialog.OnJoin): Handle layer joins as well
1116            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
1117            that the user selects the "Select..." item. The sensitivitly
1118            updating is now in update_sensitivity
1119            (JoinDialog.y): New method to refactor the sensitivity update of
1120            the join button into its own method.
1121    
1122            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
1123    
1124    2003-05-27  Bernhard Herzog  <[email protected]>
1125    
1126            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
1127            iff there are unreferenced tables in the session
1128    
1129    2003-05-27  Bernhard Herzog  <[email protected]>
1130    
1131            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
1132    
1133            * Thuban/Model/session.py (Session.UnreferencedTables): New method
1134            to return tables that are not referenced by other tables or shape
1135            stores and can be removed.
1136            (Session.RemoveTable): Issue a TABLE_REMOVED message after
1137            removing the table
1138    
1139            * Thuban/UI/mainwindow.py: Remove unused imports
1140            (MainWindow.TableClose): Implement.
1141    
1142            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
1143            messages so that the frame will be automatically closed when a new
1144            session is opened or the table is removed.
1145            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
1146            __init__
1147            (TableFrame.close_on_session_replaced)
1148            (TableFrame.close_on_table_removed): New. Subscribers that close
1149            the window
1150    
1151            * test/test_session.py (TestSessionMessages.test_remove_table)
1152            (TestSessionSimple.test_remove_table): Move the test to
1153            TestSessionSimple and add test for the TABLE_REMOVED message
1154            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
1155            (TestSessionSimple.test_unreferenced_tables) New. Test for the
1156            UnreferencedTables method.
1157            (UnreferencedTablesTests): New. Class with some more sophisticated
1158            tests for UnreferencedTables.
1159    
1160    2003-05-27  Frank Koormann  <[email protected]>
1161    
1162            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
1163            display has some unwanted side effects. Removed again.
1164    
1165    2003-05-27  Frank Koormann  <[email protected]>
1166    
1167            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
1168    
1169            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
1170    
1171    2003-05-27  Jan-Oliver Wagner <[email protected]>
1172    
1173            * test/test_menu.py (MenuTest.test): Added test for
1174            Menu.RemoveItem().
1175    
1176            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
1177            the menu.
1178    
1179    2003-05-27  Frank Koormann  <[email protected]>
1180            
1181            Nonmodal dialogs without parent (i.e. they can fall behind the main
1182            window)
1183    
1184            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
1185            all dialogs in the dialogs dictionary and the canvas.
1186    
1187            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
1188            parent, i.e. can fall behind other windows.
1189            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
1190            dictionary before removing it.
1191    
1192            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
1193    
1194            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
1195            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
1196            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
1197    
1198    2003-05-27  Bernhard Herzog  <[email protected]>
1199    
1200            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
1201            tableview dialog
1202            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
1203            Also, don't use the table's titles as the dialog names. The titles
1204            aren't guaranteed to be unique.
1205            (MainWindow.TableOpen): Open a table view dialog after opening the
1206            table
1207    
1208    2003-05-27  Bernhard Herzog  <[email protected]>
1209    
1210            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
1211            effect can be achieved by simply closing the window showing the
1212            table.
1213            (MainWindow.TableHide): Removed.
1214            (main_menu): Removed "table_hide"
1215    
1216    2003-05-27  Frank Koormann  <[email protected]>
1217    
1218            Fix legend tree display problems under Win32
1219    
1220            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
1221            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
1222            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
1223    
1224            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
1225    
1226    2003-05-27  Jan-Oliver Wagner <[email protected]>
1227    
1228            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
1229            'after' now allows to insert separators almost anywhere in the menu.
1230    
1231    2003-05-27  Frank Koormann  <[email protected]>
1232    
1233            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
1234            "S" of selection box label to hint on hot key (Alt-S). Works under
1235            Win32 but is ignored under GTK.
1236    
1237    2003-05-26  Frank Koormann  <[email protected]>
1238    
1239            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
1240            Center Choices.
1241    
1242    2003-05-26  Bernhard Herzog  <[email protected]>
1243    
1244            Remove the Precision methods again. They're too DBF specific to be
1245            part of the table interface and they're only used in table_to_dbf
1246            anyway.
1247            
1248            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
1249            fixed precision of 12 for doubles.
1250            (TransientTableBase.Precision): Removed
1251            (AutoTransientTable.Width): Delegate to self.table.
1252    
1253            * Thuban/Model/table.py (DBFTable.Precision)
1254            (MemoryTable.Precision): Removed.
1255            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
1256            (table_to_dbf): Use a fixed precision of 12 for floats unless the
1257            column object specifies something else.
1258    
1259            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
1260            test for table_to_dbf
1261    
1262    2003-05-26  Bernhard Herzog  <[email protected]>
1263    
1264            * test/test_transientdb.py
1265            (TestTransientTable.run_iceland_political_tests): Fix a comment.
1266    
1267    2003-05-26  Bernhard Herzog  <[email protected]>
1268    
1269            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
1270            implementation. Mark parts of the file format strings for
1271            localization.
1272    
1273            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
1274            file and add the table to the tables managed by the session
1275    
1276            * test/test_session.py (TestSessionSimple.test_open_table_file):
1277            New. test case for OpenTableFile
1278    
1279    2003-05-26  Jan-Oliver Wagner <[email protected]>
1280    
1281            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
1282            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
1283            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
1284            Replace the true/false of wxWindows by True/False of Python 2.2.1.
1285    
1286    2003-05-26  Jan-Oliver Wagner <[email protected]>
1287    
1288            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
1289            already a selection present, update the grid accordingly.
1290    
1291            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
1292            resizeable and increase its initial size.
1293    
1294    2003-05-26  Frank Koormann  <[email protected]>
1295    
1296            Table export functionality
1297    
1298            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
1299            Return width (in characters) for a column.
1300            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
1301            (table_to_dbf): Write table to dbf file.
1302            (table_to_csv): Write table to csv file.
1303    
1304            * Thuban/Model/transientdb.py (TransientTableBase.Width,
1305            TransientTableBase.Precision): Return column width and precision.
1306    
1307            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
1308            or table_to_csv depending on file selection.
1309    
1310            * test/test_dbf_table.py:
1311            Test table_to_dbf (extension of former part of test).
1312    
1313            * test/test_csv_table.py:
1314            Test table_to_csv.
1315    
1316    2003-05-23  Jan-Oliver Wagner <[email protected]>
1317    
1318            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
1319            Use QueryTableFrame instead of TableFrame.
1320    
1321            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
1322            table window with 'Layer Table:' instead of 'Table:'.
1323    
1324    2003-05-23  Jan-Oliver Wagner <[email protected]>
1325    
1326            Give all tables a title via mix-in TitledObject.LayerShowTable
1327    
1328            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
1329            only if it exists.
1330    
1331            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
1332            and call its init-method with a default title. Remove Title() method.
1333    
1334            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
1335            AutoTransientTable): mix-in TitledObject and call its init-method with
1336            a default title. Remove Title() method.
1337    
1338    2003-05-23  Bernhard Herzog  <[email protected]>
1339    
1340            * Thuban/Model/session.py (Session.AddShapeStore): Define
1341            AddShapeStore analogously to AddTable.
1342    
1343            * test/test_session.py (TestSessionSimple.test_add_shapestore):
1344            New. Test for AddShapeStore
1345    
1346    2003-05-23  Jan-Oliver Wagner <[email protected]>
1347    
1348            Introducing QueryTableFrame and a very coarse ShowTable implementation.
1349    
1350            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
1351            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
1352            The latter implements the selection GUI without dependency on a layer.
1353            LayerTableFrame now is derived from QueryTableFrame and connects
1354            to a layer.
1355    
1356            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
1357            implementation that still needs work.
1358    
1359            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
1360    
1361    2003-05-22  Frank Koormann  <[email protected]>
1362    
1363            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
1364            Added "outer_join = False" as optional parameter.
1365            (TransientJoinedTable.create): If outer join is true, perform a
1366            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
1367            the left table. Records not matching are filled with 0 / None.
1368    
1369            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
1370            (JoinDialog.OnJoin): Consider outer join check box.
1371    
1372    2003-05-22  Bernhard Herzog  <[email protected]>
1373    
1374            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
1375            somewhat safer way. Storing the traceback in a local variable can
1376            lead to memory leaks
1377    
1378    2003-05-22  Bernhard Herzog  <[email protected]>
1379    
1380            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
1381            the wxMessageDialog's Destroy() method.
1382    
1383    2003-05-22  Frank Koormann  <[email protected]>
1384    
1385            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
1386            TransientTable.Title()
1387    
1388    2003-05-22  Frank Koormann  <[email protected]>
1389    
1390            Join Dialog, initial version.
1391    
1392            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
1393    
1394            * Thuban/UI/join.py (JoinDialog): Functional implementation of
1395            former framework. Renamed Table1/Table2 to LeftTable/RightTable
1396            in all occurences.
1397    
1398            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
1399            Typo fixed.
1400    
1401    2003-05-22  Bernhard Herzog  <[email protected]>
1402    
1403            Give the tables titles so that the GUI can display more meaningful
1404            names. For now the titles are fixed but depend on e.g. filenames
1405            or the titles of the joined tables.
1406    
1407            * Thuban/Model/transientdb.py (TransientTable.Title)
1408            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
1409    
1410            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
1411    
1412            * test/test_transientdb.py
1413            (TestTransientTable.test_auto_transient_table_title): New. Test
1414            for the Title method
1415            (TestTransientTable.test_transient_joined_table)
1416            (TestTransientTable.test_transient_table): Add test for the Title
1417            methods
1418    
1419            * test/test_memory_table.py (TestMemoryTable.test_title): New.
1420            Test for the Title method
1421    
1422            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
1423            the Title method
1424    
1425    2003-05-22  Bernhard Herzog  <[email protected]>
1426    
1427            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
1428            Provide a better way to destroy the layers
1429            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
1430            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
1431            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
1432            the new way to destroy the layers.
1433            (TestLayer.test_derived_store): New. Test for using a layer with a
1434            DerivedShapeStore
1435    
1436            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
1437            filename if the shape store actually has one.
1438    
1439    2003-05-22  Bernhard Herzog  <[email protected]>
1440    
1441            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
1442            for the filename
1443    
1444            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
1445            for the FileName method
1446            (TestDBFTableWriting.test_write): Fix spelling of filename
1447    
1448    2003-05-22  Thomas Koester  <[email protected]>
1449    
1450            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
1451            from SciParam that now really is immutable.
1452    
1453    2003-05-22  Frank Koormann  <[email protected]>
1454    
1455            Layer Top/Bottom placement added to legend.
1456    
1457            * Thuban/UI/legend.py
1458            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
1459            bound to tool events.
1460            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
1461            New, methods binding the event methods with the map methods.
1462    
1463            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
1464            layer at top/bottom of layer stack.
1465    
1466            * Resources/Bitmaps/top_layer.xpm: New button icon.
1467    
1468            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
1469    
1470    2003-05-22  Bernhard Herzog  <[email protected]>
1471    
1472            * Thuban/Model/session.py (Session.RemoveTable): New method to
1473            remove tables
1474    
1475            * test/test_session.py (TestSessionSimple.test_remove_table): New.
1476            Test for RemoveTable
1477    
1478    2003-05-22  Thomas Koester  <[email protected]>
1479    
1480            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
1481            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
1482    
1483    2003-05-22  Bernhard Herzog  <[email protected]>
1484    
1485            Implement a way to discover dependencies between tables and
1486            shapestores.
1487    
1488            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
1489            (TransientJoinedTable.Dependencies)
1490            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
1491            interface
1492            (TransientJoinedTable.__init__): Keep tack of the original table
1493            objects in addition to the corresponding transient tables.
1494    
1495            * Thuban/Model/table.py (DBFTable.Dependencies)
1496            (MemoryTable.Dependencies): New. Implement the dependencies
1497            interface
1498    
1499            * Thuban/Model/data.py (ShapeTable): New. Helper class for
1500            ShapefileStore
1501            (ShapefileStore.__init__): Use ShapeTable instead of
1502            AutoTransientTable
1503            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
1504            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
1505            methods for filename and type
1506            (ShapefileStore.Dependencies): New. Implement the dependencies
1507            interface
1508            (DerivedShapeStore): New class to replace SimpleStore. The main
1509            difference to SimpleStore is that it depends not on a shapefile
1510            but another shapestore which expresses the dependencies a bit
1511            better
1512            (SimpleStore.__init__): Add deprecation warning.
1513    
1514            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
1515            Test for the Dependencies method.
1516    
1517            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
1518            New. Test for the Dependencies method.
1519    
1520            * test/test_transientdb.py
1521            (TestTransientTable.test_auto_transient_table_dependencies): New.
1522            Test for the Dependencies method.
1523            (TestTransientTable.test_transient_joined_table): Add test for the
1524            Dependencies method.
1525    
1526            * test/test_session.py (TestSessionSimple.setUp)
1527            (TestSessionSimple.tearDown): New. Implement a better way to
1528            destroy the sessions.
1529            (TestSessionSimple.test_initial_state)
1530            (TestSessionSimple.test_add_table): Bind session to self.session
1531            so that it's destroyed by tearDown
1532            (TestSessionSimple.test_open_shapefile): New. Test for
1533            OpenShapefile and the object it returns
1534    
1535    2003-05-22  Bernhard Herzog  <[email protected]>
1536    
1537            * Thuban/Model/session.py (Session.AddTable): New method to
1538            register tables with the session.
1539            (Session.Tables): Return the tables registered with AddTable too.
1540    
1541            * test/test_session.py (TestSessionSimple.test_add_table): New.
1542            Test case for the AddTable method
1543    
1544    2003-05-22  Frank Koormann  <[email protected]>
1545    
1546            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
1547            lower right corner, center labels for selections, initialize controls
1548            in reasonable order for keyboard navigation.
1549    
1550            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
1551            (ProjFrame.__DoOnProjAvail): Determine position of current projection
1552            using the wxListBox.FindString() method. Still a problem (#1886)
1553    
1554            * Thuban/UI/classifier.py
1555            (Classifier.__init__, SelectPropertiesDialog.__init__)
1556    
1557            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
1558            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
1559            different classification types from here to __init__.
1560            (GenUniquePanel.__init__): Set the column width of the first field
1561            in the Field ListCtrl to the full width.
1562    
1563            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
1564            Button to 'Export'. Center Buttons in Selection Box, set Focus to
1565            Grid.
1566            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
1567            changes focus to the Selection when pressing "Alt-S".
1568    
1569            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
1570            the text if not visible. The italic font sometimes exceeds the
1571            rendering area.
1572    
1573    2003-05-21  Jonathan Coles   <[email protected]>
1574    
1575            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
1576            to OnClose so that Thuban closes correctly.
1577    
1578            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
1579            DockFrame.OnClose, not DockFrame._OnClose.
1580    
1581    2003-05-21  Jonathan Coles   <[email protected]>
1582    
1583            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
1584            references to 'inf' and use new Range __init__ to pass floats
1585            directly rather than converting them to strings first.
1586            Fixes RTBug #1876.
1587    
1588            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
1589            Use new Range ___init__ to pass floats.
1590    
1591            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
1592            filename is a valid image file. Throw IOError otherwise.
1593    
1594            * Thuban/Model/range.py: Brought over new Range from SciParam that
1595            is immutable and has an __init__ which can accept floats.
1596    
1597            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
1598            into try block. AddLayer doesn't throw any exceptions anymore.
1599            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
1600            try block.
1601    
1602            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
1603            the first item in choices. Fixes RTBug #1882.
1604    
1605            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
1606            has gone to 0 which is a serious problem. abort.
1607            (MapRenderer.draw_raster_layer): Catch IOError seperately and
1608            print the error from GDAL.
1609    
1610            * Thuban/UI/tableview.py (TableGrid.__init__): Call
1611            ToggleEventListeners to turn on listening.
1612            (TableGrid.ToggleEventListeners): New. Turns event listening on
1613            and off so as to prevent excessive messages.
1614            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
1615            to suppress excessive messages when selecting many rows.
1616            Fixes RTBug #1880.
1617    
1618            * Thuban/UI/view.py: Added checks against if scale == 0. This
1619            is a serious problem that can occur when an image without
1620            geo data is loading and causes the map projection bounds to
1621            go to infinity. Right now, the solution is to simply try
1622            to recover.
1623    
1624            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
1625            to set the MFILEReceiver attributes even if the data is NULL.
1626    
1627            * extensions/thuban/gdalwarp.cpp: Improved the error handling
1628            and passed GDAL messages back up to the Python layer. Also
1629            tried to fix some memory leaks that were present in the original
1630            utility but didn't matter because the program aborted.
1631    
1632            * test/test_range.py: Copied over tests from SciParam. Removed
1633            tests against importing. Fixes RTBug #1867.
1634    
1635    2003-05-21  Bernhard Herzog  <[email protected]>
1636    
1637            * test/test_load.py: Remove unused imports and restructure the
1638            test code
1639            (LoadSessionTest): Split into one class for each test and turn
1640            LoadSessionTest itself into the base class for all such session
1641            tests.
1642            (ClassificationTest): New base class for load tests that test
1643            classifications
1644            (TestSingleLayer, TestLayerVisibility, TestClassification)
1645            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
1646            for the individual tests
1647    
1648            * test/support.py (FileLoadTestCase.filename): New base class for
1649            file loading tests
1650    
1651    2003-05-21  Jan-Oliver Wagner <[email protected]>
1652    
1653            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
1654            Mercator' to 'UTM Zone 32' as a more convenient example.
1655            Added 'Gauss Krueger Zone 6'.
1656    
1657            * Data/iceland_sample_raster.thuban: political polygon now
1658            filled transparent to have the raster image visible at once.
1659    
1660    2003-05-21  Frank Koormann  <[email protected]>
1661    
1662            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
1663            OnClose() to keep in sync with extensions. Internally Thuban
1664            still uses "underscored" names.
1665    
1666    2003-05-20  Jonathan Coles   <[email protected]>
1667    
1668            This puts back Raster layer support. These layers support projections
1669            through the GDAL library. Currently, the CVS version is being used.
1670            There are no Debian packages available although this may change soon.
1671            A GDAL driver was extended to support writing to memory rather to
1672            files.
1673    
1674            There is still some work that needs to be done, such as some error
1675            handling when loading invalid images or when there is a problem
1676            projecting the image. This putback simply checks in the majority
1677            of the work.
1678    
1679            * setup.py: Add gdalwarp library extension.
1680    
1681            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
1682            Defaults to False, but can be overridden by subclasses if they
1683            support classification.
1684            (RasterLayer): New. Defines a new layer that represents an
1685            image.
1686    
1687            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
1688            tag handler.
1689            (SessionLoader.start_layer): Encode the filename.
1690            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
1691            New. Supports reading a rasterlayer tag.
1692    
1693            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
1694    
1695            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
1696            get a string in Latin1. If we get such as string convert it to
1697            unicode first, otherwise leave if alone before encoding.
1698            (SessionSaver.write_layer): Add support for writing both Layers
1699            and RasterLayers.
1700    
1701            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1702            The right argument may not be a string, it could also be a Column.
1703    
1704            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
1705            Make initial window size 600x400. Fixes RTBug #1872.
1706    
1707            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
1708            the dialog is constructed so that we can support layers that
1709            do not have classifications.
1710            (Classifier._OnTry): Only build a classification if the layer
1711            supports one.
1712    
1713            * Thuban/UI/legend.py: Change all checks that a layer is an
1714            instance of Layer into checks against BaseLayer.
1715            (LegendTree.__FillTreeLayer): Only add children to a branch if
1716            the layer supports classification.
1717    
1718            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
1719            MainWindow.OpenSession): Don't proceed with an action if the
1720            user chooses Cancel when they are asked to save changes.
1721            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
1722            user to select an image file. Create a new RasterLayer and add
1723            it to the map.
1724    
1725            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
1726            for rendering RasterLayer layers.
1727            (MapRenderer.draw_raster_layer): Actually method that calls
1728            the GDALWarp python wrapper and constructs an image from the
1729            data returned.
1730    
1731            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
1732            Choices symbols to match those used in the table query method.
1733            Replace deprecated method calls on table with new method names.
1734    
1735            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
1736            how small the scale can get. This still needs more testing.
1737    
1738            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
1739            Provides a driver to output in .bmp format.
1740    
1741            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
1742            New. Provides IO routines which write to memory, rather than a file.
1743    
1744            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
1745            of the gdalwarp utility provided in GDAL. Added function calls
1746            that can be accessed from python.
1747    
1748            * Data/iceland_sample_raster.thuban: New. Sample file that uses
1749            a raster layer.
1750    
1751            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
1752            layer image data.
1753    
1754            * Doc/thuban.dtd: Added rasterlayer attribute definition.
1755    
1756            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
1757            tests associated with the raster layer code.
1758    
1759            * test/test_transientdb.py
1760            (TestTransientTable.test_auto_transient_table_query): Added a test
1761            for using a Column object as the "right" parameter to a query.
1762    
1763    2003-05-19  Frank Koormann  <[email protected]>
1764    
1765            * Thuban/version.py (get_changelog_date):
1766            Catch exceptions if ChangeLog does not exist.
1767    
1768            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
1769    
1770    2003-05-19  Frank Koormann  <[email protected]>
1771    
1772            Extended version information for Thuban
1773    
1774            * Thuban/version.py: New, version information for Thuban: Last
1775            modification date and last ChangeLog entry date.
1776    
1777            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
1778            information: Display Thuban, wxPython and Python version.
1779    
1780    2003-05-16  Bernhard Herzog  <[email protected]>
1781    
1782            * Thuban/Model/save.py: Remove some unused imports including the
1783            __future__ import for nested_scopes as Thuban relies on Python 2.2
1784            now.
1785            (XMLWriter.encode): Remove the special case for a None argument.
1786            In the saver encode is always called with a string argument.
1787    
1788    2003-05-16  Bernhard Herzog  <[email protected]>
1789    
1790            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
1791            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
1792            of the bug was that e.g. float("1.2") would fail. Thuban now
1793            requires 2.4.x.
1794            
1795    2003-05-16  Frank Koormann   <[email protected]>
1796    
1797            Printing enhancement and WMF export (under Win32)
1798    
1799            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
1800            ScreenRenderer. Renders Map, Legend and Scalebar for export.
1801            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
1802            PrintRender.
1803    
1804            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
1805            to fullfil information needed for PrinterRenderer.
1806            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
1807            (MapCanvas.Print): Adapted to new MapPrintout.
1808            (OutputTransform): General calculations to transform from canvas
1809            coordinates to export/printing devices.
1810    
1811            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
1812            new method_command to call ExportMap, with platform dependency (only
1813            __WXMSW__)
1814      
1815            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
1816            of scalebar drawing area as new parameters.
1817            
1818            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
1819    
1820            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
1821            Update to extended scalebar.DrawScalebar header.
1822    
1823            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
1824    
1825            * test/test_scalebar.py: Made test executable as standalone.
1826    
1827    2003-05-16  Bernhard Herzog  <[email protected]>
1828    
1829            * Thuban/Model/table.py (Table): Remove this compatibility alias
1830            for DBFTable.
1831    
1832            * test/test_table.py: Import DBFTable as Table because that alias
1833            doesn't exist anymore.
1834    
1835            * Thuban/UI/classgen.py: Remove some unused imports
1836    
1837    2003-05-14  Jonathan Coles   <[email protected]>
1838    
1839            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
1840            Fix docstring.
1841            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
1842            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
1843            values of the supplied range to determine the beginning and end
1844            bounds of the generated classes.
1845    
1846            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
1847            do not have a leading 0 (.5 is now accepted as well as 0.5).
1848    
1849            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
1850            call to ClassGenerator.GenUniformDistribution.
1851    
1852            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
1853            layout bug with the 'Projection' label.
1854    
1855            * test/support.py (FloatTestCase): New. Needed for the Range tests.
1856    
1857            * test/test_range.py: New. Imported from SciParam.
1858    
1859    2003-05-12  Jonathan Coles   <[email protected]>
1860    
1861            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
1862            to table.UniqueValues() with calls that retrieve all the values
1863            from the table. This will need to be replaced by a method on table
1864            which can simply return the list (perhaps more efficiently).
1865    
1866    2003-05-12  Jonathan Coles   <[email protected]>
1867    
1868            The return value of ClassGenerator.CalculateQuantiles has changed.
1869            Refer to the documentation for details.
1870    
1871            * test/test_classgen.py: Modified Quantile tests to use the
1872            new return values.
1873    
1874            * Thuban/Model/classgen.py
1875            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
1876            use new return values from CalculateQuantiles to produce the correct
1877            range bounds in the Classification.
1878            (ClassGenerator.CalculateQuantiles): Add more comments describing
1879            the return values and parameters. Make minor adjustments to improve
1880            the legibility of the code. Fix problem with adjusted not being set
1881            in most cases.
1882    
1883    2003-05-12  Frank Koormann <[email protected]>
1884            
1885            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
1886            and latin1. Fixes #1851 finally.
1887    
1888    2003-05-09  Jonathan Coles   <[email protected]>
1889    
1890            * test/test_classgen.py: New. Tests the Quantile algorithm.
1891    
1892            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
1893            Clean up debugging statement, add comments, fix a small bug in the
1894            returned adjusted percentiles.
1895            
1896    2003-05-09  Jonathan Coles   <[email protected]>
1897    
1898            Introduces Range class from SciParam into the ClassGroupRange class,
1899            and such ranges can now be saved and loaded from disk.
1900    
1901            Quantiles are now available in the Classification Generator.
1902    
1903            Initial support for building Queries on a table. Doesn't do anything
1904            but run some tests.
1905    
1906            * Thuban/Model/classification.py: Explicit imports.
1907            (ClassGroupRange): Use the Range class to store the underlying
1908            range information. The interface remains the same, except for
1909            GetRange(), and you can also supply a Range object as the min
1910            parameter to SetRange or __init__.
1911    
1912            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
1913            string appropriately for use in Thuban. Fixes RTbug #1851.
1914            (SessionLoader.end_projection): Handle the context of the
1915            projection tag a bit better by looking at what objects are not
1916            None. There was an assumption that a projection tag for a map
1917            could occur before any layers.
1918            (SessionLoader.start_clrange): Provide backward compatibility for
1919            reading min/max values as well as the new range parameter.
1920    
1921            * Thuban/Model/map.py: Explicit imports.
1922    
1923            * Thuban/Model/resource.py: Import _.
1924            (ProjFileSaver.write): write header using projfile.dtd.
1925    
1926            * Thuban/Model/save.py: Explicit imports.
1927            (XMLWriter.encode): New. Encode the given string from a format
1928            used by Thuban into UTF-8. Fixes RTbug #1851.
1929    
1930            * Thuban/UI/classgen.py: Explicit imports.
1931            (ClassGenDialog.__init__): Clean up the code and add support
1932            for Quantiles.
1933            (ClassGenDialog.OnOK): Add support for Quantiles.
1934            (GenQuantilesPanel): New. Input panel for Quantiles.
1935            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
1936            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
1937    
1938            * Thuban/Model/classgen.py: New. Contains all the classes named above.
1939    
1940            * Thuban/UI/classifier.py: Explicit imports.
1941            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
1942            ClassTable.SetValueAsCustom): Reworked to use new Range class.
1943    
1944            * Thuban/UI/legend.py: Explicit imports.
1945    
1946            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
1947            a Table menu and associated method calls.
1948            (MainWindow.choose_color): Removed. No longer needed.
1949    
1950            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
1951            should be disabled if no projection is selected in the available
1952            list.
1953    
1954            * Thuban/UI/renderer.py: Explicit imports.
1955    
1956            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
1957            with correctly selecting the rows and issuing the right events.
1958            Be sure to call Skip() to allow the grid to do some of its own
1959            handling which allows the rows to actually be selected.
1960            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
1961            selecting multiple shapes.
1962            (LayerTableFrame): Support for building Queries.
1963            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
1964    
1965            * Thuban/UI/tree.py: Explicit imports.
1966    
1967            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
1968            table view can call it.
1969    
1970            * test/test_classification.py: Explicit imports.
1971            (TestClassification.test_ClassGroupRange): Fix test for new
1972            Range class.
1973    
1974            * Doc/thuban.dtd: Add range parameter for clrange.
1975    
1976            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
1977            object in ClassGroupRange, and also uesd for inputting ranges in
1978            the classifer table and elsewhere.
1979    
1980            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
1981            yet.
1982    
1983    2003-05-09  Frank Koormann <[email protected]>
1984    
1985            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
1986    
1987    2003-05-08  Frank Koormann <[email protected]>
1988    
1989            Coding style updates
1990    
1991            * test/test_scalebar.py: Replaced tab indentation by spaces.
1992    
1993            * Thuban/UI/scalebar.py: Explicit imports.
1994    
1995    2003-05-08  Frank Koormann <[email protected]>
1996    
1997            * Thuban/UI/scalebar.py
1998            (ScaleBar.DrawScalebar): Format string bug fixed.
1999    
2000    2003-05-08  Frank Koormann <[email protected]>
2001    
2002            Reorganization of scalebar component (no wx in Thuban/Model)
2003    
2004            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
2005            (deriveInterval):
2006            Calculate scalebar interval and unit which fits in width for scale.
2007            (roundInterval): Round float.
2008    
2009            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
2010    
2011            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
2012    
2013            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
2014    
2015    2003-05-08  Frank Koormann <[email protected]>
2016    
2017            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
2018            Initialize ScaleBar with canvas.map
2019    
2020            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
2021            round intervals to display smarter lengths
2022            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
2023            layer. If the maps has no projection applied grey the scalebar.
2024    
2025    2003-05-07  Frank Koormann <[email protected]>
2026            
2027            Basic Scalebar features added.
2028    
2029            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
2030    
2031            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
2032            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
2033            and the renderer.
2034    
2035            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
2036    
2037            * Thuban/UI/messages.py: SCALE_CHANGED added.
2038    
2039    2003-05-07  Bernhard Herzog  <[email protected]>
2040    
2041            * Thuban/Model/session.py (Session.__init__): New instance
2042            variable shapestores to hold a list of all open shapestore objects
2043            (Session.ShapeStores): New. Accessor method for the shapestores
2044            list.
2045            (Session._add_shapestore, Session._clean_weak_store_refs): New.
2046            Internal methods to maintain the shapestores list.
2047            (Session.Tables): New. Return all tables open in the session.
2048            (Session.OpenShapefile): Insert the new ShapeStore into the
2049            shapestores list.
2050    
2051            * test/test_session.py (TestSessionSimple.test_initial_state): Add
2052            tests for ShapeStores and Tables
2053            (TestSessionWithContent.test_shape_stores)
2054            (TestSessionWithContent.test_tables): New. Test cases for
2055            ShapeStores and Tables
2056    
2057    2003-05-07  Bernhard Herzog  <[email protected]>
2058    
2059            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
2060            Add comments about the optimizations used.
2061            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
2062            Implement the ReadValue table interface method.
2063    
2064            * test/test_transientdb.py
2065            (TestTransientTable.run_iceland_political_tests)
2066            (TestTransientTable.test_transient_joined_table): Add tests for
2067            ReadValue
2068    
2069    2003-05-07  Frank Koormann <[email protected]>
2070    
2071            * Resources/Bitmaps/fulllayerextent.xpm,
2072            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
2073            new icons.
2074    
2075    2003-05-06  Bernhard Herzog  <[email protected]>
2076    
2077            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
2078            New. Simply delegate to the transient table's version.
2079    
2080            * test/test_transientdb.py
2081            (TestTransientTable.test_auto_transient_table_query): New. Test
2082            case for AutoTransientTable's SimpleQuery
2083    
2084    2003-05-06  Bernhard Herzog  <[email protected]>
2085    
2086            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
2087            Implement a simple query method for the query dialog
2088            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
2089            the row index or shapeid.
2090            (TransientTable.create): Insert the right value of the row index
2091            (TransientJoinedTable.create): Copy the row index of the left
2092            table to the joined result table
2093    
2094            * test/test_transientdb.py
2095            (TestTransientTable.test_transient_table_read_twice): Fix
2096            doc-string
2097            (TestTransientTable.test_transient_table_query): New. Test for the
2098            SimpleQuery method
2099    
2100    2003-05-06  Bernhard Herzog  <[email protected]>
2101    
2102            Convert all table users to use the new table interface. This only
2103            covers Thuban itself, not GREAT-ER or other applications built on
2104            Thuban yet, so the compatibility interface stays in place for the
2105            time being but it now issues DeprecationWarnings.
2106    
2107            Finally, the new Table interface has a new method, HasColumn.
2108    
2109            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
2110            issue deprecation warnings when they're. The warnings refer to the
2111            caller of the method.
2112            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
2113            for the deprecation warnings
2114    
2115            * test/test_table.py: Ignore the deprecation warnings for the old
2116            table in the tests in this module. The purpose of the tests is to
2117            test the old interface, after all.
2118    
2119            * test/test_transientdb.py
2120            (TestTransientTable.run_iceland_political_tests): Use the
2121            constants for the types. Add a test for HasColumn
2122            (TestTransientTable.test_transient_joined_table): Adapt to new
2123            table interface. Add a test for HasColumn
2124            (TestTransientTable.test_transient_table_read_twice): Adapt to new
2125            table interface
2126    
2127            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
2128            Adapt to new table interface
2129    
2130            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
2131            new table interface
2132    
2133            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
2134            (RecordTable.SetTable): Adapt to new table interface
2135    
2136            * Thuban/UI/classifier.py (Classifier.__init__)
2137            (Classifier.__init__): Adapt to new table interface
2138    
2139            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
2140            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
2141            to new table interface
2142    
2143            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
2144            (AutoTransientTable.HasColumn): Implement the new table interface
2145            method
2146            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
2147            (AutoTransientTable.UniqueValues): Adapt to new table interface
2148    
2149            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
2150            Adapt to new table interface
2151    
2152            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
2153            simplify opening shapefiles a bit easier.
2154            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2155            (TestLayer.test_point_layer): Use the new helper method
2156            (TestLayer.test_get_field_type): New. Test for the GetFieldType
2157            method
2158    
2159            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
2160            the new table method
2161    
2162            * test/test_memory_table.py (TestMemoryTable.test_has_column):
2163            Test for the new table method HasColumn
2164    
2165    2003-05-06  Jonathan Coles   <[email protected]>
2166    
2167            Addresses the "Selection Extent" wish of RTbug #1787.
2168    
2169            * Resources/Bitmaps/fulllayerextent.xpm,
2170            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
2171            extent. These are just place holders for the real bitmaps.
2172    
2173            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
2174            calculate the bounding box once (the first time compute_bbox() is
2175            called).
2176            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
2177            the bounding box for the shapes in lat/long coordinates.
2178    
2179            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
2180            option.
2181            (MainWindow.has_selected_shapes): New. Returns true if there are
2182            any selected shapes.
2183            (MainWindow.FullSelectionExtent): New. Calls
2184            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
2185            (_has_selected_shapes): New. Returns true if there are any
2186            selected shapes.
2187    
2188            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
2189            true if there are any selected shapes.
2190    
2191            * Thuban/UI/view.py (MapCanvas): Added delegated method
2192            HasSelectedShapes.
2193            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
2194            shapes on the canvas using the map projection (if any).
2195    
2196            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
2197            for Layer.ShapesBoundingBox().
2198    
2199    2003-05-06  Bernhard Herzog  <[email protected]>
2200    
2201            * Resources/Projections/defaults.proj: Fix spelling of Mercator
2202    
2203    2003-05-05  Jonathan Coles   <[email protected]>
2204    
2205            Addresses the "Full Layer Extent" wish of RTbug #1787.
2206    
2207            * Resources/Projections/defaults.proj: Added UK National Grid.
2208    
2209            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
2210            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
2211            when the user selects the menu option.
2212    
2213            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
2214            scales the given layer on the canvas using the map projection.
2215    
2216    2003-05-05  Bernhard Herzog  <[email protected]>
2217    
2218            Convert the table implementations to a new table interface. All
2219            tables use a common mixin class to provide backwards compatibility
2220            until all table users have been updated.
2221    
2222            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
2223            provide backwards compatibility for table classes implementing the
2224            new interface
2225            (DBFTable, MemoryTable): Implement the new table interface. Use
2226            OldTableInterfaceMixin as base for compatibility
2227            (DBFColumn, MemoryColumn): New. Column description for DBFTable
2228            and MemoryTable resp.
2229    
2230            * test/test_dbf_table.py: New. Test cases for the DBFTable with
2231            the new table interface.
2232    
2233            * test/test_memory_table.py: New. Test cases for the MemoryTable
2234            with the new table interface.
2235    
2236            * test/test_table.py: Document the all tests in this file as only
2237            for backwards compatibility. The equivalent tests for the new
2238            interface are in test_memory_table.py and test_dbf_table.py
2239            (MemoryTableTest.test_read): field_info should be returning tuples
2240            with four items
2241            (MemoryTableTest.test_write): Make doc-string a more precise.
2242    
2243            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
2244            table interface. Derive from from OldTableInterfaceMixin for
2245            compatibility.
2246            (TransientTableBase.create): New intance variable column_map to
2247            map from names and indices to column objects
2248            (TransientTable.create): Use the new table interface of the input
2249            table
2250            (AutoTransientTable): Convert to new table interface. Derive from
2251            from OldTableInterfaceMixin for compatibility.
2252            (AutoTransientTable.write_record): Removed. It's not implemented
2253            yet and we still have to decide how to handle writing with the new
2254            table and data framework.
2255    
2256            * test/test_transientdb.py
2257            (TestTransientTable.run_iceland_political_tests)
2258            (TestTransientTable.test_transient_joined_table): Use the new
2259            table interface
2260    
2261    2003-05-05  Jonathan Coles   <[email protected]>
2262    
2263            This is namely a collection of UI updates to improve user interactivity.
2264            Tabbing between controls now exists and you can use ESC to close dialog
2265            boxes; ENTER will active the default button.
2266    
2267            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
2268            order that the controls are created so that tabbing works correctly.
2269            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
2270            wxDialog can handle the default button correctly.
2271            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
2272            same reasons as for OnOK.
2273            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
2274            when we ask the table for the maximum/minimum values of a field
2275            which could take a very long time.
2276    
2277            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
2278            order that the controls are created so that tabbing works correctly.
2279            (SelectPropertiesDialog.__init__): Rearrange the order that the
2280            controls are created so that tabbing works correctly.
2281    
2282            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
2283            to derive from a wxDialog but behave like the original implementation
2284            which was derived from a wxFrame. wxDialog provides useful key
2285            handling functionality like ESC calling OnCancel and ENTER calling
2286            OnOK which is lost with wxFrame.
2287    
2288            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
2289            new dialogs.
2290    
2291            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
2292            order that the controls are created so that tabbing works correctly.
2293            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
2294            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
2295            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
2296            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
2297            can provide the "UK National Grid" as a default projection.
2298            (UTMPanel.__init__): Rearrange the order that the controls are
2299            created so that tabbing works correctly.
2300    
2301    2003-05-05  Bernhard Herzog  <[email protected]>
2302    
2303            * extensions/thuban/wxproj.cpp: Fix some of the comments.
2304            (project_point): If a map projection but no layer projection is
2305            given, convert degrees to radians before applying the map
2306            projection.
2307    
2308            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
2309            (TableGrid.allow_messages): New methods to make it possible to
2310            inhibit message sending.
2311            (TableGrid.issue): Only send the message if not inhibited.
2312            (LayerTableGrid.select_shape): Use the new methods to make sure
2313            that no ROW_SELECTED message is sent while we're updating the
2314            selected rows to match the selected shapes.
2315    
2316    2003-05-02  Jan-Oliver Wagner <[email protected]>
2317    
2318            Implementation of MemoryTable.
2319    
2320            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
2321            implementation that operates on a list of tuples. All of the data
2322            are kept in the memory.
2323    
2324            * test/test_table.py (MemoryTableTest): New.
2325    
2326            * test/test_transientdb.py (SimpleTable): Removed.
2327            (TestTransientTable.test_transient_joined_table,
2328            (TestTransientTable.test_transient_table_read_twice): Replaced
2329            SimpleTable by MemoryTable.
2330    
2331    2003-04-30  Jonathan Coles   <[email protected]>
2332    
2333            * Data/iceland_sample.thuban: Now contains correct projections
2334            for each of the layers.
2335    
2336            * Resources/Projections/defaults.proj: Geographic projection
2337            contains unit conversion parameter.
2338    
2339    2003-04-30  Jonathan Coles   <[email protected]>
2340    
2341            The most important part of this putback is the projection changes.
2342            It should now be possible to specify the projection that a layer
2343            is in and then specify a different projection for the map. The
2344            projection dialog has an extra parameter for a geographic projection
2345            which lets the user select if the input is in degrees or radians.
2346    
2347            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
2348            to say that the parameter is a tuple of unprojected
2349            points (which is what the callers to this method were assuming).
2350            Also, since the points are unprojected we need to projected them.
2351    
2352            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
2353            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
2354            groups are selected, move the layer up/down. Fixes RTbug #1833.
2355    
2356            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
2357    
2358            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
2359            parameter in call to SetClientData.
2360            (GeoPanel): Add support for selecting the units that the
2361            source data is in (Radians or Degrees).
2362    
2363            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
2364            the rendering loop by reducing the number of if's, removing the
2365            unnecessary try/except block, and checking if the old group
2366            is the same as the new one (which happens a lot if there is
2367            no classification, or lots of shapes are in the same group).
2368    
2369            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
2370            around the redraw routine to try to catch problems that the user
2371            may create by selecting invalid projections for the data set and
2372            map. Clears the display if there are any problems and prints the
2373            error.
2374            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
2375            rectangle.
2376    
2377            * extensions/thuban/wxproj.cpp (project_point): First invert the
2378            supplied point (which should be in projected coordinates) using
2379            the layer's projection and then project the point using the
2380            map's projection.
2381            (project_points): Use project_point() to project each point.
2382    
2383    2003-04-30  Jan-Oliver Wagner <[email protected]>
2384    
2385            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
2386            don't set the Classification to None if the classfication field
2387            is None (ie only a DEFAULT).
2388    
2389    2003-04-30  Bernhard Herzog  <[email protected]>
2390    
2391            * Thuban/UI/view.py: Fix some typos.
2392    
2393            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
2394            not pop up the dialog if the selection becomes empty (this could
2395            happen if e.g. a new selection is opened while the identify tool
2396            is active and dialog had been closed)
2397    
2398    2003-04-30  Bernhard Herzog  <[email protected]>
2399    
2400            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
2401            instance variable read_record_last_result
2402            (TransientTableBase.read_record): Make sure reading the same
2403            record twice works. The implementation uses the new instance
2404            variable read_record_last_result
2405    
2406            * test/test_transientdb.py
2407            (TestTransientTable.test_transient_table_read_twice): New test
2408            case for the above bug-fix.
2409    
2410    2003-04-29  Jonathan Coles   <[email protected]>
2411    
2412            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
2413    
2414            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
2415    
2416            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
2417            (ClassTable.SetValueAsCustom): Rename keyword argument in
2418            ClassGroup* constructors to match argument name.
2419    
2420    2003-04-29  Bernhard Herzog  <[email protected]>
2421    
2422            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
2423            transient DB if it exists to make sure it doesn't leave a journal
2424            file in the temp directory.
2425    
2426            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
2427            self.conn to None after closing the connection to make sure it's
2428            not closed twice
2429    
2430    2003-04-29  Jonathan Coles   <[email protected]>
2431    
2432            Add a visible parameter in the layer XML tag. The default value is
2433            "true". If anything other than "false" is specified we also assume
2434            "true". Addresses RTbug #1025.
2435    
2436            * Doc/thuban.dtd: Add visible parameter to a layer.
2437    
2438            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
2439            of visible from 1 to True.
2440            (Layer.__init__): Change default value of visible from 1 to True.
2441    
2442            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
2443            parameter.
2444    
2445            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
2446            parameter.
2447    
2448            * test/test_load.py: Add new test data contents_test_visible.
2449            (LoadSessionTest.setUp): save test data.
2450            (LoadSessionTest.testLayerVisibility): Test if the visible flag
2451            is loaded correctly.
2452    
2453            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
2454            for saving an invisible layer.
2455    
2456    2003-04-29  Jonathan Coles   <[email protected]>
2457    
2458            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
2459            legend dialog box and tell it to change its map to the one
2460            supplied to SetMap(). Fixes RTbug #1770.
2461    
2462    2003-04-29  Bernhard Herzog  <[email protected]>
2463    
2464            Next step of table implementation. Introduce a transient database
2465            using SQLite that some of the data is copied to on demand. This
2466            allows us to do joins and other operations that require an index
2467            for good performance with reasonable efficiency. Thuban now needs
2468            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
2469            haven't tested that.
2470            
2471            * Thuban/Model/transientdb.py: New. Transient database
2472            implementation.
2473    
2474            * test/test_transientdb.py: New. Tests for the transient DB
2475            classes.
2476    
2477            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
2478            classes to help automatically remove temporary files and
2479            directories.
2480            (Session.__init__): New instance variables temp_dir for the
2481            temporary directory and transient_db for the SQLite database
2482            (Session.temp_directory): New. Create a temporary directory if not
2483            yet done and return its name. Use AutoRemoveDir to have it
2484            automatically deleted
2485            (Session.TransientDB): Instantiate the transient database if not
2486            done yet and return it.
2487    
2488            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
2489            AutoTransientTable so that data is copied to the transient DB on
2490            demand.
2491            (SimpleStore): New class that simply combines a table and a
2492            shapefile
2493    
2494            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
2495            DBFTable and update its doc-string to reflect the fact that this
2496            is only the table interface to a DBF file. Table is now an alias
2497            for DBFTable for temporary backwards compatibility.
2498    
2499            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
2500            the last reference to the session goes away so that the temporary
2501            files are removed properly.
2502    
2503            * test/test_load.py (LoadSessionTest.tearDown): Remove the
2504            reference to the session to make sure the temporary files are
2505            removed.
2506    
2507    2003-04-29  Bernhard Herzog  <[email protected]>
2508    
2509            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
2510            the __parser instance variable into a normal local variable in
2511            read. It's only used there and read will never be called more than
2512            once. Plus it introduces a reference cycle that keeps can keep the
2513            session object alive for a long time.
2514    
2515    2003-04-29  Jonathan Coles   <[email protected]>
2516    
2517            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
2518            Projection an immutable item. Fixes RTbug #1825.
2519            (Projection.__init__): Initialize instance variables here.
2520            (ProjFile.Replace): New. Replace the given projection object with
2521            the new projection object. This solves the problem of needing the
2522            mutator Projection.SetProjection() in the ProjFrame class and
2523            allows a projection to change parameters without changing its
2524            location in the file.
2525    
2526            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
2527            be of type wxSAVE and should verify overwriting a file.
2528    
2529            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
2530            ProjFile.Replace() method instead of the mutator
2531            Projection.SetProjection(). Also requires that we reassign the
2532            client data to the new projection.
2533    
2534            * test/test_proj.py (TestProjection.test): Test GetName() and
2535            GetAllParameters()
2536            (TestProjFile.test): Remove tests for Set*() methods. Add tests
2537            for Replace().
2538    
2539    2003-04-25  Jonathan Coles   <[email protected]>
2540    
2541            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
2542            to save the name of the projection.
2543    
2544            * test/test_save.py (SaveSessionTest.testLayerProjection): New
2545            test to verify layer projections are saved correctly.
2546    
2547    2003-04-25  Jonathan Coles   <[email protected]>
2548    
2549            * Thuban/Model/proj.py (Projection.SetName): Set the name
2550            to "Unknown" if name is None.
2551            (Projection.SetAllParameters): New. Set the projection's
2552            parameter list to the one supplied.
2553            (Projection.SetProjection): New. Set the projection's
2554            properties to those of the supplied Projection.
2555    
2556            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
2557            the dialog title to include the map's title.
2558            (MainWindow.LayerProjection): Set the dialog title to include
2559            the layer's title.
2560    
2561            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
2562            error dialogs into a single method call.
2563            (ProjFrame.__VerifyButtons): Add more states to check.
2564            (ProjFrame.__GetProjection): Return the current state of an
2565            edited projection or None.
2566            (ProjFrame.__FillAvailList): Remove checks for states that
2567            shouldn't exist.
2568            (ProjFrame._OnNew): Clear all selected items and supply
2569            a projection panel if necessary.
2570    
2571            * test/test_proj.py (TestProjFile.test): Add tests for
2572            ProjFile.SetAllParameters, ProjFile.SetProjection,
2573            ProjFile.SetName.
2574    
2575    2003-04-25  Jonathan Coles   <[email protected]>
2576    
2577            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
2578            takes an optional argument to select the current projection.
2579            This does not guarantee that the item is visible due to
2580            limited wxWindows functionality. Fixes RTBug #1821.
2581    
2582    2003-04-25  Jonathan Coles   <[email protected]>
2583    
2584            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
2585            the projection name and use it when constructing the Projection
2586            object.
2587    
2588            * Thuban/Model/proj.py (Projection.__init__): Change the default
2589            value for 'name' to None and then test if name is equal to None
2590            in the body of the constructor. This way the caller doesn't have to
2591            know what the default value should be. Namely, useful in load.py
2592            where we have to pick a default value if the 'name' parameter
2593            doesn't exist in the XML file.
2594    
2595            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
2596            Tests a file where a layer has a projection.
2597    
2598    2003-04-25  Jonathan Coles   <[email protected]>
2599    
2600            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
2601            tree for projection information.
2602    
2603            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
2604            XMLReader.GetFileName.
2605            (SessionLoader): Added support for loading projection tags that
2606            appear inside a layer.
2607    
2608            * Thuban/Model/proj.py (ProjFile): Document the class. Move
2609            back to using a list because the order of the projections in
2610            the file is important to maintain. Fixes RTbug #1817.
2611    
2612            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
2613            to ProjFile.GetFilename.
2614    
2615            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
2616            information.
2617    
2618            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
2619            ProjFrame._OnSaveAs. Removed old dead code from previous
2620            implementation.
2621            (ProjFrame._OnExport): Add support for exporting more than one
2622            projection to a single file.
2623            (ProjFrame.__FillAvailList): use string formatting (% operator)
2624            to build strings that are (partly) translated. Fixes RTbug #1818.
2625    
2626            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
2627            class.
2628    
2629    2003-04-24  Bernhard Herzog  <[email protected]>
2630    
2631            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
2632    
2633            * po/fr.po: New. French translation by Daniel Calvelo Aros
2634    
2635            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
2636            empty strings.
2637    
2638    2003-04-24  Jonathan Coles   <[email protected]>
2639    
2640            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
2641            implement the interface that the ProjFrame dialog expects.
2642    
2643            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
2644            name of the projection to be changed.
2645            (ProjFile): Use a dictionary instead of a list so that removing
2646            projections is easier and we are sure about uniqueness.
2647            (ProjFile.Remove): Remove the given projection object.
2648    
2649            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
2650            Return a list with only one projection file instead of searching for
2651            any projection file. This simplifies many things if the user can
2652            only have one system file and one user file.
2653    
2654            * Thuban/UI/classgen.py: Change all references to
2655            genCombo to genChoice.
2656    
2657            * Thuban/UI/mainwindow.py: Add a Projection option under the
2658            layer menu.
2659            (MainWindow.LayerProjection): New. Open up a projection window
2660            for a layer.
2661    
2662            * Thuban/UI/projdialog.py: Large changes to how the dialog is
2663            laid out. Use three panels instead of one. One for the list of
2664            projections, one for the edit controls, and one for the buttons.
2665            Fixed resizing problems so that the dialog resizes correctly
2666            when the projection panel changes. Added import/export, save, and
2667            new buttons/functionality.
2668    
2669    2003-04-24  Bernhard Herzog  <[email protected]>
2670    
2671            First step towards table management. Introduce a simple data
2672            abstraction so that we replace the data a layer uses more easily
2673            in the next step.
2674    
2675            * Thuban/Model/data.py: New file with a simple data abstraction
2676            that bundles shapefile and dbffile into one object.
2677    
2678            * Thuban/Model/session.py (Session.OpenShapefile): New method to
2679            open shapefiles and return a shape store object
2680    
2681            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
2682            object instead of a shapefile filename. This introduces a new
2683            instance variable store holding the datastore. For intermediate
2684            backwards compatibility keep the old instance variables.
2685            (open_shapefile): Removed. No longer needed with the shape store.
2686            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
2687            get the shape store used by a layer.
2688            (Layer.Destroy): No need to explicitly destroy the shapefile or
2689            table anymore.
2690    
2691            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
2692            (MainWindow.AddLayer): Use the session's OpenShapefile method to
2693            open shapefiles
2694    
2695            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
2696            session's OpenShapefile method to open shapefiles
2697    
2698            * test/test_classification.py
2699            (TestClassification.test_classification): Use the session's
2700            OpenShapefile method to open shapefiles and build the filename in
2701            a more platform independed way
2702    
2703            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2704            Implement to have a session to use in the tests
2705            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2706            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
2707            session's OpenShapefile method to open shapefiles
2708            (TestLayerLegend.setUp): Instantiate a session so that we can use
2709            it to open shapefiles.
2710            (TestLayerLegend.tearDown): Make sure that all references to
2711            layers and session are removed otherwise we may get a resource
2712            leak
2713    
2714            * test/test_map.py (TestMapAddLayer.test_add_layer)
2715            (TestMapWithContents.setUp): Instantiate a session so that we can
2716            use it to open shapefiles.
2717            (TestMapWithContents.tearDown): Make sure that all references to
2718            layers, maps and sessions are removed otherwise we may get a
2719            resource leak
2720            ("__main__"): use support.run_tests() so that more info about
2721            uncollected garbage is printed
2722    
2723            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
2724            session's OpenShapefile method to open shapefiles
2725            ("__main__"): use support.run_tests() so that more info about
2726            uncollected garbage is printed
2727    
2728            * test/test_selection.py (TestSelection.tearDown): Make sure that
2729            all references to the session and the selection are removed
2730            otherwise we may get a resource leak
2731            (TestSelection.get_layer): Instantiate a session so that we can
2732            use it to open shapefiles.
2733            ("__main__"): use support.run_tests() so that more info about
2734            uncollected garbage is printed
2735    
2736            * test/test_session.py (TestSessionBase.tearDown)
2737            (TestSessionWithContent.tearDown): Make sure that all references
2738            to the session and layers are removed otherwise we may get a
2739            resource leak
2740            (TestSessionWithContent.setUp): Use the session's OpenShapefile
2741            method to open shapefiles
2742    
2743    2003-04-24  Jonathan Coles   <[email protected]>
2744    
2745            * Thuban/Model/load.py (XMLReader.read): Should have been checking
2746            if the file_or_filename object had the 'read' attribute.
2747    
2748    2003-04-23  Jonathan Coles   <[email protected]>
2749    
2750            * Thuban/Model/resource.py: Fixes RTbug #1813.
2751            (ReadProjFile): Add documentation about which exceptions are raised.
2752            Always pass the exceptions up to the caller.
2753            (GetProjFiles): If the directory can't be read return an empty list.
2754            If any of the proj files can't be read skip that file and go
2755            on to the next one.
2756    
2757            * test/test_proj.py: Added test cases to handle nonexistent files,
2758            unreadable files, and files that don't parse correctly.
2759    
2760    2003-04-23  Jonathan Coles   <[email protected]>
2761    
2762            Projection dialog. Allows the user to select from a list
2763            of projection templates and optionally edit them and save new ones.
2764    
2765            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
2766            (ProjPanel): Base class for projection specific panels.
2767            (TMPanel): Projection panel for Transverse Mercartor.
2768            (UTMPanel): Projection panel for Universal Transverse Mercartor.
2769            (LCCPanel): Projection panel for Lambert Conic Conformal.
2770            (GeoPanel): Projetion panel for Geographic Projection.
2771    
2772    2003-04-23  Jonathan Coles   <[email protected]>
2773    
2774            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
2775            promote symmetry. There now exists XMLReader and XMLWriter.
2776            (XMLReader.read): New. Call to read the given file descriptor or
2777            filename.
2778            (XMLReader.close): New. Make sure the file is closed.
2779            (XMLReader.GetFileName): New. Return just the file name that is being
2780            read from.
2781            (XMLReader.GetDirectory): New. Return just the directory of the file
2782            that is being read.
2783            (XMLReader.AddDispatchers): New. Take a dictionary which contains
2784            the names of functions to call as the XML tree is parsed.
2785            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
2786            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
2787            (SessionLoader): Removed class variables start_dispatcher and
2788            end_dispatcher since this functionality is now part of a class
2789            instance. Fixes RTbug #1808.
2790            (SessionLoader.__init__): Add dispatcher functions.
2791            (load_xmlfile): Code was moved into the XMLReader.read().
2792            (load_session): Use modified SessionLoader.
2793    
2794            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
2795            map's projection.
2796    
2797            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
2798            GetAllParameters.
2799            (Projection.GetParameter): Returns the value for the given parameter.
2800    
2801            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
2802            (GetProjFiles): Renamed from GetProjections. Now returns a list
2803            of ProjFile objects.
2804            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
2805            a list of ProjFile objects whose files are not user defined.
2806            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
2807            list of ProjFile objects whose files are user defined.
2808            (ProjFileReader): Extend new XMLReader.
2809    
2810            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
2811            promote symmetry.
2812    
2813            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
2814            control instead of a wxComboBox. wxChoice controls do not generate
2815            events as the uses highlights possible choices which fixes problems
2816            with resizing the dialog when the use selects an option.
2817    
2818            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
2819            control instead of a wxComboBox.
2820    
2821            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
2822            dialog.
2823    
2824            * test/test_proj.py (TestProjection.test): New tests for GetParameter
2825            method.
2826    
2827    2003-04-22  Bernhard Herzog  <[email protected]>
2828    
2829            * Thuban/UI/mainwindow.py: Remove some unused imports and global
2830            constants
2831    
2832            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
2833            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
2834    
2835    2003-04-17  Bernhard Herzog  <[email protected]>
2836    
2837            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
2838            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
2839            anymore.
2840            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
2841            (Layer.ShapeType, Layer.Shape): No need to call
2842            self.open_shapefile since it's always called in __init__
2843    
2844            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
2845            In wxPython 2.4 there's no need to extend MainLoop anymore since
2846            wxPython itself makes sure OnExit is called.
2847    
2848    2003-04-16  Jonathan Coles   <[email protected]>
2849    
2850            Initial putback of projection management code. Includes new
2851            classes to read and write projection files. The current load
2852            and save classes were abstracted a bit so they could be reused.
2853            The Projection class was extended to provide new methods and
2854            have a name.
2855    
2856            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
2857            general XML reading methods that were part of ProcessSession.
2858    
2859            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
2860            name.
2861            (ProjFile): New. Represents a file that contains projection
2862            information.
2863    
2864            * Thuban/Model/resource.py: New. Contains general utilities
2865            for read and writing projection files.
2866    
2867            * Thuban/Model/save.py (XMLSaver): New. Contains all the
2868            general XML writing methods that were part of SessionSaver.
2869            (SessionSaver): Renamed from Saver.
2870    
2871            * test/test_proj.py: New test cases for the projection
2872            file read and write functions.
2873    
2874    2003-04-16  Jonathan Coles   <[email protected]>
2875    
2876            * Thuban/Model/classification.py: Use repr() around values
2877            in the ClassGroup*.__repr__() methods so it is clearer when
2878            a value is a string and when it is a number.
2879    
2880            * test/test_load.py: Rework the classification test to test
2881            that we can load old files.
2882            (testLabels): Test a file where the groups have labels.
2883    
2884    2003-04-16  Bernhard Herzog  <[email protected]>
2885    
2886            Safer implementation of the performance enhancements of the
2887            low-level renderer:
2888            
2889            * extensions/thuban/wxproj.cpp (extract_projection)
2890            (extract_pointer): Rename extract_projection to extract_pointer
2891            and redefine its purpose to return the pointer stored in a CObject
2892            returned by the object's cobject method. Update all callers.
2893            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
2894            handling of these low-level parameters so that each s_draw_info
2895            instance is handled as a CObject at python level that also
2896            contains real references to the actual python objects which
2897            contain the values in the struct. Add free_draw_info as the
2898            destructor.
2899            (draw_polygon_shape): Add the py_draw_info parameter which must a
2900            cobject containing an s_draw_info pointer.
2901    
2902            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
2903            method to instantiat the low-level render parameter
2904            (MapRenderer.draw_shape_layer): Use the new method. Remove some
2905            commented out code.
2906            (MapRenderer.draw_polygon_shape): Make the first parameter not the
2907            layer but the low-level render parameter
2908            (ScreenRenderer.draw_shape_layer): Use the low-level render
2909            parameter.
2910    
2911    2003-04-15  Jonathan Coles   <[email protected]>
2912    
2913            * Thuban/Model/classification.py: Implemented __repr__ for
2914            the ClassGroup* classes to make debugging a bit easier.
2915            (ClassGroup.SetLabel): Check that the string is an instance
2916            of StringTypes not StringType. Accounts for Unicode strings.
2917    
2918            * Thuban/Model/color.py: Implemented __repr__ to make
2919            debugging a bit easier.
2920    
2921            * Thuban/Model/save.py (Saver.write_classification): Need to
2922            save the group label.
2923    
2924            * test/test_load.py (testClassification): New. Loads the
2925            iceland_sample_test.thuban file and checks if it was loaded
2926            correctly.
2927    
2928    2003-04-15  Jonathan Coles   <[email protected]>
2929    
2930            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
2931            to improve rendering performance by initializing the variables
2932            that are not change each time draw_polygon_shape() is called.
2933            The values are stored in a global struct draw_info.
2934            (draw_polygon_shape): Removed initialization code that is
2935            now in draw_polygon_init().
2936    
2937            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
2938            drawing initialization call to draw_polygon_init()
2939            (MapRenderer.draw_polygon_shape): Use new signature of
2940            draw_polygon_shape.
2941    
2942            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
2943            weirdness by setting the range to (1, maxint).
2944    
2945            * Thuban/Model/classification.py (ClassGroupProperties): Make
2946            instance variables private and optimize comparison operator
2947            by first checking if the color references are the same.
2948            (ClassGroupSingleton): Make instance variables private.
2949            (ClassGroupRange): Make instance variables private.
2950    
2951            * HOWTO-Release: Filled in missing steps for releasing packages.
2952    
2953    2003-04-15  Bernhard Herzog  <[email protected]>
2954    
2955            First stab at internationalized messages:
2956    
2957            * Thuban/__init__.py (_): Implement the translation function for
2958            real using the python gettext module.
2959    
2960            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
2961            translate empty strings.
2962    
2963            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2964            Add a missing space to a warning message
2965    
2966            * po/README: New. Notes about the management of the translation
2967            files.
2968    
2969            * po/Makefile: New. Makefile to help manage the translation files.
2970    
2971            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
2972    
2973            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
2974            translations and support files in po/
2975    
2976            * setup.py (data_files): Add the *.mo files to the data_files too
2977    
2978            * README: Add note about the translations when building from CVS
2979    
2980    2003-04-14  Jonathan Coles   <[email protected]>
2981    
2982            * Thuban/UI/dock.py: Fixes some window resizing problems most
2983            noticable under windows. Always assume the button bitmaps will
2984            be there. Code clean up.
2985            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
2986            images for the dock/undock button to the same images.
2987            Work around for RTbug #1801.
2988    
2989            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
2990            be allowed to grow within the sizer. Fixes a bug under Windows
2991            where the toolbar wasn't being drawn.
2992    
2993    2003-04-14  Frank Koormann   <[email protected]>
2994    
2995            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
2996            Updated design to try to make the button functionality more
2997            transparent.
2998    
2999    2003-04-14  Jonathan Coles   <[email protected]>
3000    
3001            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
3002            finalize the intialization of the panel.
3003    
3004            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
3005            creation of the panel. Should be the last thing called in the
3006            initializer of a subclass.
3007    
3008            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
3009            set the current selections in the combo boxes. This is needed
3010            under Windows.
3011    
3012            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
3013            level panel to the dialog so that the background colors are
3014            consistent under Windows.
3015    
3016    2003-04-11  Jonathan Coles   <[email protected]>
3017    
3018            * Thuban/UI/classgen.py: Change color ramps to start at white
3019            not black.
3020    
3021            * Thuban/UI/legend.py: Enable/disable the legend buttons when
3022            the legend changes. Fixes RTbug #1793.
3023    
3024            * test/test_classification.py: Added test for copying of
3025            classifications.
3026    
3027    2003-04-11  Jonathan Coles   <[email protected]>
3028    
3029            * Thuban/UI/resource.py: New. Centralize the loading of resources
3030            such as bitmaps.
3031    
3032            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
3033            added images to the move buttons, added 'reverse' button.
3034            (CustomRampPanel.__init__): Added images to the move buttons.
3035            (GreyRamp): New. Generates a ramp from white to black.
3036            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
3037    
3038            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
3039            ID_PROPERTY_*.
3040            (Classifier.__init__): Minor changes to the layout.
3041            (Classifier._OnTitleChanged): Listen for when the user edits the
3042            title and update the dialog's title and the layer's title.
3043    
3044            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
3045    
3046            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
3047            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
3048            if the layer's title changes.
3049    
3050            * Thuban/UI/mainwindow.py: Added new menu item and associated code
3051            to open a dialog to rename the map.
3052            (MainWindow): Use new resource class to import bitmaps.
3053    
3054    2003-04-11  Jonathan Coles   <[email protected]>
3055    
3056            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
3057            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
3058            Resources/Bitmaps/group_use_none.xpm,
3059            Resources/Bitmaps/group_use_not.xpm,
3060            Resources/Bitmaps/hide_layer.xpm,
3061            Resources/Bitmaps/layer_properties.xpm,
3062            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
3063            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
3064            New.
3065    
3066    2003-04-10  Jonathan Coles   <[email protected]>
3067    
3068            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
3069            Should pass group to ClassGroup constructor.
3070    
3071    2003-04-10  Jonathan Coles   <[email protected]>
3072    
3073            * Thuban/Model/classification.py: (ClassGroup): Move all the common
3074            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
3075            here. Implement SetVisible(), IsVisible().
3076            (ClassGroup.__init__): Add group parameter which acts as a copy
3077            constructor.
3078    
3079            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
3080            "Visible" check boxes.
3081            (Classifier): Rename the buttons and refactor the code to match
3082            the new labels.
3083    
3084            * Thuban/UI/legend.py: Classify button is now called "Properties".
3085            Refactored the code to change variable names.
3086            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
3087    
3088            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
3089            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
3090            renamed to MainWindow.LayerEditProperties.
3091            (MainWindow.ToggleLegend): Don't include map name in legend title.
3092            (MainWindow.SetMap): Added the map name to the window title.
3093            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
3094            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
3095            Functionality is found in the layer properties dialog.
3096    
3097            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
3098            draw visible groups.
3099    
3100    2003-04-09  Jonathan Coles   <[email protected]>
3101    
3102            * Thuban/UI/classgen.py: Modifications to allow simple
3103            addition and selection of new color schemes.
3104            (MonochromaticRamp): New. Generates a ramp between two colors.
3105            (RedRamp): New. Generates a ramp of all red.
3106            (GreenRamp): New. Generates a ramp of all green.
3107            (BlueRamp): New. Generates a ramp of all blue.
3108    
3109    2003-04-09  Jonathan Coles   <[email protected]>
3110    
3111            * Thuban/Model/classification.py (Classification.__deepcopy__):
3112            Need to copy over field and fieldType attributes.
3113    
3114            * Thuban/Model/table.py (Table.field_range): New. Retrive the
3115            maximum and minimum values over the entire table for a given
3116            field.
3117            (Table.GetUniqueValues): New. Retrieve all the unique values
3118            in the table for a given field.
3119    
3120            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
3121            (GenUniquePanel): New. Controls to allow the user to select
3122            which unique field values they would like in the classification.
3123            (CustomRampPanel): Code that was in ClassGenDialog that allows
3124            the user to select the properties for a custom ramp.
3125            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
3126    
3127            * Thuban/UI/classifier.py: Removed a lot of debugging code.
3128            (Classifier._SetClassification): Callback method so that the
3129            class generator can set the classification in the grid.
3130            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
3131            editing of a group properties class into a wxWindows control.
3132    
3133            * Thuban/UI/dock.py: It was decided that if the user closes
3134            a dockable window the window should simply hide itself. That
3135            way if the user wants to show the dock again it appears in the
3136            same place as it was when it was closed.
3137            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
3138            (DockableWindow._OnButtonClose): Hide the window instead of
3139            destroying it.
3140            (DockableWindow._OnClose): Hide the window instead of
3141            destroying it.
3142    
3143            * Thuban/UI/legend.py (LegendTree): Use a private method to
3144            consistently set the font and style of the text. Fixes RTbug #1786.
3145    
3146            * Thuban/UI/mainwindow.py: Import just the Classifier class.
3147    
3148    2003-04-07  Bernhard Herzog  <[email protected]>
3149    
3150            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
3151            to the map module
3152    
3153    2003-04-07  Bernhard Herzog  <[email protected]>
3154    
3155            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
3156            favor of ToggleSessionTree
3157            (MainWindow.ToggleSessionTree): New method to toggle visibility of
3158            the session tree.
3159            (MainWindow.SessionTreeShown): New method to return whether the
3160            session tree is currently shown.
3161            (MainWindow.ToggleLegend): New method to toggle visibility of the
3162            legend
3163            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
3164            LegendShown
3165            (MainWindow.LegendShown): New method to return whether the legend
3166            is currently shown.
3167            (_method_command): Add checked parameter so we can define check
3168            menu items
3169            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
3170            mainwindow methods.
3171            (show_session_tree, show_legend commands): Removed.
3172            (toggle_session_tree, toggle_legend commands): New commands to
3173            toggle the visibility of the dialogs
3174    
3175    2003-04-07  Jonathan Coles   <[email protected]>
3176    
3177            * Thuban/UI/classgen.py: Fix Windows problem.
3178    
3179            * Thuban/UI/dock.py: Fix Windows problem.
3180    
3181            * Thuban/UI/mainwindow.py: Use False instead of false.
3182            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
3183    
3184    2003-04-07  Jonathan Coles   <[email protected]>
3185    
3186            Since we now say that the order of the groups in a classification
3187            matters, it makes sense to be able to manipulate that order. Most
3188            of the changes to Thuban/Model/classification.py are to that end.
3189    
3190            * Thuban/Model/classification.py (Classification.AppendGroup,
3191            Classification.InsertGroup, Classification.ReplaceGroup,
3192            Classification.RemoveGroup, Classification.GetGroup): Do as the
3193            names imply.
3194            (Classification.FindGroup): This was called GetGroup, but GetGroup
3195            takes an index, while FindGroup takes a value.
3196            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
3197            REFERENCE. Currently there is a cyclic reference between the layer
3198            and its classification. If the classification doesn't need to know
3199            its owning layer we can change this, since it may make sense to be
3200            able to use the same classification with different layers.
3201    
3202            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
3203    
3204            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
3205            not AddGroup()
3206    
3207            * Thuban/UI/classifier.py: Now that we can depend on the order in
3208            a Classification and have methods to manipulate that order we don't
3209            need to use our own data structures in the grid. We can simply make
3210            the grid/table access the information they need from a copy of
3211            the classification object.
3212            (Classifier._OnCloseBtn): Event handler for when the user clicks
3213            'Close'. This is needed so if the user applies changes and then
3214            continues to change the table the user has the option of discarding
3215            the most recent changes and keeping what they applied.
3216    
3217            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
3218            into the same group.
3219    
3220            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
3221            with a really old version of proj, PJ_VERSION won't even be defined.
3222            If it isn't defined then just compile so that the function always
3223            returns Py_False.
3224    
3225            * test/test_classification.py: Fix tests to use the renamed methods.
3226            Still need to write tests for the new methods.
3227    
3228    2003-04-04  Jonathan Coles   <[email protected]>
3229    
3230            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
3231            call to SetSelection out of the method and before the call
3232            to __SelectField in __init__. This prevents a recursion of events
3233            when _OnFieldSelect is triggered by the user.
3234    
3235    2003-04-04  Jonathan Coles   <[email protected]>
3236    
3237            * Thuban/Model/classification.py: Rename Color.None to
3238            Color.Transparent.
3239            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
3240            Don't bother copying the color, since Colors are immutable.
3241    
3242            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
3243            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
3244            Thuban/UI/renderer.py, Thuban/UI/view.py:
3245            Rename Color.None to Color.Transparent.
3246        
3247            * test/test_classification.py, test/test_load.py: Rename Color.None
3248            to Color.Transparent.
3249    
3250    2003-04-04  Jonathan Coles   <[email protected]>
3251    
3252            * Thuban/Model/classification.py: Fix assert calls.
3253            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
3254            Copy the color parameter rather than hold onto a reference.
3255    
3256            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
3257            the color object.
3258            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
3259            are sure there exists only one refernce to Color.None in the system.
3260            This allows us to use 'is' rather than the comparision functions.
3261            
3262            * Thuban/Model/save.py: Fix assert calls.
3263            
3264            * Thuban/UI/classifier.py: Fix assert calls.
3265            (ClassGrid._OnCellDClick): Call up to the classifier to open the
3266            dialog to edit the groups properties.
3267            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
3268            correctly if a cell is resized.
3269            (ClassTable.SetClassification): New. Changes the classification
3270            that is in the table.
3271            (ClassTable.__SetRow): Allow groups to be prepended.
3272            (Classifier): New code for opening the EditProperties and
3273            GenerateRanges dialogs.
3274            (SelectPropertiesDialog.__GetColor): Only set the color in the
3275            color dialog if the current color is not None.
3276            
3277            * Thuban/UI/dock.py: Fix assert calls.
3278            
3279            * Thuban/UI/legend.py: Fix assert calls.
3280            
3281            * Thuban/UI/renderer.py: Fix assert calls.
3282            
3283            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
3284            classifications.
3285            (GenRangePanel): Panel specific to range generation.
3286            (GenSingletonPanel): Panel specific to singleton generation.
3287            (ClassGenerator): Class responsible for actually generating
3288            the classification from the data gathered in the dialog box.
3289            (PropertyRamp): Generates properties whose values range from
3290            a starting property to an ending property.
3291    
3292    2003-04-03  Bernhard Herzog  <[email protected]>
3293    
3294            * test/support.py (print_garbage_information): New function that
3295            prints information about still connected messages and memory
3296            leaks.
3297            (run_suite): Removed.
3298            (run_tests): New function for use as a replacement of
3299            unittest.main in the test_* files. This one calls
3300            print_garbage_information at the end.
3301    
3302            * test/runtests.py (main): Use support.print_garbage_information
3303    
3304            * test/test_layer.py: Use support.run_tests instead of
3305            unittest.main so we get memory leak information
3306            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
3307            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
3308            (TestLayerLegend.test_visibility): Call the layer's Destroy method
3309            to fix a memory leak.
3310    
3311            * test/test_classification.py: Use support.run_tests instead of
3312            unittest.main so we get memory leak information
3313            (TestClassification.test_classification): Call the layer's Destroy
3314            method to fix a memory leak.
3315    
3316    2003-04-02  Bernhard Herzog  <[email protected]>
3317    
3318            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
3319            Handle the reference counts of the return value and errors in
3320            PyArg_ParseTuple correctly.
3321    
3322            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
3323            sure the filename is absolute to avoid problems when saving the
3324            session again
3325    
3326            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
3327    
3328    2003-04-01  Jonathan Coles   <[email protected]>
3329    
3330            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
3331            that there actually are points in the returned list of points
3332            before trying to index into the list. The list may be empty if
3333            the shape is a Null Shape.
3334    
3335    2003-04-01  Bernhard Herzog  <[email protected]>
3336    
3337            * test/test_map.py: Don't use from <module> import *
3338    
3339    2003-04-01  Jonathan Coles   <[email protected]>
3340    
3341            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
3342            LAYER_LEGEND_CHANGED
3343    
3344            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
3345            self.Destroy() to close the window after yesterday's changes.
3346    
3347            * test/test_map.py, test/test_session.py: Fix messages that
3348            are sent from maps and layers.
3349    
3350    2003-03-31  Jonathan Coles   <[email protected]>
3351    
3352            * Thuban/UI/classifier.py: Commented out some debugging statements.
3353            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
3354            RTbug #1769.
3355    
3356            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
3357            position (although position doesn't work yet under GTK).
3358            (DockableWindow.Destroy): New. Called when the window must be
3359            closed. Namely needed when the DockFrame closes and must close
3360            its children.
3361            (DockFrame): Listen for EVT_CLOSE and destroy all children.
3362    
3363            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
3364            when then window is told to close.
3365            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
3366            comment in source for more info.
3367    
3368            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
3369    
3370            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
3371            symmetry with other such methods.
3372            (MainWindow.ShowLegend): Show the legend docked by default.
3373    
3374    2003-03-28  Jonathan Coles   <[email protected]>
3375    
3376            * Thuban/UI/classifier.py: Support for highlighting a specific
3377            group within the grid when the classification dialog is opened.
3378            Also contains a lot of debugging printouts which will later
3379            be removed.
3380    
3381            * Thuban/UI/dock.py: Complete rework on the dock code so that
3382            that it is fairly removed from the rest of the Thuban application.
3383            It is easy to add new docks which the rest of the program having
3384            to be aware of them.
3385    
3386            * Thuban/UI/legend.py: Modifications to support selecting a
3387            specific group in the classification dialog. Changed how layers
3388            are drawn when the layer is visible/invisible.
3389    
3390            * Thuban/UI/mainwindow.py: Removed legend specific code and
3391            replaced it with calls to the new dock code.
3392    
3393            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
3394            to check if scale > 0. Trying to track down a divide by zero.
3395    
3396    2003-03-26  Jonathan Coles   <[email protected]>
3397    
3398            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
3399            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
3400            now part of DockableWindow.
3401            (LegendPanel.DoOnSelChanged): Select the current layer in the
3402            map.
3403            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
3404            with the selected layer and/or group.
3405    
3406    2003-03-26  Jonathan Coles   <[email protected]>
3407    
3408            This putback contains the code for dockable windows. There is
3409            no support in wxWindows as of this date for windows that can
3410            attach themselves to other windows.
3411    
3412            The current model contains a DockableWindow which has a parent
3413            window for when it is detached and a dock window that it puts
3414            its contents in when it is docked. The contents of a DockableWindow
3415            must be a DockPanel. DockPanel itself derives from wxPanel.
3416    
3417            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
3418            message, not a LAYER_LEGEND_CHANGED message.
3419    
3420            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
3421    
3422            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
3423            as one of the style properties for the fieldTypeText item to
3424            be sure that its size is correct when the text changes.
3425    
3426            * Thuban/UI/dock.py: New. Classes for the DockPanel and
3427            DockableWindow.
3428    
3429            * Thuban/UI/legend.py: Added some more buttons and made the
3430            LegendPanel a DockPanel.
3431    
3432            * Thuban/UI/mainwindow.py: Added sash windows to the main window
3433            and supporting functions for manipulating the sashes.
3434            (MainWindow.ShowLegend): Create a DockableWindow with the
3435            LegendPanel as the contents.
3436    
3437            * Thuban/UI/messages.py: Added DOCKABLE_* messages
3438    
3439            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
3440            not LAYER_LEGEND_CHANGED, messages.
3441    
3442    2003-03-25  Jonathan Coles   <[email protected]>
3443    
3444            * setup.py: Added custom script bdist_rpm_build_script so that
3445            when the rpm is built the path to wx-config is correct.
3446    
3447            * setup.cfg: Added line saying to use the custom build script
3448    
3449    2003-03-20  Jonathan Coles   <[email protected]>
3450    
3451            Initial implementation of the Legend.
3452    
3453            * Thuban/UI/legend.py: New. Creates a window that shows the map's
3454            Legend information and allows the user to add/modify classifications
3455            and how the layers are drawn on the map.
3456    
3457            * setup.py: New command 'build_docs' which currently uses
3458            happydoc to generate html documentation for Thuban.
3459    
3460            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
3461            Returns a string which is appropriately describes the group.
3462    
3463            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
3464            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
3465    
3466            * Thuban/Model/map.py (Map): Rename messages and use new, more
3467            specific, messages.
3468    
3469            * Thuban/Model/messages.py: New message to indicate that a layer's
3470            data has changed (LAYER_CHANGED). New map messages to indicate
3471            when layers have been added/removed/changed or if the stacking order
3472            of the layers has changed.
3473    
3474            * Thuban/Model/session.py: Rename and use new messages.
3475    
3476            * Thuban/UI/classifier.py: Remember if any changes have actually
3477            been applied so that if the dialog is cancelled without an application
3478            of changes we don't have to set a new classification.
3479            (ClassDataPreviewer): Pulled out the window specific code and put it
3480            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
3481            symbols on any DC.
3482            
3483            * Thuban/UI/mainwindow.py: New code to open the legend.
3484    
3485            * Thuban/UI/view.py: Use new message names.
3486    
3487    2003-03-19  Jonathan Coles   <[email protected]>
3488    
3489            * Thuban/UI/main.py (verify_versions): New. Checks the versions
3490            of Python, wxPython, and some other libraries.
3491    
3492            * extensions/thuban/wxproj.cpp (check_version): Checks the given
3493            version against what wxproj was compiled with.
3494            (check_version_gtk): If wxproj was compiled with gtk then check
3495            the given version against the version of the gtk library
3496            currently being used.
3497    
3498    2003-03-14  Bernhard Herzog  <[email protected]>
3499    
3500            * test/test_command.py: Run the tests when the module is run as a
3501            script
3502    
3503    2003-03-14  Bernhard Herzog  <[email protected]>
3504    
3505            Implement selection of multiple selected shapes in the same layer:
3506    
3507            - Introduce a new class to hold the selection. This basically
3508              replaces the interactor which was nothing more than the
3509              selection anyway. A major difference is of course that the new
3510              selection class supports multiple selected shapes in one layer
3511            
3512            - Move the object that represents the selection from the
3513              application to the canvas. The canvas is a better place than the
3514              application because the selection represents which shapes and
3515              layer of the map displayed by the canvas are selected and
3516              affects how the map is drawn.
3517    
3518            - Make the selection and its messages publicly available through
3519              the mainwindow.
3520    
3521            - The non-modal dialogs do not get a reference to the interactor
3522              anymore as they can simply refer to their parent, the
3523              mainwindow, for the what the interactor had to offer.
3524    
3525            * Thuban/UI/selection.py: New module with a class to represent the
3526            selection.
3527    
3528            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
3529            these unused messages
3530    
3531            * Thuban/UI/application.py (ThubanApplication.OnInit)
3532            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
3533            interactor is gone now.
3534            (ThubanApplication.CreateMainWindow): There is no interactor
3535            anymore so we pass None as the interactor argument for now for
3536            compatibility.
3537    
3538            * Thuban/UI/view.py (MapCanvas.delegated_messages)
3539            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
3540            Unsubscribe, delegate messages according to the delegated_messages
3541            class variable.
3542            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
3543            attributes from instance variables as described with the
3544            delegated_methods class variable.
3545            (MapCanvas.__init__): New instance variable selection holding the
3546            current selection
3547            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
3548            pass them on to the renderer
3549            (MapCanvas.SetMap): Clear the selection when a different map is
3550            selected.
3551            (MapCanvas.shape_selected): Simple force a complete redraw. The
3552            selection class now takes care of only issueing SHAPES_SELECTED
3553            messages when the set of selected shapes actually does change.
3554            (MapCanvas.SelectShapeAt): The selection is now managed in
3555            self.selection
3556    
3557            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
3558            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
3559            Unsubscribe, delegate messages according to the delegated_messages
3560            class variable.
3561            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
3562            attributes from instance variables as described with the
3563            delegated_methods class variable.
3564            (MainWindow.__init__): The interactor as ivar is gone. The
3565            parameter is still there for compatibility. The selection messages
3566            now come from the canvas.
3567            (MainWindow.current_layer, MainWindow.has_selected_layer):
3568            Delegate to the the canvas.
3569            (MainWindow.LayerShowTable, MainWindow.Classify)
3570            (MainWindow.identify_view_on_demand): The dialogs don't need the
3571            interactor parameter anymore.
3572    
3573            * Thuban/UI/tableview.py (TableFrame.__init__)
3574            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
3575            (LayerTableFrame.row_selected): The interactor is gone. It's job
3576            from the dialog's point of view is now done by the mainwindow,
3577            i.e. the parent. Subscribe to SHAPES_SELECTED instead
3578            of SELECTED_SHAPE
3579            
3580            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
3581            is gone. It's job from the dialog's point of view is now done by
3582            the mainwindow, i.e. the parent.
3583            
3584            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
3585            gone. It's job from the dialog's point of view is now done by the
3586            mainwindow, i.e. the parent.
3587    
3588            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
3589            gone. It's job from the dialog's point of view is now done by the
3590            mainwindow, i.e. the parent.
3591            (SessionTreeCtrl.__init__): New parameter mainwindow which is
3592            stored as self.mainwindow. The mainwindow is need so that the tree
3593            can still subscribe to the selection messages.
3594            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
3595            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
3596            selection is now accessible through the mainwindow. Subscribe to
3597            SHAPES_SELECTED instead of SELECTED_SHAPE
3598    
3599            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
3600            SHAPES_SELECTED message now.
3601            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
3602            so deal with multiple shapes
3603            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
3604            gone. It's job from the dialog's point of view is now done by the
3605            mainwindow, i.e. the parent.
3606    
3607            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
3608            parameter is now a list of shape ids.
3609            (RecordTable.SetTable): The second parameter is now a list of
3610            indices.
3611    
3612            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
3613            selected_shape parameter and ivar to selected_shapes. It's now a
3614            list of shape ids.
3615            (MapRenderer.draw_label_layer): Deal with multiple selected
3616            shapes. Rearrange the code a bit so that the setup and shape type
3617            distinctions are only executed once.
3618    
3619            * test/test_selection.py: Test cases for the selection class
3620    
3621    2003-03-11  Jonathan Coles   <[email protected]>
3622    
3623            * Thuban/Model/load.py: Temporary fix so that the xml reader
3624            doesn't cause Thuban to crash.
3625    
3626            * Thuban/Model/layer.py: Handle the cyclic references between
3627            a layer and its classification better, and be sure to disconnect
3628            the classification from the layer when the layer is destroyed
3629            so that we don't maintain a cyclic reference that may not be
3630            garbage collected.
3631    
3632            * Thuban/Model/classification.py: See comment for layer.py.
3633    
3634    2003-03-12  Jan-Oliver Wagner <[email protected]>
3635    
3636            * HOWTO-Release: New. Information on the steps for releasing
3637            a new version of Thuban.
3638    
3639    2003-03-11  Jonathan Coles   <[email protected]>
3640    
3641            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
3642            Use True instead of true.
3643            (Classifier): Should have a single panel in which all the controls lie.
3644    
3645            * Thuban/UI/proj4dialog.py: Add normal border.
3646    
3647            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
3648    
3649            * Thuban/UI/mainwindow.py: Use True instead of true.
3650    
3651            * setup.py: Update some definitions to use wxWindows2.4 files
3652    
3653            * Data/iceland_sample_class.thuban: Fixed file so that the
3654            field_type information is present.
3655    
3656    2003-03-10  Jonathan Coles   <[email protected]>
3657    
3658            * Thuban/UI/classifier.py (Classifier.__init__): Make the
3659            field type label grow so that when the text changes the
3660            size is updated correctly. This may be a wxWindows bug.
3661    
3662    2003-03-10  Jonathan Coles   <[email protected]>
3663    
3664            * Thuban/UI/application.py: Changed SESSION_CHANGED to
3665            SESSION_REPLACED.
3666    
3667            * Thuban/UI/classifier.py: Wrap text with _().
3668            (ClassGrid.CreateTable): Set dimensions and size hints here,
3669            instead of in Reset, so we only set the size once.
3670    
3671            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
3672    
3673            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3674            Call Close() instead of Shutdown().
3675    
3676            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3677    
3678            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3679            Go back to using OnClose() instead of Shutdown().
3680    
3681    2003-03-10  Jonathan Coles   <[email protected]>
3682    
3683            * Thuban/UI/classifier.py (Classifier): SelectField() needed
3684            to know the old field index as well as the new one.
3685    
3686    2003-03-10  Jonathan Coles   <[email protected]>
3687    
3688            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
3689            to correctly set the table information and call this from
3690            __init__ and from _OnFieldSelect so that all the information
3691            is up to date when the dialog opens and when a field is changed.
3692    
3693    2003-03-10  Jonathan Coles   <[email protected]>
3694    
3695            * Thuban/Model/classification.py (Classification): Don't use
3696            layer's message function directly, use the ClassChanged() method
3697            when then classification changes. SetField/SetFieldType/SetLayer
3698            must keep the information about field name and field type in
3699            sync when an owning layer is set or removed.
3700    
3701            * Thuban/Model/layer.py: Added ClassChanged() so that the
3702            classification can tell the layer when its data has changed.
3703            (Layer.SetClassification): Accepts None as an arguement to
3704            remove the current classification and correctly handles
3705            adding a new classification.
3706    
3707            * Thuban/Model/load.py: Comment out print statement
3708    
3709            * test/test_classification.py, test/test_save.py: New and
3710            improved tests.
3711    
3712    2003-03-07  Jonathan Coles   <[email protected]>
3713    
3714            * Thuban/Model/classification.py: Implemented __copy__ and
3715            __deepcopy__ for ClassGroup* and ClassGroupProperites so
3716            they can easily be copied by the classifier dialog.
3717            (ClassGroupProperites.__init__): The default line color should
3718            have been Color.Black.
3719    
3720            * Thuban/UI/classifier.py: Setting and Getting table values now
3721            uses a consistent set of functions.
3722            (Classifier): Now non-modal. Has field type label which changes
3723            as the field changes. Keep track of buttons in a list so that
3724            we can enable/disable the buttons when the None field is selected.
3725            (SelectPropertiesDialog): Add buttons to make the colors transparent.
3726    
3727            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
3728            does what OnClose did, but can be called by the application to
3729            close a window. Needed when a session changes, and we have to
3730            close the classifier windows.
3731    
3732            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3733            Shuts down open dialogs. Used when a new session is created
3734            or a session is opened.
3735            (MainWindow.SaveSession): Should only call application.SaveSession()
3736            if we don't call SaveSessionAs first.
3737            (MainWindow.Classify): Allow different classifier dialogs for
3738            different layers.
3739    
3740            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
3741            the parent class handle it. Add Shutdown() to unsubscibe from
3742            event notification and call the parent Shutdown(). This was
3743            necessary so the application can close the tree window.
3744    
3745    2003-03-06  Jonathan Coles   <[email protected]>
3746    
3747            * Thuban/Model/classification.py: Minor documentation changes,
3748            Addition of __eq__ and __ne__ methods.
3749            (Classification.SetLayer): prevent recursion between this method
3750            and Layer.SetClassification().
3751    
3752            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
3753    
3754            * Thuban/Model/layer.py (SetClassification): prevent recursion
3755            between this method and Classification.SetLayer().
3756    
3757            * test/test_classification.py, test/test_load.py,
3758            test/test_session.py: Fixed and added tests for the classification
3759            classes.
3760    
3761    2003-03-06  Bernhard Herzog  <[email protected]>
3762    
3763            * Thuban/UI/classifier.py (ClassGrid.__init__)
3764            (ClassGrid.CreateTable): Move the SetSelectionMode call to
3765            CreateTable because otherwise it triggers an assertion in
3766            wxPython/wxGTK 2.4.
3767    
3768    2003-03-05  Jonathan Coles   <[email protected]>
3769    
3770            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
3771    
3772            * Thuban/Model/load.py: import FIELDTYPE constants from table.
3773    
3774            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
3775    
3776            * Thuban/Model/table.py: Put FIELDTYPE constants back.
3777    
3778    2003-03-05  Jonathan Coles   <[email protected]>
3779    
3780            * Thuban/UI/classifier.py: Added class documentation.
3781            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
3782            Store just the groups in the table and generate the other
3783            column information when it is requested. Add "None" field
3784            to pull-down to select no classification.
3785    
3786            * Thuban/common.py: Moved FIELDTYPE constants from table.py
3787            (Str2Num): Only catch ValueError exceptions.
3788    
3789            * Thuban/Model/classification.py: Class documentation. Renaming
3790            of methods with Stroke to Line. Groups are stored in a single
3791            list with the default as the first element. Groups are searched
3792            in the order they appear in the list.
3793    
3794            * Thuban/Model/color.py: Documentation.
3795    
3796            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
3797            the kind of data represented by a field.
3798    
3799            * Thuban/Model/load.py (ProcessSession): Use proper string
3800            conversion function; fixes RTbug #1713.
3801    
3802            * Thuban/Model/save.py (Saver): Store field type information.
3803    
3804            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
3805            (Table): Add field_info_by_name() to retrieve field information
3806            by specifying the field name, not the number.
3807    
3808            * Thuban/UI/mainwindow.py: Function name changes.
3809    
3810            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
3811            get the layer classification once. Don't try to classify
3812            values when the field is None: just use the default properties.
3813    
3814            * Thuban/UI/view.py: Function name changes.
3815    
3816            * Doc/thuban.dtd: Add field_type attribute to a classification.
3817    
3818    2003-03-04  Bernhard Herzog  <[email protected]>
3819    
3820            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
3821            the fill and stroke layer attributes optional with suitable
3822            default values. Add the stroke_width layer attribute. Use correct
3823            syntax for empty elements. Make the attribute list for labels
3824            refer to the label element.
3825    
3826    2003-03-04  Bernhard Herzog  <[email protected]>
3827    
3828            * setup.py (thuban_build_py.build): Add a comment about distutils in
3829            Python 2.3 containing some of the functionality we implement in
3830            setup.py ourselves.
3831    
3832            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
3833            before the selection mode. Doing it the other way round triggers
3834            an assertion in wxWindows.
3835    
3836            * Thuban/Model/save.py (escape): Fix typo in doc-string
3837    
3838            * Thuban/Model/classification.py: Remove unnecessary wxPython
3839            import
3840    
3841    2003-03-04  Jonathan Coles   <[email protected]>
3842    
3843            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
3844            Parameter 'value' should default to None.
3845    
3846            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
3847            the class attribute __classification is now private.
3848    
3849            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
3850            Classifier to ClassGrid. Added support for removing selected rows,
3851            which including code for keeping track of when cells are selected,
3852            and deselected.
3853            (ClassTable): Support for added/removing rows. Fixed a problem
3854            with __ParseInput whereby it would not allow strings (only numbers)
3855            to be entered.
3856            (Classifier): Added button and supporting code for removing
3857            selected rows.
3858    
3859    2003-02-27  Jonathan Coles   <[email protected]>
3860    
3861            * Thuban/common.py: Moved color conversion functions into
3862            Thuban/UI/common.py.
3863            (Str2Num): Now converts the float (not the string) to a long/int
3864            so that an exception isn't thrown.
3865    
3866            * Thuban/UI/common.py: Common functions used in several UI modules
3867    
3868            * Thuban/Model/classification.py: Changed the class hierarchy
3869            so that a Classification consists of Groups which return
3870            Properties when a value matches a Group.
3871    
3872            * Thuban/Model/layer.py: Fixed name resolution problem.
3873    
3874            * Thuban/Model/load.py: Use new Classification and Group functions.
3875    
3876            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
3877            failure.
3878            (Saver.write_classification): Use new Classification and Group
3879            functions.
3880    
3881            * Thuban/UI/classifier.py: Changes to use new Classification and Group
3882            functions. Fix to create a tuple with a single value instead of
3883            simply returning the value.
3884    
3885            * Thuban/UI/renderer.py: Use new Classification and Group functions.
3886            Use common.py functions.
3887    
3888            * Thuban/UI/tree.py: Use common.py functions.
3889            
3890            * test/test_classification.py: Use new Classification and Group
3891            classes.
3892    
3893    2003-02-24  Jonathan Coles   <[email protected]>
3894    
3895            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
3896            functions from Thuban color objects to wxWindow colour objects.
3897    
3898            * Thuban/Model/classification.py (Classification): Renamed
3899            GetProperties() to GetClassData(). Used the new iterator
3900            in TreeInfo().
3901            (ClassIterator): Iterator implementation to iterate over the
3902            ClassData objects in a classification object.
3903    
3904            * Thuban/Model/save.py (Saver.write_classificaton): Uses
3905            the new iterator to save the classification information.
3906    
3907            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
3908            for changing the stroke and fill colors and previewing the
3909            changes.
3910    
3911            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
3912            MainWindow.SaveSessionAs): Text string changes so the dialogs
3913            have more meaningful titles.
3914    
3915            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
3916            Classification method name from GetProperties to GetClassData.
3917    
3918            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
3919            instead of accessing now non-existent class variables.
3920    
3921    2003-02-24  Bernhard Herzog  <[email protected]>
3922    
3923            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
3924            unneeded Shape() call. Rendering is substantially faster without
3925            it and it avoids some problems with broken shape files.
3926    
3927    2003-02-20  Frank Koormann   <[email protected]>
3928    
3929            Force minimal size of identify and label dialogs. The autosizing
3930            looked too ugly.
3931    
3932            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
3933            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
3934            Set size of listctrl.
3935            * Thuban/UI/identifyview.py (IdentifyView.__init__):
3936            Set size of dialog.
3937    
3938    2003-02-19  Jonathan Coles   <[email protected]>
3939    
3940            * test/test_classification.py, test/test_layer.py,
3941            test/test_load.py, test/test_map.py, test/test_session.py:
3942            Updated the tests to use the new functions that are in the
3943            respective classes.
3944    
3945            * Thuban/Model/classification.py (Classification):
3946            Uses the new ClassData* classes. Modification messages are
3947            passed up to the parent layer (if it exists).
3948            (ClassData): New class to encapsulate the common data in each
3949            classification property.
3950            (ClassDataDefault): Represents the Default class. data.
3951            (ClassDataPoint): Represents a single class. data point
3952            (ClassDataRange): Represents a class. range
3953            (ClassDataMap): Represents a class. map (unused).
3954    
3955            * Thuban/Model/color.py: Added Color.None to represent something
3956            with no color. Color.Black represents the color black.
3957            (NoColor): Helper class derived from Color to represent something
3958            with no color.
3959    
3960            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
3961            stroke_width attributes. Made the 'classification' attribute private.
3962            New methods for setting/getting the classification.
3963    
3964            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
3965            to get the classifcation and use the new ClassData* classes to
3966            hold the classification data. Use Str2Num to convert numbers
3967            properly.
3968    
3969            * Thuban/Model/save.py (Saver): Use new Color and Classification
3970            methods
3971    
3972            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
3973            custom grid.
3974            (ClassTable): Support for editing Values and Labels and for
3975            changing what type (point or range) of data is stored in each
3976            property based on how the user enters the data.
3977            (Classifier): Support for saving the new classifications and
3978            launching the dialog to edit a property.
3979            (SelectPropertiesDialog): New class for editing the visual
3980            properties of a classification (stroke color, width, and fill color)
3981            (ClassPreviewer): Took the Draw method from ClassRenderer and
3982            made most of it into this new class. Intend to use this class in
3983            the SelectPropertiesDialog for previewing changes.
3984    
3985            * Thuban/UI/renderer.py: Use new Color and Classification methods.
3986    
3987            * Thuban/UI/tree.py: Formatting changes.
3988    
3989            * Doc/thuban.dtd: Add 'label' element
3990    
3991            * Thuban/common.py: New. Contains common routines used throughout
3992            the code.
3993            (Str2Num): Takes a string and converts it to the "best" type of
3994            number.
3995    
3996    2003-02-14  Bernhard Herzog  <[email protected]>
3997    
3998            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
3999            dragging flag is always set to 0 even when the tool implementation
4000            raises an exception
4001    
4002    2003-02-11  Bernhard Herzog  <[email protected]>
4003    
4004            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
4005            method to create a splash screen.
4006            (ThubanApplication.ShowMainWindow): New. Show the main window.
4007            Needed so the splash screen can display the mainwindow
4008            (ThubanApplication.OnInit): Call the
4009            new splash_screen method to determine whether the application
4010            should display a splash screen. If it displays a splash screen do
4011            not immediately show the main window.
4012    
4013    2003-02-11  Jonathan Coles  <[email protected]>
4014    
4015            * Thuban/Model/classification.py: Added import line to fix
4016            feature conflicts between running on python2.2 and python2.1.
4017    
4018            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
4019            onto the clinfo parameter, so removed the deepcopy().
4020    
4021    2003-02-10  Jonathan Coles  <[email protected]>
4022    
4023            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
4024            Added element_open variable to track opening and closing of tags
4025            so that tags that don't span more than one line are closed with
4026            /> instead of </tag_name>. Use the GetDefault*() methods of
4027            the Classification class.
4028    
4029            * Thuban/Model/classification.py (Classificaton): Added set and
4030            get methods for the default data. The class also takes a layer
4031            reference so that modification messages can be sent. Fixed the
4032            methods to use the new ClassData class.
4033            (ClassData): New class to encapsulate the classification data
4034    
4035            * Thuban/Model/layer.py (Layer): Remove the
4036            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
4037            SetDefault*() methods on the layer's classification object.
4038            (Layer.__init__): Use the new SetDefault*() methods in the
4039            Classification class.
4040    
4041            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
4042            object instead of a dictionary.
4043    
4044            * Thuban/UI/classifier.py (ClassRenderer): New class to
4045            draw the classifications in the dialog box's table.
4046            (Classifier): Modified to use the ClassRenderer class.
4047    
4048            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
4049            methods of the Classification class.
4050    
4051            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
4052            of the ClassData class.
4053    
4054            * test/test_classification.py, test/test_layer.py,
4055            test/test_map.py, test/test_session.py: Fix the tests to work
4056            with the above code changes.
4057    
4058    2003-02-03  Jonathan Coles  <[email protected]>
4059    
4060            * Thuban/Model/classification.py (Classification): Added getNull()
4061            to return the NullData reference
4062    
4063            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
4064            Layer.SetStrokeWidth): Modified these functions to change the
4065            null data in the classification rather than keep these values
4066            directly in the Layer class. Menu options to change these values
4067            work again.
4068    
4069    2003-01-28  Jonathan Coles  <[email protected]>
4070    
4071            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
4072            Fixed crashing problem on some systems. Dialog box shows
4073            classification data.
4074    
4075            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
4076            Colors in the tree view.
4077    
4078            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
4079            the tree info for classifications. Commented out unnecessary lines.
4080    
4081            * Thuban/Model/classification.py (Classification.TreeInfo): New
4082            function to add information about the classification into the
4083            tree view.
4084    
4085    2003-01-27  Jan-Oliver Wagner <[email protected]>
4086    
4087            * Thuban/__init__.py (_): New.
4088    
4089            * Thuban/Model/classification.py, Thuban/Model/extension.py,
4090            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
4091            Thuban/Model/session.py, Thuban/UI/application.py,
4092            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
4093            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
4094            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
4095            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
4096            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
4097    
4098    2003-01-27  Jonathan Coles  <[email protected]>
4099    
4100            * Thuban/Model/layer.py: Classification initialization calls.
4101    
4102            * Thuban/Model/classification.py: Created class to encapsulate
4103            a layer classification. Supports specific data points and
4104            ranges.
4105    
4106            * Thuban/Model/load.py: Added support for loading classification
4107            information.
4108    
4109            * Thuban/Model/save.py: Added support for saving classification
4110            information.
4111    
4112            * Thuban/UI/classifier.py: Initial class for a dialog box for
4113            specifying classification information.
4114    
4115            * Thuban/UI/mainwindows.py: Support for opening the classifier
4116            dialog.
4117    
4118            * Thuban/UI/renderer.py: Support for drawing a layer with the
4119            classification information.
4120    
4121            * Data/iceland_sample_class.thuban: iceland_sample with
4122            classification data.
4123    
4124            * test/test_classification: Tests for the Classification class.
4125    
4126    2002-12-09  Bernhard Herzog  <[email protected]>
4127    
4128            * test/test_command.py: New. Tests for the command classes.
4129    
4130            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
4131            (Command.IsTool): New method to distinguish between command
4132            switching tools and other commands.
4133    
4134            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
4135            the tool to avoid direct assignments to instance variables
4136            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
4137            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
4138            change the tool
4139    
4140            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
4141            active tool's command turns insensitive, disable the tool.
4142            (_tool_command): Use the new ToolCommand class
4143    
4144            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
4145            SelectTool method to change the tool
4146            (iconfile): Use the ToolCommand class
4147    
4148    2002-12-03  Bernhard Herzog  <[email protected]>
4149    
4150            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
4151            the case of selected items that are not children of Layers or Maps
4152            properly. Previously this bug would trigger an assertion in
4153            wxWindows.
4154    
4155    2002-11-06  Frank Koormann  <[email protected]>
4156    
4157            * Thuban/UI/mainwindow.py: Altered the order of tools in the
4158            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
4159            Full Extent).
4160    
4161    2002-10-23  Bernhard Herzog  <[email protected]>
4162    
4163            * setup.py (setup call): version now 0.1.3
4164    
4165            * MANIFEST.in: Add the files in test/
4166    
4167            * test/README: Add note about tests requiring the iceland data
4168    
4169            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
4170            copyright notice.
4171    
4172    2002-10-18  Bernhard Herzog  <[email protected]>
4173    
4174            * test/test_map.py
4175            (TestMapWithContents.test_projected_bounding_box): Use an explicit
4176            epsilon.
4177    
4178            * test/support.py (FloatComparisonMixin.assertFloatEqual)
4179            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
4180            message if the assertion fails and don't return the return value
4181            of self.assert_. In assertFloatSeqEqual the return meant that not
4182            all items of the sequence were compared.
4183    
4184    2002-09-20  Bernhard Herzog  <[email protected]>
4185    
4186            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
4187    
4188            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
4189    
4190            * test/test_map.py (TestMapWithContents.test_tree_info): Create
4191            the string with the bounding box on the fly because of platform
4192            differences in the way %g is handled.
4193    
4194            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
4195            DBFfile too because Thuban layers can't yet cope missing DBF
4196            files.
4197    
4198    2002-09-20  Bernhard Herzog  <[email protected]>
4199    
4200            * test/test_menu.py: Use initthuban instead of
4201            add_thuban_dir_to_path to initialize Thuban.
4202    
4203            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
4204            Mixin class for float comparisons
4205            (SubscriberMixin): New. Mixin class to test messages sent through
4206            the Connector class
4207    
4208            * test/README: Fix a typo and add the -v flag to the command for
4209            individual tests
4210    
4211            * test/test_session.py: New. Test cases for Thuban.Model.session
4212    
4213            * test/test_proj.py: New. Test cases for Thuban.Model.proj
4214    
4215            * test/test_map.py: New. Test cases for Thuban.Model.map
4216    
4217            * test/test_layer.py: New. Test cases for Thuban.Model.layer
4218    
4219            * test/test_label.py: New. Test cases for Thuban.Model.label
4220    
4221            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
4222    
4223            * test/test_color.py: New. Test cases for Thuban.Model.color
4224    
4225            * test/test_base.py: New. Test cases for Thuban.Model.base
4226    
4227    2002-09-13  Bernhard Herzog  <[email protected]>
4228    
4229            * Thuban/Model/session.py (Session.forwarded_channels): Forward
4230            the CHANGED channel too.
4231    
4232            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
4233            CHANGED channel too.
4234            (Map.__init__): Call the Modifiable constructor as well.
4235    
4236            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
4237            event if the modified flag changes.
4238            (Modifiable.changed): Tweak the doc-string.
4239    
4240            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
4241            (MainWindow.set_position_text): Put the code that puts the text
4242            with the mouse position into the status bar into the new method
4243            set_position_text so that it can overwritten in derived classes.
4244    
4245    2002-09-12  Bernhard Herzog  <[email protected]>
4246    
4247            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
4248            message box on the main window.
4249    
4250    2002-09-11  Bernhard Herzog  <[email protected]>
4251    
4252            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
4253            the 'E' because it's less likely to interfere with other menu
4254            entries.
4255            (MainWindow.build_menu): remove an incorrect comment.
4256    
4257    2002-09-10  Bernhard Herzog  <[email protected]>
4258    
4259            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
4260            (_tool_command): Add sensitive parameter
4261            (_has_visible_map): Sensitivity callback to tools and other
4262            commands that require a visible map. Use it in map_zoom_in_tool,
4263            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
4264            and map_full_extent
4265    
4266    2002-09-06  Bernhard Herzog  <[email protected]>
4267    
4268            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
4269            VIEW_POSITION
4270    
4271    2002-09-04  Frank Koormann  <[email protected]>
4272    
4273            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
4274    
4275    2002-09-02  Bernhard Herzog  <[email protected]>
4276    
4277            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
4278            wxWindows already and our implementation doesn't work correctly
4279            with wxGTK 2.3:
4280            (MapCanvas.__init__): Remove the instance variable
4281            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
4282            be drawin
4283            (MapCanvas.OnIdle): Removed.
4284    
4285            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
4286            a parameter to determine the size of the rectangle.
4287            (MapCanvas.find_shape_at): Create the box around the point on a
4288            layer by layer basis and make the size depend on the shape type.
4289            This solves a problem with the selection of point shapes at the
4290            border of the layer's bounding box
4291    
4292    2002-08-30  Bernhard Herzog  <[email protected]>
4293    
4294            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
4295            for the sensitivity  of remove layer.
4296            (_can_remove_layer): New. Sensitivity callback for remove layer
4297            (Command layer_remove): Use _can_remove_layer
4298    
4299            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
4300            determine whether a given layer can be deleted.
4301    
4302            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
4303            (MapCanvas.do_redraw): Get rid of the unused update_region
4304            instance variable
4305    
4306            * Thuban/UI/view.py: Add/update some doc-strings.
4307    
4308            * test/: new subdirectory with a bunch of unit tests.
4309    
4310            * test/README, test/test_table.py, test/test_save.py,
4311            test/test_menu.py, test/test_load.py: Initial set of tests and
4312            brief instructions on how to run them
4313    
4314    2002-08-29  Bernhard Herzog  <[email protected]>
4315    
4316            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
4317            arcs with multiple parts.
4318    
4319            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
4320            Handle degenrate rectangles.
4321    
4322            * Thuban/Model/table.py: Make writing records work correctly:
4323            (Table.__init__): Keep track of whether the DBF is open for
4324            writing
4325            (Table.write_record): Open the DBF file for writing when necessary
4326    
4327    2002-08-27  Bernhard Herzog  <[email protected]>
4328    
4329            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
4330            dbf files only for reading by default. Use a new writable dbf
4331            object for writing.
4332    
4333    2002-08-26  Bernhard Herzog  <[email protected]>
4334    
4335            * Thuban/UI/mainwindow.py: Refactor the context creation:
4336            (MainWindow.Context): New method to return a context
4337            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
4338            new method
4339    
4340            * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
4341            layer table specific code from TableGrid into LayerTableGrid
4342            (TableFrame, LayerTableFrame): Split the layer table specific code
4343            from TableFrame into LayerTableFrame
4344            (LayerTableGrid.select_shape): Remove a debug print
4345    
4346            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
4347            LayerTableFrame
4348    
4349    2002-08-23  Bernhard Herzog  <[email protected]>
4350    
4351            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
4352            absolute filename.
4353    
4354    2002-08-22  Bernhard Herzog  <[email protected]>
4355    
4356            * Thuban/Model/table.py (Table.write_record): New method to write
4357            records.
4358            (Table.__init__): Open the DBF file for writing too.
4359    
4360            * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
4361            into the underlying table.
4362    
4363            * extensions/shapelib/shapefil.h (DBFCommit),
4364            extensions/shapelib/dbfopen.c (DBFCommit): New API function to
4365            commit any changes made to the DBF file.
4366    
4367            * Thuban/UI/mainwindow.py (make_check_current_tool)
4368            (_tool_command): Put the code that generates the "checked"
4369            callback into a separate function so that we can reuse it
4370            elsewhere
4371    
4372            * Thuban/Model/save.py (Saver): New class to handle serializing a
4373            session into an XML file. The main reason to introduce a class is
4374            that applications built on Thuban can derive from it so that they
4375            can save additional information in a session file.
4376            (save_session): Delegate almost all the work to the Saver class.
4377            Rename the filename argument to file because it may be a file like
4378            object now.
4379    
4380            * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
4381            code. Remove the little test code which would be executed when the
4382            module is run as a script which didn't work anymore since it can't
4383            import the other Thuban modules.
4384            (ProcessSession, load_session): Refactor the ProcessSession to
4385            have one method for each element start and end tag so that derived
4386            classes can easily override the processing of individual tags.
4387            Also, always parse with namespaces enabled because applications
4388            built on top of Thuban will likely use namespaces if they extend
4389            the session file format.
4390    
4391    2002-08-21  Bernhard Herzog  <[email protected]>
4392    
4393            * setup.py (ThubanInstall.run): Don't repr install_lib_orig
4394            because thubaninit_contents will do it for us.
4395    
4396    2002-08-16  Jan-Oliver Wagner <[email protected]>
4397    
4398            * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
4399            tree window already open
4400    
4401    2002-08-15  Bernhard Herzog  <[email protected]>
4402    
4403            * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
4404            with self.
4405    
4406            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
4407            when we have actually captured it.
4408    
4409            * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
4410            shapefile and destroy the table.
4411    
4412            * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
4413    
4414    2002-08-14  Bernhard Herzog  <[email protected]>
4415    
4416            * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
4417            instance variable columns
4418            (RecordTable.GetTypeName): row and col may be negative in some
4419            cases.
4420    
4421            * setup.py (InstallLocal.initialize_options)
4422            (InstallLocal.finalize_options, InstallLocal.user_options): New
4423            option create-init-file to build a thubaninit.py when running
4424            install_local
4425            (InstallLocal.run): Create the thubaninit.py module when requested
4426            (thubaninit_contents): Split the template into several parts and
4427            create a new function thubaninit_contents that creates the
4428            contents of a thubaninit module.
4429            (ThubanInstall.run): Use the new function to create the thubaninit
4430            module.
4431    
4432    2002-07-30  Bernhard Herzog  <[email protected]>
4433    
4434            * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
4435            cleanup.
4436            (ThubanApplication.MainLoop): Extend to automatically call OnExit.
4437    
4438            * Thuban/Model/session.py (Session.Destroy): Don't bypass the
4439            direct base class' Destroy method.
4440    
4441            * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
4442            layers.
4443            (Map.Destroy): Destroy the label_layer as well and call the
4444            inherited Desatroymethod first so that no more messages are
4445            issued.
4446            (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
4447            message if the stacking order actually has changed. Add
4448            doc-strings.
4449            (Map.BoundingBox): Correct the doc-string.
4450            (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
4451            (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
4452    
4453            * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
4454            all labels.
4455    
4456    2002-07-29  Bernhard Herzog  <[email protected]>
4457    
4458            * Thuban/Model/map.py (Map.subscribe_layer_channels)
4459            (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
4460            to a layer's channels into separate methods.
4461            (Map.RemoveLayer, Map.AddLayer): Call the new methods
4462            (Map.Destroy): Unsubscribe from a layer's channels before
4463            destroying it.
4464    
4465            * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
4466            selected_layer parameter to searched_layer which is the layer to
4467            search in.
4468            (MapCanvas.SelectShapeAt): New parameter layer to restrict the
4469            search to that layer. Return the selected layer and shape.
4470    
4471            * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
4472            typo
4473    
4474    2002-07-24  Bernhard Herzog  <[email protected]>
4475    
4476            * Thuban/UI/application.py (ThubanApplication.create_session):
4477            Extend the doc string.
4478            (ThubanApplication.subscribe_session)
4479            (ThubanApplication.unsubscribe_session): New methods to
4480            subscribe/unsubscribe to/from session channels.
4481            (ThubanApplication.SetSession): Call the new methods here.
4482            (ThubanApplication.maps_changed, ThubanApplication.set_map):
4483            Renamed set_map to maps_changed. Its now a subscriber for
4484            MAPS_CHANGED.
4485    
4486            * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
4487            x-coordinate in case of simple clicks
4488    
4489            * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
4490            don't pass it as a parameter
4491    
4492            * Thuban/Model/session.py (Session.RemoveMap): New
4493    
4494            * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
4495            window size into a parameter.
4496    
4497    2002-07-23  Bernhard Herzog  <[email protected]>
4498    
4499            * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
4500            just commands.
4501    
4502            * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
4503            parameter list a bit to allow setting the window title and the
4504            initial message in the status bar. Update the callers.
4505    
4506            * Thuban/UI/application.py (ThubanApplication.OnInit)
4507            (ThubanApplication.CreateMainWindow): Put the mainwindow
4508            instantiation into a separate method so that it can be overridden
4509            by a subclass.
4510    
4511    2002-07-19  Bernhard Herzog  <[email protected]>
4512    
4513            * Thuban/Model/session.py: Issue a CHANGED message every time
4514            another changed message is issued to make it easier to get
4515            notified of changes.
4516            (Session): Update the doc string
4517            (Session.forward): Issue changed-events as CHANGED as well.
4518            (Session.changed): Overwrite the inherited version to issue
4519            CHANGED events as well.
4520    
4521            * Thuban/UI/tree.py: We can now simply subscribe to the session's
4522            CHANGED channel to be informed of changes.
4523            (SessionTreeCtrl.session_channels): Not needed any longer.
4524            (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
4525            Only have to (un)subscribe CHANGED
4526    
4527            * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
4528    
4529            * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
4530            for the wxPython locale bug to __init__.py so that it's
4531            automatically executed by anybody using UI code from Thuban.
4532    
4533    2002-07-18  Bernhard Herzog  <[email protected]>
4534    
4535            * Thuban/UI/main.py (main): app no longer needs to be global
4536    
4537            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
4538            as parameter and store it in an instance variable
4539            (MainWindow.invoke_command, MainWindow.update_command_ui)
4540            (MainWindow.save_modified_session, MainWindow.NewSession)
4541            (MainWindow.OpenSession, MainWindow.SaveSession)
4542            (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
4543            application object.
4544    
4545            * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
4546            the main window with self.
4547    
4548            * Thuban/UI/context.py: New module with the context class
4549    
4550            * Thuban/UI/command.py (Command): Update doc string.
4551    
4552            * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
4553            MainWindow.update_command_ui): Pass an instance of the context
4554            class to the command's methods
4555            (check_current_tool, call_method): Handle the new context
4556            implementation
4557    
4558            * Examples/simple_extensions/simple_tool.py (simple_tool,
4559            check_simple_tool): Handle the new context implementation
4560    
4561            * Examples/simple_extensions/simple_command.py (simple_command):
4562            Handle the new context implementation. Update the comments about
4563            the context.
4564    
4565            * Thuban/UI/application.py (ThubanApplication.SetSession): Add
4566            doc-string
4567            (ThubanApplication.Session): New method to return the session
4568            object
4569    
4570            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
4571            interactor's selected_layer may not be a layer of the current
4572            session when the tree is updated while a new session is being set.
4573    
4574    2002-07-17  Bernhard Herzog  <[email protected]>
4575    
4576            * Thuban/UI/tree.py (color_string): Removed. No longer used.
4577            (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
4578            update_tree into update_tree and add_items. The tree now uses a
4579            more generic way to display the contents of the tree.
4580            (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
4581    
4582            * Thuban/Model/layer.py (Layer.TreeInfo),
4583            Thuban/Model/extension.py (Extension.TreeInfo),
4584            Thuban/Model/map.py (Map.TreeInfo),
4585            Thuban/Model/session.py (Session.TreeInfo):
4586            Add TreeInfo methods to implement the new tree view update scheme
4587    
4588    2002-07-16  Bernhard Herzog  <[email protected]>
4589    
4590            * Thuban/UI/application.py: Don't use "import from" for the
4591            MainWindow. It can't always be resolved.
4592            (ThubanApplication.OnInit): change reference to MainWindow
4593            accordingly.
4594    
4595            * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
4596            completely
4597    
4598    2002-07-10  Bernhard Herzog  <[email protected]>
4599    
4600            * setup.py (create_init_module): New configurable variable whose
4601            default depends on the platform we're running on.
4602            (ThubanInstall.initialize_options): Initialize
4603            self.create_init_module from the global create_init_module
4604            (ThubanInstall.user_options): indictate that the options
4605            create-init-module and init-module-dir have arguments.
4606    
4607            * setup.py: In the setup call change the version number to include
4608            cvs.
4609    
4610            * MANIFEST.in: Add the files in Examples
4611    
4612    2002-07-09  Bernhard Herzog  <[email protected]>
4613    
4614            * setup.py: In the setup call, use the thuban homepage as the
4615            value of the url parameter.
4616    
4617            * Examples: New subdirectory for examples.
4618    
4619            * Examples/simple_extensions/simple_tool.xpm,
4620            Examples/simple_extensions/simple_tool.py,
4621            Examples/simple_extensions/simple_command.py,
4622            Examples/simple_extensions/README: Simple examples showing how to
4623            add new commands and tools.
4624    
4625            * setup.cfg (bdist_rpm): Add the default value for prefix and tell
4626            bdist_rpm that we also have an install script.
4627            (bdist_inno): Add 2002 to the copyright notice.
4628    
4629            * setup.py: Create a file in python's site-packages directory to
4630            make installation of Thuban as a library easier.
4631            (ThubanInstall.user_options): Add two new options,
4632            create-init-module and init-module-dir
4633            (ThubanInstall.expand_with_pure_python_dirs): New method to expand
4634            filenames for installation in the default directories.
4635            (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
4636            the inherited methods to capture some filenames before they're
4637            transformed too much by distutils.
4638            (ThubanInstall.run): Create the init module if requested.
4639            (ThubanInstall.thuban_init_filename): New method to return the
4640            full name of the init module.
4641            (ThubanInstall.get_outputs): Append the filename of the init
4642            module.
4643    
4644    2002-07-08  Bernhard Herzog  <[email protected]>
4645    
4646            * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
4647            handle the prefix properly which means that the default for the
4648            installation prefix should be /usr for RPMs and /usr/local when
4649            doing a normal source install.
4650            (bdist_rpm_install_script): Script to override the default install
4651            commands in the specfile generated by the bdist_rpm command.
4652            (thuban_bdist_rpm.user_options): Add a prefix option
4653            (thuban_bdist_rpm.initialize_options): Init the prefix option.
4654            Create the script files for the spec files as empty files here
4655            (thuban_bdist_rpm._make_spec_file): Override the inherited method
4656            to fill the script files with content.
4657    
4658            * Thuban/Model/save.py (relative_filename): Wrapper around
4659            Thuban.Lib.fileutil.relative_filename that accepts an empty dir
4660            argument. save_session now automatically uses this version,
4661            solving a problem when saving to a relative filename.
4662    
4663            * setup.py: In the setup call, make sure that the library
4664            directories are under $prefix/lib not directly under $prefix.
4665    
4666    2002-06-20  Jan-Oliver Wagner <[email protected]>
4667    
4668            * Thuban/Model/extension.py: new module to handle extension objects.
4669            * Thuban/Model/messages.py: new messages for extensions.
4670            * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
4671            Session.AddExtension): new for handling extensions.
4672            Also some other minor changes to round up extension handling.
4673            * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
4674            of Extension titles and title and names of its objects.
4675    
4676    2002-05-29  Bernhard Herzog  <[email protected]>
4677    
4678            * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
4679            the events for a command.
4680            (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
4681            Call bind_command_events to bind the events. add_toolbar_command
4682            can now bind events too so that it's possible to have commands
4683            that are only available through the toolbar.
4684            (MainWindow.init_ids): New instance variable events_bound to keep
4685            track of for which commands events have been bound.
4686    
4687    2002-05-28  Bernhard Herzog  <[email protected]>
4688    
4689            * Thuban/UI/menu.py: New module to build and manage menus.
4690    
4691            * Thuban/UI/mainwindow.py: Remove some unused imports.
4692            (MainWindow.__init__, main_menu): move the definition of the main
4693            menu from __init__ to the Menu instance main_menu.
4694            (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
4695            build the menu bar and sub-menus from a menu description.
4696    
4697            * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
4698            startup file
4699            (ThubanApplication.read_startup_files): New method to run
4700            ~/.thuban/thubanstart.py
4701    
4702            * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
4703            Move the toolbar definition to the Menu instance main_toolbar.
4704            (MainWindow.build_toolbar): New method to build the toolbar
4705            similar to the build_menu methods
4706    
4707  2002-05-23  Bernhard Herzog  <[email protected]>  2002-05-23  Bernhard Herzog  <[email protected]>
4708    
4709            * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
4710            layer_outline_color. Fix it in the definition of the command too.
4711    
4712          * Thuban/UI/command.py (Command): Fix typo in doc string          * Thuban/UI/command.py (Command): Fix typo in doc string
4713    
4714  2002-05-22  Bernhard Herzog  <[email protected]>  2002-05-22  Bernhard Herzog  <[email protected]>
# Line 183  Line 4892 
4892          * Thuban/UI/messages.py (VIEW_POSITION): New message for the          * Thuban/UI/messages.py (VIEW_POSITION): New message for the
4893          position in the statusbar          position in the statusbar
4894    
4895  2002-04-26      Frank Koormann <[email protected]>  2002-04-26  Frank Koormann <[email protected]>
4896    
4897          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
4898    
4899  2002-04-24      Frank Koormann <[email protected]>  2002-04-24  Frank Koormann <[email protected]>
4900            
4901          * Resources/Bitmaps/identify.xpm: shadow added          * Resources/Bitmaps/identify.xpm: shadow added
4902    
4903          * Resources/Bitmaps/fullextent.xpm: new          * Resources/Bitmaps/fullextent.xpm: new
           
 2002-04-22      Jan-Oliver Wagner <[email protected]>  
4904    
4905          * Thuban/UI/tree.py (update_tree): added test for None on map bounding box  2002-04-22  Jan-Oliver Wagner <[email protected]>
4906    
4907            * Thuban/UI/tree.py (update_tree): added test for None on map bounding
4908            box
4909    
4910  2002-04-21      Jan-Oliver Wagner <[email protected]>  2002-04-21  Jan-Oliver Wagner <[email protected]>
4911    
4912          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
4913    
4914          * Thuban/UI/tree.py (update_tree): added added map extent          * Thuban/UI/tree.py (update_tree): added added map extent
4915    
4916          * Thuban/UI/mainwindow.py (_method_command): extended by parameter          * Thuban/UI/mainwindow.py (_method_command): extended by parameter
4917          icon; added map_full_extend as tool          icon; added map_full_extend as tool
4918    
4919  2002-04-19      Jan-Oliver Wagner <[email protected]>  2002-04-19  Jan-Oliver Wagner <[email protected]>
4920    
4921          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
4922          saving _new_ sessions          saving _new_ sessions
# Line 308  Line 5018 
5018    
5019          * setup.py: increase version number to 0.1          * setup.py: increase version number to 0.1
5020          (data_dist): New command class for data distribution          (data_dist): New command class for data distribution
           
5021    
5022  2001-09-14  Bernhard Herzog  <[email protected]>  2001-09-14  Bernhard Herzog  <[email protected]>
5023    
5024          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
5025          Handle the case of no layer (i.e. layer is None) properly.          Handle the case of no layer (i.e. layer is None) properly.
5026    
5027          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
5028          Set the initial selection of the combo boxes to reflect the          Set the initial selection of the combo boxes to reflect the
5029          projection we're starting with in a way that works on windows,          projection we're starting with in a way that works on windows,
5030          too.          too.
# Line 425  Line 5134 
5134          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
5135          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
5136    
5137          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
5138          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
5139          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
5140          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
5141          the application's OnInit method          the application's OnInit method
# Line 442  Line 5151 
5151          layer to the tableview dialog.          layer to the tableview dialog.
5152    
5153          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
5154          (TableGrid):          (TableGrid):
5155          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
5156          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
5157          (TableFrame.__init__):          (TableFrame.__init__):
# Line 509  Line 5218 
5218  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
5219    
5220          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
5221            
5222          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
5223          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
5224            
5225          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
5226          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
5227          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 559  Line 5268 
5268          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
5269          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
5270          link_file method          link_file method
5271            
5272          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
5273          the window when the first layer is added to the map.          the window when the first layer is added to the map.
5274    
# Line 596  Line 5305 
5305          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
5306          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
5307          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
5308            
5309          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
5310          installer          installer
5311    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26