/[thuban]/branches/WIP-pyshapelib-bramz/ChangeLog
ViewVC logotype

Annotation of /branches/WIP-pyshapelib-bramz/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1097 - (hide annotations)
Thu May 29 10:03:30 2003 UTC (21 years, 9 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 165479 byte(s)
a bugfix in tableview.

1 jan 1097 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 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
7    
8 bh 1095 * 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 bh 1093 * 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 bh 1089 * 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 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
30 jan 1085
31 jan 1087 * 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 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
37     sort the selection list for the dialog.
38    
39 frank 1083 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 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
47    
48 bh 1081 * 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 bh 1079 * 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 frank 1077 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 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
65    
66 bh 1075 * 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 bh 1073 * 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 bh 1071 * 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 bh 1069 * 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 frank 1065 2003-05-27 Frank Koormann <[email protected]>
129    
130 frank 1067 * 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 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
136    
137     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
138    
139 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
140    
141 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
142     Menu.RemoveItem().
143 jan 1062
144 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
145     the menu.
146 jan 1062
147 frank 1059 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 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
167    
168 bh 1055 * 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 bh 1053 * 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 frank 1051 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 jan 1048 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 frank 1046 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 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
211    
212 bh 1044 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 bh 1038 * 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 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
245     New. test case for OpenTableFile
246    
247 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
248    
249 jan 1035 * 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 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
257     already a selection present, update the grid accordingly.
258 jan 1033
259     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
260     resizeable and increase its initial size.
261    
262 frank 1030 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 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
285    
286 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
287     Use QueryTableFrame instead of TableFrame.
288 jan 1021
289 jan 1024 * 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 jan 1021 * 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 bh 1017 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 jan 1015 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 frank 1011 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 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
341    
342 bh 1008 * 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 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
349     the wxMessageDialog's Destroy() method.
350    
351 frank 1004 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 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
370    
371 bh 999 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 bh 997 * 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 bh 995 * 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 tkoester 993 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 frank 992 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 bh 988 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 tkoester 986 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 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
452    
453 bh 985 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 bh 983 * 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 frank 981 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 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
542 jonathan 971
543 jonathan 975 * 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 jonathan 971 * 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 bh 958 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 jan 955 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 frank 952 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 jonathan 949 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 frank 924 2003-05-19 Frank Koormann <[email protected]>
732    
733 frank 927 * 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 frank 924 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 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
749    
750 bh 921 * 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 bh 919 * 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 frank 917 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 bh 908 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 jonathan 906 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 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
828    
829 jonathan 899 * 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 jonathan 897 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 frank 893 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 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
857    
858 jonathan 897 * 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 jonathan 889 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 frank 872 2003-05-09 Frank Koormann <[email protected]>
952    
953     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
954    
955 frank 860 2003-05-08 Frank Koormann <[email protected]>
956    
957 frank 870 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 frank 867 * Thuban/UI/scalebar.py
966     (ScaleBar.DrawScalebar): Format string bug fixed.
967    
968     2003-05-08 Frank Koormann <[email protected]>
969    
970 frank 865 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 frank 860 * 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 frank 857 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 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
1008    
1009 bh 852 * 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 bh 850 * 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 frank 848 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 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
1044    
1045 bh 846 * 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 bh 843 * 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 bh 840 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 jonathan 833 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 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
1168    
1169     * Resources/Projections/defaults.proj: Fix spelling of Mercator
1170    
1171 jonathan 823 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 bh 819 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 jonathan 817 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 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
1270    
1271 bh 811 * 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 bh 809 * 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 jan 807 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 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
1300    
1301 jonathan 803 * 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 jonathan 793 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 jan 792 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 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
1358    
1359 bh 790 * Thuban/UI/view.py: Fix some typos.
1360    
1361 bh 788 * 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 bh 786 * 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 jonathan 793 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 bh 779 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 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
1399    
1400 jonathan 769 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 jonathan 776 "true". Addresses RTbug #1025.
1403 jonathan 769
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 jonathan 767 * 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 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
1431    
1432 bh 766 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 bh 764 * 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 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
1484 jonathan 735
1485 jonathan 762 * 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 jonathan 756 * 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 jonathan 753 * 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 jonathan 748 * 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 jonathan 743 * 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 jonathan 735 * 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 bh 734 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 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
1607 jonathan 724
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 bh 723 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 jonathan 721 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 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
1717    
1718 jonathan 720 * 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 jonathan 716 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 jonathan 715 * 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 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
1796    
1797 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
1798     constants
1799    
1800 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
1801     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
1802    
1803 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
1804    
1805 bh 701 * 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 bh 700 * 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 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
1817    
1818 jonathan 693 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 jonathan 688 * 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 bh 687 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 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
1880    
1881 jonathan 680 * 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 jonathan 673 * 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 jonathan 674 drawing initialization call to draw_polygon_init()
1907     (MapRenderer.draw_polygon_shape): Use new signature of
1908     draw_polygon_shape.
1909 jonathan 673
1910 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
1911     weirdness by setting the range to (1, maxint).
1912 jonathan 673
1913 jonathan 674 * 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 jonathan 673
1919 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
1920    
1921 bh 672 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 jonathan 669 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 frank 664 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 jonathan 662 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 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
1985    
1986 jonathan 662 * 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 jonathan 647 * 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 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
2025 jonathan 647 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 jonathan 646
2034 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
2035    
2036 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
2037     Should pass group to ClassGroup constructor.
2038    
2039     2003-04-10 Jonathan Coles <[email protected]>
2040    
2041 jonathan 636 * 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 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
2069    
2070 jonathan 634 * 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 jonathan 626 * 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 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
2117    
2118 bh 625 * 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 bh 623 * 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 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
2144    
2145 jonathan 619 * 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 jonathan 612 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 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
2197 jonathan 608
2198 jonathan 612 * 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 jonathan 608 * 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 jonathan 603
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 jonathan 601
2224 jonathan 603 * 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 jonathan 601
2260 bh 600 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 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
2285    
2286 bh 595 * 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 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2291     sure the filename is absolute to avoid problems when saving the
2292     session again
2293    
2294 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
2295    
2296 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
2297    
2298 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
2299 jonathan 587 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 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
2304    
2305     * test/test_map.py: Don't use from <module> import *
2306    
2307 jonathan 581 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 jonathan 575 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 jonathan 569 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 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
2365    
2366 jonathan 567 * 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 jonathan 557 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 jonathan 554 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 jonathan 552 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 jonathan 541 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 bh 538 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 jonathan 527 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 jan 523 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 jonathan 514 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 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
2625    
2626 jonathan 505 * 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 jonathan 499 * 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 jonathan 497 * 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 jonathan 495 * 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 jonathan 490 * 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 jonathan 483 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 jonathan 478 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 bh 477 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 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
2737    
2738 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
2739 jonathan 471
2740 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
2741 jonathan 471
2742 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
2743 jonathan 471
2744 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
2745 jonathan 471
2746     2003-03-05 Jonathan Coles <[email protected]>
2747    
2748 jonathan 459 * 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 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
2787    
2788 bh 458 * 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 bh 456 * 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 jonathan 448 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 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
2828 jonathan 434
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 jonathan 445 functions. Fix to create a tuple with a single value instead of
2851     simply returning the value.
2852 jonathan 434
2853     * Thuban/UI/renderer.py: Use new Classification and Group functions.
2854     Use common.py functions.
2855    
2856 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
2857 jonathan 447
2858     * test/test_classification.py: Use new Classification and Group
2859     classes.
2860 jonathan 434
2861 jonathan 426 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 bh 425 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 frank 423 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 jonathan 408 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 bh 405 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 bh 402 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 jonathan 399 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 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
2990    
2991 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
2992 jonathan 396 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 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
3005 jonathan 396 SetDefault*() methods on the layer's classification object.
3006 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
3007 jonathan 396 Classification class.
3008    
3009     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
3010     object instead of a dictionary.
3011    
3012 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
3013 jonathan 396 draw the classifications in the dialog box's table.
3014     (Classifier): Modified to use the ClassRenderer class.
3015    
3016 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
3017     methods of the Classification class.
3018 jonathan 396
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 jonathan 387 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 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
3038    
3039 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
3040 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
3041 jonathan 380 classification data.
3042    
3043 jonathan 384 * 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 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
3054 jan 375
3055 tkoester 403 * Thuban/__init__.py (_): New.
3056 jan 375
3057     * Thuban/Model/classification.py, Thuban/Model/extension.py,
3058     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
3059 tkoester 403 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 jan 375
3066 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
3067    
3068 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
3069 jonathan 370
3070 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
3071     a layer classification. Supports specific data points and
3072     ranges.
3073 jonathan 370
3074 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
3075     information.
3076 jonathan 370
3077 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
3078     information.
3079 jonathan 370
3080 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
3081     specifying classification information.
3082 jonathan 370
3083 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
3084     dialog.
3085 jonathan 370
3086 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
3087     classification information.
3088 jonathan 370
3089 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
3090     classification data.
3091 jonathan 370
3092 tkoester 403 * test/test_classification: Tests for the Classification class.
3093 jonathan 370
3094 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
3095    
3096 bh 361 * test/test_command.py: New. Tests for the command classes.
3097    
3098 bh 359 * 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 bh 354 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 frank 352 2002-11-06 Frank Koormann <[email protected]>
3124    
3125 bh 354 * 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 tkoester 403
3129 bh 349 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 bh 344 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 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
3153    
3154 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
3155    
3156     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
3157    
3158 bh 338 * 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 bh 326 * 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 bh 335 * 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 bh 322 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 bh 317 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 bh 313 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 bh 315 (MainWindow.build_menu): remove an incorrect comment.
3224 bh 313
3225 bh 311 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 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
3235    
3236     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
3237     VIEW_POSITION
3238    
3239 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
3240 frank 306
3241     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
3242    
3243 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
3244    
3245 bh 304 * 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 bh 302 * 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 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
3261    
3262 bh 300 * 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 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
3271     (MapCanvas.do_redraw): Get rid of the unused update_region
3272     instance variable
3273    
3274 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
3275    
3276 bh 292 * 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 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
3283    
3284 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
3285     arcs with multiple parts.
3286    
3287 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
3288     Handle degenrate rectangles.
3289    
3290 bh 287 * 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 bh 285 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 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
3302    
3303 bh 282 * 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 bh 278 * 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 bh 280 (LayerTableGrid.select_shape): Remove a debug print
3313 bh 278
3314     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
3315     LayerTableFrame
3316    
3317 bh 277 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 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
3323    
3324 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
3325     records.
3326 tkoester 403 (Table.__init__): Open the DBF file for writing too.
3327 bh 275
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 bh 271 * 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 bh 269 * 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 bh 266 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 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
3365 jan 265
3366     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
3367     tree window already open
3368    
3369 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
3370    
3371 bh 263 * 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 bh 259 * 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 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
3383    
3384 bh 256 * 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 bh 254 * 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 bh 252 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 bh 247 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 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
3443    
3444 bh 243 * 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 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
3463     window size into a parameter.
3464    
3465 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
3466    
3467 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
3468     just commands.
3469    
3470 bh 235 * 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 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
3480    
3481 bh 234 * 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 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
3493 bh 234 Only have to (un)subscribe CHANGED
3494    
3495     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
3496    
3497 bh 230 * 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 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
3502    
3503 bh 228 * 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 bh 225 * 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 bh 217 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 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
3554 bh 217 Add TreeInfo methods to implement the new tree view update scheme
3555    
3556 bh 216 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 bh 213 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 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
3581    
3582 bh 210 * setup.py: In the setup call, use the thuban homepage as the
3583     value of the url parameter.
3584    
3585 bh 208 * 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 bh 207 * 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 bh 205 * 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 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
3613    
3614 bh 205 * 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 bh 202 * 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 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
3635 jan 199
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 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
3645    
3646     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
3647 bh 202 the events for a command.
3648 bh 194 (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 bh 190 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 bh 192 * 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 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
3676    
3677 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
3678     layer_outline_color. Fix it in the definition of the command too.
3679    
3680 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
3681    
3682 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
3683    
3684     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
3685     in the docstring
3686    
3687 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
3688    
3689 bh 180 * 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 bh 175 * 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 bh 172 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 bh 165 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 bh 163 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 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
3739    
3740 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
3741     the file to have a .thuban extension.
3742    
3743 bh 152 * 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 bh 146 * 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 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
3807    
3808 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
3809     MainWindow.OpenSession): Change the file extension of the session
3810     files to .thuban
3811    
3812 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
3813     Move the map channels to be forwarded by the session into the
3814 bh 146 class constant with forwarded_channels. Also add
3815     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
3816     forwarded_channels
3817 bh 129
3818     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
3819     typo and some rewording).
3820    
3821 bh 126 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 bh 124 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 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
3864 frank 120
3865     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
3866    
3867 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
3868    
3869 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
3870    
3871     * Resources/Bitmaps/fullextent.xpm: new
3872 jan 116
3873 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
3874 jan 116
3875 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
3876     box
3877 jan 114
3878 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
3879    
3880 jan 114 * 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 tkoester 403 icon; added map_full_extend as tool
3886 jan 114
3887 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
3888 jan 107
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 bh 100 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 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
3920    
3921 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
3922     initialize_options to create the scripts for the rpm.
3923    
3924 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
3925    
3926 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
3927    
3928 bh 87 * setup.py: Increment version to 0.1.1
3929    
3930 bh 85 * 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 bh 83 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 bh 81 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 bh 72 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 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
3977    
3978     * setup.py (data_dist.make_distribution): Fix some typos
3979    
3980 bh 70 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 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
3991    
3992 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
3993     Handle the case of no layer (i.e. layer is None) properly.
3994    
3995 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
3996 bh 70 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 bh 64 * 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 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
4008    
4009 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
4010     deselect the layer if no layer is selected
4011    
4012 bh 59 * 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 bh 64 (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 bh 59
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 bh 55 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 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
4051    
4052 bh 53 * 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 bh 48 * 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 bh 44 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 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
4080     height do nothing (avoids zero division errors)
4081 bh 44
4082 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
4083    
4084 bh 42 * 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 bh 40 * 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 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
4106     * Thuban/UI/application.py (ThubanApplication.OnInit):
4107 bh 40 * 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 bh 35 * 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 tkoester 403 (TableGrid):
4123 bh 35 (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 bh 32 * 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 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
4187    
4188     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
4189 tkoester 403
4190 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
4191     interactor to pass through to the MapCanvas
4192 tkoester 403
4193 bh 26 * 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 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
4199    
4200 bh 22 * 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 bh 19 * 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 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
4227    
4228 bh 19 * 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 tkoester 403
4240 bh 18 * 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 bh 16 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 tkoester 403
4277 bh 16 * 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 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
4294    
4295 bh 9 * setup.py: Fix some doc strings
4296    
4297 bh 7 * ChangeLog: started
4298    

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26