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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1006 - (hide annotations)
Thu May 22 20:01:54 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 152902 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26