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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1067 - (hide annotations)
Tue May 27 14:18:26 2003 UTC (21 years, 9 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 160785 byte(s)
Keyboard navigation update

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26