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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1141 - (hide annotations)
Fri Jun 6 11:19:25 2003 UTC (21 years, 9 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 172949 byte(s)
improved menu help texts

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26