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

Legend:
Removed from v.55  
changed lines
  Added in v.1265

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26