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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 826 - (hide annotations)
Tue May 6 08:24:23 2003 UTC (21 years, 10 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 121970 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26