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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1118 - (hide annotations)
Fri May 30 18:31:35 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 169405 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26