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

Legend:
Removed from v.402  
changed lines
  Added in v.790

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26