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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 843 - (hide annotations)
Tue May 6 17:13:15 2003 UTC (21 years, 10 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 126443 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26