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

Legend:
Removed from v.217  
changed lines
  Added in v.848

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26