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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 848 - (hide annotations)
Wed May 7 07:20:52 2003 UTC (21 years, 10 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 126936 byte(s)
Icon updates.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26