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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1147 - (hide annotations)
Tue Jun 10 12:00:45 2003 UTC (21 years, 8 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 175323 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26