/[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 490 by jonathan, Mon Mar 10 10:44:24 2003 UTC revision 826 by bh, Tue May 6 08:24:23 2003 UTC
# Line 1  Line 1 
1    2003-05-06  Bernhard Herzog  <[email protected]>
2    
3            * Resources/Projections/defaults.proj: Fix spelling of Mercator
4    
5    2003-05-05  Jonathan Coles   <[email protected]>
6    
7            Addresses the "Full Layer Extent" wish of RTbug #1787.
8    
9            * Resources/Projections/defaults.proj: Added UK National Grid.
10    
11            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
12            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
13            when the user selects the menu option.
14    
15            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
16            scales the given layer on the canvas using the map projection.
17    
18    2003-05-05  Bernhard Herzog  <[email protected]>
19    
20            Convert the table implementations to a new table interface. All
21            tables use a common mixin class to provide backwards compatibility
22            until all table users have been updated.
23    
24            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
25            provide backwards compatibility for table classes implementing the
26            new interface
27            (DBFTable, MemoryTable): Implement the new table interface. Use
28            OldTableInterfaceMixin as base for compatibility
29            (DBFColumn, MemoryColumn): New. Column description for DBFTable
30            and MemoryTable resp.
31    
32            * test/test_dbf_table.py: New. Test cases for the DBFTable with
33            the new table interface.
34    
35            * test/test_memory_table.py: New. Test cases for the MemoryTable
36            with the new table interface.
37    
38            * test/test_table.py: Document the all tests in this file as only
39            for backwards compatibility. The equivalent tests for the new
40            interface are in test_memory_table.py and test_dbf_table.py
41            (MemoryTableTest.test_read): field_info should be returning tuples
42            with four items
43            (MemoryTableTest.test_write): Make doc-string a more precise.
44    
45            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
46            table interface. Derive from from OldTableInterfaceMixin for
47            compatibility.
48            (TransientTableBase.create): New intance variable column_map to
49            map from names and indices to column objects
50            (TransientTable.create): Use the new table interface of the input
51            table
52            (AutoTransientTable): Convert to new table interface. Derive from
53            from OldTableInterfaceMixin for compatibility.
54            (AutoTransientTable.write_record): Removed. It's not implemented
55            yet and we still have to decide how to handle writing with the new
56            table and data framework.
57    
58            * test/test_transientdb.py
59            (TestTransientTable.run_iceland_political_tests)
60            (TestTransientTable.test_transient_joined_table): Use the new
61            table interface
62    
63    2003-05-05  Jonathan Coles   <[email protected]>
64    
65            This is namely a collection of UI updates to improve user interactivity.
66            Tabbing between controls now exists and you can use ESC to close dialog
67            boxes; ENTER will active the default button.
68    
69            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
70            order that the controls are created so that tabbing works correctly.
71            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
72            wxDialog can handle the default button correctly.
73            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
74            same reasons as for OnOK.
75            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
76            when we ask the table for the maximum/minimum values of a field
77            which could take a very long time.
78    
79            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
80            order that the controls are created so that tabbing works correctly.
81            (SelectPropertiesDialog.__init__): Rearrange the order that the
82            controls are created so that tabbing works correctly.
83    
84            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
85            to derive from a wxDialog but behave like the original implementation
86            which was derived from a wxFrame. wxDialog provides useful key
87            handling functionality like ESC calling OnCancel and ENTER calling
88            OnOK which is lost with wxFrame.
89    
90            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
91            new dialogs.
92    
93            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
94            order that the controls are created so that tabbing works correctly.
95            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
96            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
97            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
98            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
99            can provide the "UK National Grid" as a default projection.
100            (UTMPanel.__init__): Rearrange the order that the controls are
101            created so that tabbing works correctly.
102    
103    2003-05-05  Bernhard Herzog  <[email protected]>
104    
105            * extensions/thuban/wxproj.cpp: Fix some of the comments.
106            (project_point): If a map projection but no layer projection is
107            given, convert degrees to radians before applying the map
108            projection.
109    
110            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
111            (TableGrid.allow_messages): New methods to make it possible to
112            inhibit message sending.
113            (TableGrid.issue): Only send the message if not inhibited.
114            (LayerTableGrid.select_shape): Use the new methods to make sure
115            that no ROW_SELECTED message is sent while we're updating the
116            selected rows to match the selected shapes.
117    
118    2003-05-02  Jan-Oliver Wagner <[email protected]>
119    
120            Implementation of MemoryTable.
121    
122            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
123            implementation that operates on a list of tuples. All of the data
124            are kept in the memory.
125    
126            * test/test_table.py (MemoryTableTest): New.
127    
128            * test/test_transientdb.py (SimpleTable): Removed.
129            (TestTransientTable.test_transient_joined_table,
130            (TestTransientTable.test_transient_table_read_twice): Replaced
131            SimpleTable by MemoryTable.
132    
133    2003-04-30  Jonathan Coles   <[email protected]>
134    
135            * Data/iceland_sample.thuban: Now contains correct projections
136            for each of the layers.
137    
138            * Resources/Projections/defaults.proj: Geographic projection
139            contains unit conversion parameter.
140    
141    2003-04-30  Jonathan Coles   <[email protected]>
142    
143            The most important part of this putback is the projection changes.
144            It should now be possible to specify the projection that a layer
145            is in and then specify a different projection for the map. The
146            projection dialog has an extra parameter for a geographic projection
147            which lets the user select if the input is in degrees or radians.
148    
149            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
150            to say that the parameter is a tuple of unprojected
151            points (which is what the callers to this method were assuming).
152            Also, since the points are unprojected we need to projected them.
153    
154            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
155            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
156            groups are selected, move the layer up/down. Fixes RTbug #1833.
157    
158            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
159    
160            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
161            parameter in call to SetClientData.
162            (GeoPanel): Add support for selecting the units that the
163            source data is in (Radians or Degrees).
164    
165            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
166            the rendering loop by reducing the number of if's, removing the
167            unnecessary try/except block, and checking if the old group
168            is the same as the new one (which happens a lot if there is
169            no classification, or lots of shapes are in the same group).
170    
171            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
172            around the redraw routine to try to catch problems that the user
173            may create by selecting invalid projections for the data set and
174            map. Clears the display if there are any problems and prints the
175            error.
176            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
177            rectangle.
178    
179            * extensions/thuban/wxproj.cpp (project_point): First invert the
180            supplied point (which should be in projected coordinates) using
181            the layer's projection and then project the point using the
182            map's projection.
183            (project_points): Use project_point() to project each point.
184    
185    2003-04-30  Jan-Oliver Wagner <[email protected]>
186    
187            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
188            don't set the Classification to None if the classfication field
189            is None (ie only a DEFAULT).
190    
191    2003-04-30  Bernhard Herzog  <[email protected]>
192    
193            * Thuban/UI/view.py: Fix some typos.
194    
195            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
196            not pop up the dialog if the selection becomes empty (this could
197            happen if e.g. a new selection is opened while the identify tool
198            is active and dialog had been closed)
199    
200    2003-04-30  Bernhard Herzog  <[email protected]>
201    
202            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
203            instance variable read_record_last_result
204            (TransientTableBase.read_record): Make sure reading the same
205            record twice works. The implementation uses the new instance
206            variable read_record_last_result
207    
208            * test/test_transientdb.py
209            (TestTransientTable.test_transient_table_read_twice): New test
210            case for the above bug-fix.
211    
212    2003-04-29  Jonathan Coles   <[email protected]>
213    
214            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
215    
216            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
217    
218            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
219            (ClassTable.SetValueAsCustom): Rename keyword argument in
220            ClassGroup* constructors to match argument name.
221    
222    2003-04-29  Bernhard Herzog  <[email protected]>
223    
224            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
225            transient DB if it exists to make sure it doesn't leave a journal
226            file in the temp directory.
227    
228            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
229            self.conn to None after closing the connection to make sure it's
230            not closed twice
231    
232    2003-04-29  Jonathan Coles   <[email protected]>
233    
234            Add a visible parameter in the layer XML tag. The default value is
235            "true". If anything other than "false" is specified we also assume
236            "true". Addresses RTbug #1025.
237    
238            * Doc/thuban.dtd: Add visible parameter to a layer.
239    
240            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
241            of visible from 1 to True.
242            (Layer.__init__): Change default value of visible from 1 to True.
243    
244            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
245            parameter.
246    
247            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
248            parameter.
249    
250            * test/test_load.py: Add new test data contents_test_visible.
251            (LoadSessionTest.setUp): save test data.
252            (LoadSessionTest.testLayerVisibility): Test if the visible flag
253            is loaded correctly.
254    
255            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
256            for saving an invisible layer.
257    
258    2003-04-29  Jonathan Coles   <[email protected]>
259    
260            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
261            legend dialog box and tell it to change its map to the one
262            supplied to SetMap(). Fixes RTbug #1770.
263    
264    2003-04-29  Bernhard Herzog  <[email protected]>
265    
266            Next step of table implementation. Introduce a transient database
267            using SQLite that some of the data is copied to on demand. This
268            allows us to do joins and other operations that require an index
269            for good performance with reasonable efficiency. Thuban now needs
270            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
271            haven't tested that.
272            
273            * Thuban/Model/transientdb.py: New. Transient database
274            implementation.
275    
276            * test/test_transientdb.py: New. Tests for the transient DB
277            classes.
278    
279            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
280            classes to help automatically remove temporary files and
281            directories.
282            (Session.__init__): New instance variables temp_dir for the
283            temporary directory and transient_db for the SQLite database
284            (Session.temp_directory): New. Create a temporary directory if not
285            yet done and return its name. Use AutoRemoveDir to have it
286            automatically deleted
287            (Session.TransientDB): Instantiate the transient database if not
288            done yet and return it.
289    
290            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
291            AutoTransientTable so that data is copied to the transient DB on
292            demand.
293            (SimpleStore): New class that simply combines a table and a
294            shapefile
295    
296            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
297            DBFTable and update its doc-string to reflect the fact that this
298            is only the table interface to a DBF file. Table is now an alias
299            for DBFTable for temporary backwards compatibility.
300    
301            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
302            the last reference to the session goes away so that the temporary
303            files are removed properly.
304    
305            * test/test_load.py (LoadSessionTest.tearDown): Remove the
306            reference to the session to make sure the temporary files are
307            removed.
308    
309    2003-04-29  Bernhard Herzog  <[email protected]>
310    
311            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
312            the __parser instance variable into a normal local variable in
313            read. It's only used there and read will never be called more than
314            once. Plus it introduces a reference cycle that keeps can keep the
315            session object alive for a long time.
316    
317    2003-04-29  Jonathan Coles   <[email protected]>
318    
319            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
320            Projection an immutable item. Fixes RTbug #1825.
321            (Projection.__init__): Initialize instance variables here.
322            (ProjFile.Replace): New. Replace the given projection object with
323            the new projection object. This solves the problem of needing the
324            mutator Projection.SetProjection() in the ProjFrame class and
325            allows a projection to change parameters without changing its
326            location in the file.
327    
328            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
329            be of type wxSAVE and should verify overwriting a file.
330    
331            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
332            ProjFile.Replace() method instead of the mutator
333            Projection.SetProjection(). Also requires that we reassign the
334            client data to the new projection.
335    
336            * test/test_proj.py (TestProjection.test): Test GetName() and
337            GetAllParameters()
338            (TestProjFile.test): Remove tests for Set*() methods. Add tests
339            for Replace().
340    
341    2003-04-25  Jonathan Coles   <[email protected]>
342    
343            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
344            to save the name of the projection.
345    
346            * test/test_save.py (SaveSessionTest.testLayerProjection): New
347            test to verify layer projections are saved correctly.
348    
349    2003-04-25  Jonathan Coles   <[email protected]>
350    
351            * Thuban/Model/proj.py (Projection.SetName): Set the name
352            to "Unknown" if name is None.
353            (Projection.SetAllParameters): New. Set the projection's
354            parameter list to the one supplied.
355            (Projection.SetProjection): New. Set the projection's
356            properties to those of the supplied Projection.
357    
358            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
359            the dialog title to include the map's title.
360            (MainWindow.LayerProjection): Set the dialog title to include
361            the layer's title.
362    
363            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
364            error dialogs into a single method call.
365            (ProjFrame.__VerifyButtons): Add more states to check.
366            (ProjFrame.__GetProjection): Return the current state of an
367            edited projection or None.
368            (ProjFrame.__FillAvailList): Remove checks for states that
369            shouldn't exist.
370            (ProjFrame._OnNew): Clear all selected items and supply
371            a projection panel if necessary.
372    
373            * test/test_proj.py (TestProjFile.test): Add tests for
374            ProjFile.SetAllParameters, ProjFile.SetProjection,
375            ProjFile.SetName.
376    
377    2003-04-25  Jonathan Coles   <[email protected]>
378    
379            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
380            takes an optional argument to select the current projection.
381            This does not guarantee that the item is visible due to
382            limited wxWindows functionality. Fixes RTBug #1821.
383    
384    2003-04-25  Jonathan Coles   <[email protected]>
385    
386            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
387            the projection name and use it when constructing the Projection
388            object.
389    
390            * Thuban/Model/proj.py (Projection.__init__): Change the default
391            value for 'name' to None and then test if name is equal to None
392            in the body of the constructor. This way the caller doesn't have to
393            know what the default value should be. Namely, useful in load.py
394            where we have to pick a default value if the 'name' parameter
395            doesn't exist in the XML file.
396    
397            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
398            Tests a file where a layer has a projection.
399    
400    2003-04-25  Jonathan Coles   <[email protected]>
401    
402            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
403            tree for projection information.
404    
405            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
406            XMLReader.GetFileName.
407            (SessionLoader): Added support for loading projection tags that
408            appear inside a layer.
409    
410            * Thuban/Model/proj.py (ProjFile): Document the class. Move
411            back to using a list because the order of the projections in
412            the file is important to maintain. Fixes RTbug #1817.
413    
414            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
415            to ProjFile.GetFilename.
416    
417            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
418            information.
419    
420            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
421            ProjFrame._OnSaveAs. Removed old dead code from previous
422            implementation.
423            (ProjFrame._OnExport): Add support for exporting more than one
424            projection to a single file.
425            (ProjFrame.__FillAvailList): use string formatting (% operator)
426            to build strings that are (partly) translated. Fixes RTbug #1818.
427    
428            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
429            class.
430    
431    2003-04-24  Bernhard Herzog  <[email protected]>
432    
433            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
434    
435            * po/fr.po: New. French translation by Daniel Calvelo Aros
436    
437            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
438            empty strings.
439    
440    2003-04-24  Jonathan Coles   <[email protected]>
441    
442            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
443            implement the interface that the ProjFrame dialog expects.
444    
445            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
446            name of the projection to be changed.
447            (ProjFile): Use a dictionary instead of a list so that removing
448            projections is easier and we are sure about uniqueness.
449            (ProjFile.Remove): Remove the given projection object.
450    
451            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
452            Return a list with only one projection file instead of searching for
453            any projection file. This simplifies many things if the user can
454            only have one system file and one user file.
455    
456            * Thuban/UI/classgen.py: Change all references to
457            genCombo to genChoice.
458    
459            * Thuban/UI/mainwindow.py: Add a Projection option under the
460            layer menu.
461            (MainWindow.LayerProjection): New. Open up a projection window
462            for a layer.
463    
464            * Thuban/UI/projdialog.py: Large changes to how the dialog is
465            laid out. Use three panels instead of one. One for the list of
466            projections, one for the edit controls, and one for the buttons.
467            Fixed resizing problems so that the dialog resizes correctly
468            when the projection panel changes. Added import/export, save, and
469            new buttons/functionality.
470    
471    2003-04-24  Bernhard Herzog  <[email protected]>
472    
473            First step towards table management. Introduce a simple data
474            abstraction so that we replace the data a layer uses more easily
475            in the next step.
476    
477            * Thuban/Model/data.py: New file with a simple data abstraction
478            that bundles shapefile and dbffile into one object.
479    
480            * Thuban/Model/session.py (Session.OpenShapefile): New method to
481            open shapefiles and return a shape store object
482    
483            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
484            object instead of a shapefile filename. This introduces a new
485            instance variable store holding the datastore. For intermediate
486            backwards compatibility keep the old instance variables.
487            (open_shapefile): Removed. No longer needed with the shape store.
488            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
489            get the shape store used by a layer.
490            (Layer.Destroy): No need to explicitly destroy the shapefile or
491            table anymore.
492    
493            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
494            (MainWindow.AddLayer): Use the session's OpenShapefile method to
495            open shapefiles
496    
497            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
498            session's OpenShapefile method to open shapefiles
499    
500            * test/test_classification.py
501            (TestClassification.test_classification): Use the session's
502            OpenShapefile method to open shapefiles and build the filename in
503            a more platform independed way
504    
505            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
506            Implement to have a session to use in the tests
507            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
508            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
509            session's OpenShapefile method to open shapefiles
510            (TestLayerLegend.setUp): Instantiate a session so that we can use
511            it to open shapefiles.
512            (TestLayerLegend.tearDown): Make sure that all references to
513            layers and session are removed otherwise we may get a resource
514            leak
515    
516            * test/test_map.py (TestMapAddLayer.test_add_layer)
517            (TestMapWithContents.setUp): Instantiate a session so that we can
518            use it to open shapefiles.
519            (TestMapWithContents.tearDown): Make sure that all references to
520            layers, maps and sessions are removed otherwise we may get a
521            resource leak
522            ("__main__"): use support.run_tests() so that more info about
523            uncollected garbage is printed
524    
525            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
526            session's OpenShapefile method to open shapefiles
527            ("__main__"): use support.run_tests() so that more info about
528            uncollected garbage is printed
529    
530            * test/test_selection.py (TestSelection.tearDown): Make sure that
531            all references to the session and the selection are removed
532            otherwise we may get a resource leak
533            (TestSelection.get_layer): Instantiate a session so that we can
534            use it to open shapefiles.
535            ("__main__"): use support.run_tests() so that more info about
536            uncollected garbage is printed
537    
538            * test/test_session.py (TestSessionBase.tearDown)
539            (TestSessionWithContent.tearDown): Make sure that all references
540            to the session and layers are removed otherwise we may get a
541            resource leak
542            (TestSessionWithContent.setUp): Use the session's OpenShapefile
543            method to open shapefiles
544    
545    2003-04-24  Jonathan Coles   <[email protected]>
546    
547            * Thuban/Model/load.py (XMLReader.read): Should have been checking
548            if the file_or_filename object had the 'read' attribute.
549    
550    2003-04-23  Jonathan Coles   <[email protected]>
551    
552            * Thuban/Model/resource.py: Fixes RTbug #1813.
553            (ReadProjFile): Add documentation about which exceptions are raised.
554            Always pass the exceptions up to the caller.
555            (GetProjFiles): If the directory can't be read return an empty list.
556            If any of the proj files can't be read skip that file and go
557            on to the next one.
558    
559            * test/test_proj.py: Added test cases to handle nonexistent files,
560            unreadable files, and files that don't parse correctly.
561    
562    2003-04-23  Jonathan Coles   <[email protected]>
563    
564            Projection dialog. Allows the user to select from a list
565            of projection templates and optionally edit them and save new ones.
566    
567            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
568            (ProjPanel): Base class for projection specific panels.
569            (TMPanel): Projection panel for Transverse Mercartor.
570            (UTMPanel): Projection panel for Universal Transverse Mercartor.
571            (LCCPanel): Projection panel for Lambert Conic Conformal.
572            (GeoPanel): Projetion panel for Geographic Projection.
573    
574    2003-04-23  Jonathan Coles   <[email protected]>
575    
576            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
577            promote symmetry. There now exists XMLReader and XMLWriter.
578            (XMLReader.read): New. Call to read the given file descriptor or
579            filename.
580            (XMLReader.close): New. Make sure the file is closed.
581            (XMLReader.GetFileName): New. Return just the file name that is being
582            read from.
583            (XMLReader.GetDirectory): New. Return just the directory of the file
584            that is being read.
585            (XMLReader.AddDispatchers): New. Take a dictionary which contains
586            the names of functions to call as the XML tree is parsed.
587            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
588            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
589            (SessionLoader): Removed class variables start_dispatcher and
590            end_dispatcher since this functionality is now part of a class
591            instance. Fixes RTbug #1808.
592            (SessionLoader.__init__): Add dispatcher functions.
593            (load_xmlfile): Code was moved into the XMLReader.read().
594            (load_session): Use modified SessionLoader.
595    
596            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
597            map's projection.
598    
599            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
600            GetAllParameters.
601            (Projection.GetParameter): Returns the value for the given parameter.
602    
603            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
604            (GetProjFiles): Renamed from GetProjections. Now returns a list
605            of ProjFile objects.
606            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
607            a list of ProjFile objects whose files are not user defined.
608            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
609            list of ProjFile objects whose files are user defined.
610            (ProjFileReader): Extend new XMLReader.
611    
612            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
613            promote symmetry.
614    
615            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
616            control instead of a wxComboBox. wxChoice controls do not generate
617            events as the uses highlights possible choices which fixes problems
618            with resizing the dialog when the use selects an option.
619    
620            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
621            control instead of a wxComboBox.
622    
623            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
624            dialog.
625    
626            * test/test_proj.py (TestProjection.test): New tests for GetParameter
627            method.
628    
629    2003-04-22  Bernhard Herzog  <[email protected]>
630    
631            * Thuban/UI/mainwindow.py: Remove some unused imports and global
632            constants
633    
634            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
635            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
636    
637    2003-04-17  Bernhard Herzog  <[email protected]>
638    
639            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
640            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
641            anymore.
642            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
643            (Layer.ShapeType, Layer.Shape): No need to call
644            self.open_shapefile since it's always called in __init__
645    
646            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
647            In wxPython 2.4 there's no need to extend MainLoop anymore since
648            wxPython itself makes sure OnExit is called.
649    
650    2003-04-16  Jonathan Coles   <[email protected]>
651    
652            Initial putback of projection management code. Includes new
653            classes to read and write projection files. The current load
654            and save classes were abstracted a bit so they could be reused.
655            The Projection class was extended to provide new methods and
656            have a name.
657    
658            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
659            general XML reading methods that were part of ProcessSession.
660    
661            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
662            name.
663            (ProjFile): New. Represents a file that contains projection
664            information.
665    
666            * Thuban/Model/resource.py: New. Contains general utilities
667            for read and writing projection files.
668    
669            * Thuban/Model/save.py (XMLSaver): New. Contains all the
670            general XML writing methods that were part of SessionSaver.
671            (SessionSaver): Renamed from Saver.
672    
673            * test/test_proj.py: New test cases for the projection
674            file read and write functions.
675    
676    2003-04-16  Jonathan Coles   <[email protected]>
677    
678            * Thuban/Model/classification.py: Use repr() around values
679            in the ClassGroup*.__repr__() methods so it is clearer when
680            a value is a string and when it is a number.
681    
682            * test/test_load.py: Rework the classification test to test
683            that we can load old files.
684            (testLabels): Test a file where the groups have labels.
685    
686    2003-04-16  Bernhard Herzog  <[email protected]>
687    
688            Safer implementation of the performance enhancements of the
689            low-level renderer:
690            
691            * extensions/thuban/wxproj.cpp (extract_projection)
692            (extract_pointer): Rename extract_projection to extract_pointer
693            and redefine its purpose to return the pointer stored in a CObject
694            returned by the object's cobject method. Update all callers.
695            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
696            handling of these low-level parameters so that each s_draw_info
697            instance is handled as a CObject at python level that also
698            contains real references to the actual python objects which
699            contain the values in the struct. Add free_draw_info as the
700            destructor.
701            (draw_polygon_shape): Add the py_draw_info parameter which must a
702            cobject containing an s_draw_info pointer.
703    
704            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
705            method to instantiat the low-level render parameter
706            (MapRenderer.draw_shape_layer): Use the new method. Remove some
707            commented out code.
708            (MapRenderer.draw_polygon_shape): Make the first parameter not the
709            layer but the low-level render parameter
710            (ScreenRenderer.draw_shape_layer): Use the low-level render
711            parameter.
712    
713    2003-04-15  Jonathan Coles   <[email protected]>
714    
715            * Thuban/Model/classification.py: Implemented __repr__ for
716            the ClassGroup* classes to make debugging a bit easier.
717            (ClassGroup.SetLabel): Check that the string is an instance
718            of StringTypes not StringType. Accounts for Unicode strings.
719    
720            * Thuban/Model/color.py: Implemented __repr__ to make
721            debugging a bit easier.
722    
723            * Thuban/Model/save.py (Saver.write_classification): Need to
724            save the group label.
725    
726            * test/test_load.py (testClassification): New. Loads the
727            iceland_sample_test.thuban file and checks if it was loaded
728            correctly.
729    
730    2003-04-15  Jonathan Coles   <[email protected]>
731    
732            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
733            to improve rendering performance by initializing the variables
734            that are not change each time draw_polygon_shape() is called.
735            The values are stored in a global struct draw_info.
736            (draw_polygon_shape): Removed initialization code that is
737            now in draw_polygon_init().
738    
739            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
740            drawing initialization call to draw_polygon_init()
741            (MapRenderer.draw_polygon_shape): Use new signature of
742            draw_polygon_shape.
743    
744            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
745            weirdness by setting the range to (1, maxint).
746    
747            * Thuban/Model/classification.py (ClassGroupProperties): Make
748            instance variables private and optimize comparison operator
749            by first checking if the color references are the same.
750            (ClassGroupSingleton): Make instance variables private.
751            (ClassGroupRange): Make instance variables private.
752    
753            * HOWTO-Release: Filled in missing steps for releasing packages.
754    
755    2003-04-15  Bernhard Herzog  <[email protected]>
756    
757            First stab at internationalized messages:
758    
759            * Thuban/__init__.py (_): Implement the translation function for
760            real using the python gettext module.
761    
762            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
763            translate empty strings.
764    
765            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
766            Add a missing space to a warning message
767    
768            * po/README: New. Notes about the management of the translation
769            files.
770    
771            * po/Makefile: New. Makefile to help manage the translation files.
772    
773            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
774    
775            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
776            translations and support files in po/
777    
778            * setup.py (data_files): Add the *.mo files to the data_files too
779    
780            * README: Add note about the translations when building from CVS
781    
782    2003-04-14  Jonathan Coles   <[email protected]>
783    
784            * Thuban/UI/dock.py: Fixes some window resizing problems most
785            noticable under windows. Always assume the button bitmaps will
786            be there. Code clean up.
787            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
788            images for the dock/undock button to the same images.
789            Work around for RTbug #1801.
790    
791            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
792            be allowed to grow within the sizer. Fixes a bug under Windows
793            where the toolbar wasn't being drawn.
794    
795    2003-04-14  Frank Koormann   <[email protected]>
796    
797            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
798            Updated design to try to make the button functionality more
799            transparent.
800    
801    2003-04-14  Jonathan Coles   <[email protected]>
802    
803            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
804            finalize the intialization of the panel.
805    
806            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
807            creation of the panel. Should be the last thing called in the
808            initializer of a subclass.
809    
810            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
811            set the current selections in the combo boxes. This is needed
812            under Windows.
813    
814            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
815            level panel to the dialog so that the background colors are
816            consistent under Windows.
817    
818    2003-04-11  Jonathan Coles   <[email protected]>
819    
820            * Thuban/UI/classgen.py: Change color ramps to start at white
821            not black.
822    
823            * Thuban/UI/legend.py: Enable/disable the legend buttons when
824            the legend changes. Fixes RTbug #1793.
825    
826            * test/test_classification.py: Added test for copying of
827            classifications.
828    
829    2003-04-11  Jonathan Coles   <[email protected]>
830    
831            * Thuban/UI/resource.py: New. Centralize the loading of resources
832            such as bitmaps.
833    
834            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
835            added images to the move buttons, added 'reverse' button.
836            (CustomRampPanel.__init__): Added images to the move buttons.
837            (GreyRamp): New. Generates a ramp from white to black.
838            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
839    
840            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
841            ID_PROPERTY_*.
842            (Classifier.__init__): Minor changes to the layout.
843            (Classifier._OnTitleChanged): Listen for when the user edits the
844            title and update the dialog's title and the layer's title.
845    
846            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
847    
848            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
849            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
850            if the layer's title changes.
851    
852            * Thuban/UI/mainwindow.py: Added new menu item and associated code
853            to open a dialog to rename the map.
854            (MainWindow): Use new resource class to import bitmaps.
855    
856    2003-04-11  Jonathan Coles   <[email protected]>
857    
858            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
859            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
860            Resources/Bitmaps/group_use_none.xpm,
861            Resources/Bitmaps/group_use_not.xpm,
862            Resources/Bitmaps/hide_layer.xpm,
863            Resources/Bitmaps/layer_properties.xpm,
864            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
865            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
866            New.
867    
868    2003-04-10  Jonathan Coles   <[email protected]>
869    
870            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
871            Should pass group to ClassGroup constructor.
872    
873    2003-04-10  Jonathan Coles   <[email protected]>
874    
875            * Thuban/Model/classification.py: (ClassGroup): Move all the common
876            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
877            here. Implement SetVisible(), IsVisible().
878            (ClassGroup.__init__): Add group parameter which acts as a copy
879            constructor.
880    
881            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
882            "Visible" check boxes.
883            (Classifier): Rename the buttons and refactor the code to match
884            the new labels.
885    
886            * Thuban/UI/legend.py: Classify button is now called "Properties".
887            Refactored the code to change variable names.
888            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
889    
890            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
891            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
892            renamed to MainWindow.LayerEditProperties.
893            (MainWindow.ToggleLegend): Don't include map name in legend title.
894            (MainWindow.SetMap): Added the map name to the window title.
895            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
896            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
897            Functionality is found in the layer properties dialog.
898    
899            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
900            draw visible groups.
901    
902    2003-04-09  Jonathan Coles   <[email protected]>
903    
904            * Thuban/UI/classgen.py: Modifications to allow simple
905            addition and selection of new color schemes.
906            (MonochromaticRamp): New. Generates a ramp between two colors.
907            (RedRamp): New. Generates a ramp of all red.
908            (GreenRamp): New. Generates a ramp of all green.
909            (BlueRamp): New. Generates a ramp of all blue.
910    
911    2003-04-09  Jonathan Coles   <[email protected]>
912    
913            * Thuban/Model/classification.py (Classification.__deepcopy__):
914            Need to copy over field and fieldType attributes.
915    
916            * Thuban/Model/table.py (Table.field_range): New. Retrive the
917            maximum and minimum values over the entire table for a given
918            field.
919            (Table.GetUniqueValues): New. Retrieve all the unique values
920            in the table for a given field.
921    
922            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
923            (GenUniquePanel): New. Controls to allow the user to select
924            which unique field values they would like in the classification.
925            (CustomRampPanel): Code that was in ClassGenDialog that allows
926            the user to select the properties for a custom ramp.
927            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
928    
929            * Thuban/UI/classifier.py: Removed a lot of debugging code.
930            (Classifier._SetClassification): Callback method so that the
931            class generator can set the classification in the grid.
932            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
933            editing of a group properties class into a wxWindows control.
934    
935            * Thuban/UI/dock.py: It was decided that if the user closes
936            a dockable window the window should simply hide itself. That
937            way if the user wants to show the dock again it appears in the
938            same place as it was when it was closed.
939            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
940            (DockableWindow._OnButtonClose): Hide the window instead of
941            destroying it.
942            (DockableWindow._OnClose): Hide the window instead of
943            destroying it.
944    
945            * Thuban/UI/legend.py (LegendTree): Use a private method to
946            consistently set the font and style of the text. Fixes RTbug #1786.
947    
948            * Thuban/UI/mainwindow.py: Import just the Classifier class.
949    
950    2003-04-07  Bernhard Herzog  <[email protected]>
951    
952            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
953            to the map module
954    
955    2003-04-07  Bernhard Herzog  <[email protected]>
956    
957            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
958            favor of ToggleSessionTree
959            (MainWindow.ToggleSessionTree): New method to toggle visibility of
960            the session tree.
961            (MainWindow.SessionTreeShown): New method to return whether the
962            session tree is currently shown.
963            (MainWindow.ToggleLegend): New method to toggle visibility of the
964            legend
965            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
966            LegendShown
967            (MainWindow.LegendShown): New method to return whether the legend
968            is currently shown.
969            (_method_command): Add checked parameter so we can define check
970            menu items
971            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
972            mainwindow methods.
973            (show_session_tree, show_legend commands): Removed.
974            (toggle_session_tree, toggle_legend commands): New commands to
975            toggle the visibility of the dialogs
976    
977    2003-04-07  Jonathan Coles   <[email protected]>
978    
979            * Thuban/UI/classgen.py: Fix Windows problem.
980    
981            * Thuban/UI/dock.py: Fix Windows problem.
982    
983            * Thuban/UI/mainwindow.py: Use False instead of false.
984            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
985    
986    2003-04-07  Jonathan Coles   <[email protected]>
987    
988            Since we now say that the order of the groups in a classification
989            matters, it makes sense to be able to manipulate that order. Most
990            of the changes to Thuban/Model/classification.py are to that end.
991    
992            * Thuban/Model/classification.py (Classification.AppendGroup,
993            Classification.InsertGroup, Classification.ReplaceGroup,
994            Classification.RemoveGroup, Classification.GetGroup): Do as the
995            names imply.
996            (Classification.FindGroup): This was called GetGroup, but GetGroup
997            takes an index, while FindGroup takes a value.
998            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
999            REFERENCE. Currently there is a cyclic reference between the layer
1000            and its classification. If the classification doesn't need to know
1001            its owning layer we can change this, since it may make sense to be
1002            able to use the same classification with different layers.
1003    
1004            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
1005    
1006            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
1007            not AddGroup()
1008    
1009            * Thuban/UI/classifier.py: Now that we can depend on the order in
1010            a Classification and have methods to manipulate that order we don't
1011            need to use our own data structures in the grid. We can simply make
1012            the grid/table access the information they need from a copy of
1013            the classification object.
1014            (Classifier._OnCloseBtn): Event handler for when the user clicks
1015            'Close'. This is needed so if the user applies changes and then
1016            continues to change the table the user has the option of discarding
1017            the most recent changes and keeping what they applied.
1018    
1019            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
1020            into the same group.
1021    
1022            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
1023            with a really old version of proj, PJ_VERSION won't even be defined.
1024            If it isn't defined then just compile so that the function always
1025            returns Py_False.
1026    
1027            * test/test_classification.py: Fix tests to use the renamed methods.
1028            Still need to write tests for the new methods.
1029    
1030    2003-04-04  Jonathan Coles   <[email protected]>
1031    
1032            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
1033            call to SetSelection out of the method and before the call
1034            to __SelectField in __init__. This prevents a recursion of events
1035            when _OnFieldSelect is triggered by the user.
1036    
1037    2003-04-04  Jonathan Coles   <[email protected]>
1038    
1039            * Thuban/Model/classification.py: Rename Color.None to
1040            Color.Transparent.
1041            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
1042            Don't bother copying the color, since Colors are immutable.
1043    
1044            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
1045            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
1046            Thuban/UI/renderer.py, Thuban/UI/view.py:
1047            Rename Color.None to Color.Transparent.
1048        
1049            * test/test_classification.py, test/test_load.py: Rename Color.None
1050            to Color.Transparent.
1051    
1052    2003-04-04  Jonathan Coles   <[email protected]>
1053    
1054            * Thuban/Model/classification.py: Fix assert calls.
1055            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
1056            Copy the color parameter rather than hold onto a reference.
1057    
1058            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
1059            the color object.
1060            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
1061            are sure there exists only one refernce to Color.None in the system.
1062            This allows us to use 'is' rather than the comparision functions.
1063            
1064            * Thuban/Model/save.py: Fix assert calls.
1065            
1066            * Thuban/UI/classifier.py: Fix assert calls.
1067            (ClassGrid._OnCellDClick): Call up to the classifier to open the
1068            dialog to edit the groups properties.
1069            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
1070            correctly if a cell is resized.
1071            (ClassTable.SetClassification): New. Changes the classification
1072            that is in the table.
1073            (ClassTable.__SetRow): Allow groups to be prepended.
1074            (Classifier): New code for opening the EditProperties and
1075            GenerateRanges dialogs.
1076            (SelectPropertiesDialog.__GetColor): Only set the color in the
1077            color dialog if the current color is not None.
1078            
1079            * Thuban/UI/dock.py: Fix assert calls.
1080            
1081            * Thuban/UI/legend.py: Fix assert calls.
1082            
1083            * Thuban/UI/renderer.py: Fix assert calls.
1084            
1085            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
1086            classifications.
1087            (GenRangePanel): Panel specific to range generation.
1088            (GenSingletonPanel): Panel specific to singleton generation.
1089            (ClassGenerator): Class responsible for actually generating
1090            the classification from the data gathered in the dialog box.
1091            (PropertyRamp): Generates properties whose values range from
1092            a starting property to an ending property.
1093    
1094    2003-04-03  Bernhard Herzog  <[email protected]>
1095    
1096            * test/support.py (print_garbage_information): New function that
1097            prints information about still connected messages and memory
1098            leaks.
1099            (run_suite): Removed.
1100            (run_tests): New function for use as a replacement of
1101            unittest.main in the test_* files. This one calls
1102            print_garbage_information at the end.
1103    
1104            * test/runtests.py (main): Use support.print_garbage_information
1105    
1106            * test/test_layer.py: Use support.run_tests instead of
1107            unittest.main so we get memory leak information
1108            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1109            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
1110            (TestLayerLegend.test_visibility): Call the layer's Destroy method
1111            to fix a memory leak.
1112    
1113            * test/test_classification.py: Use support.run_tests instead of
1114            unittest.main so we get memory leak information
1115            (TestClassification.test_classification): Call the layer's Destroy
1116            method to fix a memory leak.
1117    
1118    2003-04-02  Bernhard Herzog  <[email protected]>
1119    
1120            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
1121            Handle the reference counts of the return value and errors in
1122            PyArg_ParseTuple correctly.
1123    
1124            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
1125            sure the filename is absolute to avoid problems when saving the
1126            session again
1127    
1128            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
1129    
1130    2003-04-01  Jonathan Coles   <[email protected]>
1131    
1132            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
1133            that there actually are points in the returned list of points
1134            before trying to index into the list. The list may be empty if
1135            the shape is a Null Shape.
1136    
1137    2003-04-01  Bernhard Herzog  <[email protected]>
1138    
1139            * test/test_map.py: Don't use from <module> import *
1140    
1141    2003-04-01  Jonathan Coles   <[email protected]>
1142    
1143            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
1144            LAYER_LEGEND_CHANGED
1145    
1146            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
1147            self.Destroy() to close the window after yesterday's changes.
1148    
1149            * test/test_map.py, test/test_session.py: Fix messages that
1150            are sent from maps and layers.
1151    
1152    2003-03-31  Jonathan Coles   <[email protected]>
1153    
1154            * Thuban/UI/classifier.py: Commented out some debugging statements.
1155            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
1156            RTbug #1769.
1157    
1158            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
1159            position (although position doesn't work yet under GTK).
1160            (DockableWindow.Destroy): New. Called when the window must be
1161            closed. Namely needed when the DockFrame closes and must close
1162            its children.
1163            (DockFrame): Listen for EVT_CLOSE and destroy all children.
1164    
1165            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
1166            when then window is told to close.
1167            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
1168            comment in source for more info.
1169    
1170            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
1171    
1172            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
1173            symmetry with other such methods.
1174            (MainWindow.ShowLegend): Show the legend docked by default.
1175    
1176    2003-03-28  Jonathan Coles   <[email protected]>
1177    
1178            * Thuban/UI/classifier.py: Support for highlighting a specific
1179            group within the grid when the classification dialog is opened.
1180            Also contains a lot of debugging printouts which will later
1181            be removed.
1182    
1183            * Thuban/UI/dock.py: Complete rework on the dock code so that
1184            that it is fairly removed from the rest of the Thuban application.
1185            It is easy to add new docks which the rest of the program having
1186            to be aware of them.
1187    
1188            * Thuban/UI/legend.py: Modifications to support selecting a
1189            specific group in the classification dialog. Changed how layers
1190            are drawn when the layer is visible/invisible.
1191    
1192            * Thuban/UI/mainwindow.py: Removed legend specific code and
1193            replaced it with calls to the new dock code.
1194    
1195            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
1196            to check if scale > 0. Trying to track down a divide by zero.
1197    
1198    2003-03-26  Jonathan Coles   <[email protected]>
1199    
1200            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
1201            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
1202            now part of DockableWindow.
1203            (LegendPanel.DoOnSelChanged): Select the current layer in the
1204            map.
1205            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
1206            with the selected layer and/or group.
1207    
1208    2003-03-26  Jonathan Coles   <[email protected]>
1209    
1210            This putback contains the code for dockable windows. There is
1211            no support in wxWindows as of this date for windows that can
1212            attach themselves to other windows.
1213    
1214            The current model contains a DockableWindow which has a parent
1215            window for when it is detached and a dock window that it puts
1216            its contents in when it is docked. The contents of a DockableWindow
1217            must be a DockPanel. DockPanel itself derives from wxPanel.
1218    
1219            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
1220            message, not a LAYER_LEGEND_CHANGED message.
1221    
1222            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
1223    
1224            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
1225            as one of the style properties for the fieldTypeText item to
1226            be sure that its size is correct when the text changes.
1227    
1228            * Thuban/UI/dock.py: New. Classes for the DockPanel and
1229            DockableWindow.
1230    
1231            * Thuban/UI/legend.py: Added some more buttons and made the
1232            LegendPanel a DockPanel.
1233    
1234            * Thuban/UI/mainwindow.py: Added sash windows to the main window
1235            and supporting functions for manipulating the sashes.
1236            (MainWindow.ShowLegend): Create a DockableWindow with the
1237            LegendPanel as the contents.
1238    
1239            * Thuban/UI/messages.py: Added DOCKABLE_* messages
1240    
1241            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
1242            not LAYER_LEGEND_CHANGED, messages.
1243    
1244    2003-03-25  Jonathan Coles   <[email protected]>
1245    
1246            * setup.py: Added custom script bdist_rpm_build_script so that
1247            when the rpm is built the path to wx-config is correct.
1248    
1249            * setup.cfg: Added line saying to use the custom build script
1250    
1251    2003-03-20  Jonathan Coles   <[email protected]>
1252    
1253            Initial implementation of the Legend.
1254    
1255            * Thuban/UI/legend.py: New. Creates a window that shows the map's
1256            Legend information and allows the user to add/modify classifications
1257            and how the layers are drawn on the map.
1258    
1259            * setup.py: New command 'build_docs' which currently uses
1260            happydoc to generate html documentation for Thuban.
1261    
1262            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
1263            Returns a string which is appropriately describes the group.
1264    
1265            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
1266            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
1267    
1268            * Thuban/Model/map.py (Map): Rename messages and use new, more
1269            specific, messages.
1270    
1271            * Thuban/Model/messages.py: New message to indicate that a layer's
1272            data has changed (LAYER_CHANGED). New map messages to indicate
1273            when layers have been added/removed/changed or if the stacking order
1274            of the layers has changed.
1275    
1276            * Thuban/Model/session.py: Rename and use new messages.
1277    
1278            * Thuban/UI/classifier.py: Remember if any changes have actually
1279            been applied so that if the dialog is cancelled without an application
1280            of changes we don't have to set a new classification.
1281            (ClassDataPreviewer): Pulled out the window specific code and put it
1282            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
1283            symbols on any DC.
1284            
1285            * Thuban/UI/mainwindow.py: New code to open the legend.
1286    
1287            * Thuban/UI/view.py: Use new message names.
1288    
1289    2003-03-19  Jonathan Coles   <[email protected]>
1290    
1291            * Thuban/UI/main.py (verify_versions): New. Checks the versions
1292            of Python, wxPython, and some other libraries.
1293    
1294            * extensions/thuban/wxproj.cpp (check_version): Checks the given
1295            version against what wxproj was compiled with.
1296            (check_version_gtk): If wxproj was compiled with gtk then check
1297            the given version against the version of the gtk library
1298            currently being used.
1299    
1300    2003-03-14  Bernhard Herzog  <[email protected]>
1301    
1302            * test/test_command.py: Run the tests when the module is run as a
1303            script
1304    
1305    2003-03-14  Bernhard Herzog  <[email protected]>
1306    
1307            Implement selection of multiple selected shapes in the same layer:
1308    
1309            - Introduce a new class to hold the selection. This basically
1310              replaces the interactor which was nothing more than the
1311              selection anyway. A major difference is of course that the new
1312              selection class supports multiple selected shapes in one layer
1313            
1314            - Move the object that represents the selection from the
1315              application to the canvas. The canvas is a better place than the
1316              application because the selection represents which shapes and
1317              layer of the map displayed by the canvas are selected and
1318              affects how the map is drawn.
1319    
1320            - Make the selection and its messages publicly available through
1321              the mainwindow.
1322    
1323            - The non-modal dialogs do not get a reference to the interactor
1324              anymore as they can simply refer to their parent, the
1325              mainwindow, for the what the interactor had to offer.
1326    
1327            * Thuban/UI/selection.py: New module with a class to represent the
1328            selection.
1329    
1330            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
1331            these unused messages
1332    
1333            * Thuban/UI/application.py (ThubanApplication.OnInit)
1334            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
1335            interactor is gone now.
1336            (ThubanApplication.CreateMainWindow): There is no interactor
1337            anymore so we pass None as the interactor argument for now for
1338            compatibility.
1339    
1340            * Thuban/UI/view.py (MapCanvas.delegated_messages)
1341            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
1342            Unsubscribe, delegate messages according to the delegated_messages
1343            class variable.
1344            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
1345            attributes from instance variables as described with the
1346            delegated_methods class variable.
1347            (MapCanvas.__init__): New instance variable selection holding the
1348            current selection
1349            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
1350            pass them on to the renderer
1351            (MapCanvas.SetMap): Clear the selection when a different map is
1352            selected.
1353            (MapCanvas.shape_selected): Simple force a complete redraw. The
1354            selection class now takes care of only issueing SHAPES_SELECTED
1355            messages when the set of selected shapes actually does change.
1356            (MapCanvas.SelectShapeAt): The selection is now managed in
1357            self.selection
1358    
1359            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
1360            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
1361            Unsubscribe, delegate messages according to the delegated_messages
1362            class variable.
1363            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
1364            attributes from instance variables as described with the
1365            delegated_methods class variable.
1366            (MainWindow.__init__): The interactor as ivar is gone. The
1367            parameter is still there for compatibility. The selection messages
1368            now come from the canvas.
1369            (MainWindow.current_layer, MainWindow.has_selected_layer):
1370            Delegate to the the canvas.
1371            (MainWindow.LayerShowTable, MainWindow.Classify)
1372            (MainWindow.identify_view_on_demand): The dialogs don't need the
1373            interactor parameter anymore.
1374    
1375            * Thuban/UI/tableview.py (TableFrame.__init__)
1376            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
1377            (LayerTableFrame.row_selected): The interactor is gone. It's job
1378            from the dialog's point of view is now done by the mainwindow,
1379            i.e. the parent. Subscribe to SHAPES_SELECTED instead
1380            of SELECTED_SHAPE
1381            
1382            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
1383            is gone. It's job from the dialog's point of view is now done by
1384            the mainwindow, i.e. the parent.
1385            
1386            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
1387            gone. It's job from the dialog's point of view is now done by the
1388            mainwindow, i.e. the parent.
1389    
1390            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
1391            gone. It's job from the dialog's point of view is now done by the
1392            mainwindow, i.e. the parent.
1393            (SessionTreeCtrl.__init__): New parameter mainwindow which is
1394            stored as self.mainwindow. The mainwindow is need so that the tree
1395            can still subscribe to the selection messages.
1396            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
1397            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
1398            selection is now accessible through the mainwindow. Subscribe to
1399            SHAPES_SELECTED instead of SELECTED_SHAPE
1400    
1401            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
1402            SHAPES_SELECTED message now.
1403            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
1404            so deal with multiple shapes
1405            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
1406            gone. It's job from the dialog's point of view is now done by the
1407            mainwindow, i.e. the parent.
1408    
1409            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
1410            parameter is now a list of shape ids.
1411            (RecordTable.SetTable): The second parameter is now a list of
1412            indices.
1413    
1414            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
1415            selected_shape parameter and ivar to selected_shapes. It's now a
1416            list of shape ids.
1417            (MapRenderer.draw_label_layer): Deal with multiple selected
1418            shapes. Rearrange the code a bit so that the setup and shape type
1419            distinctions are only executed once.
1420    
1421            * test/test_selection.py: Test cases for the selection class
1422    
1423    2003-03-11  Jonathan Coles   <[email protected]>
1424    
1425            * Thuban/Model/load.py: Temporary fix so that the xml reader
1426            doesn't cause Thuban to crash.
1427    
1428            * Thuban/Model/layer.py: Handle the cyclic references between
1429            a layer and its classification better, and be sure to disconnect
1430            the classification from the layer when the layer is destroyed
1431            so that we don't maintain a cyclic reference that may not be
1432            garbage collected.
1433    
1434            * Thuban/Model/classification.py: See comment for layer.py.
1435    
1436    2003-03-12  Jan-Oliver Wagner <[email protected]>
1437    
1438            * HOWTO-Release: New. Information on the steps for releasing
1439            a new version of Thuban.
1440    
1441    2003-03-11  Jonathan Coles   <[email protected]>
1442    
1443            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
1444            Use True instead of true.
1445            (Classifier): Should have a single panel in which all the controls lie.
1446    
1447            * Thuban/UI/proj4dialog.py: Add normal border.
1448    
1449            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
1450    
1451            * Thuban/UI/mainwindow.py: Use True instead of true.
1452    
1453            * setup.py: Update some definitions to use wxWindows2.4 files
1454    
1455            * Data/iceland_sample_class.thuban: Fixed file so that the
1456            field_type information is present.
1457    
1458    2003-03-10  Jonathan Coles   <[email protected]>
1459    
1460            * Thuban/UI/classifier.py (Classifier.__init__): Make the
1461            field type label grow so that when the text changes the
1462            size is updated correctly. This may be a wxWindows bug.
1463    
1464    2003-03-10  Jonathan Coles   <[email protected]>
1465    
1466            * Thuban/UI/application.py: Changed SESSION_CHANGED to
1467            SESSION_REPLACED.
1468    
1469            * Thuban/UI/classifier.py: Wrap text with _().
1470            (ClassGrid.CreateTable): Set dimensions and size hints here,
1471            instead of in Reset, so we only set the size once.
1472    
1473            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
1474    
1475            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
1476            Call Close() instead of Shutdown().
1477    
1478            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
1479    
1480            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
1481            Go back to using OnClose() instead of Shutdown().
1482    
1483    2003-03-10  Jonathan Coles   <[email protected]>
1484    
1485            * Thuban/UI/classifier.py (Classifier): SelectField() needed
1486            to know the old field index as well as the new one.
1487    
1488    2003-03-10  Jonathan Coles   <[email protected]>
1489    
1490            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
1491            to correctly set the table information and call this from
1492            __init__ and from _OnFieldSelect so that all the information
1493            is up to date when the dialog opens and when a field is changed.
1494    
1495  2003-03-10  Jonathan Coles   <[email protected]>  2003-03-10  Jonathan Coles   <[email protected]>
1496    
1497          * Thuban/Model/classification.py (Classification): Don't use          * Thuban/Model/classification.py (Classification): Don't use

Legend:
Removed from v.490  
changed lines
  Added in v.826

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26