/[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 208 by bh, Tue Jul 9 14:57:03 2002 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]>
1793    
1794            * Thuban/Model/load.py (XMLReader.read): Should have been checking
1795            if the file_or_filename object had the 'read' attribute.
1796    
1797    2003-04-23  Jonathan Coles   <[email protected]>
1798    
1799            * Thuban/Model/resource.py: Fixes RTbug #1813.
1800            (ReadProjFile): Add documentation about which exceptions are raised.
1801            Always pass the exceptions up to the caller.
1802            (GetProjFiles): If the directory can't be read return an empty list.
1803            If any of the proj files can't be read skip that file and go
1804            on to the next one.
1805    
1806            * test/test_proj.py: Added test cases to handle nonexistent files,
1807            unreadable files, and files that don't parse correctly.
1808    
1809    2003-04-23  Jonathan Coles   <[email protected]>
1810    
1811            Projection dialog. Allows the user to select from a list
1812            of projection templates and optionally edit them and save new ones.
1813    
1814            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
1815            (ProjPanel): Base class for projection specific panels.
1816            (TMPanel): Projection panel for Transverse Mercartor.
1817            (UTMPanel): Projection panel for Universal Transverse Mercartor.
1818            (LCCPanel): Projection panel for Lambert Conic Conformal.
1819            (GeoPanel): Projetion panel for Geographic Projection.
1820    
1821    2003-04-23  Jonathan Coles   <[email protected]>
1822    
1823            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
1824            promote symmetry. There now exists XMLReader and XMLWriter.
1825            (XMLReader.read): New. Call to read the given file descriptor or
1826            filename.
1827            (XMLReader.close): New. Make sure the file is closed.
1828            (XMLReader.GetFileName): New. Return just the file name that is being
1829            read from.
1830            (XMLReader.GetDirectory): New. Return just the directory of the file
1831            that is being read.
1832            (XMLReader.AddDispatchers): New. Take a dictionary which contains
1833            the names of functions to call as the XML tree is parsed.
1834            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
1835            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
1836            (SessionLoader): Removed class variables start_dispatcher and
1837            end_dispatcher since this functionality is now part of a class
1838            instance. Fixes RTbug #1808.
1839            (SessionLoader.__init__): Add dispatcher functions.
1840            (load_xmlfile): Code was moved into the XMLReader.read().
1841            (load_session): Use modified SessionLoader.
1842    
1843            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
1844            map's projection.
1845    
1846            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
1847            GetAllParameters.
1848            (Projection.GetParameter): Returns the value for the given parameter.
1849    
1850            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
1851            (GetProjFiles): Renamed from GetProjections. Now returns a list
1852            of ProjFile objects.
1853            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
1854            a list of ProjFile objects whose files are not user defined.
1855            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
1856            list of ProjFile objects whose files are user defined.
1857            (ProjFileReader): Extend new XMLReader.
1858    
1859            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
1860            promote symmetry.
1861    
1862            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
1863            control instead of a wxComboBox. wxChoice controls do not generate
1864            events as the uses highlights possible choices which fixes problems
1865            with resizing the dialog when the use selects an option.
1866    
1867            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
1868            control instead of a wxComboBox.
1869    
1870            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
1871            dialog.
1872    
1873            * test/test_proj.py (TestProjection.test): New tests for GetParameter
1874            method.
1875    
1876    2003-04-22  Bernhard Herzog  <[email protected]>
1877    
1878            * Thuban/UI/mainwindow.py: Remove some unused imports and global
1879            constants
1880    
1881            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
1882            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
1883    
1884    2003-04-17  Bernhard Herzog  <[email protected]>
1885    
1886            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
1887            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
1888            anymore.
1889            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
1890            (Layer.ShapeType, Layer.Shape): No need to call
1891            self.open_shapefile since it's always called in __init__
1892    
1893            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
1894            In wxPython 2.4 there's no need to extend MainLoop anymore since
1895            wxPython itself makes sure OnExit is called.
1896    
1897    2003-04-16  Jonathan Coles   <[email protected]>
1898    
1899            Initial putback of projection management code. Includes new
1900            classes to read and write projection files. The current load
1901            and save classes were abstracted a bit so they could be reused.
1902            The Projection class was extended to provide new methods and
1903            have a name.
1904    
1905            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
1906            general XML reading methods that were part of ProcessSession.
1907    
1908            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
1909            name.
1910            (ProjFile): New. Represents a file that contains projection
1911            information.
1912    
1913            * Thuban/Model/resource.py: New. Contains general utilities
1914            for read and writing projection files.
1915    
1916            * Thuban/Model/save.py (XMLSaver): New. Contains all the
1917            general XML writing methods that were part of SessionSaver.
1918            (SessionSaver): Renamed from Saver.
1919    
1920            * test/test_proj.py: New test cases for the projection
1921            file read and write functions.
1922    
1923    2003-04-16  Jonathan Coles   <[email protected]>
1924    
1925            * Thuban/Model/classification.py: Use repr() around values
1926            in the ClassGroup*.__repr__() methods so it is clearer when
1927            a value is a string and when it is a number.
1928    
1929            * test/test_load.py: Rework the classification test to test
1930            that we can load old files.
1931            (testLabels): Test a file where the groups have labels.
1932    
1933    2003-04-16  Bernhard Herzog  <[email protected]>
1934    
1935            Safer implementation of the performance enhancements of the
1936            low-level renderer:
1937            
1938            * extensions/thuban/wxproj.cpp (extract_projection)
1939            (extract_pointer): Rename extract_projection to extract_pointer
1940            and redefine its purpose to return the pointer stored in a CObject
1941            returned by the object's cobject method. Update all callers.
1942            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
1943            handling of these low-level parameters so that each s_draw_info
1944            instance is handled as a CObject at python level that also
1945            contains real references to the actual python objects which
1946            contain the values in the struct. Add free_draw_info as the
1947            destructor.
1948            (draw_polygon_shape): Add the py_draw_info parameter which must a
1949            cobject containing an s_draw_info pointer.
1950    
1951            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
1952            method to instantiat the low-level render parameter
1953            (MapRenderer.draw_shape_layer): Use the new method. Remove some
1954            commented out code.
1955            (MapRenderer.draw_polygon_shape): Make the first parameter not the
1956            layer but the low-level render parameter
1957            (ScreenRenderer.draw_shape_layer): Use the low-level render
1958            parameter.
1959    
1960    2003-04-15  Jonathan Coles   <[email protected]>
1961    
1962            * Thuban/Model/classification.py: Implemented __repr__ for
1963            the ClassGroup* classes to make debugging a bit easier.
1964            (ClassGroup.SetLabel): Check that the string is an instance
1965            of StringTypes not StringType. Accounts for Unicode strings.
1966    
1967            * Thuban/Model/color.py: Implemented __repr__ to make
1968            debugging a bit easier.
1969    
1970            * Thuban/Model/save.py (Saver.write_classification): Need to
1971            save the group label.
1972    
1973            * test/test_load.py (testClassification): New. Loads the
1974            iceland_sample_test.thuban file and checks if it was loaded
1975            correctly.
1976    
1977    2003-04-15  Jonathan Coles   <[email protected]>
1978    
1979            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
1980            to improve rendering performance by initializing the variables
1981            that are not change each time draw_polygon_shape() is called.
1982            The values are stored in a global struct draw_info.
1983            (draw_polygon_shape): Removed initialization code that is
1984            now in draw_polygon_init().
1985    
1986            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
1987            drawing initialization call to draw_polygon_init()
1988            (MapRenderer.draw_polygon_shape): Use new signature of
1989            draw_polygon_shape.
1990    
1991            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
1992            weirdness by setting the range to (1, maxint).
1993    
1994            * Thuban/Model/classification.py (ClassGroupProperties): Make
1995            instance variables private and optimize comparison operator
1996            by first checking if the color references are the same.
1997            (ClassGroupSingleton): Make instance variables private.
1998            (ClassGroupRange): Make instance variables private.
1999    
2000            * HOWTO-Release: Filled in missing steps for releasing packages.
2001    
2002    2003-04-15  Bernhard Herzog  <[email protected]>
2003    
2004            First stab at internationalized messages:
2005    
2006            * Thuban/__init__.py (_): Implement the translation function for
2007            real using the python gettext module.
2008    
2009            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
2010            translate empty strings.
2011    
2012            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2013            Add a missing space to a warning message
2014    
2015            * po/README: New. Notes about the management of the translation
2016            files.
2017    
2018            * po/Makefile: New. Makefile to help manage the translation files.
2019    
2020            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
2021    
2022            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
2023            translations and support files in po/
2024    
2025            * setup.py (data_files): Add the *.mo files to the data_files too
2026    
2027            * README: Add note about the translations when building from CVS
2028    
2029    2003-04-14  Jonathan Coles   <[email protected]>
2030    
2031            * Thuban/UI/dock.py: Fixes some window resizing problems most
2032            noticable under windows. Always assume the button bitmaps will
2033            be there. Code clean up.
2034            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
2035            images for the dock/undock button to the same images.
2036            Work around for RTbug #1801.
2037    
2038            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
2039            be allowed to grow within the sizer. Fixes a bug under Windows
2040            where the toolbar wasn't being drawn.
2041    
2042    2003-04-14  Frank Koormann   <[email protected]>
2043    
2044            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
2045            Updated design to try to make the button functionality more
2046            transparent.
2047    
2048    2003-04-14  Jonathan Coles   <[email protected]>
2049    
2050            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
2051            finalize the intialization of the panel.
2052    
2053            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
2054            creation of the panel. Should be the last thing called in the
2055            initializer of a subclass.
2056    
2057            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
2058            set the current selections in the combo boxes. This is needed
2059            under Windows.
2060    
2061            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
2062            level panel to the dialog so that the background colors are
2063            consistent under Windows.
2064    
2065    2003-04-11  Jonathan Coles   <[email protected]>
2066    
2067            * Thuban/UI/classgen.py: Change color ramps to start at white
2068            not black.
2069    
2070            * Thuban/UI/legend.py: Enable/disable the legend buttons when
2071            the legend changes. Fixes RTbug #1793.
2072    
2073            * test/test_classification.py: Added test for copying of
2074            classifications.
2075    
2076    2003-04-11  Jonathan Coles   <[email protected]>
2077    
2078            * Thuban/UI/resource.py: New. Centralize the loading of resources
2079            such as bitmaps.
2080    
2081            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
2082            added images to the move buttons, added 'reverse' button.
2083            (CustomRampPanel.__init__): Added images to the move buttons.
2084            (GreyRamp): New. Generates a ramp from white to black.
2085            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
2086    
2087            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
2088            ID_PROPERTY_*.
2089            (Classifier.__init__): Minor changes to the layout.
2090            (Classifier._OnTitleChanged): Listen for when the user edits the
2091            title and update the dialog's title and the layer's title.
2092    
2093            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
2094    
2095            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
2096            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
2097            if the layer's title changes.
2098    
2099            * Thuban/UI/mainwindow.py: Added new menu item and associated code
2100            to open a dialog to rename the map.
2101            (MainWindow): Use new resource class to import bitmaps.
2102    
2103    2003-04-11  Jonathan Coles   <[email protected]>
2104    
2105            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
2106            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
2107            Resources/Bitmaps/group_use_none.xpm,
2108            Resources/Bitmaps/group_use_not.xpm,
2109            Resources/Bitmaps/hide_layer.xpm,
2110            Resources/Bitmaps/layer_properties.xpm,
2111            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
2112            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
2113            New.
2114    
2115    2003-04-10  Jonathan Coles   <[email protected]>
2116    
2117            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
2118            Should pass group to ClassGroup constructor.
2119    
2120    2003-04-10  Jonathan Coles   <[email protected]>
2121    
2122            * Thuban/Model/classification.py: (ClassGroup): Move all the common
2123            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
2124            here. Implement SetVisible(), IsVisible().
2125            (ClassGroup.__init__): Add group parameter which acts as a copy
2126            constructor.
2127    
2128            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
2129            "Visible" check boxes.
2130            (Classifier): Rename the buttons and refactor the code to match
2131            the new labels.
2132    
2133            * Thuban/UI/legend.py: Classify button is now called "Properties".
2134            Refactored the code to change variable names.
2135            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
2136    
2137            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
2138            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
2139            renamed to MainWindow.LayerEditProperties.
2140            (MainWindow.ToggleLegend): Don't include map name in legend title.
2141            (MainWindow.SetMap): Added the map name to the window title.
2142            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
2143            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
2144            Functionality is found in the layer properties dialog.
2145    
2146            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
2147            draw visible groups.
2148    
2149    2003-04-09  Jonathan Coles   <[email protected]>
2150    
2151            * Thuban/UI/classgen.py: Modifications to allow simple
2152            addition and selection of new color schemes.
2153            (MonochromaticRamp): New. Generates a ramp between two colors.
2154            (RedRamp): New. Generates a ramp of all red.
2155            (GreenRamp): New. Generates a ramp of all green.
2156            (BlueRamp): New. Generates a ramp of all blue.
2157    
2158    2003-04-09  Jonathan Coles   <[email protected]>
2159    
2160            * Thuban/Model/classification.py (Classification.__deepcopy__):
2161            Need to copy over field and fieldType attributes.
2162    
2163            * Thuban/Model/table.py (Table.field_range): New. Retrive the
2164            maximum and minimum values over the entire table for a given
2165            field.
2166            (Table.GetUniqueValues): New. Retrieve all the unique values
2167            in the table for a given field.
2168    
2169            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
2170            (GenUniquePanel): New. Controls to allow the user to select
2171            which unique field values they would like in the classification.
2172            (CustomRampPanel): Code that was in ClassGenDialog that allows
2173            the user to select the properties for a custom ramp.
2174            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
2175    
2176            * Thuban/UI/classifier.py: Removed a lot of debugging code.
2177            (Classifier._SetClassification): Callback method so that the
2178            class generator can set the classification in the grid.
2179            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
2180            editing of a group properties class into a wxWindows control.
2181    
2182            * Thuban/UI/dock.py: It was decided that if the user closes
2183            a dockable window the window should simply hide itself. That
2184            way if the user wants to show the dock again it appears in the
2185            same place as it was when it was closed.
2186            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
2187            (DockableWindow._OnButtonClose): Hide the window instead of
2188            destroying it.
2189            (DockableWindow._OnClose): Hide the window instead of
2190            destroying it.
2191    
2192            * Thuban/UI/legend.py (LegendTree): Use a private method to
2193            consistently set the font and style of the text. Fixes RTbug #1786.
2194    
2195            * Thuban/UI/mainwindow.py: Import just the Classifier class.
2196    
2197    2003-04-07  Bernhard Herzog  <[email protected]>
2198    
2199            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
2200            to the map module
2201    
2202    2003-04-07  Bernhard Herzog  <[email protected]>
2203    
2204            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
2205            favor of ToggleSessionTree
2206            (MainWindow.ToggleSessionTree): New method to toggle visibility of
2207            the session tree.
2208            (MainWindow.SessionTreeShown): New method to return whether the
2209            session tree is currently shown.
2210            (MainWindow.ToggleLegend): New method to toggle visibility of the
2211            legend
2212            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
2213            LegendShown
2214            (MainWindow.LegendShown): New method to return whether the legend
2215            is currently shown.
2216            (_method_command): Add checked parameter so we can define check
2217            menu items
2218            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
2219            mainwindow methods.
2220            (show_session_tree, show_legend commands): Removed.
2221            (toggle_session_tree, toggle_legend commands): New commands to
2222            toggle the visibility of the dialogs
2223    
2224    2003-04-07  Jonathan Coles   <[email protected]>
2225    
2226            * Thuban/UI/classgen.py: Fix Windows problem.
2227    
2228            * Thuban/UI/dock.py: Fix Windows problem.
2229    
2230            * Thuban/UI/mainwindow.py: Use False instead of false.
2231            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
2232    
2233    2003-04-07  Jonathan Coles   <[email protected]>
2234    
2235            Since we now say that the order of the groups in a classification
2236            matters, it makes sense to be able to manipulate that order. Most
2237            of the changes to Thuban/Model/classification.py are to that end.
2238    
2239            * Thuban/Model/classification.py (Classification.AppendGroup,
2240            Classification.InsertGroup, Classification.ReplaceGroup,
2241            Classification.RemoveGroup, Classification.GetGroup): Do as the
2242            names imply.
2243            (Classification.FindGroup): This was called GetGroup, but GetGroup
2244            takes an index, while FindGroup takes a value.
2245            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
2246            REFERENCE. Currently there is a cyclic reference between the layer
2247            and its classification. If the classification doesn't need to know
2248            its owning layer we can change this, since it may make sense to be
2249            able to use the same classification with different layers.
2250    
2251            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
2252    
2253            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
2254            not AddGroup()
2255    
2256            * Thuban/UI/classifier.py: Now that we can depend on the order in
2257            a Classification and have methods to manipulate that order we don't
2258            need to use our own data structures in the grid. We can simply make
2259            the grid/table access the information they need from a copy of
2260            the classification object.
2261            (Classifier._OnCloseBtn): Event handler for when the user clicks
2262            'Close'. This is needed so if the user applies changes and then
2263            continues to change the table the user has the option of discarding
2264            the most recent changes and keeping what they applied.
2265    
2266            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
2267            into the same group.
2268    
2269            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
2270            with a really old version of proj, PJ_VERSION won't even be defined.
2271            If it isn't defined then just compile so that the function always
2272            returns Py_False.
2273    
2274            * test/test_classification.py: Fix tests to use the renamed methods.
2275            Still need to write tests for the new methods.
2276    
2277    2003-04-04  Jonathan Coles   <[email protected]>
2278    
2279            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
2280            call to SetSelection out of the method and before the call
2281            to __SelectField in __init__. This prevents a recursion of events
2282            when _OnFieldSelect is triggered by the user.
2283    
2284    2003-04-04  Jonathan Coles   <[email protected]>
2285    
2286            * Thuban/Model/classification.py: Rename Color.None to
2287            Color.Transparent.
2288            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
2289            Don't bother copying the color, since Colors are immutable.
2290    
2291            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
2292            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
2293            Thuban/UI/renderer.py, Thuban/UI/view.py:
2294            Rename Color.None to Color.Transparent.
2295        
2296            * test/test_classification.py, test/test_load.py: Rename Color.None
2297            to Color.Transparent.
2298    
2299    2003-04-04  Jonathan Coles   <[email protected]>
2300    
2301            * Thuban/Model/classification.py: Fix assert calls.
2302            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
2303            Copy the color parameter rather than hold onto a reference.
2304    
2305            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
2306            the color object.
2307            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
2308            are sure there exists only one refernce to Color.None in the system.
2309            This allows us to use 'is' rather than the comparision functions.
2310            
2311            * Thuban/Model/save.py: Fix assert calls.
2312            
2313            * Thuban/UI/classifier.py: Fix assert calls.
2314            (ClassGrid._OnCellDClick): Call up to the classifier to open the
2315            dialog to edit the groups properties.
2316            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
2317            correctly if a cell is resized.
2318            (ClassTable.SetClassification): New. Changes the classification
2319            that is in the table.
2320            (ClassTable.__SetRow): Allow groups to be prepended.
2321            (Classifier): New code for opening the EditProperties and
2322            GenerateRanges dialogs.
2323            (SelectPropertiesDialog.__GetColor): Only set the color in the
2324            color dialog if the current color is not None.
2325            
2326            * Thuban/UI/dock.py: Fix assert calls.
2327            
2328            * Thuban/UI/legend.py: Fix assert calls.
2329            
2330            * Thuban/UI/renderer.py: Fix assert calls.
2331            
2332            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
2333            classifications.
2334            (GenRangePanel): Panel specific to range generation.
2335            (GenSingletonPanel): Panel specific to singleton generation.
2336            (ClassGenerator): Class responsible for actually generating
2337            the classification from the data gathered in the dialog box.
2338            (PropertyRamp): Generates properties whose values range from
2339            a starting property to an ending property.
2340    
2341    2003-04-03  Bernhard Herzog  <[email protected]>
2342    
2343            * test/support.py (print_garbage_information): New function that
2344            prints information about still connected messages and memory
2345            leaks.
2346            (run_suite): Removed.
2347            (run_tests): New function for use as a replacement of
2348            unittest.main in the test_* files. This one calls
2349            print_garbage_information at the end.
2350    
2351            * test/runtests.py (main): Use support.print_garbage_information
2352    
2353            * test/test_layer.py: Use support.run_tests instead of
2354            unittest.main so we get memory leak information
2355            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2356            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
2357            (TestLayerLegend.test_visibility): Call the layer's Destroy method
2358            to fix a memory leak.
2359    
2360            * test/test_classification.py: Use support.run_tests instead of
2361            unittest.main so we get memory leak information
2362            (TestClassification.test_classification): Call the layer's Destroy
2363            method to fix a memory leak.
2364    
2365    2003-04-02  Bernhard Herzog  <[email protected]>
2366    
2367            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
2368            Handle the reference counts of the return value and errors in
2369            PyArg_ParseTuple correctly.
2370    
2371            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2372            sure the filename is absolute to avoid problems when saving the
2373            session again
2374    
2375            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
2376    
2377    2003-04-01  Jonathan Coles   <[email protected]>
2378    
2379            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
2380            that there actually are points in the returned list of points
2381            before trying to index into the list. The list may be empty if
2382            the shape is a Null Shape.
2383    
2384    2003-04-01  Bernhard Herzog  <[email protected]>
2385    
2386            * test/test_map.py: Don't use from <module> import *
2387    
2388    2003-04-01  Jonathan Coles   <[email protected]>
2389    
2390            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
2391            LAYER_LEGEND_CHANGED
2392    
2393            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
2394            self.Destroy() to close the window after yesterday's changes.
2395    
2396            * test/test_map.py, test/test_session.py: Fix messages that
2397            are sent from maps and layers.
2398    
2399    2003-03-31  Jonathan Coles   <[email protected]>
2400    
2401            * Thuban/UI/classifier.py: Commented out some debugging statements.
2402            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
2403            RTbug #1769.
2404    
2405            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
2406            position (although position doesn't work yet under GTK).
2407            (DockableWindow.Destroy): New. Called when the window must be
2408            closed. Namely needed when the DockFrame closes and must close
2409            its children.
2410            (DockFrame): Listen for EVT_CLOSE and destroy all children.
2411    
2412            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
2413            when then window is told to close.
2414            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
2415            comment in source for more info.
2416    
2417            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
2418    
2419            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
2420            symmetry with other such methods.
2421            (MainWindow.ShowLegend): Show the legend docked by default.
2422    
2423    2003-03-28  Jonathan Coles   <[email protected]>
2424    
2425            * Thuban/UI/classifier.py: Support for highlighting a specific
2426            group within the grid when the classification dialog is opened.
2427            Also contains a lot of debugging printouts which will later
2428            be removed.
2429    
2430            * Thuban/UI/dock.py: Complete rework on the dock code so that
2431            that it is fairly removed from the rest of the Thuban application.
2432            It is easy to add new docks which the rest of the program having
2433            to be aware of them.
2434    
2435            * Thuban/UI/legend.py: Modifications to support selecting a
2436            specific group in the classification dialog. Changed how layers
2437            are drawn when the layer is visible/invisible.
2438    
2439            * Thuban/UI/mainwindow.py: Removed legend specific code and
2440            replaced it with calls to the new dock code.
2441    
2442            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
2443            to check if scale > 0. Trying to track down a divide by zero.
2444    
2445    2003-03-26  Jonathan Coles   <[email protected]>
2446    
2447            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
2448            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
2449            now part of DockableWindow.
2450            (LegendPanel.DoOnSelChanged): Select the current layer in the
2451            map.
2452            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
2453            with the selected layer and/or group.
2454    
2455    2003-03-26  Jonathan Coles   <[email protected]>
2456    
2457            This putback contains the code for dockable windows. There is
2458            no support in wxWindows as of this date for windows that can
2459            attach themselves to other windows.
2460    
2461            The current model contains a DockableWindow which has a parent
2462            window for when it is detached and a dock window that it puts
2463            its contents in when it is docked. The contents of a DockableWindow
2464            must be a DockPanel. DockPanel itself derives from wxPanel.
2465    
2466            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
2467            message, not a LAYER_LEGEND_CHANGED message.
2468    
2469            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
2470    
2471            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
2472            as one of the style properties for the fieldTypeText item to
2473            be sure that its size is correct when the text changes.
2474    
2475            * Thuban/UI/dock.py: New. Classes for the DockPanel and
2476            DockableWindow.
2477    
2478            * Thuban/UI/legend.py: Added some more buttons and made the
2479            LegendPanel a DockPanel.
2480    
2481            * Thuban/UI/mainwindow.py: Added sash windows to the main window
2482            and supporting functions for manipulating the sashes.
2483            (MainWindow.ShowLegend): Create a DockableWindow with the
2484            LegendPanel as the contents.
2485    
2486            * Thuban/UI/messages.py: Added DOCKABLE_* messages
2487    
2488            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
2489            not LAYER_LEGEND_CHANGED, messages.
2490    
2491    2003-03-25  Jonathan Coles   <[email protected]>
2492    
2493            * setup.py: Added custom script bdist_rpm_build_script so that
2494            when the rpm is built the path to wx-config is correct.
2495    
2496            * setup.cfg: Added line saying to use the custom build script
2497    
2498    2003-03-20  Jonathan Coles   <[email protected]>
2499    
2500            Initial implementation of the Legend.
2501    
2502            * Thuban/UI/legend.py: New. Creates a window that shows the map's
2503            Legend information and allows the user to add/modify classifications
2504            and how the layers are drawn on the map.
2505    
2506            * setup.py: New command 'build_docs' which currently uses
2507            happydoc to generate html documentation for Thuban.
2508    
2509            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
2510            Returns a string which is appropriately describes the group.
2511    
2512            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
2513            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
2514    
2515            * Thuban/Model/map.py (Map): Rename messages and use new, more
2516            specific, messages.
2517    
2518            * Thuban/Model/messages.py: New message to indicate that a layer's
2519            data has changed (LAYER_CHANGED). New map messages to indicate
2520            when layers have been added/removed/changed or if the stacking order
2521            of the layers has changed.
2522    
2523            * Thuban/Model/session.py: Rename and use new messages.
2524    
2525            * Thuban/UI/classifier.py: Remember if any changes have actually
2526            been applied so that if the dialog is cancelled without an application
2527            of changes we don't have to set a new classification.
2528            (ClassDataPreviewer): Pulled out the window specific code and put it
2529            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
2530            symbols on any DC.
2531            
2532            * Thuban/UI/mainwindow.py: New code to open the legend.
2533    
2534            * Thuban/UI/view.py: Use new message names.
2535    
2536    2003-03-19  Jonathan Coles   <[email protected]>
2537    
2538            * Thuban/UI/main.py (verify_versions): New. Checks the versions
2539            of Python, wxPython, and some other libraries.
2540    
2541            * extensions/thuban/wxproj.cpp (check_version): Checks the given
2542            version against what wxproj was compiled with.
2543            (check_version_gtk): If wxproj was compiled with gtk then check
2544            the given version against the version of the gtk library
2545            currently being used.
2546    
2547    2003-03-14  Bernhard Herzog  <[email protected]>
2548    
2549            * test/test_command.py: Run the tests when the module is run as a
2550            script
2551    
2552    2003-03-14  Bernhard Herzog  <[email protected]>
2553    
2554            Implement selection of multiple selected shapes in the same layer:
2555    
2556            - Introduce a new class to hold the selection. This basically
2557              replaces the interactor which was nothing more than the
2558              selection anyway. A major difference is of course that the new
2559              selection class supports multiple selected shapes in one layer
2560            
2561            - Move the object that represents the selection from the
2562              application to the canvas. The canvas is a better place than the
2563              application because the selection represents which shapes and
2564              layer of the map displayed by the canvas are selected and
2565              affects how the map is drawn.
2566    
2567            - Make the selection and its messages publicly available through
2568              the mainwindow.
2569    
2570            - The non-modal dialogs do not get a reference to the interactor
2571              anymore as they can simply refer to their parent, the
2572              mainwindow, for the what the interactor had to offer.
2573    
2574            * Thuban/UI/selection.py: New module with a class to represent the
2575            selection.
2576    
2577            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
2578            these unused messages
2579    
2580            * Thuban/UI/application.py (ThubanApplication.OnInit)
2581            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
2582            interactor is gone now.
2583            (ThubanApplication.CreateMainWindow): There is no interactor
2584            anymore so we pass None as the interactor argument for now for
2585            compatibility.
2586    
2587            * Thuban/UI/view.py (MapCanvas.delegated_messages)
2588            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
2589            Unsubscribe, delegate messages according to the delegated_messages
2590            class variable.
2591            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
2592            attributes from instance variables as described with the
2593            delegated_methods class variable.
2594            (MapCanvas.__init__): New instance variable selection holding the
2595            current selection
2596            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
2597            pass them on to the renderer
2598            (MapCanvas.SetMap): Clear the selection when a different map is
2599            selected.
2600            (MapCanvas.shape_selected): Simple force a complete redraw. The
2601            selection class now takes care of only issueing SHAPES_SELECTED
2602            messages when the set of selected shapes actually does change.
2603            (MapCanvas.SelectShapeAt): The selection is now managed in
2604            self.selection
2605    
2606            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
2607            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
2608            Unsubscribe, delegate messages according to the delegated_messages
2609            class variable.
2610            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
2611            attributes from instance variables as described with the
2612            delegated_methods class variable.
2613            (MainWindow.__init__): The interactor as ivar is gone. The
2614            parameter is still there for compatibility. The selection messages
2615            now come from the canvas.
2616            (MainWindow.current_layer, MainWindow.has_selected_layer):
2617            Delegate to the the canvas.
2618            (MainWindow.LayerShowTable, MainWindow.Classify)
2619            (MainWindow.identify_view_on_demand): The dialogs don't need the
2620            interactor parameter anymore.
2621    
2622            * Thuban/UI/tableview.py (TableFrame.__init__)
2623            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
2624            (LayerTableFrame.row_selected): The interactor is gone. It's job
2625            from the dialog's point of view is now done by the mainwindow,
2626            i.e. the parent. Subscribe to SHAPES_SELECTED instead
2627            of SELECTED_SHAPE
2628            
2629            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
2630            is gone. It's job from the dialog's point of view is now done by
2631            the mainwindow, i.e. the parent.
2632            
2633            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
2634            gone. It's job from the dialog's point of view is now done by the
2635            mainwindow, i.e. the parent.
2636    
2637            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
2638            gone. It's job from the dialog's point of view is now done by the
2639            mainwindow, i.e. the parent.
2640            (SessionTreeCtrl.__init__): New parameter mainwindow which is
2641            stored as self.mainwindow. The mainwindow is need so that the tree
2642            can still subscribe to the selection messages.
2643            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
2644            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
2645            selection is now accessible through the mainwindow. Subscribe to
2646            SHAPES_SELECTED instead of SELECTED_SHAPE
2647    
2648            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
2649            SHAPES_SELECTED message now.
2650            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
2651            so deal with multiple shapes
2652            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
2653            gone. It's job from the dialog's point of view is now done by the
2654            mainwindow, i.e. the parent.
2655    
2656            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
2657            parameter is now a list of shape ids.
2658            (RecordTable.SetTable): The second parameter is now a list of
2659            indices.
2660    
2661            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
2662            selected_shape parameter and ivar to selected_shapes. It's now a
2663            list of shape ids.
2664            (MapRenderer.draw_label_layer): Deal with multiple selected
2665            shapes. Rearrange the code a bit so that the setup and shape type
2666            distinctions are only executed once.
2667    
2668            * test/test_selection.py: Test cases for the selection class
2669    
2670    2003-03-11  Jonathan Coles   <[email protected]>
2671    
2672            * Thuban/Model/load.py: Temporary fix so that the xml reader
2673            doesn't cause Thuban to crash.
2674    
2675            * Thuban/Model/layer.py: Handle the cyclic references between
2676            a layer and its classification better, and be sure to disconnect
2677            the classification from the layer when the layer is destroyed
2678            so that we don't maintain a cyclic reference that may not be
2679            garbage collected.
2680    
2681            * Thuban/Model/classification.py: See comment for layer.py.
2682    
2683    2003-03-12  Jan-Oliver Wagner <[email protected]>
2684    
2685            * HOWTO-Release: New. Information on the steps for releasing
2686            a new version of Thuban.
2687    
2688    2003-03-11  Jonathan Coles   <[email protected]>
2689    
2690            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
2691            Use True instead of true.
2692            (Classifier): Should have a single panel in which all the controls lie.
2693    
2694            * Thuban/UI/proj4dialog.py: Add normal border.
2695    
2696            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
2697    
2698            * Thuban/UI/mainwindow.py: Use True instead of true.
2699    
2700            * setup.py: Update some definitions to use wxWindows2.4 files
2701    
2702            * Data/iceland_sample_class.thuban: Fixed file so that the
2703            field_type information is present.
2704    
2705    2003-03-10  Jonathan Coles   <[email protected]>
2706    
2707            * Thuban/UI/classifier.py (Classifier.__init__): Make the
2708            field type label grow so that when the text changes the
2709            size is updated correctly. This may be a wxWindows bug.
2710    
2711    2003-03-10  Jonathan Coles   <[email protected]>
2712    
2713            * Thuban/UI/application.py: Changed SESSION_CHANGED to
2714            SESSION_REPLACED.
2715    
2716            * Thuban/UI/classifier.py: Wrap text with _().
2717            (ClassGrid.CreateTable): Set dimensions and size hints here,
2718            instead of in Reset, so we only set the size once.
2719    
2720            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
2721    
2722            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
2723            Call Close() instead of Shutdown().
2724    
2725            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
2726    
2727            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
2728            Go back to using OnClose() instead of Shutdown().
2729    
2730    2003-03-10  Jonathan Coles   <[email protected]>
2731    
2732            * Thuban/UI/classifier.py (Classifier): SelectField() needed
2733            to know the old field index as well as the new one.
2734    
2735    2003-03-10  Jonathan Coles   <[email protected]>
2736    
2737            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
2738            to correctly set the table information and call this from
2739            __init__ and from _OnFieldSelect so that all the information
2740            is up to date when the dialog opens and when a field is changed.
2741    
2742    2003-03-10  Jonathan Coles   <[email protected]>
2743    
2744            * Thuban/Model/classification.py (Classification): Don't use
2745            layer's message function directly, use the ClassChanged() method
2746            when then classification changes. SetField/SetFieldType/SetLayer
2747            must keep the information about field name and field type in
2748            sync when an owning layer is set or removed.
2749    
2750            * Thuban/Model/layer.py: Added ClassChanged() so that the
2751            classification can tell the layer when its data has changed.
2752            (Layer.SetClassification): Accepts None as an arguement to
2753            remove the current classification and correctly handles
2754            adding a new classification.
2755    
2756            * Thuban/Model/load.py: Comment out print statement
2757    
2758            * test/test_classification.py, test/test_save.py: New and
2759            improved tests.
2760    
2761    2003-03-07  Jonathan Coles   <[email protected]>
2762    
2763            * Thuban/Model/classification.py: Implemented __copy__ and
2764            __deepcopy__ for ClassGroup* and ClassGroupProperites so
2765            they can easily be copied by the classifier dialog.
2766            (ClassGroupProperites.__init__): The default line color should
2767            have been Color.Black.
2768    
2769            * Thuban/UI/classifier.py: Setting and Getting table values now
2770            uses a consistent set of functions.
2771            (Classifier): Now non-modal. Has field type label which changes
2772            as the field changes. Keep track of buttons in a list so that
2773            we can enable/disable the buttons when the None field is selected.
2774            (SelectPropertiesDialog): Add buttons to make the colors transparent.
2775    
2776            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
2777            does what OnClose did, but can be called by the application to
2778            close a window. Needed when a session changes, and we have to
2779            close the classifier windows.
2780    
2781            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
2782            Shuts down open dialogs. Used when a new session is created
2783            or a session is opened.
2784            (MainWindow.SaveSession): Should only call application.SaveSession()
2785            if we don't call SaveSessionAs first.
2786            (MainWindow.Classify): Allow different classifier dialogs for
2787            different layers.
2788    
2789            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
2790            the parent class handle it. Add Shutdown() to unsubscibe from
2791            event notification and call the parent Shutdown(). This was
2792            necessary so the application can close the tree window.
2793    
2794    2003-03-06  Jonathan Coles   <[email protected]>
2795    
2796            * Thuban/Model/classification.py: Minor documentation changes,
2797            Addition of __eq__ and __ne__ methods.
2798            (Classification.SetLayer): prevent recursion between this method
2799            and Layer.SetClassification().
2800    
2801            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
2802    
2803            * Thuban/Model/layer.py (SetClassification): prevent recursion
2804            between this method and Classification.SetLayer().
2805    
2806            * test/test_classification.py, test/test_load.py,
2807            test/test_session.py: Fixed and added tests for the classification
2808            classes.
2809    
2810    2003-03-06  Bernhard Herzog  <[email protected]>
2811    
2812            * Thuban/UI/classifier.py (ClassGrid.__init__)
2813            (ClassGrid.CreateTable): Move the SetSelectionMode call to
2814            CreateTable because otherwise it triggers an assertion in
2815            wxPython/wxGTK 2.4.
2816    
2817    2003-03-05  Jonathan Coles   <[email protected]>
2818    
2819            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
2820    
2821            * Thuban/Model/load.py: import FIELDTYPE constants from table.
2822    
2823            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
2824    
2825            * Thuban/Model/table.py: Put FIELDTYPE constants back.
2826    
2827    2003-03-05  Jonathan Coles   <[email protected]>
2828    
2829            * Thuban/UI/classifier.py: Added class documentation.
2830            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
2831            Store just the groups in the table and generate the other
2832            column information when it is requested. Add "None" field
2833            to pull-down to select no classification.
2834    
2835            * Thuban/common.py: Moved FIELDTYPE constants from table.py
2836            (Str2Num): Only catch ValueError exceptions.
2837    
2838            * Thuban/Model/classification.py: Class documentation. Renaming
2839            of methods with Stroke to Line. Groups are stored in a single
2840            list with the default as the first element. Groups are searched
2841            in the order they appear in the list.
2842    
2843            * Thuban/Model/color.py: Documentation.
2844    
2845            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
2846            the kind of data represented by a field.
2847    
2848            * Thuban/Model/load.py (ProcessSession): Use proper string
2849            conversion function; fixes RTbug #1713.
2850    
2851            * Thuban/Model/save.py (Saver): Store field type information.
2852    
2853            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
2854            (Table): Add field_info_by_name() to retrieve field information
2855            by specifying the field name, not the number.
2856    
2857            * Thuban/UI/mainwindow.py: Function name changes.
2858    
2859            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
2860            get the layer classification once. Don't try to classify
2861            values when the field is None: just use the default properties.
2862    
2863            * Thuban/UI/view.py: Function name changes.
2864    
2865            * Doc/thuban.dtd: Add field_type attribute to a classification.
2866    
2867    2003-03-04  Bernhard Herzog  <[email protected]>
2868    
2869            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
2870            the fill and stroke layer attributes optional with suitable
2871            default values. Add the stroke_width layer attribute. Use correct
2872            syntax for empty elements. Make the attribute list for labels
2873            refer to the label element.
2874    
2875    2003-03-04  Bernhard Herzog  <[email protected]>
2876    
2877            * setup.py (thuban_build_py.build): Add a comment about distutils in
2878            Python 2.3 containing some of the functionality we implement in
2879            setup.py ourselves.
2880    
2881            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
2882            before the selection mode. Doing it the other way round triggers
2883            an assertion in wxWindows.
2884    
2885            * Thuban/Model/save.py (escape): Fix typo in doc-string
2886    
2887            * Thuban/Model/classification.py: Remove unnecessary wxPython
2888            import
2889    
2890    2003-03-04  Jonathan Coles   <[email protected]>
2891    
2892            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
2893            Parameter 'value' should default to None.
2894    
2895            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
2896            the class attribute __classification is now private.
2897    
2898            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
2899            Classifier to ClassGrid. Added support for removing selected rows,
2900            which including code for keeping track of when cells are selected,
2901            and deselected.
2902            (ClassTable): Support for added/removing rows. Fixed a problem
2903            with __ParseInput whereby it would not allow strings (only numbers)
2904            to be entered.
2905            (Classifier): Added button and supporting code for removing
2906            selected rows.
2907    
2908    2003-02-27  Jonathan Coles   <[email protected]>
2909    
2910            * Thuban/common.py: Moved color conversion functions into
2911            Thuban/UI/common.py.
2912            (Str2Num): Now converts the float (not the string) to a long/int
2913            so that an exception isn't thrown.
2914    
2915            * Thuban/UI/common.py: Common functions used in several UI modules
2916    
2917            * Thuban/Model/classification.py: Changed the class hierarchy
2918            so that a Classification consists of Groups which return
2919            Properties when a value matches a Group.
2920    
2921            * Thuban/Model/layer.py: Fixed name resolution problem.
2922    
2923            * Thuban/Model/load.py: Use new Classification and Group functions.
2924    
2925            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
2926            failure.
2927            (Saver.write_classification): Use new Classification and Group
2928            functions.
2929    
2930            * Thuban/UI/classifier.py: Changes to use new Classification and Group
2931            functions. Fix to create a tuple with a single value instead of
2932            simply returning the value.
2933    
2934            * Thuban/UI/renderer.py: Use new Classification and Group functions.
2935            Use common.py functions.
2936    
2937            * Thuban/UI/tree.py: Use common.py functions.
2938            
2939            * test/test_classification.py: Use new Classification and Group
2940            classes.
2941    
2942    2003-02-24  Jonathan Coles   <[email protected]>
2943    
2944            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
2945            functions from Thuban color objects to wxWindow colour objects.
2946    
2947            * Thuban/Model/classification.py (Classification): Renamed
2948            GetProperties() to GetClassData(). Used the new iterator
2949            in TreeInfo().
2950            (ClassIterator): Iterator implementation to iterate over the
2951            ClassData objects in a classification object.
2952    
2953            * Thuban/Model/save.py (Saver.write_classificaton): Uses
2954            the new iterator to save the classification information.
2955    
2956            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
2957            for changing the stroke and fill colors and previewing the
2958            changes.
2959    
2960            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
2961            MainWindow.SaveSessionAs): Text string changes so the dialogs
2962            have more meaningful titles.
2963    
2964            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
2965            Classification method name from GetProperties to GetClassData.
2966    
2967            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
2968            instead of accessing now non-existent class variables.
2969    
2970    2003-02-24  Bernhard Herzog  <[email protected]>
2971    
2972            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
2973            unneeded Shape() call. Rendering is substantially faster without
2974            it and it avoids some problems with broken shape files.
2975    
2976    2003-02-20  Frank Koormann   <[email protected]>
2977    
2978            Force minimal size of identify and label dialogs. The autosizing
2979            looked too ugly.
2980    
2981            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
2982            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
2983            Set size of listctrl.
2984            * Thuban/UI/identifyview.py (IdentifyView.__init__):
2985            Set size of dialog.
2986    
2987    2003-02-19  Jonathan Coles   <[email protected]>
2988    
2989            * test/test_classification.py, test/test_layer.py,
2990            test/test_load.py, test/test_map.py, test/test_session.py:
2991            Updated the tests to use the new functions that are in the
2992            respective classes.
2993    
2994            * Thuban/Model/classification.py (Classification):
2995            Uses the new ClassData* classes. Modification messages are
2996            passed up to the parent layer (if it exists).
2997            (ClassData): New class to encapsulate the common data in each
2998            classification property.
2999            (ClassDataDefault): Represents the Default class. data.
3000            (ClassDataPoint): Represents a single class. data point
3001            (ClassDataRange): Represents a class. range
3002            (ClassDataMap): Represents a class. map (unused).
3003    
3004            * Thuban/Model/color.py: Added Color.None to represent something
3005            with no color. Color.Black represents the color black.
3006            (NoColor): Helper class derived from Color to represent something
3007            with no color.
3008    
3009            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
3010            stroke_width attributes. Made the 'classification' attribute private.
3011            New methods for setting/getting the classification.
3012    
3013            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
3014            to get the classifcation and use the new ClassData* classes to
3015            hold the classification data. Use Str2Num to convert numbers
3016            properly.
3017    
3018            * Thuban/Model/save.py (Saver): Use new Color and Classification
3019            methods
3020    
3021            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
3022            custom grid.
3023            (ClassTable): Support for editing Values and Labels and for
3024            changing what type (point or range) of data is stored in each
3025            property based on how the user enters the data.
3026            (Classifier): Support for saving the new classifications and
3027            launching the dialog to edit a property.
3028            (SelectPropertiesDialog): New class for editing the visual
3029            properties of a classification (stroke color, width, and fill color)
3030            (ClassPreviewer): Took the Draw method from ClassRenderer and
3031            made most of it into this new class. Intend to use this class in
3032            the SelectPropertiesDialog for previewing changes.
3033    
3034            * Thuban/UI/renderer.py: Use new Color and Classification methods.
3035    
3036            * Thuban/UI/tree.py: Formatting changes.
3037    
3038            * Doc/thuban.dtd: Add 'label' element
3039    
3040            * Thuban/common.py: New. Contains common routines used throughout
3041            the code.
3042            (Str2Num): Takes a string and converts it to the "best" type of
3043            number.
3044    
3045    2003-02-14  Bernhard Herzog  <[email protected]>
3046    
3047            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
3048            dragging flag is always set to 0 even when the tool implementation
3049            raises an exception
3050    
3051    2003-02-11  Bernhard Herzog  <[email protected]>
3052    
3053            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
3054            method to create a splash screen.
3055            (ThubanApplication.ShowMainWindow): New. Show the main window.
3056            Needed so the splash screen can display the mainwindow
3057            (ThubanApplication.OnInit): Call the
3058            new splash_screen method to determine whether the application
3059            should display a splash screen. If it displays a splash screen do
3060            not immediately show the main window.
3061    
3062    2003-02-11  Jonathan Coles  <[email protected]>
3063    
3064            * Thuban/Model/classification.py: Added import line to fix
3065            feature conflicts between running on python2.2 and python2.1.
3066    
3067            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
3068            onto the clinfo parameter, so removed the deepcopy().
3069    
3070    2003-02-10  Jonathan Coles  <[email protected]>
3071    
3072            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
3073            Added element_open variable to track opening and closing of tags
3074            so that tags that don't span more than one line are closed with
3075            /> instead of </tag_name>. Use the GetDefault*() methods of
3076            the Classification class.
3077    
3078            * Thuban/Model/classification.py (Classificaton): Added set and
3079            get methods for the default data. The class also takes a layer
3080            reference so that modification messages can be sent. Fixed the
3081            methods to use the new ClassData class.
3082            (ClassData): New class to encapsulate the classification data
3083    
3084            * Thuban/Model/layer.py (Layer): Remove the
3085            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
3086            SetDefault*() methods on the layer's classification object.
3087            (Layer.__init__): Use the new SetDefault*() methods in the
3088            Classification class.
3089    
3090            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
3091            object instead of a dictionary.
3092    
3093            * Thuban/UI/classifier.py (ClassRenderer): New class to
3094            draw the classifications in the dialog box's table.
3095            (Classifier): Modified to use the ClassRenderer class.
3096    
3097            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
3098            methods of the Classification class.
3099    
3100            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
3101            of the ClassData class.
3102    
3103            * test/test_classification.py, test/test_layer.py,
3104            test/test_map.py, test/test_session.py: Fix the tests to work
3105            with the above code changes.
3106    
3107    2003-02-03  Jonathan Coles  <[email protected]>
3108    
3109            * Thuban/Model/classification.py (Classification): Added getNull()
3110            to return the NullData reference
3111    
3112            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
3113            Layer.SetStrokeWidth): Modified these functions to change the
3114            null data in the classification rather than keep these values
3115            directly in the Layer class. Menu options to change these values
3116            work again.
3117    
3118    2003-01-28  Jonathan Coles  <[email protected]>
3119    
3120            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
3121            Fixed crashing problem on some systems. Dialog box shows
3122            classification data.
3123    
3124            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
3125            Colors in the tree view.
3126    
3127            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
3128            the tree info for classifications. Commented out unnecessary lines.
3129    
3130            * Thuban/Model/classification.py (Classification.TreeInfo): New
3131            function to add information about the classification into the
3132            tree view.
3133    
3134    2003-01-27  Jan-Oliver Wagner <[email protected]>
3135    
3136            * Thuban/__init__.py (_): New.
3137    
3138            * Thuban/Model/classification.py, Thuban/Model/extension.py,
3139            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
3140            Thuban/Model/session.py, Thuban/UI/application.py,
3141            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
3142            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
3143            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
3144            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
3145            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
3146    
3147    2003-01-27  Jonathan Coles  <[email protected]>
3148    
3149            * Thuban/Model/layer.py: Classification initialization calls.
3150    
3151            * Thuban/Model/classification.py: Created class to encapsulate
3152            a layer classification. Supports specific data points and
3153            ranges.
3154    
3155            * Thuban/Model/load.py: Added support for loading classification
3156            information.
3157    
3158            * Thuban/Model/save.py: Added support for saving classification
3159            information.
3160    
3161            * Thuban/UI/classifier.py: Initial class for a dialog box for
3162            specifying classification information.
3163    
3164            * Thuban/UI/mainwindows.py: Support for opening the classifier
3165            dialog.
3166    
3167            * Thuban/UI/renderer.py: Support for drawing a layer with the
3168            classification information.
3169    
3170            * Data/iceland_sample_class.thuban: iceland_sample with
3171            classification data.
3172    
3173            * test/test_classification: Tests for the Classification class.
3174    
3175    2002-12-09  Bernhard Herzog  <[email protected]>
3176    
3177            * test/test_command.py: New. Tests for the command classes.
3178    
3179            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
3180            (Command.IsTool): New method to distinguish between command
3181            switching tools and other commands.
3182    
3183            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
3184            the tool to avoid direct assignments to instance variables
3185            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
3186            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
3187            change the tool
3188    
3189            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
3190            active tool's command turns insensitive, disable the tool.
3191            (_tool_command): Use the new ToolCommand class
3192    
3193            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
3194            SelectTool method to change the tool
3195            (iconfile): Use the ToolCommand class
3196    
3197    2002-12-03  Bernhard Herzog  <[email protected]>
3198    
3199            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
3200            the case of selected items that are not children of Layers or Maps
3201            properly. Previously this bug would trigger an assertion in
3202            wxWindows.
3203    
3204    2002-11-06  Frank Koormann  <[email protected]>
3205    
3206            * Thuban/UI/mainwindow.py: Altered the order of tools in the
3207            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
3208            Full Extent).
3209    
3210    2002-10-23  Bernhard Herzog  <[email protected]>
3211    
3212            * setup.py (setup call): version now 0.1.3
3213    
3214            * MANIFEST.in: Add the files in test/
3215    
3216            * test/README: Add note about tests requiring the iceland data
3217    
3218            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
3219            copyright notice.
3220    
3221    2002-10-18  Bernhard Herzog  <[email protected]>
3222    
3223            * test/test_map.py
3224            (TestMapWithContents.test_projected_bounding_box): Use an explicit
3225            epsilon.
3226    
3227            * test/support.py (FloatComparisonMixin.assertFloatEqual)
3228            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
3229            message if the assertion fails and don't return the return value
3230            of self.assert_. In assertFloatSeqEqual the return meant that not
3231            all items of the sequence were compared.
3232    
3233    2002-09-20  Bernhard Herzog  <[email protected]>
3234    
3235            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
3236    
3237            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
3238    
3239            * test/test_map.py (TestMapWithContents.test_tree_info): Create
3240            the string with the bounding box on the fly because of platform
3241            differences in the way %g is handled.
3242    
3243            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
3244            DBFfile too because Thuban layers can't yet cope missing DBF
3245            files.
3246    
3247    2002-09-20  Bernhard Herzog  <[email protected]>
3248    
3249            * test/test_menu.py: Use initthuban instead of
3250            add_thuban_dir_to_path to initialize Thuban.
3251    
3252            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
3253            Mixin class for float comparisons
3254            (SubscriberMixin): New. Mixin class to test messages sent through
3255            the Connector class
3256    
3257            * test/README: Fix a typo and add the -v flag to the command for
3258            individual tests
3259    
3260            * test/test_session.py: New. Test cases for Thuban.Model.session
3261    
3262            * test/test_proj.py: New. Test cases for Thuban.Model.proj
3263    
3264            * test/test_map.py: New. Test cases for Thuban.Model.map
3265    
3266            * test/test_layer.py: New. Test cases for Thuban.Model.layer
3267    
3268            * test/test_label.py: New. Test cases for Thuban.Model.label
3269    
3270            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
3271    
3272            * test/test_color.py: New. Test cases for Thuban.Model.color
3273    
3274            * test/test_base.py: New. Test cases for Thuban.Model.base
3275    
3276    2002-09-13  Bernhard Herzog  <[email protected]>
3277    
3278            * Thuban/Model/session.py (Session.forwarded_channels): Forward
3279            the CHANGED channel too.
3280    
3281            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
3282            CHANGED channel too.
3283            (Map.__init__): Call the Modifiable constructor as well.
3284    
3285            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
3286            event if the modified flag changes.
3287            (Modifiable.changed): Tweak the doc-string.
3288    
3289            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
3290            (MainWindow.set_position_text): Put the code that puts the text
3291            with the mouse position into the status bar into the new method
3292            set_position_text so that it can overwritten in derived classes.
3293    
3294    2002-09-12  Bernhard Herzog  <[email protected]>
3295    
3296            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
3297            message box on the main window.
3298    
3299    2002-09-11  Bernhard Herzog  <[email protected]>
3300    
3301            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
3302            the 'E' because it's less likely to interfere with other menu
3303            entries.
3304            (MainWindow.build_menu): remove an incorrect comment.
3305    
3306    2002-09-10  Bernhard Herzog  <[email protected]>
3307    
3308            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
3309            (_tool_command): Add sensitive parameter
3310            (_has_visible_map): Sensitivity callback to tools and other
3311            commands that require a visible map. Use it in map_zoom_in_tool,
3312            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
3313            and map_full_extent
3314    
3315    2002-09-06  Bernhard Herzog  <[email protected]>
3316    
3317            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
3318            VIEW_POSITION
3319    
3320    2002-09-04  Frank Koormann  <[email protected]>
3321    
3322            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
3323    
3324    2002-09-02  Bernhard Herzog  <[email protected]>
3325    
3326            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
3327            wxWindows already and our implementation doesn't work correctly
3328            with wxGTK 2.3:
3329            (MapCanvas.__init__): Remove the instance variable
3330            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
3331            be drawin
3332            (MapCanvas.OnIdle): Removed.
3333    
3334            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
3335            a parameter to determine the size of the rectangle.
3336            (MapCanvas.find_shape_at): Create the box around the point on a
3337            layer by layer basis and make the size depend on the shape type.
3338            This solves a problem with the selection of point shapes at the
3339            border of the layer's bounding box
3340    
3341    2002-08-30  Bernhard Herzog  <[email protected]>
3342    
3343            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
3344            for the sensitivity  of remove layer.
3345            (_can_remove_layer): New. Sensitivity callback for remove layer
3346            (Command layer_remove): Use _can_remove_layer
3347    
3348            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
3349            determine whether a given layer can be deleted.
3350    
3351            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
3352            (MapCanvas.do_redraw): Get rid of the unused update_region
3353            instance variable
3354    
3355            * Thuban/UI/view.py: Add/update some doc-strings.
3356    
3357            * test/: new subdirectory with a bunch of unit tests.
3358    
3359            * test/README, test/test_table.py, test/test_save.py,
3360            test/test_menu.py, test/test_load.py: Initial set of tests and
3361            brief instructions on how to run them
3362    
3363    2002-08-29  Bernhard Herzog  <[email protected]>
3364    
3365            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
3366            arcs with multiple parts.
3367    
3368            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
3369            Handle degenrate rectangles.
3370    
3371            * Thuban/Model/table.py: Make writing records work correctly:
3372            (Table.__init__): Keep track of whether the DBF is open for
3373            writing
3374            (Table.write_record): Open the DBF file for writing when necessary
3375    
3376    2002-08-27  Bernhard Herzog  <[email protected]>
3377    
3378            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
3379            dbf files only for reading by default. Use a new writable dbf
3380            object for writing.
3381    
3382    2002-08-26  Bernhard Herzog  <[email protected]>
3383    
3384            * Thuban/UI/mainwindow.py: Refactor the context creation:
3385            (MainWindow.Context): New method to return a context
3386            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
3387            new method
3388    
3389            * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
3390            layer table specific code from TableGrid into LayerTableGrid
3391            (TableFrame, LayerTableFrame): Split the layer table specific code
3392            from TableFrame into LayerTableFrame
3393            (LayerTableGrid.select_shape): Remove a debug print
3394    
3395            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
3396            LayerTableFrame
3397    
3398    2002-08-23  Bernhard Herzog  <[email protected]>
3399    
3400            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
3401            absolute filename.
3402    
3403    2002-08-22  Bernhard Herzog  <[email protected]>
3404    
3405            * Thuban/Model/table.py (Table.write_record): New method to write
3406            records.
3407            (Table.__init__): Open the DBF file for writing too.
3408    
3409            * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
3410            into the underlying table.
3411    
3412            * extensions/shapelib/shapefil.h (DBFCommit),
3413            extensions/shapelib/dbfopen.c (DBFCommit): New API function to
3414            commit any changes made to the DBF file.
3415    
3416            * Thuban/UI/mainwindow.py (make_check_current_tool)
3417            (_tool_command): Put the code that generates the "checked"
3418            callback into a separate function so that we can reuse it
3419            elsewhere
3420    
3421            * Thuban/Model/save.py (Saver): New class to handle serializing a
3422            session into an XML file. The main reason to introduce a class is
3423            that applications built on Thuban can derive from it so that they
3424            can save additional information in a session file.
3425            (save_session): Delegate almost all the work to the Saver class.
3426            Rename the filename argument to file because it may be a file like
3427            object now.
3428    
3429            * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
3430            code. Remove the little test code which would be executed when the
3431            module is run as a script which didn't work anymore since it can't
3432            import the other Thuban modules.
3433            (ProcessSession, load_session): Refactor the ProcessSession to
3434            have one method for each element start and end tag so that derived
3435            classes can easily override the processing of individual tags.
3436            Also, always parse with namespaces enabled because applications
3437            built on top of Thuban will likely use namespaces if they extend
3438            the session file format.
3439    
3440    2002-08-21  Bernhard Herzog  <[email protected]>
3441    
3442            * setup.py (ThubanInstall.run): Don't repr install_lib_orig
3443            because thubaninit_contents will do it for us.
3444    
3445    2002-08-16  Jan-Oliver Wagner <[email protected]>
3446    
3447            * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
3448            tree window already open
3449    
3450    2002-08-15  Bernhard Herzog  <[email protected]>
3451    
3452            * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
3453            with self.
3454    
3455            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
3456            when we have actually captured it.
3457    
3458            * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
3459            shapefile and destroy the table.
3460    
3461            * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
3462    
3463    2002-08-14  Bernhard Herzog  <[email protected]>
3464    
3465            * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
3466            instance variable columns
3467            (RecordTable.GetTypeName): row and col may be negative in some
3468            cases.
3469    
3470            * setup.py (InstallLocal.initialize_options)
3471            (InstallLocal.finalize_options, InstallLocal.user_options): New
3472            option create-init-file to build a thubaninit.py when running
3473            install_local
3474            (InstallLocal.run): Create the thubaninit.py module when requested
3475            (thubaninit_contents): Split the template into several parts and
3476            create a new function thubaninit_contents that creates the
3477            contents of a thubaninit module.
3478            (ThubanInstall.run): Use the new function to create the thubaninit
3479            module.
3480    
3481    2002-07-30  Bernhard Herzog  <[email protected]>
3482    
3483            * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
3484            cleanup.
3485            (ThubanApplication.MainLoop): Extend to automatically call OnExit.
3486    
3487            * Thuban/Model/session.py (Session.Destroy): Don't bypass the
3488            direct base class' Destroy method.
3489    
3490            * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
3491            layers.
3492            (Map.Destroy): Destroy the label_layer as well and call the
3493            inherited Desatroymethod first so that no more messages are
3494            issued.
3495            (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
3496            message if the stacking order actually has changed. Add
3497            doc-strings.
3498            (Map.BoundingBox): Correct the doc-string.
3499            (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
3500            (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
3501    
3502            * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
3503            all labels.
3504    
3505    2002-07-29  Bernhard Herzog  <[email protected]>
3506    
3507            * Thuban/Model/map.py (Map.subscribe_layer_channels)
3508            (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
3509            to a layer's channels into separate methods.
3510            (Map.RemoveLayer, Map.AddLayer): Call the new methods
3511            (Map.Destroy): Unsubscribe from a layer's channels before
3512            destroying it.
3513    
3514            * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
3515            selected_layer parameter to searched_layer which is the layer to
3516            search in.
3517            (MapCanvas.SelectShapeAt): New parameter layer to restrict the
3518            search to that layer. Return the selected layer and shape.
3519    
3520            * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
3521            typo
3522    
3523    2002-07-24  Bernhard Herzog  <[email protected]>
3524    
3525            * Thuban/UI/application.py (ThubanApplication.create_session):
3526            Extend the doc string.
3527            (ThubanApplication.subscribe_session)
3528            (ThubanApplication.unsubscribe_session): New methods to
3529            subscribe/unsubscribe to/from session channels.
3530            (ThubanApplication.SetSession): Call the new methods here.
3531            (ThubanApplication.maps_changed, ThubanApplication.set_map):
3532            Renamed set_map to maps_changed. Its now a subscriber for
3533            MAPS_CHANGED.
3534    
3535            * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
3536            x-coordinate in case of simple clicks
3537    
3538            * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
3539            don't pass it as a parameter
3540    
3541            * Thuban/Model/session.py (Session.RemoveMap): New
3542    
3543            * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
3544            window size into a parameter.
3545    
3546    2002-07-23  Bernhard Herzog  <[email protected]>
3547    
3548            * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
3549            just commands.
3550    
3551            * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
3552            parameter list a bit to allow setting the window title and the
3553            initial message in the status bar. Update the callers.
3554    
3555            * Thuban/UI/application.py (ThubanApplication.OnInit)
3556            (ThubanApplication.CreateMainWindow): Put the mainwindow
3557            instantiation into a separate method so that it can be overridden
3558            by a subclass.
3559    
3560    2002-07-19  Bernhard Herzog  <[email protected]>
3561    
3562            * Thuban/Model/session.py: Issue a CHANGED message every time
3563            another changed message is issued to make it easier to get
3564            notified of changes.
3565            (Session): Update the doc string
3566            (Session.forward): Issue changed-events as CHANGED as well.
3567            (Session.changed): Overwrite the inherited version to issue
3568            CHANGED events as well.
3569    
3570            * Thuban/UI/tree.py: We can now simply subscribe to the session's
3571            CHANGED channel to be informed of changes.
3572            (SessionTreeCtrl.session_channels): Not needed any longer.
3573            (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
3574            Only have to (un)subscribe CHANGED
3575    
3576            * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
3577    
3578            * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
3579            for the wxPython locale bug to __init__.py so that it's
3580            automatically executed by anybody using UI code from Thuban.
3581    
3582    2002-07-18  Bernhard Herzog  <[email protected]>
3583    
3584            * Thuban/UI/main.py (main): app no longer needs to be global
3585    
3586            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
3587            as parameter and store it in an instance variable
3588            (MainWindow.invoke_command, MainWindow.update_command_ui)
3589            (MainWindow.save_modified_session, MainWindow.NewSession)
3590            (MainWindow.OpenSession, MainWindow.SaveSession)
3591            (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
3592            application object.
3593    
3594            * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
3595            the main window with self.
3596    
3597            * Thuban/UI/context.py: New module with the context class
3598    
3599            * Thuban/UI/command.py (Command): Update doc string.
3600    
3601            * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
3602            MainWindow.update_command_ui): Pass an instance of the context
3603            class to the command's methods
3604            (check_current_tool, call_method): Handle the new context
3605            implementation
3606    
3607            * Examples/simple_extensions/simple_tool.py (simple_tool,
3608            check_simple_tool): Handle the new context implementation
3609    
3610            * Examples/simple_extensions/simple_command.py (simple_command):
3611            Handle the new context implementation. Update the comments about
3612            the context.
3613    
3614            * Thuban/UI/application.py (ThubanApplication.SetSession): Add
3615            doc-string
3616            (ThubanApplication.Session): New method to return the session
3617            object
3618    
3619            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
3620            interactor's selected_layer may not be a layer of the current
3621            session when the tree is updated while a new session is being set.
3622    
3623    2002-07-17  Bernhard Herzog  <[email protected]>
3624    
3625            * Thuban/UI/tree.py (color_string): Removed. No longer used.
3626            (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
3627            update_tree into update_tree and add_items. The tree now uses a
3628            more generic way to display the contents of the tree.
3629            (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
3630    
3631            * Thuban/Model/layer.py (Layer.TreeInfo),
3632            Thuban/Model/extension.py (Extension.TreeInfo),
3633            Thuban/Model/map.py (Map.TreeInfo),
3634            Thuban/Model/session.py (Session.TreeInfo):
3635            Add TreeInfo methods to implement the new tree view update scheme
3636    
3637    2002-07-16  Bernhard Herzog  <[email protected]>
3638    
3639            * Thuban/UI/application.py: Don't use "import from" for the
3640            MainWindow. It can't always be resolved.
3641            (ThubanApplication.OnInit): change reference to MainWindow
3642            accordingly.
3643    
3644            * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
3645            completely
3646    
3647    2002-07-10  Bernhard Herzog  <[email protected]>
3648    
3649            * setup.py (create_init_module): New configurable variable whose
3650            default depends on the platform we're running on.
3651            (ThubanInstall.initialize_options): Initialize
3652            self.create_init_module from the global create_init_module
3653            (ThubanInstall.user_options): indictate that the options
3654            create-init-module and init-module-dir have arguments.
3655    
3656            * setup.py: In the setup call change the version number to include
3657            cvs.
3658    
3659            * MANIFEST.in: Add the files in Examples
3660    
3661  2002-07-09  Bernhard Herzog  <[email protected]>  2002-07-09  Bernhard Herzog  <[email protected]>
3662    
3663            * setup.py: In the setup call, use the thuban homepage as the
3664            value of the url parameter.
3665    
3666          * Examples: New subdirectory for examples.          * Examples: New subdirectory for examples.
3667    
3668          * Examples/simple_extensions/simple_tool.xpm,          * Examples/simple_extensions/simple_tool.xpm,
# Line 49  Line 3712 
3712          * setup.py: In the setup call, make sure that the library          * setup.py: In the setup call, make sure that the library
3713          directories are under $prefix/lib not directly under $prefix.          directories are under $prefix/lib not directly under $prefix.
3714    
3715  2002-06-20      Jan-Oliver Wagner <[email protected]>  2002-06-20  Jan-Oliver Wagner <[email protected]>
3716    
3717          * Thuban/Model/extension.py: new module to handle extension objects.          * Thuban/Model/extension.py: new module to handle extension objects.
3718          * Thuban/Model/messages.py: new messages for extensions.          * Thuban/Model/messages.py: new messages for extensions.
# Line 278  Line 3941 
3941          * Thuban/UI/messages.py (VIEW_POSITION): New message for the          * Thuban/UI/messages.py (VIEW_POSITION): New message for the
3942          position in the statusbar          position in the statusbar
3943    
3944  2002-04-26      Frank Koormann <[email protected]>  2002-04-26  Frank Koormann <[email protected]>
3945    
3946          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
3947    
3948  2002-04-24      Frank Koormann <[email protected]>  2002-04-24  Frank Koormann <[email protected]>
3949            
3950          * Resources/Bitmaps/identify.xpm: shadow added          * Resources/Bitmaps/identify.xpm: shadow added
3951    
3952          * Resources/Bitmaps/fullextent.xpm: new          * Resources/Bitmaps/fullextent.xpm: new
           
 2002-04-22      Jan-Oliver Wagner <[email protected]>  
3953    
3954          * Thuban/UI/tree.py (update_tree): added test for None on map bounding box  2002-04-22  Jan-Oliver Wagner <[email protected]>
3955    
3956  2002-04-21      Jan-Oliver Wagner <[email protected]>          * Thuban/UI/tree.py (update_tree): added test for None on map bounding
3957            box
3958    
3959    2002-04-21  Jan-Oliver Wagner <[email protected]>
3960    
3961          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
3962    
3963          * Thuban/UI/tree.py (update_tree): added added map extent          * Thuban/UI/tree.py (update_tree): added added map extent
3964    
3965          * Thuban/UI/mainwindow.py (_method_command): extended by parameter          * Thuban/UI/mainwindow.py (_method_command): extended by parameter
3966          icon; added map_full_extend as tool          icon; added map_full_extend as tool
3967    
3968  2002-04-19      Jan-Oliver Wagner <[email protected]>  2002-04-19  Jan-Oliver Wagner <[email protected]>
3969    
3970          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
3971          saving _new_ sessions          saving _new_ sessions
# Line 403  Line 4067 
4067    
4068          * setup.py: increase version number to 0.1          * setup.py: increase version number to 0.1
4069          (data_dist): New command class for data distribution          (data_dist): New command class for data distribution
           
4070    
4071  2001-09-14  Bernhard Herzog  <[email protected]>  2001-09-14  Bernhard Herzog  <[email protected]>
4072    
4073          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
4074          Handle the case of no layer (i.e. layer is None) properly.          Handle the case of no layer (i.e. layer is None) properly.
4075    
4076          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
4077          Set the initial selection of the combo boxes to reflect the          Set the initial selection of the combo boxes to reflect the
4078          projection we're starting with in a way that works on windows,          projection we're starting with in a way that works on windows,
4079          too.          too.
# Line 520  Line 4183 
4183          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
4184          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
4185    
4186          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
4187          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
4188          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
4189          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
4190          the application's OnInit method          the application's OnInit method
# Line 537  Line 4200 
4200          layer to the tableview dialog.          layer to the tableview dialog.
4201    
4202          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
4203          (TableGrid):          (TableGrid):
4204          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
4205          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
4206          (TableFrame.__init__):          (TableFrame.__init__):
# Line 604  Line 4267 
4267  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
4268    
4269          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
4270            
4271          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
4272          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
4273            
4274          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
4275          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
4276          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 654  Line 4317 
4317          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
4318          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
4319          link_file method          link_file method
4320            
4321          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
4322          the window when the first layer is added to the map.          the window when the first layer is added to the map.
4323    
# Line 691  Line 4354 
4354          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
4355          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
4356          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
4357            
4358          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
4359          installer          installer
4360    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26