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

Legend:
Removed from v.445  
changed lines
  Added in v.803

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26