/[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

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

Legend:
Removed from v.721  
changed lines
  Added in v.1114

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26