/[thuban]/branches/greater-ms3/thuban/ChangeLog
ViewVC logotype

Diff of /branches/greater-ms3/thuban/ChangeLog

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

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

Legend:
Removed from v.126  
changed lines
  Added in v.1414

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26