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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 833 - (hide annotations)
Tue May 6 12:07:44 2003 UTC (21 years, 10 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 123304 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26