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

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

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

revision 766 by bh, Tue Apr 29 12:42:27 2003 UTC revision 1172 by jonathan, Thu Jun 12 12:57:13 2003 UTC
# Line 1  Line 1 
1    2003-06-12  Jonathan Coles   <[email protected]>
2        
3            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
4            that was in load.py
5    
6            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
7            that was in save.py
8    
9    2003-06-12  Jonathan Coles   <[email protected]>
10    
11            This is largely a collection of bug fixes. We also handle the
12            case where gdal is not on the system. The XMLReader and XMLWriter
13            classes were moved into there own files to resolve some circular
14            import references and because they shouldn't really be in the
15            file that is dediciated to reading/writing session files since
16            they are also used elsewhere.
17    
18            * Thuban/Model/classgen.py: Renamed functions to follow the
19            function_names_with_underscores style. Fixes RTbug #1903.
20            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
21    
22            * Thuban/Model/layer.py: Import gdal only if it available.
23            (RasterLayer): Handle the case where the gdal library is unavailable.
24            Addresses RTbug #1877.
25    
26            * Thuban/Model/load.py (XMLReader): Moved into seperate file
27            xmlreader.py.
28    
29    2003-06-12  Jonathan Coles   <[email protected]>
30    
31            This is largely a collection of bug fixes. We also handle the
32            case where gdal is not on the system. The XMLReader and XMLWriter
33            classes were moved into there own files to resolve some circular
34            import references and because they shouldn't really be in the
35            file that is dediciated to reading/writing session files since
36            they are also used elsewhere.
37    
38            * Thuban/Model/classgen.py: Renamed functions to follow the
39            function_names_with_underscores style. Fixes RTbug #1903.
40            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
41    
42            * Thuban/Model/layer.py: Import gdal only if it available.
43            (RasterLayer): Handle the case where the gdal library is unavailable.
44            Addresses RTbug #1877.
45    
46            * Thuban/Model/load.py (XMLReader): Moved into seperate file
47            xmlreader.py.
48    
49            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
50            file xmlwriter.py.
51    
52            * Thuban/Model/resource.py: Renamed functions to following the
53            function_names_with_underscores style.
54            (has_gdal_support): New function that returns true if the gdal
55            library is available. Addresses RTbug #1877.
56    
57            * Thuban/UI/application.py (ThubanApplication.OpenSession):
58            Display a message box if the gdal library is not available, but
59            only if there are any layers that would use it. Addresses RTbug #1877.
60    
61            * Thuban/UI/classgen.py: Use renamed projection resource functions.
62            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
63            when using integers versus floats.
64    
65            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
66            determine if the "Add Image Layer" menu option should be
67            greyed out or not. Addresses RTbug #1877.
68    
69            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
70    
71            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
72            optimize if a raster layer is visible. Fixes RTbug #1931.
73            Only draw the raster layer if the gdal library is available.
74            Addresses RTbug #1877.
75    
76            * test/test_classgen.py: Add tests for generate_singletons,
77            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
78            (test_calculate_quantiles): Fix some tests to catch the new
79            ValueError that is raised.
80    
81            * test/test_proj.py: Use renamed projection resource functions.
82    
83            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
84            test for saving classified layers. Fixes RTbug #1902.
85            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
86    
87    2003-06-12  Jan-Oliver Wagner <[email protected]>
88    
89            Fix for http://intevation.de/rt/webrt?serial_num=1900.
90    
91            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
92    
93            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
94            multiplechoicedialog.py rather than from the wxPython library.
95    
96    2003-06-11  Frank Koormann  <[email protected]>
97    
98            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
99            update.
100    
101    2003-06-11  Frank Koormann  <[email protected]>
102    
103            * Thuban/Lib/fileutil.py (get_application_dir): New function to
104            determine the absolute .thuban/thuban directory under
105            "posix" (os.expanduser) and "nt" (read AppData registry key).
106    
107            * Thuban/Model/resource.py: Use get_application_dir
108    
109            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
110            Use get_application_dir.
111    
112    2003-06-10  Bernhard Herzog  <[email protected]>
113    
114            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
115            the messages MAP_LAYERS_REMOVED messages
116            (LayerTableFrame.OnClose): Unsubscribe from it.
117            (LayerTableFrame.map_layers_removed): New. Receiver for
118            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
119            dialog is showing is removed.
120    
121    2003-06-10  Bernhard Herzog  <[email protected]>
122    
123            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
124            of the receivers list so that unsubscribing in a receiver doesn't
125            modify it while iterating over it.
126    
127            * test/test_connector.py
128            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
129            unsubscribing in a receiver works correctly. See docstring for
130            details
131    
132    2003-06-10  Bernhard Herzog  <[email protected]>
133    
134            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
135            message.
136    
137            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
138            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
139            LAYER_CHANGED will still be sent if the classification changes.
140    
141            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
142            parameter so we can subscribe to some of its messages
143            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
144            and the layer's LAYER_SHAPESTORE_REPLACED
145            (Classifier.unsubscribe_messages): New. Unsubscribe from message
146            subscribed to in __init__
147            (Classifier.map_layers_removed)
148            (Classifier.layer_shapestore_replaced): receivers for the messages
149            subscribed to in __init__. Unsubscribe and close the dialog
150    
151            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
152            the map to the Classifier dialog
153    
154            * test/test_layer.py (SetShapeStoreTests): Derive from
155            SubscriberMixin as well so we can test messages
156            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
157            messages
158            (SetShapeStoreTests.tearDown): Clear the messages again
159            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
160            for the modified flag too
161            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
162            to check whether SetShapeStore sets the modified flag
163            (SetShapeStoreTests.test_set_shape_store_different_field_name)
164            (SetShapeStoreTests.test_set_shape_store_same_field)
165            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
166            Add tests for the messages. This checks both the new
167            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
168    
169    2003-06-06  Jan-Oliver Wagner <[email protected]>
170    
171            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
172            the menu items.
173    
174    2003-06-05  Frank Koormann  <[email protected]>
175    
176            * Thuban/UI/identifyview.py (IdentifyView.__init__):
177            Layout reimplemented without panel. Make life easier to fit the list
178            in the dialog.
179    
180    2003-06-05  Frank Koormann  <[email protected]>
181    
182            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
183            once on initialisation (Former implementation resulted in multiple
184            entries for each projection).
185            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
186            if set, select the projection found under the specified name. This
187            overwrites any other selection estimate.
188            Removed projchoice filling from this method.
189            (ProjFrame._OnSave, ProjFrame._OnAddToList):
190            Updated call of ProjFrame.__FillAvailList
191            (LCCPanel._DoLayout): Moved parameter controls in more common order.
192    
193            * Resources/Projections/defaults.proj: Extended defaults representing
194            various common European projections.
195    
196    2003-06-05  Frank Koormann  <[email protected]>
197    
198            * Thuban/UI/identifyview.py (IdentifyView.__init__):
199            Use ListCtrl instead of GridCtrl
200    
201            * Thuban/Model/resource.py:
202            Guess location of .thuban directory from tempdir parent directory.
203    
204            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
205            Guess location of .thuban directory from tempdir parent directory.
206    
207    2003-06-04  Bernhard Herzog  <[email protected]>
208    
209            Do not cache the values returned by the tree widget's
210            GetFirstChild and GetNextChild methods because it led to lots of
211            segfaults. The new way requires more brute force but is more
212            reliable.
213    
214            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
215            variable layer2id
216            (LegendTree.find_layer): New method to do with brute force what
217            layer2id tried to accomplish
218            (LegendTree._OnMsgLayerChanged)
219            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
220            Use find_layer instead of layer2id
221            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
222            update layer2id anymore
223            (LegendTree._OnMsgMapLayersRemoved)
224            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
225    
226    2003-06-03  Thomas Koester  <[email protected]>
227    
228            * Thuban/Model/classgen.py (GenQuantiles0): New function.
229    
230    2003-06-02  Bernhard Herzog  <[email protected]>
231    
232            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
233            New commands.
234            (main_menu): Add the new commands.
235            (MainWindow.TableRename): New. Implementation of the table_rename
236            command.
237            (MainWindow.RenameLayer): New. Implementation of the layer_rename
238            command.
239    
240            * Thuban/Model/session.py (Session.AddTable): call self.changed to
241            set the modified flag
242    
243            * test/test_session.py (TestSessionSimple.test_add_table): Test
244            whether the modified flag is set properly
245    
246            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
247            instead of issue so that the modified flags get updated.
248    
249            * test/test_base.py (SomeTitledObject): Derive from Modifiable
250            instead of Publisher to reflect reality better and to accomodate
251            the fact that SetTitle now calls changed instead of issue
252    
253    2003-06-02  Bernhard Herzog  <[email protected]>
254    
255            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
256            acquisition has to happen before the try in a try-finally.
257    
258    2003-06-02  Bernhard Herzog  <[email protected]>
259    
260            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
261            possible that a layer is removed that is not currently selected in
262            the legend so don't check for this.
263    
264    2003-05-30  Bernhard Herzog  <[email protected]>
265    
266            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
267            variables to None that have direct or indirect references to
268            shapefiles or dbf files to make sure that they do go away and the
269            files are closed.
270    
271    2003-05-30  Bernhard Herzog  <[email protected]>
272    
273            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
274            availImgListIndices when a new image list is created
275            
276    2003-05-30  Bernhard Herzog  <[email protected]>
277    
278            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
279            changing_selection to indicate whether the LegendTree code itself
280            is currently changing the selection
281            (LegendTree.normalize_selection): New method to normalize the
282            selection by selecting the layer item even if the user clicked on
283            the classification.
284            (LegendTree._OnSelChanged): normalize the selection. This works
285            around a bug in wx which doesn't keep track of the selection
286            properly when subtrees are deleted.
287    
288    2003-05-30  Bernhard Herzog  <[email protected]>
289    
290            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
291            maximum and minimum scale factors.
292    
293            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
294            changes in classgen.py
295    
296    2003-05-30  Jonathan Coles   <[email protected]>
297    
298            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
299            all the methods functions. Fixes RTBug #1903.
300    
301            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
302            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
303            RTBug #1907.
304    
305            * Thuban/UI/classgen.py: Use classgen functions that were part
306            of the ClassGenerator class. Put try/finally blocks around
307            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
308            RTBug #1904.
309    
310            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
311    
312            * Thuban/UI/legend.py: The legend was cleared and repopulated any
313            time something changed which caused some state to be lost such
314            as which children were expanded or collapsed. Fixes RTBug #1901.
315            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
316            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
317            the legend but not in the map.
318            (LegendTree.__FillTree): Move main functionality out into smaller
319            methods that can be used by other methods.
320            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
321            if they are available.
322            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
323            that we override the wxTreeCtrl method. Iterate over children
324            and call __RemoveLayer.
325            (LegendTree.__AddLayer): New. Add a new layer to the legend.
326            (LegendTree.__RemoveLayer): Remove a layer from the legend.
327            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
328            Should only be called with the id of a layer branch.
329            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
330            Returns the root item or creates one if necessary.
331    
332            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
333            ProjectRasterFile with tuple arguments instead of strings.
334    
335            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
336            with try/finally. Fixes RTBug #1904.
337    
338            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
339            with try/finally. Fixes RTBug #1904.
340            (MapCanvas.FitSelectedToWindow): If a single point is selected
341            simply center it on the display. Fixes RTBug #1849.
342    
343            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
344            to be compiled as a standalone app. Now the code can only be
345            called from Python which simplifies the parameter passing.
346            (ProjectRasterFile): Handle Python arguments. Remove code that
347            checks for a destination dataset. Add more clean up code.
348    
349            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
350            TestMapWithContents.test_lower_layer_bottom):
351            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
352            Fixes RTBug #1907.
353    
354            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
355            extent to the map when the legend is toggled. Fixes RTBug #1881.
356    
357    2003-05-29  Jan-Oliver Wagner <[email protected]>
358    
359            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
360            unsubscribes all that is subcribed in __init__.
361    
362    2003-05-28  Bernhard Herzog  <[email protected]>
363    
364            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
365            (MainWindow.CanDuplicateLayer): New methods to implement the
366            Layer/Duplicate command.
367            (layer_duplicate command): New.
368            (main_menu): Add layer_duplicate to the Layer menu.
369    
370    2003-05-28  Bernhard Herzog  <[email protected]>
371    
372            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
373            renderer so that NULL/None values get displayed differently (by a
374            gray rectangle).
375            (TableGrid.__init__): Override the default renderers
376    
377    2003-05-28  Bernhard Herzog  <[email protected]>
378    
379            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
380            classification to "None" if the type of the field has changed.
381    
382            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
383            test for the Layer.SetShapeStore method
384    
385    2003-05-28  Jan-Oliver Wagner <[email protected]>
386    
387            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
388            does not necessarily have a filename).
389    
390    2003-05-28  Jan-Oliver Wagner <[email protected]>
391    
392            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
393            sort the selection list for the dialog.
394    
395    2003-05-28  Frank Koormann  <[email protected]>
396    
397            * extensions/thuban/wxproj.cpp
398            (project_point): Removed cast to int for projected point coordinates.
399            (shape_centroid): Return last point if all polygon vertices fall
400            to one point.
401    
402    2003-05-28  Bernhard Herzog  <[email protected]>
403    
404            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
405            with layers that don't have shapestores, i.e. raster layers.
406    
407    2003-05-28  Bernhard Herzog  <[email protected]>
408    
409            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
410            when determining the title from the filename.
411    
412            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
413            reflect changes in the way the title is derived from the filename
414    
415    2003-05-28  Frank Koormann  <[email protected]>
416    
417            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
418            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
419    
420    2003-05-27  Bernhard Herzog  <[email protected]>
421    
422            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
423            delegate SelectedLayer.
424            (MainWindow.LayerUnjoinTable): Implement.
425            (_can_unjoin): New. Helper function for the sensitivity of the
426            layer/unjoin command.
427    
428            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
429            (DerivedShapeStore.OrigShapeStore): New. Return the original
430            shapestore. Used to figure out how to unjoin.
431            (DerivedShapeStore.Shapefile): Fix a typo.
432    
433    2003-05-27  Bernhard Herzog  <[email protected]>
434    
435            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
436            well
437            (JoinDialog.__init__): Use the layer parameter and only build the
438            left choice when a layer is given
439            (JoinDialog.OnJoin): Handle layer joins as well
440            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
441            that the user selects the "Select..." item. The sensitivitly
442            updating is now in update_sensitivity
443            (JoinDialog.y): New method to refactor the sensitivity update of
444            the join button into its own method.
445    
446            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
447    
448    2003-05-27  Bernhard Herzog  <[email protected]>
449    
450            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
451            iff there are unreferenced tables in the session
452    
453    2003-05-27  Bernhard Herzog  <[email protected]>
454    
455            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
456    
457            * Thuban/Model/session.py (Session.UnreferencedTables): New method
458            to return tables that are not referenced by other tables or shape
459            stores and can be removed.
460            (Session.RemoveTable): Issue a TABLE_REMOVED message after
461            removing the table
462    
463            * Thuban/UI/mainwindow.py: Remove unused imports
464            (MainWindow.TableClose): Implement.
465    
466            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
467            messages so that the frame will be automatically closed when a new
468            session is opened or the table is removed.
469            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
470            __init__
471            (TableFrame.close_on_session_replaced)
472            (TableFrame.close_on_table_removed): New. Subscribers that close
473            the window
474    
475            * test/test_session.py (TestSessionMessages.test_remove_table)
476            (TestSessionSimple.test_remove_table): Move the test to
477            TestSessionSimple and add test for the TABLE_REMOVED message
478            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
479            (TestSessionSimple.test_unreferenced_tables) New. Test for the
480            UnreferencedTables method.
481            (UnreferencedTablesTests): New. Class with some more sophisticated
482            tests for UnreferencedTables.
483    
484    2003-05-27  Frank Koormann  <[email protected]>
485    
486            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
487            display has some unwanted side effects. Removed again.
488    
489    2003-05-27  Frank Koormann  <[email protected]>
490    
491            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
492    
493            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
494    
495    2003-05-27  Jan-Oliver Wagner <[email protected]>
496    
497            * test/test_menu.py (MenuTest.test): Added test for
498            Menu.RemoveItem().
499    
500            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
501            the menu.
502    
503    2003-05-27  Frank Koormann  <[email protected]>
504            
505            Nonmodal dialogs without parent (i.e. they can fall behind the main
506            window)
507    
508            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
509            all dialogs in the dialogs dictionary and the canvas.
510    
511            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
512            parent, i.e. can fall behind other windows.
513            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
514            dictionary before removing it.
515    
516            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
517    
518            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
519            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
520            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
521    
522    2003-05-27  Bernhard Herzog  <[email protected]>
523    
524            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
525            tableview dialog
526            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
527            Also, don't use the table's titles as the dialog names. The titles
528            aren't guaranteed to be unique.
529            (MainWindow.TableOpen): Open a table view dialog after opening the
530            table
531    
532    2003-05-27  Bernhard Herzog  <[email protected]>
533    
534            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
535            effect can be achieved by simply closing the window showing the
536            table.
537            (MainWindow.TableHide): Removed.
538            (main_menu): Removed "table_hide"
539    
540    2003-05-27  Frank Koormann  <[email protected]>
541    
542            Fix legend tree display problems under Win32
543    
544            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
545            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
546            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
547    
548            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
549    
550    2003-05-27  Jan-Oliver Wagner <[email protected]>
551    
552            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
553            'after' now allows to insert separators almost anywhere in the menu.
554    
555    2003-05-27  Frank Koormann  <[email protected]>
556    
557            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
558            "S" of selection box label to hint on hot key (Alt-S). Works under
559            Win32 but is ignored under GTK.
560    
561    2003-05-26  Frank Koormann  <[email protected]>
562    
563            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
564            Center Choices.
565    
566    2003-05-26  Bernhard Herzog  <[email protected]>
567    
568            Remove the Precision methods again. They're too DBF specific to be
569            part of the table interface and they're only used in table_to_dbf
570            anyway.
571            
572            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
573            fixed precision of 12 for doubles.
574            (TransientTableBase.Precision): Removed
575            (AutoTransientTable.Width): Delegate to self.table.
576    
577            * Thuban/Model/table.py (DBFTable.Precision)
578            (MemoryTable.Precision): Removed.
579            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
580            (table_to_dbf): Use a fixed precision of 12 for floats unless the
581            column object specifies something else.
582    
583            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
584            test for table_to_dbf
585    
586    2003-05-26  Bernhard Herzog  <[email protected]>
587    
588            * test/test_transientdb.py
589            (TestTransientTable.run_iceland_political_tests): Fix a comment.
590    
591    2003-05-26  Bernhard Herzog  <[email protected]>
592    
593            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
594            implementation. Mark parts of the file format strings for
595            localization.
596    
597            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
598            file and add the table to the tables managed by the session
599    
600            * test/test_session.py (TestSessionSimple.test_open_table_file):
601            New. test case for OpenTableFile
602    
603    2003-05-26  Jan-Oliver Wagner <[email protected]>
604    
605            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
606            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
607            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
608            Replace the true/false of wxWindows by True/False of Python 2.2.1.
609    
610    2003-05-26  Jan-Oliver Wagner <[email protected]>
611    
612            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
613            already a selection present, update the grid accordingly.
614    
615            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
616            resizeable and increase its initial size.
617    
618    2003-05-26  Frank Koormann  <[email protected]>
619    
620            Table export functionality
621    
622            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
623            Return width (in characters) for a column.
624            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
625            (table_to_dbf): Write table to dbf file.
626            (table_to_csv): Write table to csv file.
627    
628            * Thuban/Model/transientdb.py (TransientTableBase.Width,
629            TransientTableBase.Precision): Return column width and precision.
630    
631            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
632            or table_to_csv depending on file selection.
633    
634            * test/test_dbf_table.py:
635            Test table_to_dbf (extension of former part of test).
636    
637            * test/test_csv_table.py:
638            Test table_to_csv.
639    
640    2003-05-23  Jan-Oliver Wagner <[email protected]>
641    
642            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
643            Use QueryTableFrame instead of TableFrame.
644    
645            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
646            table window with 'Layer Table:' instead of 'Table:'.
647    
648    2003-05-23  Jan-Oliver Wagner <[email protected]>
649    
650            Give all tables a title via mix-in TitledObject.LayerShowTable
651    
652            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
653            only if it exists.
654    
655            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
656            and call its init-method with a default title. Remove Title() method.
657    
658            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
659            AutoTransientTable): mix-in TitledObject and call its init-method with
660            a default title. Remove Title() method.
661    
662    2003-05-23  Bernhard Herzog  <[email protected]>
663    
664            * Thuban/Model/session.py (Session.AddShapeStore): Define
665            AddShapeStore analogously to AddTable.
666    
667            * test/test_session.py (TestSessionSimple.test_add_shapestore):
668            New. Test for AddShapeStore
669    
670    2003-05-23  Jan-Oliver Wagner <[email protected]>
671    
672            Introducing QueryTableFrame and a very coarse ShowTable implementation.
673    
674            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
675            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
676            The latter implements the selection GUI without dependency on a layer.
677            LayerTableFrame now is derived from QueryTableFrame and connects
678            to a layer.
679    
680            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
681            implementation that still needs work.
682    
683            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
684    
685    2003-05-22  Frank Koormann  <[email protected]>
686    
687            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
688            Added "outer_join = False" as optional parameter.
689            (TransientJoinedTable.create): If outer join is true, perform a
690            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
691            the left table. Records not matching are filled with 0 / None.
692    
693            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
694            (JoinDialog.OnJoin): Consider outer join check box.
695    
696    2003-05-22  Bernhard Herzog  <[email protected]>
697    
698            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
699            somewhat safer way. Storing the traceback in a local variable can
700            lead to memory leaks
701    
702    2003-05-22  Bernhard Herzog  <[email protected]>
703    
704            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
705            the wxMessageDialog's Destroy() method.
706    
707    2003-05-22  Frank Koormann  <[email protected]>
708    
709            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
710            TransientTable.Title()
711    
712    2003-05-22  Frank Koormann  <[email protected]>
713    
714            Join Dialog, initial version.
715    
716            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
717    
718            * Thuban/UI/join.py (JoinDialog): Functional implementation of
719            former framework. Renamed Table1/Table2 to LeftTable/RightTable
720            in all occurences.
721    
722            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
723            Typo fixed.
724    
725    2003-05-22  Bernhard Herzog  <[email protected]>
726    
727            Give the tables titles so that the GUI can display more meaningful
728            names. For now the titles are fixed but depend on e.g. filenames
729            or the titles of the joined tables.
730    
731            * Thuban/Model/transientdb.py (TransientTable.Title)
732            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
733    
734            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
735    
736            * test/test_transientdb.py
737            (TestTransientTable.test_auto_transient_table_title): New. Test
738            for the Title method
739            (TestTransientTable.test_transient_joined_table)
740            (TestTransientTable.test_transient_table): Add test for the Title
741            methods
742    
743            * test/test_memory_table.py (TestMemoryTable.test_title): New.
744            Test for the Title method
745    
746            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
747            the Title method
748    
749    2003-05-22  Bernhard Herzog  <[email protected]>
750    
751            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
752            Provide a better way to destroy the layers
753            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
754            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
755            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
756            the new way to destroy the layers.
757            (TestLayer.test_derived_store): New. Test for using a layer with a
758            DerivedShapeStore
759    
760            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
761            filename if the shape store actually has one.
762    
763    2003-05-22  Bernhard Herzog  <[email protected]>
764    
765            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
766            for the filename
767    
768            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
769            for the FileName method
770            (TestDBFTableWriting.test_write): Fix spelling of filename
771    
772    2003-05-22  Thomas Koester  <[email protected]>
773    
774            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
775            from SciParam that now really is immutable.
776    
777    2003-05-22  Frank Koormann  <[email protected]>
778    
779            Layer Top/Bottom placement added to legend.
780    
781            * Thuban/UI/legend.py
782            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
783            bound to tool events.
784            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
785            New, methods binding the event methods with the map methods.
786    
787            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
788            layer at top/bottom of layer stack.
789    
790            * Resources/Bitmaps/top_layer.xpm: New button icon.
791    
792            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
793    
794    2003-05-22  Bernhard Herzog  <[email protected]>
795    
796            * Thuban/Model/session.py (Session.RemoveTable): New method to
797            remove tables
798    
799            * test/test_session.py (TestSessionSimple.test_remove_table): New.
800            Test for RemoveTable
801    
802    2003-05-22  Thomas Koester  <[email protected]>
803    
804            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
805            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
806    
807    2003-05-22  Bernhard Herzog  <[email protected]>
808    
809            Implement a way to discover dependencies between tables and
810            shapestores.
811    
812            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
813            (TransientJoinedTable.Dependencies)
814            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
815            interface
816            (TransientJoinedTable.__init__): Keep tack of the original table
817            objects in addition to the corresponding transient tables.
818    
819            * Thuban/Model/table.py (DBFTable.Dependencies)
820            (MemoryTable.Dependencies): New. Implement the dependencies
821            interface
822    
823            * Thuban/Model/data.py (ShapeTable): New. Helper class for
824            ShapefileStore
825            (ShapefileStore.__init__): Use ShapeTable instead of
826            AutoTransientTable
827            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
828            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
829            methods for filename and type
830            (ShapefileStore.Dependencies): New. Implement the dependencies
831            interface
832            (DerivedShapeStore): New class to replace SimpleStore. The main
833            difference to SimpleStore is that it depends not on a shapefile
834            but another shapestore which expresses the dependencies a bit
835            better
836            (SimpleStore.__init__): Add deprecation warning.
837    
838            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
839            Test for the Dependencies method.
840    
841            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
842            New. Test for the Dependencies method.
843    
844            * test/test_transientdb.py
845            (TestTransientTable.test_auto_transient_table_dependencies): New.
846            Test for the Dependencies method.
847            (TestTransientTable.test_transient_joined_table): Add test for the
848            Dependencies method.
849    
850            * test/test_session.py (TestSessionSimple.setUp)
851            (TestSessionSimple.tearDown): New. Implement a better way to
852            destroy the sessions.
853            (TestSessionSimple.test_initial_state)
854            (TestSessionSimple.test_add_table): Bind session to self.session
855            so that it's destroyed by tearDown
856            (TestSessionSimple.test_open_shapefile): New. Test for
857            OpenShapefile and the object it returns
858    
859    2003-05-22  Bernhard Herzog  <[email protected]>
860    
861            * Thuban/Model/session.py (Session.AddTable): New method to
862            register tables with the session.
863            (Session.Tables): Return the tables registered with AddTable too.
864    
865            * test/test_session.py (TestSessionSimple.test_add_table): New.
866            Test case for the AddTable method
867    
868    2003-05-22  Frank Koormann  <[email protected]>
869    
870            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
871            lower right corner, center labels for selections, initialize controls
872            in reasonable order for keyboard navigation.
873    
874            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
875            (ProjFrame.__DoOnProjAvail): Determine position of current projection
876            using the wxListBox.FindString() method. Still a problem (#1886)
877    
878            * Thuban/UI/classifier.py
879            (Classifier.__init__, SelectPropertiesDialog.__init__)
880    
881            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
882            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
883            different classification types from here to __init__.
884            (GenUniquePanel.__init__): Set the column width of the first field
885            in the Field ListCtrl to the full width.
886    
887            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
888            Button to 'Export'. Center Buttons in Selection Box, set Focus to
889            Grid.
890            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
891            changes focus to the Selection when pressing "Alt-S".
892    
893            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
894            the text if not visible. The italic font sometimes exceeds the
895            rendering area.
896    
897    2003-05-21  Jonathan Coles   <[email protected]>
898    
899            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
900            to OnClose so that Thuban closes correctly.
901    
902            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
903            DockFrame.OnClose, not DockFrame._OnClose.
904    
905    2003-05-21  Jonathan Coles   <[email protected]>
906    
907            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
908            references to 'inf' and use new Range __init__ to pass floats
909            directly rather than converting them to strings first.
910            Fixes RTBug #1876.
911    
912            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
913            Use new Range ___init__ to pass floats.
914    
915            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
916            filename is a valid image file. Throw IOError otherwise.
917    
918            * Thuban/Model/range.py: Brought over new Range from SciParam that
919            is immutable and has an __init__ which can accept floats.
920    
921            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
922            into try block. AddLayer doesn't throw any exceptions anymore.
923            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
924            try block.
925    
926            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
927            the first item in choices. Fixes RTBug #1882.
928    
929            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
930            has gone to 0 which is a serious problem. abort.
931            (MapRenderer.draw_raster_layer): Catch IOError seperately and
932            print the error from GDAL.
933    
934            * Thuban/UI/tableview.py (TableGrid.__init__): Call
935            ToggleEventListeners to turn on listening.
936            (TableGrid.ToggleEventListeners): New. Turns event listening on
937            and off so as to prevent excessive messages.
938            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
939            to suppress excessive messages when selecting many rows.
940            Fixes RTBug #1880.
941    
942            * Thuban/UI/view.py: Added checks against if scale == 0. This
943            is a serious problem that can occur when an image without
944            geo data is loading and causes the map projection bounds to
945            go to infinity. Right now, the solution is to simply try
946            to recover.
947    
948            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
949            to set the MFILEReceiver attributes even if the data is NULL.
950    
951            * extensions/thuban/gdalwarp.cpp: Improved the error handling
952            and passed GDAL messages back up to the Python layer. Also
953            tried to fix some memory leaks that were present in the original
954            utility but didn't matter because the program aborted.
955    
956            * test/test_range.py: Copied over tests from SciParam. Removed
957            tests against importing. Fixes RTBug #1867.
958    
959    2003-05-21  Bernhard Herzog  <[email protected]>
960    
961            * test/test_load.py: Remove unused imports and restructure the
962            test code
963            (LoadSessionTest): Split into one class for each test and turn
964            LoadSessionTest itself into the base class for all such session
965            tests.
966            (ClassificationTest): New base class for load tests that test
967            classifications
968            (TestSingleLayer, TestLayerVisibility, TestClassification)
969            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
970            for the individual tests
971    
972            * test/support.py (FileLoadTestCase.filename): New base class for
973            file loading tests
974    
975    2003-05-21  Jan-Oliver Wagner <[email protected]>
976    
977            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
978            Mercator' to 'UTM Zone 32' as a more convenient example.
979            Added 'Gauss Krueger Zone 6'.
980    
981            * Data/iceland_sample_raster.thuban: political polygon now
982            filled transparent to have the raster image visible at once.
983    
984    2003-05-21  Frank Koormann  <[email protected]>
985    
986            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
987            OnClose() to keep in sync with extensions. Internally Thuban
988            still uses "underscored" names.
989    
990    2003-05-20  Jonathan Coles   <[email protected]>
991    
992            This puts back Raster layer support. These layers support projections
993            through the GDAL library. Currently, the CVS version is being used.
994            There are no Debian packages available although this may change soon.
995            A GDAL driver was extended to support writing to memory rather to
996            files.
997    
998            There is still some work that needs to be done, such as some error
999            handling when loading invalid images or when there is a problem
1000            projecting the image. This putback simply checks in the majority
1001            of the work.
1002    
1003            * setup.py: Add gdalwarp library extension.
1004    
1005            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
1006            Defaults to False, but can be overridden by subclasses if they
1007            support classification.
1008            (RasterLayer): New. Defines a new layer that represents an
1009            image.
1010    
1011            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
1012            tag handler.
1013            (SessionLoader.start_layer): Encode the filename.
1014            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
1015            New. Supports reading a rasterlayer tag.
1016    
1017            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
1018    
1019            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
1020            get a string in Latin1. If we get such as string convert it to
1021            unicode first, otherwise leave if alone before encoding.
1022            (SessionSaver.write_layer): Add support for writing both Layers
1023            and RasterLayers.
1024    
1025            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1026            The right argument may not be a string, it could also be a Column.
1027    
1028            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
1029            Make initial window size 600x400. Fixes RTBug #1872.
1030    
1031            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
1032            the dialog is constructed so that we can support layers that
1033            do not have classifications.
1034            (Classifier._OnTry): Only build a classification if the layer
1035            supports one.
1036    
1037            * Thuban/UI/legend.py: Change all checks that a layer is an
1038            instance of Layer into checks against BaseLayer.
1039            (LegendTree.__FillTreeLayer): Only add children to a branch if
1040            the layer supports classification.
1041    
1042            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
1043            MainWindow.OpenSession): Don't proceed with an action if the
1044            user chooses Cancel when they are asked to save changes.
1045            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
1046            user to select an image file. Create a new RasterLayer and add
1047            it to the map.
1048    
1049            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
1050            for rendering RasterLayer layers.
1051            (MapRenderer.draw_raster_layer): Actually method that calls
1052            the GDALWarp python wrapper and constructs an image from the
1053            data returned.
1054    
1055            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
1056            Choices symbols to match those used in the table query method.
1057            Replace deprecated method calls on table with new method names.
1058    
1059            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
1060            how small the scale can get. This still needs more testing.
1061    
1062            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
1063            Provides a driver to output in .bmp format.
1064    
1065            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
1066            New. Provides IO routines which write to memory, rather than a file.
1067    
1068            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
1069            of the gdalwarp utility provided in GDAL. Added function calls
1070            that can be accessed from python.
1071    
1072            * Data/iceland_sample_raster.thuban: New. Sample file that uses
1073            a raster layer.
1074    
1075            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
1076            layer image data.
1077    
1078            * Doc/thuban.dtd: Added rasterlayer attribute definition.
1079    
1080            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
1081            tests associated with the raster layer code.
1082    
1083            * test/test_transientdb.py
1084            (TestTransientTable.test_auto_transient_table_query): Added a test
1085            for using a Column object as the "right" parameter to a query.
1086    
1087    2003-05-19  Frank Koormann  <[email protected]>
1088    
1089            * Thuban/version.py (get_changelog_date):
1090            Catch exceptions if ChangeLog does not exist.
1091    
1092            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
1093    
1094    2003-05-19  Frank Koormann  <[email protected]>
1095    
1096            Extended version information for Thuban
1097    
1098            * Thuban/version.py: New, version information for Thuban: Last
1099            modification date and last ChangeLog entry date.
1100    
1101            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
1102            information: Display Thuban, wxPython and Python version.
1103    
1104    2003-05-16  Bernhard Herzog  <[email protected]>
1105    
1106            * Thuban/Model/save.py: Remove some unused imports including the
1107            __future__ import for nested_scopes as Thuban relies on Python 2.2
1108            now.
1109            (XMLWriter.encode): Remove the special case for a None argument.
1110            In the saver encode is always called with a string argument.
1111    
1112    2003-05-16  Bernhard Herzog  <[email protected]>
1113    
1114            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
1115            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
1116            of the bug was that e.g. float("1.2") would fail. Thuban now
1117            requires 2.4.x.
1118            
1119    2003-05-16  Frank Koormann   <[email protected]>
1120    
1121            Printing enhancement and WMF export (under Win32)
1122    
1123            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
1124            ScreenRenderer. Renders Map, Legend and Scalebar for export.
1125            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
1126            PrintRender.
1127    
1128            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
1129            to fullfil information needed for PrinterRenderer.
1130            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
1131            (MapCanvas.Print): Adapted to new MapPrintout.
1132            (OutputTransform): General calculations to transform from canvas
1133            coordinates to export/printing devices.
1134    
1135            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
1136            new method_command to call ExportMap, with platform dependency (only
1137            __WXMSW__)
1138      
1139            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
1140            of scalebar drawing area as new parameters.
1141            
1142            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
1143    
1144            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
1145            Update to extended scalebar.DrawScalebar header.
1146    
1147            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
1148    
1149            * test/test_scalebar.py: Made test executable as standalone.
1150    
1151    2003-05-16  Bernhard Herzog  <[email protected]>
1152    
1153            * Thuban/Model/table.py (Table): Remove this compatibility alias
1154            for DBFTable.
1155    
1156            * test/test_table.py: Import DBFTable as Table because that alias
1157            doesn't exist anymore.
1158    
1159            * Thuban/UI/classgen.py: Remove some unused imports
1160    
1161    2003-05-14  Jonathan Coles   <[email protected]>
1162    
1163            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
1164            Fix docstring.
1165            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
1166            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
1167            values of the supplied range to determine the beginning and end
1168            bounds of the generated classes.
1169    
1170            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
1171            do not have a leading 0 (.5 is now accepted as well as 0.5).
1172    
1173            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
1174            call to ClassGenerator.GenUniformDistribution.
1175    
1176            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
1177            layout bug with the 'Projection' label.
1178    
1179            * test/support.py (FloatTestCase): New. Needed for the Range tests.
1180    
1181            * test/test_range.py: New. Imported from SciParam.
1182    
1183    2003-05-12  Jonathan Coles   <[email protected]>
1184    
1185            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
1186            to table.UniqueValues() with calls that retrieve all the values
1187            from the table. This will need to be replaced by a method on table
1188            which can simply return the list (perhaps more efficiently).
1189    
1190    2003-05-12  Jonathan Coles   <[email protected]>
1191    
1192            The return value of ClassGenerator.CalculateQuantiles has changed.
1193            Refer to the documentation for details.
1194    
1195            * test/test_classgen.py: Modified Quantile tests to use the
1196            new return values.
1197    
1198            * Thuban/Model/classgen.py
1199            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
1200            use new return values from CalculateQuantiles to produce the correct
1201            range bounds in the Classification.
1202            (ClassGenerator.CalculateQuantiles): Add more comments describing
1203            the return values and parameters. Make minor adjustments to improve
1204            the legibility of the code. Fix problem with adjusted not being set
1205            in most cases.
1206    
1207    2003-05-12  Frank Koormann <[email protected]>
1208            
1209            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
1210            and latin1. Fixes #1851 finally.
1211    
1212    2003-05-09  Jonathan Coles   <[email protected]>
1213    
1214            * test/test_classgen.py: New. Tests the Quantile algorithm.
1215    
1216            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
1217            Clean up debugging statement, add comments, fix a small bug in the
1218            returned adjusted percentiles.
1219            
1220    2003-05-09  Jonathan Coles   <[email protected]>
1221    
1222            Introduces Range class from SciParam into the ClassGroupRange class,
1223            and such ranges can now be saved and loaded from disk.
1224    
1225            Quantiles are now available in the Classification Generator.
1226    
1227            Initial support for building Queries on a table. Doesn't do anything
1228            but run some tests.
1229    
1230            * Thuban/Model/classification.py: Explicit imports.
1231            (ClassGroupRange): Use the Range class to store the underlying
1232            range information. The interface remains the same, except for
1233            GetRange(), and you can also supply a Range object as the min
1234            parameter to SetRange or __init__.
1235    
1236            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
1237            string appropriately for use in Thuban. Fixes RTbug #1851.
1238            (SessionLoader.end_projection): Handle the context of the
1239            projection tag a bit better by looking at what objects are not
1240            None. There was an assumption that a projection tag for a map
1241            could occur before any layers.
1242            (SessionLoader.start_clrange): Provide backward compatibility for
1243            reading min/max values as well as the new range parameter.
1244    
1245            * Thuban/Model/map.py: Explicit imports.
1246    
1247            * Thuban/Model/resource.py: Import _.
1248            (ProjFileSaver.write): write header using projfile.dtd.
1249    
1250            * Thuban/Model/save.py: Explicit imports.
1251            (XMLWriter.encode): New. Encode the given string from a format
1252            used by Thuban into UTF-8. Fixes RTbug #1851.
1253    
1254            * Thuban/UI/classgen.py: Explicit imports.
1255            (ClassGenDialog.__init__): Clean up the code and add support
1256            for Quantiles.
1257            (ClassGenDialog.OnOK): Add support for Quantiles.
1258            (GenQuantilesPanel): New. Input panel for Quantiles.
1259            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
1260            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
1261    
1262            * Thuban/Model/classgen.py: New. Contains all the classes named above.
1263    
1264            * Thuban/UI/classifier.py: Explicit imports.
1265            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
1266            ClassTable.SetValueAsCustom): Reworked to use new Range class.
1267    
1268            * Thuban/UI/legend.py: Explicit imports.
1269    
1270            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
1271            a Table menu and associated method calls.
1272            (MainWindow.choose_color): Removed. No longer needed.
1273    
1274            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
1275            should be disabled if no projection is selected in the available
1276            list.
1277    
1278            * Thuban/UI/renderer.py: Explicit imports.
1279    
1280            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
1281            with correctly selecting the rows and issuing the right events.
1282            Be sure to call Skip() to allow the grid to do some of its own
1283            handling which allows the rows to actually be selected.
1284            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
1285            selecting multiple shapes.
1286            (LayerTableFrame): Support for building Queries.
1287            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
1288    
1289            * Thuban/UI/tree.py: Explicit imports.
1290    
1291            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
1292            table view can call it.
1293    
1294            * test/test_classification.py: Explicit imports.
1295            (TestClassification.test_ClassGroupRange): Fix test for new
1296            Range class.
1297    
1298            * Doc/thuban.dtd: Add range parameter for clrange.
1299    
1300            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
1301            object in ClassGroupRange, and also uesd for inputting ranges in
1302            the classifer table and elsewhere.
1303    
1304            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
1305            yet.
1306    
1307    2003-05-09  Frank Koormann <[email protected]>
1308    
1309            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
1310    
1311    2003-05-08  Frank Koormann <[email protected]>
1312    
1313            Coding style updates
1314    
1315            * test/test_scalebar.py: Replaced tab indentation by spaces.
1316    
1317            * Thuban/UI/scalebar.py: Explicit imports.
1318    
1319    2003-05-08  Frank Koormann <[email protected]>
1320    
1321            * Thuban/UI/scalebar.py
1322            (ScaleBar.DrawScalebar): Format string bug fixed.
1323    
1324    2003-05-08  Frank Koormann <[email protected]>
1325    
1326            Reorganization of scalebar component (no wx in Thuban/Model)
1327    
1328            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
1329            (deriveInterval):
1330            Calculate scalebar interval and unit which fits in width for scale.
1331            (roundInterval): Round float.
1332    
1333            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
1334    
1335            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
1336    
1337            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
1338    
1339    2003-05-08  Frank Koormann <[email protected]>
1340    
1341            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
1342            Initialize ScaleBar with canvas.map
1343    
1344            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
1345            round intervals to display smarter lengths
1346            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
1347            layer. If the maps has no projection applied grey the scalebar.
1348    
1349    2003-05-07  Frank Koormann <[email protected]>
1350            
1351            Basic Scalebar features added.
1352    
1353            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
1354    
1355            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
1356            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
1357            and the renderer.
1358    
1359            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
1360    
1361            * Thuban/UI/messages.py: SCALE_CHANGED added.
1362    
1363    2003-05-07  Bernhard Herzog  <[email protected]>
1364    
1365            * Thuban/Model/session.py (Session.__init__): New instance
1366            variable shapestores to hold a list of all open shapestore objects
1367            (Session.ShapeStores): New. Accessor method for the shapestores
1368            list.
1369            (Session._add_shapestore, Session._clean_weak_store_refs): New.
1370            Internal methods to maintain the shapestores list.
1371            (Session.Tables): New. Return all tables open in the session.
1372            (Session.OpenShapefile): Insert the new ShapeStore into the
1373            shapestores list.
1374    
1375            * test/test_session.py (TestSessionSimple.test_initial_state): Add
1376            tests for ShapeStores and Tables
1377            (TestSessionWithContent.test_shape_stores)
1378            (TestSessionWithContent.test_tables): New. Test cases for
1379            ShapeStores and Tables
1380    
1381    2003-05-07  Bernhard Herzog  <[email protected]>
1382    
1383            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
1384            Add comments about the optimizations used.
1385            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
1386            Implement the ReadValue table interface method.
1387    
1388            * test/test_transientdb.py
1389            (TestTransientTable.run_iceland_political_tests)
1390            (TestTransientTable.test_transient_joined_table): Add tests for
1391            ReadValue
1392    
1393    2003-05-07  Frank Koormann <[email protected]>
1394    
1395            * Resources/Bitmaps/fulllayerextent.xpm,
1396            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
1397            new icons.
1398    
1399    2003-05-06  Bernhard Herzog  <[email protected]>
1400    
1401            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1402            New. Simply delegate to the transient table's version.
1403    
1404            * test/test_transientdb.py
1405            (TestTransientTable.test_auto_transient_table_query): New. Test
1406            case for AutoTransientTable's SimpleQuery
1407    
1408    2003-05-06  Bernhard Herzog  <[email protected]>
1409    
1410            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
1411            Implement a simple query method for the query dialog
1412            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
1413            the row index or shapeid.
1414            (TransientTable.create): Insert the right value of the row index
1415            (TransientJoinedTable.create): Copy the row index of the left
1416            table to the joined result table
1417    
1418            * test/test_transientdb.py
1419            (TestTransientTable.test_transient_table_read_twice): Fix
1420            doc-string
1421            (TestTransientTable.test_transient_table_query): New. Test for the
1422            SimpleQuery method
1423    
1424    2003-05-06  Bernhard Herzog  <[email protected]>
1425    
1426            Convert all table users to use the new table interface. This only
1427            covers Thuban itself, not GREAT-ER or other applications built on
1428            Thuban yet, so the compatibility interface stays in place for the
1429            time being but it now issues DeprecationWarnings.
1430    
1431            Finally, the new Table interface has a new method, HasColumn.
1432    
1433            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
1434            issue deprecation warnings when they're. The warnings refer to the
1435            caller of the method.
1436            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
1437            for the deprecation warnings
1438    
1439            * test/test_table.py: Ignore the deprecation warnings for the old
1440            table in the tests in this module. The purpose of the tests is to
1441            test the old interface, after all.
1442    
1443            * test/test_transientdb.py
1444            (TestTransientTable.run_iceland_political_tests): Use the
1445            constants for the types. Add a test for HasColumn
1446            (TestTransientTable.test_transient_joined_table): Adapt to new
1447            table interface. Add a test for HasColumn
1448            (TestTransientTable.test_transient_table_read_twice): Adapt to new
1449            table interface
1450    
1451            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
1452            Adapt to new table interface
1453    
1454            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
1455            new table interface
1456    
1457            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
1458            (RecordTable.SetTable): Adapt to new table interface
1459    
1460            * Thuban/UI/classifier.py (Classifier.__init__)
1461            (Classifier.__init__): Adapt to new table interface
1462    
1463            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
1464            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
1465            to new table interface
1466    
1467            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
1468            (AutoTransientTable.HasColumn): Implement the new table interface
1469            method
1470            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
1471            (AutoTransientTable.UniqueValues): Adapt to new table interface
1472    
1473            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
1474            Adapt to new table interface
1475    
1476            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
1477            simplify opening shapefiles a bit easier.
1478            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1479            (TestLayer.test_point_layer): Use the new helper method
1480            (TestLayer.test_get_field_type): New. Test for the GetFieldType
1481            method
1482    
1483            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
1484            the new table method
1485    
1486            * test/test_memory_table.py (TestMemoryTable.test_has_column):
1487            Test for the new table method HasColumn
1488    
1489    2003-05-06  Jonathan Coles   <[email protected]>
1490    
1491            Addresses the "Selection Extent" wish of RTbug #1787.
1492    
1493            * Resources/Bitmaps/fulllayerextent.xpm,
1494            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
1495            extent. These are just place holders for the real bitmaps.
1496    
1497            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
1498            calculate the bounding box once (the first time compute_bbox() is
1499            called).
1500            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
1501            the bounding box for the shapes in lat/long coordinates.
1502    
1503            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
1504            option.
1505            (MainWindow.has_selected_shapes): New. Returns true if there are
1506            any selected shapes.
1507            (MainWindow.FullSelectionExtent): New. Calls
1508            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
1509            (_has_selected_shapes): New. Returns true if there are any
1510            selected shapes.
1511    
1512            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
1513            true if there are any selected shapes.
1514    
1515            * Thuban/UI/view.py (MapCanvas): Added delegated method
1516            HasSelectedShapes.
1517            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
1518            shapes on the canvas using the map projection (if any).
1519    
1520            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
1521            for Layer.ShapesBoundingBox().
1522    
1523    2003-05-06  Bernhard Herzog  <[email protected]>
1524    
1525            * Resources/Projections/defaults.proj: Fix spelling of Mercator
1526    
1527    2003-05-05  Jonathan Coles   <[email protected]>
1528    
1529            Addresses the "Full Layer Extent" wish of RTbug #1787.
1530    
1531            * Resources/Projections/defaults.proj: Added UK National Grid.
1532    
1533            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
1534            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
1535            when the user selects the menu option.
1536    
1537            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
1538            scales the given layer on the canvas using the map projection.
1539    
1540    2003-05-05  Bernhard Herzog  <[email protected]>
1541    
1542            Convert the table implementations to a new table interface. All
1543            tables use a common mixin class to provide backwards compatibility
1544            until all table users have been updated.
1545    
1546            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
1547            provide backwards compatibility for table classes implementing the
1548            new interface
1549            (DBFTable, MemoryTable): Implement the new table interface. Use
1550            OldTableInterfaceMixin as base for compatibility
1551            (DBFColumn, MemoryColumn): New. Column description for DBFTable
1552            and MemoryTable resp.
1553    
1554            * test/test_dbf_table.py: New. Test cases for the DBFTable with
1555            the new table interface.
1556    
1557            * test/test_memory_table.py: New. Test cases for the MemoryTable
1558            with the new table interface.
1559    
1560            * test/test_table.py: Document the all tests in this file as only
1561            for backwards compatibility. The equivalent tests for the new
1562            interface are in test_memory_table.py and test_dbf_table.py
1563            (MemoryTableTest.test_read): field_info should be returning tuples
1564            with four items
1565            (MemoryTableTest.test_write): Make doc-string a more precise.
1566    
1567            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
1568            table interface. Derive from from OldTableInterfaceMixin for
1569            compatibility.
1570            (TransientTableBase.create): New intance variable column_map to
1571            map from names and indices to column objects
1572            (TransientTable.create): Use the new table interface of the input
1573            table
1574            (AutoTransientTable): Convert to new table interface. Derive from
1575            from OldTableInterfaceMixin for compatibility.
1576            (AutoTransientTable.write_record): Removed. It's not implemented
1577            yet and we still have to decide how to handle writing with the new
1578            table and data framework.
1579    
1580            * test/test_transientdb.py
1581            (TestTransientTable.run_iceland_political_tests)
1582            (TestTransientTable.test_transient_joined_table): Use the new
1583            table interface
1584    
1585    2003-05-05  Jonathan Coles   <[email protected]>
1586    
1587            This is namely a collection of UI updates to improve user interactivity.
1588            Tabbing between controls now exists and you can use ESC to close dialog
1589            boxes; ENTER will active the default button.
1590    
1591            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
1592            order that the controls are created so that tabbing works correctly.
1593            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
1594            wxDialog can handle the default button correctly.
1595            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
1596            same reasons as for OnOK.
1597            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
1598            when we ask the table for the maximum/minimum values of a field
1599            which could take a very long time.
1600    
1601            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
1602            order that the controls are created so that tabbing works correctly.
1603            (SelectPropertiesDialog.__init__): Rearrange the order that the
1604            controls are created so that tabbing works correctly.
1605    
1606            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
1607            to derive from a wxDialog but behave like the original implementation
1608            which was derived from a wxFrame. wxDialog provides useful key
1609            handling functionality like ESC calling OnCancel and ENTER calling
1610            OnOK which is lost with wxFrame.
1611    
1612            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
1613            new dialogs.
1614    
1615            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
1616            order that the controls are created so that tabbing works correctly.
1617            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
1618            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
1619            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
1620            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
1621            can provide the "UK National Grid" as a default projection.
1622            (UTMPanel.__init__): Rearrange the order that the controls are
1623            created so that tabbing works correctly.
1624    
1625    2003-05-05  Bernhard Herzog  <[email protected]>
1626    
1627            * extensions/thuban/wxproj.cpp: Fix some of the comments.
1628            (project_point): If a map projection but no layer projection is
1629            given, convert degrees to radians before applying the map
1630            projection.
1631    
1632            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
1633            (TableGrid.allow_messages): New methods to make it possible to
1634            inhibit message sending.
1635            (TableGrid.issue): Only send the message if not inhibited.
1636            (LayerTableGrid.select_shape): Use the new methods to make sure
1637            that no ROW_SELECTED message is sent while we're updating the
1638            selected rows to match the selected shapes.
1639    
1640    2003-05-02  Jan-Oliver Wagner <[email protected]>
1641    
1642            Implementation of MemoryTable.
1643    
1644            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
1645            implementation that operates on a list of tuples. All of the data
1646            are kept in the memory.
1647    
1648            * test/test_table.py (MemoryTableTest): New.
1649    
1650            * test/test_transientdb.py (SimpleTable): Removed.
1651            (TestTransientTable.test_transient_joined_table,
1652            (TestTransientTable.test_transient_table_read_twice): Replaced
1653            SimpleTable by MemoryTable.
1654    
1655    2003-04-30  Jonathan Coles   <[email protected]>
1656    
1657            * Data/iceland_sample.thuban: Now contains correct projections
1658            for each of the layers.
1659    
1660            * Resources/Projections/defaults.proj: Geographic projection
1661            contains unit conversion parameter.
1662    
1663    2003-04-30  Jonathan Coles   <[email protected]>
1664    
1665            The most important part of this putback is the projection changes.
1666            It should now be possible to specify the projection that a layer
1667            is in and then specify a different projection for the map. The
1668            projection dialog has an extra parameter for a geographic projection
1669            which lets the user select if the input is in degrees or radians.
1670    
1671            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
1672            to say that the parameter is a tuple of unprojected
1673            points (which is what the callers to this method were assuming).
1674            Also, since the points are unprojected we need to projected them.
1675    
1676            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
1677            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
1678            groups are selected, move the layer up/down. Fixes RTbug #1833.
1679    
1680            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
1681    
1682            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
1683            parameter in call to SetClientData.
1684            (GeoPanel): Add support for selecting the units that the
1685            source data is in (Radians or Degrees).
1686    
1687            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
1688            the rendering loop by reducing the number of if's, removing the
1689            unnecessary try/except block, and checking if the old group
1690            is the same as the new one (which happens a lot if there is
1691            no classification, or lots of shapes are in the same group).
1692    
1693            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
1694            around the redraw routine to try to catch problems that the user
1695            may create by selecting invalid projections for the data set and
1696            map. Clears the display if there are any problems and prints the
1697            error.
1698            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
1699            rectangle.
1700    
1701            * extensions/thuban/wxproj.cpp (project_point): First invert the
1702            supplied point (which should be in projected coordinates) using
1703            the layer's projection and then project the point using the
1704            map's projection.
1705            (project_points): Use project_point() to project each point.
1706    
1707    2003-04-30  Jan-Oliver Wagner <[email protected]>
1708    
1709            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
1710            don't set the Classification to None if the classfication field
1711            is None (ie only a DEFAULT).
1712    
1713    2003-04-30  Bernhard Herzog  <[email protected]>
1714    
1715            * Thuban/UI/view.py: Fix some typos.
1716    
1717            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
1718            not pop up the dialog if the selection becomes empty (this could
1719            happen if e.g. a new selection is opened while the identify tool
1720            is active and dialog had been closed)
1721    
1722    2003-04-30  Bernhard Herzog  <[email protected]>
1723    
1724            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
1725            instance variable read_record_last_result
1726            (TransientTableBase.read_record): Make sure reading the same
1727            record twice works. The implementation uses the new instance
1728            variable read_record_last_result
1729    
1730            * test/test_transientdb.py
1731            (TestTransientTable.test_transient_table_read_twice): New test
1732            case for the above bug-fix.
1733    
1734    2003-04-29  Jonathan Coles   <[email protected]>
1735    
1736            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
1737    
1738            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
1739    
1740            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
1741            (ClassTable.SetValueAsCustom): Rename keyword argument in
1742            ClassGroup* constructors to match argument name.
1743    
1744    2003-04-29  Bernhard Herzog  <[email protected]>
1745    
1746            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
1747            transient DB if it exists to make sure it doesn't leave a journal
1748            file in the temp directory.
1749    
1750            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
1751            self.conn to None after closing the connection to make sure it's
1752            not closed twice
1753    
1754    2003-04-29  Jonathan Coles   <[email protected]>
1755    
1756            Add a visible parameter in the layer XML tag. The default value is
1757            "true". If anything other than "false" is specified we also assume
1758            "true". Addresses RTbug #1025.
1759    
1760            * Doc/thuban.dtd: Add visible parameter to a layer.
1761    
1762            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
1763            of visible from 1 to True.
1764            (Layer.__init__): Change default value of visible from 1 to True.
1765    
1766            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
1767            parameter.
1768    
1769            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
1770            parameter.
1771    
1772            * test/test_load.py: Add new test data contents_test_visible.
1773            (LoadSessionTest.setUp): save test data.
1774            (LoadSessionTest.testLayerVisibility): Test if the visible flag
1775            is loaded correctly.
1776    
1777            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
1778            for saving an invisible layer.
1779    
1780    2003-04-29  Jonathan Coles   <[email protected]>
1781    
1782            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
1783            legend dialog box and tell it to change its map to the one
1784            supplied to SetMap(). Fixes RTbug #1770.
1785    
1786  2003-04-29  Bernhard Herzog  <[email protected]>  2003-04-29  Bernhard Herzog  <[email protected]>
1787    
1788          Next step of table implementation. Introduce a transient database          Next step of table implementation. Introduce a transient database
# Line 51  Line 1836 
1836          once. Plus it introduces a reference cycle that keeps can keep the          once. Plus it introduces a reference cycle that keeps can keep the
1837          session object alive for a long time.          session object alive for a long time.
1838    
1839  2003-04-25  Jonathan Coles   <[email protected]>  2003-04-29  Jonathan Coles   <[email protected]>
1840    
1841          * Thuban/Model/proj.py (Projection): Removed Set*() methods to make          * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
1842          Projection an immutable item. Fixes RTbug #1825.          Projection an immutable item. Fixes RTbug #1825.

Legend:
Removed from v.766  
changed lines
  Added in v.1172

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26