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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.120  
changed lines
  Added in v.870

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26