/[thuban]/branches/WIP-pyshapelib-bramz/ChangeLog
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26