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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1137 - (hide annotations)
Thu Jun 5 15:06:34 2003 UTC (21 years, 9 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 172610 byte(s)
Projection updates

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26