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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1114 - (hide annotations)
Fri May 30 15:59:58 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 168988 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26