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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 870 - (hide annotations)
Thu May 8 14:06:32 2003 UTC (21 years, 10 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 129748 byte(s)
Coding style updates.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26