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

Legend:
Removed from v.9  
changed lines
  Added in v.1097

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26