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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1017 - (hide annotations)
Fri May 23 11:06:14 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 154435 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26