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

Legend:
Removed from v.743  
changed lines
  Added in v.1118

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26