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

Legend:
Removed from v.263  
changed lines
  Added in v.1087

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26