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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 867 - (hide annotations)
Thu May 8 13:42:36 2003 UTC (21 years, 10 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 129558 byte(s)
Bugfix

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26