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

Legend:
Removed from v.44  
changed lines
  Added in v.1083

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26