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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 983 - (hide annotations)
Thu May 22 12:02:30 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 147372 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26