/[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 87 by bh, Wed Apr 3 19:02:32 2002 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]>
1605    
1606            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
1607            method to create a splash screen.
1608            (ThubanApplication.ShowMainWindow): New. Show the main window.
1609            Needed so the splash screen can display the mainwindow
1610            (ThubanApplication.OnInit): Call the
1611            new splash_screen method to determine whether the application
1612            should display a splash screen. If it displays a splash screen do
1613            not immediately show the main window.
1614    
1615    2003-02-11  Jonathan Coles  <[email protected]>
1616    
1617            * Thuban/Model/classification.py: Added import line to fix
1618            feature conflicts between running on python2.2 and python2.1.
1619    
1620            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
1621            onto the clinfo parameter, so removed the deepcopy().
1622    
1623    2003-02-10  Jonathan Coles  <[email protected]>
1624    
1625            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
1626            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
1628            /> instead of </tag_name>. Use the GetDefault*() methods of
1629            the Classification class.
1630    
1631            * Thuban/Model/classification.py (Classificaton): Added set and
1632            get methods for the default data. The class also takes a layer
1633            reference so that modification messages can be sent. Fixed the
1634            methods to use the new ClassData class.
1635            (ClassData): New class to encapsulate the classification data
1636    
1637            * Thuban/Model/layer.py (Layer): Remove the
1638            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
1639            SetDefault*() methods on the layer's classification object.
1640            (Layer.__init__): Use the new SetDefault*() methods in the
1641            Classification class.
1642    
1643            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
1644            object instead of a dictionary.
1645    
1646            * Thuban/UI/classifier.py (ClassRenderer): New class to
1647            draw the classifications in the dialog box's table.
1648            (Classifier): Modified to use the ClassRenderer class.
1649    
1650            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
1651            methods of the Classification class.
1652    
1653            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
1654            of the ClassData class.
1655    
1656            * test/test_classification.py, test/test_layer.py,
1657            test/test_map.py, test/test_session.py: Fix the tests to work
1658            with the above code changes.
1659    
1660    2003-02-03  Jonathan Coles  <[email protected]>
1661    
1662            * Thuban/Model/classification.py (Classification): Added getNull()
1663            to return the NullData reference
1664    
1665            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
1666            Layer.SetStrokeWidth): Modified these functions to change the
1667            null data in the classification rather than keep these values
1668            directly in the Layer class. Menu options to change these values
1669            work again.
1670    
1671    2003-01-28  Jonathan Coles  <[email protected]>
1672    
1673            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
1674            Fixed crashing problem on some systems. Dialog box shows
1675            classification data.
1676    
1677            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
1678            Colors in the tree view.
1679    
1680            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
1681            the tree info for classifications. Commented out unnecessary lines.
1682    
1683            * Thuban/Model/classification.py (Classification.TreeInfo): New
1684            function to add information about the classification into the
1685            tree view.
1686    
1687    2003-01-27  Jan-Oliver Wagner <[email protected]>
1688    
1689            * Thuban/__init__.py (_): New.
1690    
1691            * Thuban/Model/classification.py, Thuban/Model/extension.py,
1692            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
1693            Thuban/Model/session.py, Thuban/UI/application.py,
1694            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
1695            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
1696            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
1697            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
1698            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
1699    
1700    2003-01-27  Jonathan Coles  <[email protected]>
1701    
1702            * Thuban/Model/layer.py: Classification initialization calls.
1703    
1704            * Thuban/Model/classification.py: Created class to encapsulate
1705            a layer classification. Supports specific data points and
1706            ranges.
1707    
1708            * Thuban/Model/load.py: Added support for loading classification
1709            information.
1710    
1711            * Thuban/Model/save.py: Added support for saving classification
1712            information.
1713    
1714            * Thuban/UI/classifier.py: Initial class for a dialog box for
1715            specifying classification information.
1716    
1717            * Thuban/UI/mainwindows.py: Support for opening the classifier
1718            dialog.
1719    
1720            * Thuban/UI/renderer.py: Support for drawing a layer with the
1721            classification information.
1722    
1723            * Data/iceland_sample_class.thuban: iceland_sample with
1724            classification data.
1725    
1726            * test/test_classification: Tests for the Classification class.
1727    
1728    2002-12-09  Bernhard Herzog  <[email protected]>
1729    
1730            * test/test_command.py: New. Tests for the command classes.
1731    
1732            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
1733            (Command.IsTool): New method to distinguish between command
1734            switching tools and other commands.
1735    
1736            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
1737            the tool to avoid direct assignments to instance variables
1738            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
1739            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
1740            change the tool
1741    
1742            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
1743            active tool's command turns insensitive, disable the tool.
1744            (_tool_command): Use the new ToolCommand class
1745    
1746            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
1747            SelectTool method to change the tool
1748            (iconfile): Use the ToolCommand class
1749    
1750    2002-12-03  Bernhard Herzog  <[email protected]>
1751    
1752            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
1753            the case of selected items that are not children of Layers or Maps
1754            properly. Previously this bug would trigger an assertion in
1755            wxWindows.
1756    
1757    2002-11-06  Frank Koormann  <[email protected]>
1758    
1759            * Thuban/UI/mainwindow.py: Altered the order of tools in the
1760            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
1761            Full Extent).
1762    
1763    2002-10-23  Bernhard Herzog  <[email protected]>
1764    
1765            * setup.py (setup call): version now 0.1.3
1766    
1767            * MANIFEST.in: Add the files in test/
1768    
1769            * test/README: Add note about tests requiring the iceland data
1770    
1771            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
1772            copyright notice.
1773    
1774    2002-10-18  Bernhard Herzog  <[email protected]>
1775    
1776            * test/test_map.py
1777            (TestMapWithContents.test_projected_bounding_box): Use an explicit
1778            epsilon.
1779    
1780            * test/support.py (FloatComparisonMixin.assertFloatEqual)
1781            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
1782            message if the assertion fails and don't return the return value
1783            of self.assert_. In assertFloatSeqEqual the return meant that not
1784            all items of the sequence were compared.
1785    
1786    2002-09-20  Bernhard Herzog  <[email protected]>
1787    
1788            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
1789    
1790            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
1791    
1792            * test/test_map.py (TestMapWithContents.test_tree_info): Create
1793            the string with the bounding box on the fly because of platform
1794            differences in the way %g is handled.
1795    
1796            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
1797            DBFfile too because Thuban layers can't yet cope missing DBF
1798            files.
1799    
1800    2002-09-20  Bernhard Herzog  <[email protected]>
1801    
1802            * test/test_menu.py: Use initthuban instead of
1803            add_thuban_dir_to_path to initialize Thuban.
1804    
1805            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
1806            Mixin class for float comparisons
1807            (SubscriberMixin): New. Mixin class to test messages sent through
1808            the Connector class
1809    
1810            * test/README: Fix a typo and add the -v flag to the command for
1811            individual tests
1812    
1813            * test/test_session.py: New. Test cases for Thuban.Model.session
1814    
1815            * test/test_proj.py: New. Test cases for Thuban.Model.proj
1816    
1817            * test/test_map.py: New. Test cases for Thuban.Model.map
1818    
1819            * test/test_layer.py: New. Test cases for Thuban.Model.layer
1820    
1821            * test/test_label.py: New. Test cases for Thuban.Model.label
1822    
1823            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
1824    
1825            * test/test_color.py: New. Test cases for Thuban.Model.color
1826    
1827            * test/test_base.py: New. Test cases for Thuban.Model.base
1828    
1829    2002-09-13  Bernhard Herzog  <[email protected]>
1830    
1831            * Thuban/Model/session.py (Session.forwarded_channels): Forward
1832            the CHANGED channel too.
1833    
1834            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
1835            CHANGED channel too.
1836            (Map.__init__): Call the Modifiable constructor as well.
1837    
1838            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
1839            event if the modified flag changes.
1840            (Modifiable.changed): Tweak the doc-string.
1841    
1842            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
1843            (MainWindow.set_position_text): Put the code that puts the text
1844            with the mouse position into the status bar into the new method
1845            set_position_text so that it can overwritten in derived classes.
1846    
1847    2002-09-12  Bernhard Herzog  <[email protected]>
1848    
1849            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
1850            message box on the main window.
1851    
1852    2002-09-11  Bernhard Herzog  <[email protected]>
1853    
1854            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
1855            the 'E' because it's less likely to interfere with other menu
1856            entries.
1857            (MainWindow.build_menu): remove an incorrect comment.
1858    
1859    2002-09-10  Bernhard Herzog  <[email protected]>
1860    
1861            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
1862            (_tool_command): Add sensitive parameter
1863            (_has_visible_map): Sensitivity callback to tools and other
1864            commands that require a visible map. Use it in map_zoom_in_tool,
1865            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
1866            and map_full_extent
1867    
1868    2002-09-06  Bernhard Herzog  <[email protected]>
1869    
1870            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
1871            VIEW_POSITION
1872    
1873    2002-09-04  Frank Koormann  <[email protected]>
1874    
1875            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
1876    
1877    2002-09-02  Bernhard Herzog  <[email protected]>
1878    
1879            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
1880            wxWindows already and our implementation doesn't work correctly
1881            with wxGTK 2.3:
1882            (MapCanvas.__init__): Remove the instance variable
1883            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
1884            be drawin
1885            (MapCanvas.OnIdle): Removed.
1886    
1887            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
1888            a parameter to determine the size of the rectangle.
1889            (MapCanvas.find_shape_at): Create the box around the point on a
1890            layer by layer basis and make the size depend on the shape type.
1891            This solves a problem with the selection of point shapes at the
1892            border of the layer's bounding box
1893    
1894    2002-08-30  Bernhard Herzog  <[email protected]>
1895    
1896            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
1897            for the sensitivity  of remove layer.
1898            (_can_remove_layer): New. Sensitivity callback for remove layer
1899            (Command layer_remove): Use _can_remove_layer
1900    
1901            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
1902            determine whether a given layer can be deleted.
1903    
1904            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
1905            (MapCanvas.do_redraw): Get rid of the unused update_region
1906            instance variable
1907    
1908            * Thuban/UI/view.py: Add/update some doc-strings.
1909    
1910            * test/: new subdirectory with a bunch of unit tests.
1911    
1912            * test/README, test/test_table.py, test/test_save.py,
1913            test/test_menu.py, test/test_load.py: Initial set of tests and
1914            brief instructions on how to run them
1915    
1916    2002-08-29  Bernhard Herzog  <[email protected]>
1917    
1918            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
1919            arcs with multiple parts.
1920    
1921            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
1922            Handle degenrate rectangles.
1923    
1924            * Thuban/Model/table.py: Make writing records work correctly:
1925            (Table.__init__): Keep track of whether the DBF is open for
1926            writing
1927            (Table.write_record): Open the DBF file for writing when necessary
1928    
1929    2002-08-27  Bernhard Herzog  <[email protected]>
1930    
1931            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
1932            dbf files only for reading by default. Use a new writable dbf
1933            object for writing.
1934    
1935    2002-08-26  Bernhard Herzog  <[email protected]>
1936    
1937            * Thuban/UI/mainwindow.py: Refactor the context creation:
1938            (MainWindow.Context): New method to return a context
1939            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
1940            new method
1941    
1942            * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
1943            layer table specific code from TableGrid into LayerTableGrid
1944            (TableFrame, LayerTableFrame): Split the layer table specific code
1945            from TableFrame into LayerTableFrame
1946            (LayerTableGrid.select_shape): Remove a debug print
1947    
1948            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
1949            LayerTableFrame
1950    
1951    2002-08-23  Bernhard Herzog  <[email protected]>
1952    
1953            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
1954            absolute filename.
1955    
1956    2002-08-22  Bernhard Herzog  <[email protected]>
1957    
1958            * Thuban/Model/table.py (Table.write_record): New method to write
1959            records.
1960            (Table.__init__): Open the DBF file for writing too.
1961    
1962            * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
1963            into the underlying table.
1964    
1965            * extensions/shapelib/shapefil.h (DBFCommit),
1966            extensions/shapelib/dbfopen.c (DBFCommit): New API function to
1967            commit any changes made to the DBF file.
1968    
1969            * Thuban/UI/mainwindow.py (make_check_current_tool)
1970            (_tool_command): Put the code that generates the "checked"
1971            callback into a separate function so that we can reuse it
1972            elsewhere
1973    
1974            * Thuban/Model/save.py (Saver): New class to handle serializing a
1975            session into an XML file. The main reason to introduce a class is
1976            that applications built on Thuban can derive from it so that they
1977            can save additional information in a session file.
1978            (save_session): Delegate almost all the work to the Saver class.
1979            Rename the filename argument to file because it may be a file like
1980            object now.
1981    
1982            * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
1983            code. Remove the little test code which would be executed when the
1984            module is run as a script which didn't work anymore since it can't
1985            import the other Thuban modules.
1986            (ProcessSession, load_session): Refactor the ProcessSession to
1987            have one method for each element start and end tag so that derived
1988            classes can easily override the processing of individual tags.
1989            Also, always parse with namespaces enabled because applications
1990            built on top of Thuban will likely use namespaces if they extend
1991            the session file format.
1992    
1993    2002-08-21  Bernhard Herzog  <[email protected]>
1994    
1995            * setup.py (ThubanInstall.run): Don't repr install_lib_orig
1996            because thubaninit_contents will do it for us.
1997    
1998    2002-08-16  Jan-Oliver Wagner <[email protected]>
1999    
2000            * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
2001            tree window already open
2002    
2003    2002-08-15  Bernhard Herzog  <[email protected]>
2004    
2005            * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
2006            with self.
2007    
2008            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
2009            when we have actually captured it.
2010    
2011            * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
2012            shapefile and destroy the table.
2013    
2014            * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
2015    
2016    2002-08-14  Bernhard Herzog  <[email protected]>
2017    
2018            * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
2019            instance variable columns
2020            (RecordTable.GetTypeName): row and col may be negative in some
2021            cases.
2022    
2023            * setup.py (InstallLocal.initialize_options)
2024            (InstallLocal.finalize_options, InstallLocal.user_options): New
2025            option create-init-file to build a thubaninit.py when running
2026            install_local
2027            (InstallLocal.run): Create the thubaninit.py module when requested
2028            (thubaninit_contents): Split the template into several parts and
2029            create a new function thubaninit_contents that creates the
2030            contents of a thubaninit module.
2031            (ThubanInstall.run): Use the new function to create the thubaninit
2032            module.
2033    
2034    2002-07-30  Bernhard Herzog  <[email protected]>
2035    
2036            * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
2037            cleanup.
2038            (ThubanApplication.MainLoop): Extend to automatically call OnExit.
2039    
2040            * Thuban/Model/session.py (Session.Destroy): Don't bypass the
2041            direct base class' Destroy method.
2042    
2043            * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
2044            layers.
2045            (Map.Destroy): Destroy the label_layer as well and call the
2046            inherited Desatroymethod first so that no more messages are
2047            issued.
2048            (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
2049            message if the stacking order actually has changed. Add
2050            doc-strings.
2051            (Map.BoundingBox): Correct the doc-string.
2052            (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
2053            (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
2054    
2055            * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
2056            all labels.
2057    
2058    2002-07-29  Bernhard Herzog  <[email protected]>
2059    
2060            * Thuban/Model/map.py (Map.subscribe_layer_channels)
2061            (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
2062            to a layer's channels into separate methods.
2063            (Map.RemoveLayer, Map.AddLayer): Call the new methods
2064            (Map.Destroy): Unsubscribe from a layer's channels before
2065            destroying it.
2066    
2067            * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
2068            selected_layer parameter to searched_layer which is the layer to
2069            search in.
2070            (MapCanvas.SelectShapeAt): New parameter layer to restrict the
2071            search to that layer. Return the selected layer and shape.
2072    
2073            * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
2074            typo
2075    
2076    2002-07-24  Bernhard Herzog  <[email protected]>
2077    
2078            * Thuban/UI/application.py (ThubanApplication.create_session):
2079            Extend the doc string.
2080            (ThubanApplication.subscribe_session)
2081            (ThubanApplication.unsubscribe_session): New methods to
2082            subscribe/unsubscribe to/from session channels.
2083            (ThubanApplication.SetSession): Call the new methods here.
2084            (ThubanApplication.maps_changed, ThubanApplication.set_map):
2085            Renamed set_map to maps_changed. Its now a subscriber for
2086            MAPS_CHANGED.
2087    
2088            * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
2089            x-coordinate in case of simple clicks
2090    
2091            * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
2092            don't pass it as a parameter
2093    
2094            * Thuban/Model/session.py (Session.RemoveMap): New
2095    
2096            * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
2097            window size into a parameter.
2098    
2099    2002-07-23  Bernhard Herzog  <[email protected]>
2100    
2101            * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
2102            just commands.
2103    
2104            * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
2105            parameter list a bit to allow setting the window title and the
2106            initial message in the status bar. Update the callers.
2107    
2108            * Thuban/UI/application.py (ThubanApplication.OnInit)
2109            (ThubanApplication.CreateMainWindow): Put the mainwindow
2110            instantiation into a separate method so that it can be overridden
2111            by a subclass.
2112    
2113    2002-07-19  Bernhard Herzog  <[email protected]>
2114    
2115            * Thuban/Model/session.py: Issue a CHANGED message every time
2116            another changed message is issued to make it easier to get
2117            notified of changes.
2118            (Session): Update the doc string
2119            (Session.forward): Issue changed-events as CHANGED as well.
2120            (Session.changed): Overwrite the inherited version to issue
2121            CHANGED events as well.
2122    
2123            * Thuban/UI/tree.py: We can now simply subscribe to the session's
2124            CHANGED channel to be informed of changes.
2125            (SessionTreeCtrl.session_channels): Not needed any longer.
2126            (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
2127            Only have to (un)subscribe CHANGED
2128    
2129            * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
2130    
2131            * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
2132            for the wxPython locale bug to __init__.py so that it's
2133            automatically executed by anybody using UI code from Thuban.
2134    
2135    2002-07-18  Bernhard Herzog  <[email protected]>
2136    
2137            * Thuban/UI/main.py (main): app no longer needs to be global
2138    
2139            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
2140            as parameter and store it in an instance variable
2141            (MainWindow.invoke_command, MainWindow.update_command_ui)
2142            (MainWindow.save_modified_session, MainWindow.NewSession)
2143            (MainWindow.OpenSession, MainWindow.SaveSession)
2144            (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
2145            application object.
2146    
2147            * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
2148            the main window with self.
2149    
2150            * Thuban/UI/context.py: New module with the context class
2151    
2152            * Thuban/UI/command.py (Command): Update doc string.
2153    
2154            * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
2155            MainWindow.update_command_ui): Pass an instance of the context
2156            class to the command's methods
2157            (check_current_tool, call_method): Handle the new context
2158            implementation
2159    
2160            * Examples/simple_extensions/simple_tool.py (simple_tool,
2161            check_simple_tool): Handle the new context implementation
2162    
2163            * Examples/simple_extensions/simple_command.py (simple_command):
2164            Handle the new context implementation. Update the comments about
2165            the context.
2166    
2167            * Thuban/UI/application.py (ThubanApplication.SetSession): Add
2168            doc-string
2169            (ThubanApplication.Session): New method to return the session
2170            object
2171    
2172            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
2173            interactor's selected_layer may not be a layer of the current
2174            session when the tree is updated while a new session is being set.
2175    
2176    2002-07-17  Bernhard Herzog  <[email protected]>
2177    
2178            * Thuban/UI/tree.py (color_string): Removed. No longer used.
2179            (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
2180            update_tree into update_tree and add_items. The tree now uses a
2181            more generic way to display the contents of the tree.
2182            (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
2183    
2184            * Thuban/Model/layer.py (Layer.TreeInfo),
2185            Thuban/Model/extension.py (Extension.TreeInfo),
2186            Thuban/Model/map.py (Map.TreeInfo),
2187            Thuban/Model/session.py (Session.TreeInfo):
2188            Add TreeInfo methods to implement the new tree view update scheme
2189    
2190    2002-07-16  Bernhard Herzog  <[email protected]>
2191    
2192            * Thuban/UI/application.py: Don't use "import from" for the
2193            MainWindow. It can't always be resolved.
2194            (ThubanApplication.OnInit): change reference to MainWindow
2195            accordingly.
2196    
2197            * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
2198            completely
2199    
2200    2002-07-10  Bernhard Herzog  <[email protected]>
2201    
2202            * setup.py (create_init_module): New configurable variable whose
2203            default depends on the platform we're running on.
2204            (ThubanInstall.initialize_options): Initialize
2205            self.create_init_module from the global create_init_module
2206            (ThubanInstall.user_options): indictate that the options
2207            create-init-module and init-module-dir have arguments.
2208    
2209            * setup.py: In the setup call change the version number to include
2210            cvs.
2211    
2212            * MANIFEST.in: Add the files in Examples
2213    
2214    2002-07-09  Bernhard Herzog  <[email protected]>
2215    
2216            * setup.py: In the setup call, use the thuban homepage as the
2217            value of the url parameter.
2218    
2219            * Examples: New subdirectory for examples.
2220    
2221            * Examples/simple_extensions/simple_tool.xpm,
2222            Examples/simple_extensions/simple_tool.py,
2223            Examples/simple_extensions/simple_command.py,
2224            Examples/simple_extensions/README: Simple examples showing how to
2225            add new commands and tools.
2226    
2227            * setup.cfg (bdist_rpm): Add the default value for prefix and tell
2228            bdist_rpm that we also have an install script.
2229            (bdist_inno): Add 2002 to the copyright notice.
2230    
2231            * setup.py: Create a file in python's site-packages directory to
2232            make installation of Thuban as a library easier.
2233            (ThubanInstall.user_options): Add two new options,
2234            create-init-module and init-module-dir
2235            (ThubanInstall.expand_with_pure_python_dirs): New method to expand
2236            filenames for installation in the default directories.
2237            (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
2238            the inherited methods to capture some filenames before they're
2239            transformed too much by distutils.
2240            (ThubanInstall.run): Create the init module if requested.
2241            (ThubanInstall.thuban_init_filename): New method to return the
2242            full name of the init module.
2243            (ThubanInstall.get_outputs): Append the filename of the init
2244            module.
2245    
2246    2002-07-08  Bernhard Herzog  <[email protected]>
2247    
2248            * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
2249            handle the prefix properly which means that the default for the
2250            installation prefix should be /usr for RPMs and /usr/local when
2251            doing a normal source install.
2252            (bdist_rpm_install_script): Script to override the default install
2253            commands in the specfile generated by the bdist_rpm command.
2254            (thuban_bdist_rpm.user_options): Add a prefix option
2255            (thuban_bdist_rpm.initialize_options): Init the prefix option.
2256            Create the script files for the spec files as empty files here
2257            (thuban_bdist_rpm._make_spec_file): Override the inherited method
2258            to fill the script files with content.
2259    
2260            * Thuban/Model/save.py (relative_filename): Wrapper around
2261            Thuban.Lib.fileutil.relative_filename that accepts an empty dir
2262            argument. save_session now automatically uses this version,
2263            solving a problem when saving to a relative filename.
2264    
2265            * setup.py: In the setup call, make sure that the library
2266            directories are under $prefix/lib not directly under $prefix.
2267    
2268    2002-06-20  Jan-Oliver Wagner <[email protected]>
2269    
2270            * Thuban/Model/extension.py: new module to handle extension objects.
2271            * Thuban/Model/messages.py: new messages for extensions.
2272            * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
2273            Session.AddExtension): new for handling extensions.
2274            Also some other minor changes to round up extension handling.
2275            * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
2276            of Extension titles and title and names of its objects.
2277    
2278    2002-05-29  Bernhard Herzog  <[email protected]>
2279    
2280            * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
2281            the events for a command.
2282            (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
2283            Call bind_command_events to bind the events. add_toolbar_command
2284            can now bind events too so that it's possible to have commands
2285            that are only available through the toolbar.
2286            (MainWindow.init_ids): New instance variable events_bound to keep
2287            track of for which commands events have been bound.
2288    
2289    2002-05-28  Bernhard Herzog  <[email protected]>
2290    
2291            * Thuban/UI/menu.py: New module to build and manage menus.
2292    
2293            * Thuban/UI/mainwindow.py: Remove some unused imports.
2294            (MainWindow.__init__, main_menu): move the definition of the main
2295            menu from __init__ to the Menu instance main_menu.
2296            (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
2297            build the menu bar and sub-menus from a menu description.
2298    
2299            * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
2300            startup file
2301            (ThubanApplication.read_startup_files): New method to run
2302            ~/.thuban/thubanstart.py
2303    
2304            * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
2305            Move the toolbar definition to the Menu instance main_toolbar.
2306            (MainWindow.build_toolbar): New method to build the toolbar
2307            similar to the build_menu methods
2308    
2309    2002-05-23  Bernhard Herzog  <[email protected]>
2310    
2311            * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
2312            layer_outline_color. Fix it in the definition of the command too.
2313    
2314            * Thuban/UI/command.py (Command): Fix typo in doc string
2315    
2316    2002-05-22  Bernhard Herzog  <[email protected]>
2317    
2318            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
2319            in the docstring
2320    
2321    2002-05-15  Bernhard Herzog  <[email protected]>
2322    
2323            * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
2324            when the shapefile is empty.
2325            (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
2326            now return None for empty shapefiles. Update doc-strings.
2327    
2328            * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
2329            the layer's bbox being None.
2330    
2331            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
2332            layer's bbox being None.
2333    
2334            * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
2335            necessary.
2336            (MapCanvas.__init__): New instance variables, last_selected_layer
2337            and last_selected_shape to determine how the selection has
2338            changed.
2339    
2340            * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
2341            AutoSizeColumns because it will cause a traversal of the entire
2342            table which for large .dbf files will take a very long time.
2343    
2344    2002-05-14  Bernhard Herzog  <[email protected]>
2345    
2346            * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
2347            maximum depth for the tree than shapelib does by default.
2348    
2349    2002-05-10  Bernhard Herzog  <[email protected]>
2350    
2351            * setup.py (py_modules): The shptree modules doesn't have a
2352            wrapper, so don't include it in the py_modules
2353    
2354    2002-05-08  Bernhard Herzog  <[email protected]>
2355    
2356            * extensions/shapelib/shptree.c (compare_ints): Make arguments
2357            const void * as in the qsort prototype
2358            (SHPTreeFindLikelyShapes): Remove some unused variables.
2359    
2360            * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
2361            maintains to redraw the window during a drag.
2362            (MapCanvas.unprojected_rect_around_point): New method to determine
2363            a small region around a point for hit-testing.
2364            (MapCanvas.find_shape_at): Only test the shapes in a small region
2365            around the point.
2366    
2367            * setup.py: Increment the version to 0.1.2
2368    
2369            * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
2370            debug print and set session to None after unsubscribing
2371    
2372    2002-05-07  Bernhard Herzog  <[email protected]>
2373    
2374            * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
2375            the file to have a .thuban extension.
2376    
2377            * Thuban/UI/tree.py (session_channels): New class constant with
2378            all the session channels to subscribe to to update the tree
2379            (SessionTreeCtrl.session_changed): Remember the session so that we
2380            can unsubscribe properly. Use the new class constant to
2381            unsubscribe from the old session and subscribe to the new one.
2382            (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
2383            subscriptions of the SessionTreeCtrl.
2384            (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
2385    
2386            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
2387            Session Tree" command to the file menu.
2388    
2389            * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
2390            as update_region to the renderer.
2391    
2392            * Thuban/UI/renderer.py
2393            (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
2394            update box is now directly a tuple, not a wxRect anymore.
2395    
2396            * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
2397            prints.
2398    
2399    2002-05-07  Bernhard Herzog  <[email protected]>
2400    
2401            * setup.py: Add the shptree extension module. See
2402            extensions/pyshapelib/ChangeLog for more details.
2403    
2404            * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
2405            extensions/shapelib/dbfopen.c: Really update to the versions of
2406            shapelib 1.2.9. For some reason it wasn't really done on
2407            2002-04-11.
2408    
2409            * extensions/shapelib/shptree.c: Modified version of shptree.c of
2410            shapelib 1.2.9. The only real difference is the use of qsort
2411            instead of a bubble sort implementation
2412    
2413            * Thuban/Model/layer.py (Layer.__init__): New instance variable
2414            shapetree to hold the shapelib quadtree for the shapefile
2415            (Layer.open_shapefile): Create the quad tree.
2416            (Layer.ShapesInRegion): New method to return the ids of shapes in
2417            a given region using the quad tree.
2418    
2419            * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
2420            comment
2421            (draw_polygon_shape): Accept both arcs and polygons.
2422            (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
2423            the api.
2424    
2425            * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
2426            return the shape ids to be rendered in a given layer.
2427            (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
2428            ids. Use draw_polygon_shape to draw arc shapes as well.
2429            (ScreenRenderer.RenderMap): New parameter for the rectangle that
2430            has to be updated
2431            (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
2432            calling it's ShapesInRegion method.
2433    
2434            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
2435            update_region for the update region.
2436            (MapCanvas.OnPaint): Maintain the update region
2437            (MapCanvas.do_redraw): Pass the bounding box of the update_region
2438            to the renderer when drawing the bitmap. Reset the update_region.
2439    
2440    2002-05-03  Bernhard Herzog  <[email protected]>
2441    
2442            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
2443            MainWindow.OpenSession): Change the file extension of the session
2444            files to .thuban
2445    
2446            * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
2447            Move the map channels to be forwarded by the session into the
2448            class constant with forwarded_channels. Also add
2449            LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
2450            forwarded_channels
2451    
2452            * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
2453            typo and some rewording).
2454    
2455    2002-05-02  Bernhard Herzog  <[email protected]>
2456    
2457            * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
2458            around to speed up most redraws:
2459            (MapCanvas.__init__): New instance variable bitmap which holds the
2460            bitmap
2461            (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
2462            self.bitmap to draw.
2463            (MapCanvas.full_redraw): New method to force a full redraw
2464            including the bitmap
2465            (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
2466            make sure the bitmap is redrawn.
2467            (MapCanvas.projection_changed, MapCanvas.set_view_transform,
2468            MapCanvas.shape_selected): Call full_redraw instead of readraw to
2469            make sure the bitmap is redrawn.
2470            (MapCanvas.OnSize): New method to handle size events so that the
2471            bitmap can be redrawn.
2472    
2473    2002-04-29  Bernhard Herzog  <[email protected]>
2474    
2475            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
2476            canvas' VIEW_POSITION event
2477            (MainWindow.view_position_changed): Handler for VIEW_POSITION.
2478            Update the text in the status-bar accordingly.
2479    
2480            * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
2481            (MapCanvas.__del__): Implement because Publisher.__del__ has to be
2482            called.
2483            (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
2484            current_position
2485            (MapCanvas.set_current_position): New method to set
2486            current_position. Issue a VIEW_POSITION event
2487            (MapCanvas.CurrentPosition): New public method to return the value
2488            of current_position. Should be called when the VIEW_POSITION event
2489            is processed.
2490            (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
2491            Update the position.
2492            (MapCanvas.OnLeaveWindow): Set the position to None.
2493    
2494            * Thuban/UI/messages.py (VIEW_POSITION): New message for the
2495            position in the statusbar
2496    
2497    2002-04-26  Frank Koormann <[email protected]>
2498    
2499            * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
2500    
2501    2002-04-24  Frank Koormann <[email protected]>
2502    
2503            * Resources/Bitmaps/identify.xpm: shadow added
2504    
2505            * Resources/Bitmaps/fullextent.xpm: new
2506    
2507    2002-04-22  Jan-Oliver Wagner <[email protected]>
2508    
2509            * 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
2515    
2516            * Thuban/UI/tree.py (update_tree): added added map extent
2517    
2518            * Thuban/UI/mainwindow.py (_method_command): extended by parameter
2519            icon; added map_full_extend as tool
2520    
2521    2002-04-19  Jan-Oliver Wagner <[email protected]>
2522    
2523            * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
2524            saving _new_ sessions
2525    
2526            * Thuban/Model/session.py (create_empty_session): new session
2527            don't have a filename (set to None)
2528    
2529            * Thuban/UI/tree.py (update_tree): added filename and modified flag
2530    
2531            * Thuban/Model/load.py (ProcessSession): convert projection
2532            parameters from unicode to regular string
2533    
2534            * Data/iceland_sample.session: Added UTM Zone 26 projection.
2535    
2536    2002-04-11  Bernhard Herzog  <[email protected]>
2537    
2538            * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
2539            extensions/shapelib/dbfopen.c: Update to the versions of shapelib
2540            1.2.9
2541    
2542            * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
2543            the pyshapelib directoy into the list of include dirs, so that
2544            pyshapelib_api.h can be found.
2545    
2546            * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
2547            holds the pyshapelib C-API
2548            (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
2549            pyshapelib_api to access the shapelib functions.
2550            (initwxproj): Import the c_api from the shapelib module and
2551            initialize pyshapelib_api.
2552    
2553    2002-04-04  Bernhard Herzog  <[email protected]>
2554    
2555            * setup.py (thuban_bdist_rpm.initialize_options): Use
2556            initialize_options to create the scripts for the rpm.
2557    
2558            * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
2559    
2560  2002-04-03  Bernhard Herzog  <[email protected]>  2002-04-03  Bernhard Herzog  <[email protected]>
2561    
2562          * setup.py: Increment version to 0.1.1          * setup.py: Increment version to 0.1.1
# Line 61  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 178  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 195  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 262  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 312  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 349  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.87  
changed lines
  Added in v.790

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26