/[thuban]/branches/greater-ms3/thuban/ChangeLog
ViewVC logotype

Annotation of /branches/greater-ms3/thuban/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log


Revision 917 - (hide annotations)
Fri May 16 16:26:57 2003 UTC (21 years, 9 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 137134 byte(s)
Printing enhancement and WMF export (under Win32)

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26