/[thuban]/branches/WIP-pyshapelib-bramz/ChangeLog
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 55 by bh, Tue Sep 11 11:45:27 2001 UTC revision 2197 by frank, Tue May 4 17:17:00 2004 UTC
# Line 1  Line 1 
1    2004-05-04  Frank Koormann  <[email protected]>
2    
3            * Extensions/bboxdump/__init__.py: Fixed string left over from
4            copying.
5    
6            * Extensions/bboxdump/bboxdump.py (bboxdump):
7            Use layer.ShapeStore().AllShapes() to loop over shapes instead of
8            xrange(layer.NumShapes()). Compile the bboxmessage from a list
9            of formatted outputs (string.join) instead of appending to the
10            message. Two progress bar dialogs to report progress on the sometimes
11            lenghty processing.
12    
13    2004-04-22  Frank Koormann  <[email protected]>
14    
15            New Extension to dump bounding boxes of all shapes of the selected
16            layer. An optional column can be specified to group the objects,
17            in this case the bounding box is a union of the separate boxes.
18            Dump can be displayed in a ScrolledMessageDialog or written to file.
19            The Extension is simply a combination of available and well tested
20            Thuban functionality.
21    
22            * Extensions/bboxdump/__init__.py: New: Init to make this
23            directory a package.
24    
25            * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
26            all shapes of the selected layer.
27    
28    2004-04-22  Jan-Oliver Wagner <[email protected]>
29    
30            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
31            strings to be i18n now.
32    
33    2004-04-18  Jan-Oliver Wagner <[email protected]>
34    
35            Changing popup menu of legend from direct building
36            to using the Menu construction as used for the mainwindow.
37    
38            * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
39            layer_to_bottom, layer_visibility
40            (MainWindow.LayerToTop): New. Put current layer to the top.
41            (MainWindow.LayerToBottom): New. Put current layer to bottom.
42            (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
43            Replace 1,0 by True, False.
44            (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
45            current layer.
46            (MainWindow.LayerShowTable): Removed raising of dialog.
47            (_has_selected_layer_visible): New. Support function.
48    
49            * Thuban/UI/legend.py: ID_POP_xxx: removed.
50            (LegendPanel.__init__): Removed EVT_MENU bindings.
51            (LegendTree._OnRightClick): Replace direct creation of
52            menu via wx Classes by applying the menu definition
53            as of Menu class of menu.py.
54            
55    2004-04-16  Jan-Oliver Wagner <[email protected]>
56    
57            * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
58        button string to stronger clearify that Thuban will be closed when hitting
59            the button.
60    
61            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
62            Now for layers without a ShapeStore a corresponding message is given
63            to the user, that this layer has no table to show.
64    
65    2004-04-15  Martin Schulze  <[email protected]>
66    
67            * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
68            recalculate the format for the internal render engine as well.
69    
70            * Extensions/wms/properties.py (wmsProperties): First start for a
71            properties dialog.  It's functional for a first selection of
72            layers, but still has some weired wxWidgets/GTK problems but
73            beautification can be done later.
74    
75            * Extensions/wms/layer.py: Added more documentation
76            (WMSLayer.getFormats): New: Return list of supported image formats
77            by the WMS server
78            (WMSLayer.getLayers): New: Return the list of layer names
79            supported by the WMS server
80            (WMSLayer.getLayerTitle): New: Return the title of the named layer
81            (WMSLayer.getWMSFormat): New: Return the image format that is used
82            for WMS GetMap requests
83            (WMSLayer.setWMSFormat): New: Set the image format that is used
84            for WMS GetMap requests
85            (WMSLayer.__init__): Move away from using only one layer to using
86            a list of layers (unsorted at the moment, though).
87            (WMSLayer.getVisibleLayers): New: Return the list of names for all
88            visible layers
89            (WMSLayer.setVisibleLayers): New: Set the list of names for all
90            visible layers
91    
92            * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
93            order to establish a clean structure.
94    
95            * Extensions/wms/layer.py: Moved the WMS layer into a file on its
96            own in order to establish a clean structure.
97    
98    2004-04-13  Martin Schulze  <[email protected]>
99    
100            * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
101            support for oldstyle (WMS 1.0 apparently) image format
102            specification.
103    
104            * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
105            supported graphic formats back to JPEG and BMP, PNG and others are
106            too *cough* experimental...  Sorry, I meant to filter this out
107            before I committed this part.  This should make the WMS extension
108            run from CVS again.
109            (wms_dialog): Reset an empty URL to None so that the subsequent
110            program can depend on this, since the dialog will indeed return an
111            empty URL, causing another declaration of love by Python.
112    
113            * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
114            Whenever a native BoundingBox request cannot be fulfilled, check
115            whether the requested SRS is EPSG:3426, in which case return the
116            LatLonBoundingBox values.
117    
118            * Extensions/wms/test/test_parser.py
119            (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
120            ignoring AUTO:* SRS.
121            (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
122            Added another test method to test whether the LatLonBoundingBox
123            values will be returned if BoundingBox values are requested with
124            SRS set to EPSG:3426.
125    
126            * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
127            Added rudimentary support for non-EPSG SRS, i.e. ignore them for
128            the moment by placing them into a variable which is currently
129            unused.  Also test whether the EPSG SRS is numerical as it should
130            be and add an error message if it is not.
131    
132            * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
133            appear in the real world as well.  Since we cannot handle them yet
134            (OGCLib can't either), we will ignore them for the moment.
135    
136            * Extensions/wms/parser.py: Use a variable for denoting the sample
137            filename
138            (WMSCapabilitiesParser.peekLayers): Added support for error
139            messages during grok().  They will be aggregated in an array and
140            may be displayed later.  We may have to add a classification
141            "Warning" and "Error" to this.  That requires more experience,
142            though, since not every error may be lethal.
143    
144            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
145            ShowTable() dialog/frame when the user attempts to display it
146            while it has been opened before already and not closed again.
147    
148    2004-04-11  Martin Schulze  <[email protected]>
149    
150            * Extensions/wms/infodialog.py: Adjusted the class documentation
151    
152            * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
153            Switch to using Thuban{Begin,End}BusyCursor instead of the pure
154            wxWidgets variants.
155            (WMSLayer.__init__): The epsg_id variable is named top_srs now.
156    
157            * Extensions/wms/infodialog.py: Added an information dialog that
158            will display various information about the WMS current resource,
159            so that additional information such as the title, the abstract,
160            fees and access constraints can be displayed for the user if they
161            are documented in the WMS XML.
162    
163    2004-04-10  Martin Schulze  <[email protected]>
164    
165            * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
166            string handling.  It's "foo".lower() and not lower(foo) without
167            lower imported from strings or something.
168    
169            * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
170            from capabilities.py and parser.py.  Implement priority list for
171            supported graphics formats, take care of wbmp != bmp.  PNG, TIFF
172            and GIF are supported here, but not yet by main Thuban.  Hence,
173            support for them may be removed later.  Special contribution to
174            usability: get wxWidgets to change the cursor when we're waiting
175            for data from the network so the user won't start to worry.  This
176            causes a redrawing error/warning, though.
177    
178            * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
179            the DOM object.
180    
181    2004-04-01  Martin Schulze  <[email protected]>
182    
183            * Extensions/wms/capabilities.py: Adjusted documentation
184            (WMSCapabilities.__init__): Improved documentation, fixed syntax
185            (WMSCapabilities.saveCapabilities): Only catch IOError when
186            handling files
187            (WMSCapabilities.loadCapabilities): Only catch IOError when
188            handling files
189            __main__: corrected variable naming
190            (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
191            class a specialisation of WMSCapabilitiesParser as well.  Also
192            execute grok() after loading or fetching capabilities, if that
193            went well, so that subsequent calls can already access the data.
194            (WMSCapabilities.getVersion): Export the used version of the
195            GetCapabilities request, so we can use it for subsequent calls,
196            i.e. for GetMap requests.
197            (WMSCapabilities.fetchCapabilities): Added proper error handling
198            when the GetCapabilities request failed, so that the surrounding
199            program can act accordingly.
200    
201    2004-03-30  Martin Schulze  <[email protected]>
202    
203            * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
204            Adjusted the getLayerSRS method to return the list of SRSes
205            extracted from <SRS> elements instead of <BoundingBox> elements.
206            Added a bit of documentation as well.
207            (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
208            since it was only implemented due to a misunderstanding.
209    
210            * Extensions/wms/test/test_parser.py
211            (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
212            reflect the corrected interpretation of the standard: i.e. a layer
213            does not have to define a BoundingBox for all SRSes it supports.
214            Hence the <SRS></SRS> specification is authoritative, not the list
215            of BoundingBoxes.
216            (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
217            to ensure None is returned for a non-existing SRS.
218            (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
219            since it is not applicable anymore.  Listing more SRSes in <SRS>
220            elements is valid according to the specs.
221    
222    2004-03-26  Bernhard Reiter <[email protected]>
223    
224            * README: Nicer formatting of text. Improved descriptions.
225            Reflected wxWidgets name change.
226            
227            * Thuban/UI/about.py: Extended copyright to 2004 and added
228            information about the thuban-devel mailinglist.
229    
230    2004-03-24  Martin Schulze  <[email protected]>
231    
232            * Extensions/wms/capabilities.py: Renamed the class to contain
233            'WMS', also added a linebreak where required
234    
235            * Extensions/wms/parser.py: Finally added the XML parser for the
236            GetCapabilities response.
237    
238            * Extensions/wms/test/sample.xml: Adjusted the sample file so that
239            <SRS> elements match the <BoundingBox> elements, except for the
240            layer 'beschriftung'.
241    
242            * Extensions/wms/test/test_parser.py: Encode non-ascii strings
243            since Python uses unicode strings internally, otherwise
244            comparisons will fail.  Removed tests for getLayerBBoxSRS() since
245            the SRS will be calculated anyway and this method is obsoleted by
246            getLayerSRS().  Denote SRS as strings and not as cardinal numbers.
247            Move loading the sample file into the setUp method.  Added a test
248            for finding the integrity problem in the sample response.
249            Improved formatting.
250    
251            * Extensions/wms/domutils.py: Added convenience routines for
252            handling of Document Object Model (DOM) nodes.
253    
254            * Extensions/wms/test/test_domutils.py: Added a test for the
255            domutils module
256    
257    2004-03-19  Martin Schulze  <[email protected]>
258    
259            * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
260            Moved path detection and adding into a module of its own,
261            adjustpath, which exports thubandir as main Thuban directory.
262    
263            * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
264            detection and adding into a module of its own, adjustpath, which
265            exports thubandir as main Thuban directory.  Reorganised the
266            module in order to support the SkipTest feature for Thuban test
267            cases.
268    
269            * Extensions/wms/test/adjustpath.py: Moved path detection and
270            adding into a module of its own.
271    
272    2004-03-18  Martin Schulze  <[email protected]>
273    
274            * Extensions/wms/test/test_parser.py: Added another test for
275            checking whether the WMS XML parser (to be implemented) returns
276            the information we expect.  This requires a sample WMS WML file
277            (sample.xml) which has been extracted from the frida server and
278            "improved" manually.
279    
280            * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
281            main Thuban directory to the path in order to be able to import
282            random modules.  Adjusted the PyOGCLib detection to reuse the
283            information gathered.  Also added a note about the PYTHONPATH
284            environment variable.
285    
286            * Extensions/wms/test/test_ogclib.py: The format specification is
287            a mime-type, not a graphic format, hence image/jpeg wou ld be the
288            proper format and not JPEG.  We'll also have to take care of the
289            encoding of / as %2F.
290    
291    2004-03-16  Martin Schulze  <[email protected]>
292    
293            * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
294            comprehensive test for the getMapURL method, built compare URLs
295            according to the documentation in OGC 01-068r3
296    
297            * Extensions/wms/capabilities.py (WMSCapabilities): Added the
298            class WMSCapabilities to manage capabilites, will incorporate
299            parsing the capabilities response and provide details for other
300            classes.
301    
302    2004-03-12  Bernhard Herzog  <[email protected]>
303    
304            Support views in addition to normal tables in the postgis
305            shapestore
306    
307            * Thuban/Model/postgisdb.py
308            (PostGISShapeStore._fetch_table_information): Add a fallback for
309            the case where the table name is not in the geometry_columns
310            table.  This is usually the case for views.  Also, set
311            self.shapestore here.
312            (PostGISShapeStore.ShapeType): No need to query the database all
313            the time.  The shape type is now determined in
314            _fetch_table_information
315    
316            * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
317            (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
318            New parameter to specify views.
319            (PostGISDatabase.has_data): Also compare the views.  New views
320            parameter
321            (PostGISDatabase.initdb): Create the views.
322            (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
323            view
324    
325            * test/test_postgis_db.py
326            (TestPostGISShapestorePointFromViews): New.  Test a
327            PostGISShapeStore with a view
328            (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
329            the geometry_column explicitly to test whether that works
330    
331    2004-03-12  Bernhard Herzog  <[email protected]>
332    
333            Final step for explicit id/geometry columns: Loading and saving
334    
335            * Resources/XML/thuban-1.1.dtd: New.  Derived from thuban-1.0.dtd
336            with the following changes:
337            (dbshapesource): Two new attributes id_column and geometry_column
338    
339            * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
340            (SessionSaver.write_session): Use the new namespace
341            (SessionSaver.write_data_containers): Write the new dbshapesource
342            parameters
343    
344            * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
345            the new file format version
346            (SessionLoader.start_dbshapesource): Handle the new db parameters
347    
348            * test/test_save.py: Update to the new dtd and namespace
349            (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
350            mock object to provide a working IDColumn method.
351    
352            * test/test_load_1_0.py: New.  Copy of the test_load.py before
353            today's changes but with the round-trip tests removed.
354    
355            * test/test_load_0_9.py: Update doc-string.
356    
357            * test/test_load.py: Update all .thuban files to the new dtd and
358            namespace.
359            (TestPostGISLayer.file_contents): Add the new dbshapesource
360            paramters
361    
362    2004-03-11  Bernhard Herzog  <[email protected]>
363    
364            Next step for explicit id/geometry columns: User interaction
365    
366            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
367            the dialog is constructed. Add combo boxes to select id and
368            geometry column.  Rename some instance variables.
369            (ChooseDBTableDialog.GetTable): Return id and geometry column
370            names
371            (ChooseDBTableDialog.OnTableSelect): New. Event handler for
372            selections in the table list
373    
374            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
375            and geometry_column
376    
377            * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
378            parameters for id_column and geometry column of PostGISShapeStore
379            here as well.
380    
381            * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
382            (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
383            (PostGISConnection.GeometryTables): Use a better query to
384            determine which relations in the database might be usable for
385            shapestores.  Now supports views as well but is more PostgreSQL
386            specific
387            (PostGISConnection.table_columns): New. Somewhat experimental
388            method to let the db dialogs provide lists of columns to users so
389            that they can select id and geometry columns.
390            (PostGISTable.__init__): The default value of the id_column
391            parameter is now None it still means "gid" effectively, though.
392            (PostGISTable.IDColumn): New introspection method to return a
393            column object for the id column
394            (PostGISShapeStore.GeometryColumn): New introspection method to
395            return a column object for the geometry column
396    
397            * test/test_postgis_db.py
398            (TestPostGISConnection.test_gis_tables_non_empty):
399            Removed. Subsumed by the new:
400            (TestPostGISConnection.test_gis_tables_with_views_and_tables):
401            New. Tes the GeometryTables and table_columns methods with actual
402            tables and views.
403            (PointTests.test_id_column, PointTests.test_geometry_column):
404            New. tests for the new methods.
405            (TestPostGISShapestorePoint.setUp)
406            (TestPostGISShapestorePointSRID.setUp)
407            (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
408            instance variables needed by the new tests
409    
410    2004-03-11  Bernhard Herzog  <[email protected]>
411    
412            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
413            numbers given to ReadValue are ordinals.
414    
415    2004-03-11  Bernhard Herzog  <[email protected]>
416    
417            Elimiate the requirement for PostGIS tables to have a column
418            called "gid".
419    
420            * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
421            id_column to specify which column to use to identify rows.  Also
422            new instance variables id_column and quoted_id_column
423            (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
424            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
425            (PostGISTable.SimpleQuery): Use the id column name provided to the
426            constructor instead of "gid"
427            (PostGISShapeStore.__init__): New parameter id_column analogously
428            to PostGISTable.__init__.  This parameter is simply passed through
429            to the base class constructor
430            (PostGISShapeStore._create_col_from_description): Fix typo in
431            doc-string
432            (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
433            (PostGISShapeStore.ShapesInRegion): Use the id column name
434            provided to the constructor instead of "gid"
435    
436            * test/postgissupport.py
437            (PostgreSQLServer.get_default_static_data_db): New static table
438            landmarks_point_id with an id column != "gid.  Update the comments
439            a bit.
440            (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
441            doc-
442            (upload_shapefile): New parameter gid_column to use a name other
443            than "gid" for the column to store the shape ids
444    
445            * test/test_postgis_db.py (TableTests): New.  Mixin-class
446            containing all tests previously in TestPostGISTable.  The actual
447            tests are the same but the code is a bit more configurable to
448            allow for different id columns etc.
449            (TestPostGISTable): Derive from TableTests now for the actual
450            tests.
451            (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
452            except that it the landmarks_point_id table to test the id_column
453            parameter
454            (PointTests): Extend the doc-string
455            (TestPostGISShapestorePointExplicitGIDColumn)
456            (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
457            from PointTests to test the explicit id_column parameter.  One
458            tests with the name of the column holding the shape ids, the other
459            uses PostgreSQL's OID column.  For the latter a number of methods
460            have to be overwritten to make them independent of the actual id
461            values.
462    
463    2004-03-08  Silke Reimer  <[email protected]>
464    
465            Update debian directory:
466    
467            * debian/changelog: Added new version.
468            * deiban/rules: Updated management of patches (with cbds)
469            * debian/control: Added cbds to dependencies
470            * debian/patches/*: New. Adds better support for patches of thuban in
471                            debian
472            * debian/menu: Syntax of menu changed slightly
473            * debian/setup.py.patch: removed because it has been moved to
474                            debian/patechs/setup.py.patch
475            
476    
477    2004-02-26  Bernhard Herzog  <[email protected]>
478    
479            Create the Doc/technotes directory for text files with information
480            for developers
481    
482            * Doc/technotes/README: New. README for the technotes
483    
484            * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
485            Thuban
486    
487            * Doc/technotes/release_process.txt: New. Used to be
488            HOWTO-Release.  Now slightly adapted to technote formatting style.
489    
490            * HOWTO-Release: Removed.  It's contents are now in
491            Doc/technotes/release_process.txt
492    
493    2004-02-25  Bernhard Herzog  <[email protected]>
494    
495            * libraries/thuban/wxproj.cpp (get_wx_version): New.  Return the
496            version of wxWindows the module was compiled with so we can check
497            that against the wxPython version.
498    
499            * Thuban/version.py (thuban_branch, thuban_release): New variables
500            controlling which and how Thuban versions are shown.  See the
501            comments for details.
502            (verify_versions): Also check that the wx version that wxproj is
503            compiled against matches that of the wxPython we use at runtime
504    
505    2004-02-20  Bernhard Herzog  <[email protected]>
506    
507            * Extensions/wms/wms.py (epsg_code_to_projection): Use
508            get_system_proj_file to read the epsg projections.  The old way
509            depended on the current directory being the top Thuban directory.
510    
511    2004-02-20  Bernhard Herzog  <[email protected]>
512    
513            * Extensions/svgexport/test/test_svgmapwriter.py
514            (TestVirtualDC.test_clippath): Remove a debug print
515    
516    2004-02-20  Bernhard Herzog  <[email protected]>
517    
518            * Extensions/svgexport/__init__.py: New.  Turn
519            Extensions/svgexport into a package.
520    
521            * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
522            doc-string a bit.  The doc-string must come first, otherwise it's
523            not a doc-string.  The __future__ import must be the first thing
524            after the doc-string.  Use only double quotes in doc-strings.
525            Single quotes trip up emacs syntax highlighting if the text
526            contains apostrophes.
527    
528    2004-02-20  Bernhard Herzog  <[email protected]>
529    
530            * Extensions/svgexport/test/__init__.py,
531            Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
532            suite for svgexport
533    
534            * test/runtests.py (find_test_modules): New. Function with the
535            module finding code from main.
536            (main): Use find_test_modules to figure out the default test
537            modules and take modules from Extensions.svgexport.test too.
538    
539    2004-02-19  Bernhard Herzog  <[email protected]>
540    
541            * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
542            the mainwindow has a reference to the map of the initial session.
543            This fixes a bug introduced with the fix for RT#2245
544    
545    2004-02-19  Bernhard Herzog  <[email protected]>
546    
547            * Extensions/svgexport/svgsaver.py,
548            Extensions/svgexport/svgmapwriter.py,
549            Extensions/svgexport/maplegend.py: Added again.  This time in the
550            correct place.
551    
552    2004-02-17  Bernhard Herzog  <[email protected]>
553    
554            Fix for RT#2245
555    
556            * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
557            instance variables before trying to create any windows.  Creating
558            windows can start an event loop if e.g. message boxes are popped
559            up for some reason, and event handlers, especially EVT_UPDATE_UI
560            may want to access things from the application.
561            (ThubanApplication.maps_changed): The mainwindow may not have been
562            created yet, so check whether it has been created before calling
563            its methods
564    
565            * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
566            have a map
567    
568    2004-02-17  Bernhard Herzog  <[email protected]>
569    
570            * test/test_svgmapwriter.py, Extensions/svgsaver.py,
571            Extensions/svgmapwriter.py, Extensions/maplegend.py,
572            extensions/svgexport/svgsaver.py,
573            extensions/svgexport/svgmapwriter.py,
574            extensions/svgexport/maplegend.py: Removed.  These files were in
575            the wrong places or didn't work at all.
576    
577    2004-02-16  Bernhard Herzog  <[email protected]>
578    
579            * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
580            line
581    
582    2004-02-16  Bernhard Herzog  <[email protected]>
583    
584            * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
585    
586    2004-02-15  Markus Rechtien  <[email protected]>
587            
588            * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
589            to write a session to a file in SVG format.
590            * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
591            to write a SVG map of a session.
592            * Extensions/svgexport/maplegend: New. Writes a basic maplegend
593            in SVG format for the current session.
594    
595    2004-02-13  Bernhard Herzog  <[email protected]>
596    
597            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
598            can't be created, return immediately after displaying the error
599            message.
600    
601    2004-02-11  Bernhard Herzog  <[email protected]>
602    
603            Handle postgis tables with more than one geometry column.
604    
605            * Thuban/Model/postgisdb.py
606            (PostGISTable._fetch_table_information): Delegate the creation of
607            column objects to a different method so that we can extend that in
608            derived classes
609            (PostGISTable._create_col_from_description): New. Column object
610            creation part of _fetch_table_information
611            (PostGISShapeStore._create_col_from_description): New. Extend
612            inherited method to handle geometry columns
613            (PostGISShapeStore.__init__): New parameter geometry_column to
614            specify which geometry column to use.  Optional but mandatory for
615            tables with more than one geometry column
616            (PostGISShapeStore._fetch_table_information): Also use the name of
617            the geometry column when looking for the srid
618            (PostGISShapeStore.ShapeType): Also use the name of the geometry
619            column when looking for the shape type
620    
621            * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
622            NonConnectionStore to changes in the PostGISShapeStore
623    
624            * test/test_postgis_db.py
625            (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
626            PostGISShapeStore with tables having two geometry columns.
627    
628    2004-02-10  Bernhard Herzog  <[email protected]>
629    
630            Fix some postgis problems.  What remains to be done is real
631            handling of SRIDs as they affect how reprojection is done
632    
633            * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
634            doc-string
635            (PostGISShapeStore._fetch_table_information): New. Extend
636            inherited method to retrieve srid
637            (PostGISShapeStore.BoundingBox): Handle tables without data.
638            extent yields NULL for those
639            (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
640    
641            * test/test_postgis_db.py
642            (TestPostGISSpecialCases.test_shapestore_empty_table): New test
643            for the special case of a table without any data
644            (TestPostGISShapestorePointSRID): New class with tests for a table
645            that uses srids
646            (PolygonTests): Fix a doc-string typo
647    
648            * test/postgissupport.py (PostGISDatabase.__init__): New parameter
649            reference_systems with a specification of spacial reference
650            systems to create in the new db.
651            (PostgreSQLServer.new_postgis_db)
652            (PostgreSQLServer.get_static_data_db): New parameter
653            reference_systems to be passed through ultimately to
654            PostGISDatabase.  In new_postgis_db also check whether an existing
655            db already has the right srids
656            (PostgreSQLServer.get_default_static_data_db): Add srids and a
657            table that uses srids
658            (PostGISDatabase.initdb): Create the entries for the reference
659            systems
660            (PostGISDatabase.has_data): Add reference_systems parameter to
661            check for those too
662            (upload_shapefile): New parameter srid to create tables with a
663            specific srid
664    
665    2004-02-06  Frank Koormann  <[email protected]>
666    
667            * po/pt_BR.po: Fixed charset
668    
669    2004-02-05  Frank Koormann  <[email protected]>
670    
671            * po/pt_BR.po: Fixed format string for error message, missing %s
672            added (Thuban/UI/application.py:273)
673    
674    2004-02-03  Frank Koormann  <[email protected]>
675            
676            First version of Portuguese (Brazilian) translation
677    
678            * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
679            Brazilian Portuguese by Eduardo Patto Kanegae.
680    
681            * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
682            translators.
683    
684    
685    2004-01-22  Frank Koormann  <[email protected]>
686    
687            * Doc/manual/thuban-manual.xml: Added section on installation of
688            Thuban under Win32 systems. Fixed image path references in the postgis
689            section. Some minor source formattings.
690    
691    2004-01-21  Frank Koormann  <[email protected]>
692    
693            Make Thuban remember path selections (at least for one application run).
694    
695            * Thuban/UI/application.py (Application.OnInit): Initialize path as a
696            attribute of application object. Path is a dictionary of
697            strings, currently with the items "data" and "projection".  
698            (Application.SetPath): New, stores path for the specified item.
699            (Application.Path): New, return path for the specified item.
700    
701            * Thuban/UI/mainwindow.py
702            (MainWindow.OpenSession, MainWindow.SaveSessionAs,
703            MainWindow.AddLayer, MainWindow.AddRasterLayer,
704            MainWindow.TableOpen): Access "data" path information of the
705            application.
706            
707            * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
708            Access "projection" path information of the application.
709    
710    2004-01-05  Bernhard Herzog  <[email protected]>
711    
712            * po/ru.po: Updated translations from Alex Shevlakov
713    
714    2004-01-05  Bernhard Herzog  <[email protected]>
715    
716            * po/Makefile, po/README: Move the description of how to generate
717            the translation statistics to the README.
718    
719    2003-12-23  Bernhard Herzog  <[email protected]>
720    
721            * NEWS: Update for 1.0.0
722    
723            * po/it.po: Another update from Maurizio Napolitano
724    
725    2003-12-23  Bernhard Herzog  <[email protected]>
726    
727            * po/it.po: Updated translation from Maurizio Napolitano
728    
729    2003-12-23  Bernhard Herzog  <[email protected]>
730    
731            * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
732            for translation
733    
734            * Thuban/UI/mainwindow.py (MainWindow.TableRename)
735            (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
736            strings for translation
737    
738            * po/de.po: Update with the newly marked strings.
739    
740    2003-12-22  Bernhard Herzog  <[email protected]>
741    
742            * HOWTO-Release: Fix the places where version numbers have to be
743            updated
744    
745    2003-12-22  Bernhard Herzog  <[email protected]>
746    
747            * setup.py (setup call): 1.0.0, yeah!
748    
749            * Thuban/version.py (longversion): 1.0.0, yeah!
750    
751            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
752            1.0.0 namespace too
753    
754            * Thuban/Model/save.py (SessionSaver.write_session): Save with
755            1.0.0 namespace
756    
757            * test/test_load.py (LoadSessionTest.dtd)
758            (TestSingleLayer.file_contents)
759            (TestNonAsciiColumnName.file_contents)
760            (TestLayerVisibility.file_contents)
761            (TestClassification.file_contents, TestLabels.file_contents)
762            (TestLayerProjection.file_contents)
763            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
764            (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
765            (TestPostGISLayerPassword.file_contents)
766            (TestLoadError.file_contents, TestLoadError.test): Update for
767            1.0.0 namespace
768    
769            * test/test_save.py (SaveSessionTest.dtd)
770            (SaveSessionTest.testEmptySession)
771            (SaveSessionTest.testSingleLayer)
772            (SaveSessionTest.testLayerProjection)
773            (SaveSessionTest.testRasterLayer)
774            (SaveSessionTest.testClassifiedLayer)
775            (SaveSessionTest.test_dbf_table)
776            (SaveSessionTest.test_joined_table)
777            (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
778    
779    2003-12-22  Bernhard Herzog  <[email protected]>
780    
781            * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
782            alignment flags are byte strings not unicode and that they have
783            valid values
784    
785            * test/test_load.py (TestLabelLayer): New. Test loading (and
786            indirectly saving) of maps with labels.
787    
788    2003-12-22  Bernhard Herzog  <[email protected]>
789    
790            * Thuban/UI/tableview.py (TableGrid.OnDestroy)
791            (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
792            unsubscribe all subscribers.
793            (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
794            self.grid since it may already have been destroyed.
795            Fixes RT #2256
796    
797    2003-12-19  Bernhard Herzog  <[email protected]>
798    
799            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
800    
801    2003-12-16  Bernhard Herzog  <[email protected]>
802            
803            * debian/bitmappath.patch, debian/setup.py.patch:
804                    added to ensure compliance with FHS for debian
805            * debian/rules, debian/changelog:
806                added patches in rules to ensure compliance with FHS for debian
807    
808    2003-12-16  Bernhard Herzog  <[email protected]>
809    
810            * po/Makefile (mo): Make the output a bit nicer so that it prints
811            statistics about the translations. Add a comment how produce even
812            nicer statistics with sed.
813    
814    2003-12-09  Frank Koormann   <[email protected]>
815    
816            * Resources/Projections/defaults.proj:
817            French projection sample with correct accents (UNICODE).
818    
819    2003-12-05  Bernhard Herzog  <[email protected]>
820    
821            * MANIFEST.in: Add the devtools directory
822    
823            * setup.py (setup call): Use license instead of licence. This
824            silences a deprecation warning on Python 2.3
825    
826    2003-12-05  Frank Koormann   <[email protected]>
827    
828            Documentation synced with 1.0rc1
829    
830            * Doc/manual/thuban-manual.xml:
831            Minor formatting changes and references to database layers .
832            Introduction.Internationalization: New section on i18n.
833            MapManagement.AddingandRemovingLayers: Added item on database layers.  
834            MapManagement.TheLegend: Added section and screenshot on popup menu.
835            ProjectionManagement: Updated screenshot and sentence on EPSG.
836            Appendix.SupportedDataSources: Added PostGIS.
837            Appendix.WorkingwithPostGIS: New section.
838    
839            * Doc/manual/images/6_projection.png: Updated screenshot including
840            EPSG checkboxes.
841    
842            * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
843    
844            * Doc/manual/images/app_postgis_add_layer.png,
845            Doc/manual/images/app_postgis_db_add.png,
846            Doc/manual/images/app_postgis_db_management.png:
847            New screenshots focussing on database layers
848    
849    2003-12-05  Frank Koormann   <[email protected]>
850    
851            * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
852            write warning to stderr instead of rising a warning dialog
853    
854    2003-12-03  Bernhard Herzog  <[email protected]>
855    
856            Fix for RT #2243
857    
858            * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
859            New. Like has_selected_layer but for shape layers only
860            (_has_selected_shape_layer): New. Like _has_selected_layer but for
861            shape layers only
862            (layer_show_table command, layer_jointable command): Use these
863            commands should only be available for shape layers
864    
865    2003-12-03  Bernhard Herzog  <[email protected]>
866    
867            * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
868            publishers that are wx objects and may have been destroyed by wx
869            already. Fixes RT #2242.
870    
871    2003-12-03  Bernhard Herzog  <[email protected]>
872    
873            * po/ru.po: Updates from Alex Shevlakov
874    
875    2003-12-03  Silke Reimer <silkeintevation.de>
876    
877            * debian/control, debian/changelog: Added gdal-support to
878                    debian package, updated to new thuban version
879    
880    
881    2003-12-03  Bernhard Herzog  <[email protected]>
882    
883            * Thuban/Lib/version.py: New. Module for version number
884            manipulations. The version of make_tuple here also deals better
885            with more unusual version number strings, such as e.g.
886            "1.2+cvs20031111"
887    
888            * Thuban/version.py (make_tuple): Removed. It's now in
889            Thuban.Lib.version. Use that implementation instead.
890    
891            * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
892    
893    2003-12-02  Bernhard Herzog  <[email protected]>
894    
895            * MANIFEST.in: Add debian files
896    
897            * setup.py (setup call): Add packages for the Extensions so that
898            they're installed too
899            (data_files): Add READMEs and sample data from some Extensions
900    
901            * NEWS: Add note about the extensions in binary packages
902    
903    2003-12-02  Bernhard Herzog  <[email protected]>
904    
905            * Thuban/Model/save.py (SessionSaver.write_session): Save files
906            with the thuban-1.0rc1
907    
908            * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
909            thuban-1.0rc1 namespace too
910    
911            * test/test_save.py (SaveSessionTest.dtd)
912            (SaveSessionTest.testEmptySession)
913            (SaveSessionTest.testSingleLayer)
914            (SaveSessionTest.testLayerProjection)
915            (SaveSessionTest.testRasterLayer)
916            (SaveSessionTest.testClassifiedLayer)
917            (SaveSessionTest.test_dbf_table)
918            (SaveSessionTest.test_joined_table)
919            (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
920            namespace
921    
922            * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
923            namespace
924            (TestSingleLayer.file_contents)
925            (TestNonAsciiColumnName.file_contents)
926            (TestLayerVisibility.file_contents)
927            (TestClassification.file_contents, TestLabels.file_contents)
928            (TestLayerProjection.file_contents)
929            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
930            (TestPostGISLayer.file_contents)
931            (TestPostGISLayerPassword.file_contents)
932            (TestLoadError.file_contents, TestLoadError.test): Update to
933            thuban-1.0rc1 namespace
934    
935    2003-12-01  Bernhard Herzog  <[email protected]>
936    
937            * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
938            nt to better match Intevation's current w32 setup
939    
940            * HOWTO-Release: Add note about updating MANIFEST.in
941    
942            * MANIFEST.in: Add the Extensions
943    
944            * NEWS: Update for 1.0rc1
945    
946    2003-12-01  Bernhard Herzog  <[email protected]>
947    
948            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
949            cards for the dialog so that shapefiles ending in all uppercase
950            SHP are listed too
951    
952    2003-11-28  Bernhard Herzog  <[email protected]>
953    
954            * Thuban/version.py (longversion): Update to 1.0rc1
955    
956            * setup.py (setup call): Update version to 1.0rc1. Use the
957            [email protected] email address as author email instead of my
958            personal one.
959    
960    2003-11-28  Bernhard Herzog  <[email protected]>
961    
962            * po/de.po: Update german translation.
963    
964    2003-11-28  Bernhard Herzog  <[email protected]>
965    
966            Unify the filenames stored in .thuban files so that the .thuban
967            files are more platform independend
968    
969            * Thuban/Model/save.py (unify_filename): New. Unify filenames so
970            that they can be used on both windows and unix
971            (SessionSaver.prepare_filename): New. Handle all filename
972            transformations for filenames stored in the thuban file
973            (SessionSaver.write_data_containers, SessionSaver.write_layer):
974            Use prepare_filename
975    
976            * test/test_save.py (SaveSessionTest.testSingleLayer)
977            (SaveSessionTest.testLayerProjection)
978            (SaveSessionTest.testRasterLayer)
979            (SaveSessionTest.testClassifiedLayer)
980            (SaveSessionTest.test_dbf_table)
981            (SaveSessionTest.test_joined_table): Filenames are always stored
982            with slashes on all currently supported platforms so adapt all
983            tests to this
984    
985            * test/test_load.py (LoadSessionTest.filenames): With the new
986            filename scheme the filenames in the tests should be
987            understandable on all currently supported platforms so we turn
988            this into an empty list because we don't have to normalize them
989            anymore
990    
991    2003-11-28  Bernhard Herzog  <[email protected]>
992    
993            * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
994            Add the ellipsoid to the projection since some Proj versions
995            complain if it's missing.
996    
997    2003-11-27  Bernhard Herzog  <[email protected]>
998    
999            Corect some bounding box projection problems
1000    
1001            * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
1002            version of ForwardBBox
1003            (Projection._transform_bbox): New. common implementation of
1004            ForwardBBox and InverseBBox
1005            (Projection.ForwardBBox): Use _transform_bbox.
1006    
1007            * test/test_proj.py (TestProjection.test): Add test for
1008            InverseBBox
1009    
1010            * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
1011            (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
1012            new InverseBBox method to determine the unprojected bounding box
1013            (Layer.ShapesInRegion): Use the ForwardBBox method to project the
1014            bbox.
1015    
1016            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
1017            Removed.
1018            (TestLayer.test_arc_layer_with_projection): New. This test is
1019            better able to test whether bounding boxes are projected correctly
1020            than test_point_layer_with_projection
1021    
1022            * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
1023            InverseBBox to unproject bboxes
1024    
1025    2003-11-25  Bernhard Herzog  <[email protected]>
1026    
1027            * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
1028            source code.
1029    
1030    2003-11-25  Bernhard Herzog  <[email protected]>
1031    
1032            * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
1033            there for backwards compatibility and all code relying on that
1034            should have been updated by now.
1035    
1036    2003-11-25  Bernhard Herzog  <[email protected]>
1037    
1038            * test/test_load.py (TestClassification.test): Add the missing
1039            round trip test.
1040            (TestClassification.file_contents): Update to the newest file
1041            format
1042    
1043    2003-11-25  Bernhard Herzog  <[email protected]>
1044    
1045            Add very experimental (and possibly dangerous) extension to draw
1046            polygons:
1047    
1048            * Extensions/drawshape/README: New. Brief installation
1049            instructions
1050    
1051            * Extensions/drawshape/drawshape.py: New. Implementation of the
1052            drawshape extensions
1053    
1054            * Extensions/drawshape/patch.diff: Patch to apply before the
1055            extension can be used.
1056    
1057    2003-11-24  Bernhard Herzog  <[email protected]>
1058    
1059            * Thuban/Model/data.py (ShapefileStore._open_shapefile)
1060            (ShapefileStore.__init__): Factor opening the shapefile into a
1061            separate method (the new _open_shapefile). This makes the code a
1062            bit more readable but the real reason is that it makes some evil
1063            hacks easier. :-)
1064    
1065    2003-11-24  Bernhard Herzog  <[email protected]>
1066    
1067            * Thuban/Model/load.py (SessionLoader.check_attrs): If no
1068            converter is specified for an attribute assume it's a string
1069            containing only Latin1 characters. Update doc-string accordingly.
1070            This change should fix many places where unicode objects might
1071            accidentally enter Thuban.
1072    
1073            * test/test_load.py (TestNonAsciiColumnName): New test to check
1074            what happens with column names in DBF files that contain non-ascii
1075            characters
1076    
1077    2003-11-21  Bernhard Herzog  <[email protected]>
1078    
1079            Enable the experimental attribute editing again and introduce a
1080            command line switch to actually activate it
1081    
1082            * Thuban/UI/main.py (options): New. Container for options set on
1083            the commmand line
1084            (main): Add the --enable-attribute-editing flag.
1085    
1086            * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
1087            editing is enabled use the grid ctrl which allows editing of the
1088            values
1089    
1090            * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
1091            New. Just delegate this to the underlying table.
1092    
1093    2003-11-20  Bernhard Herzog  <[email protected]>
1094    
1095            * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
1096            Skip this test if run under non-posix systems since it only works
1097            there
1098    
1099    2003-11-19  Bernhard Herzog  <[email protected]>
1100    
1101            * Thuban/Model/resource.py: Rework the way gdal support is
1102            determined so that we can give a reason in the about why gdal is
1103            not supported.
1104            (gdal_support_status): New. Variable holding a string with the
1105            reason for no gdal support
1106    
1107            * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
1108            not supported to the message
1109    
1110    2003-11-19  Bernhard Herzog  <[email protected]>
1111    
1112            Remove the old table interface and its test cases
1113    
1114            * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
1115            (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
1116            anymore
1117    
1118            * Thuban/Model/transientdb.py (TransientTableBase)
1119            (AutoTransientTable): Do not derive from OldTableInterfaceMixin
1120            anymore
1121    
1122            * test/test_table.py: Removed since the old interface it tests is
1123            gone.
1124    
1125            * test/runtests.py (main): The old table interface is gone and
1126            with it the deprecation warnings so remove the code that turns
1127            these warnings into errors
1128    
1129    2003-11-19  Bernhard Herzog  <[email protected]>
1130    
1131            * test/test_table.py: Revert to revision 1.5 again. Changing the
1132            tests to use the new table interface is completely wrong since the
1133            whole purpose of the tests in this module is to test the old
1134            interface.
1135    
1136    2003-11-18  Bernhard Herzog  <[email protected]>
1137    
1138            * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
1139            New. Test whether the connection matches a set of connection
1140            parameters
1141    
1142            * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
1143            (DBFrame.OnAdd): Use the new MatchesParameters method when looking
1144            for existing connections with the same parameters and break out of
1145            the loop correctly.
1146    
1147            * test/test_postgis_db.py (TestBriefDescription)
1148            (TestPostGISSimple.test_brief_description): Rename
1149            TestBriefDescription to TestPostGISSimple and the test method to
1150            test_brief_description so that we can add more test methods.
1151            (TestPostGISSimple.test_matches_parameters): New. Test the new
1152            MatchesParameters method
1153    
1154    2003-11-18  Bernhard Herzog  <[email protected]>
1155    
1156            * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
1157            _was_destroyed, to indicate whether an publisher instance has
1158            already been destroyed.
1159            (Publisher.Unsubscribe): Only disconnect if the publisher has not
1160            been destroyed yet.
1161            (Publisher.Destroy): Set the _was_destroyed flag to true.
1162    
1163            * test/test_connector.py
1164            (TestPublisher.test_unsubscribe_after_destroy): New. Test that
1165            calling Unsubscribe after Destroy doesn't raise an exception
1166    
1167    2003-11-14  Bernhard Herzog  <[email protected]>
1168    
1169            * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
1170            typo in doc-string
1171    
1172    2003-11-13  Bernhard Herzog  <[email protected]>
1173    
1174            Quote table and column names properly for postgis.
1175    
1176            * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
1177            quote an identifier for use in an sql statement
1178            (PostGISColumn.__init__): Add the quoted_name attribute
1179            (PostGISTable.__init__): New instance variable quoted_tablename
1180            (PostGISTable._fetch_table_information): Use the quoted table
1181            name. New isntance variable quoted_geo_col with a quoted version
1182            of geometry_column
1183            (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
1184            (PostGISTable.RowOrdinalToId): Use the quoted table name
1185            (PostGISTable.ReadValue, PostGISTable.ValueRange)
1186            (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
1187            (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
1188            (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
1189            Use quoted table and column names
1190    
1191            * test/test_postgis_db.py (TestPostGISSpecialCases)
1192            (TestPostGISIgnoredColumns): Rename the class to
1193            TestPostGISSpecialCases because that better describes the new
1194            cases
1195            (TestPostGISSpecialCases.test_unsupported_types)
1196            (TestPostGISSpecialCases.test): Rename the method to
1197            test_unsupported_types because we need a more descriptive name now
1198            that there are more methods
1199            (TestPostGISSpecialCases.test_table_name_quoting)
1200            (TestPostGISSpecialCases.test_column_name_quoting)
1201            (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
1202            cases to test quoting of table and column names in PostGISTable
1203            and PostGISShapeStore
1204    
1205            * test/postgissupport.py
1206            (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
1207            AddGeometryColumn desn't support table or column names with sapces
1208            or double quotes
1209    
1210    2003-11-12  Jan-Oliver Wagner <[email protected]>
1211    
1212            * Extensions/wms/__init__.py: New: Init to make this
1213            directory a package.
1214    
1215            * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
1216    
1217    2003-11-11  Bernhard Herzog  <[email protected]>
1218    
1219            * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
1220            Constant for the file woth deprecated epsg projections
1221            (get_system_proj_file): Update doc-string
1222    
1223            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
1224            above the EPS widgets, introduce a check box for the deprecated
1225            eps projections and a label for the epsg widgets
1226            (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
1227            too
1228    
1229    2003-11-11  Bernhard Herzog  <[email protected]>
1230    
1231            Avoid warnings when run under Python 2.3
1232    
1233            * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
1234            (BaseRenderer.draw_label_layer): Coordinates must be ints.
1235    
1236            * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
1237            real method so that we can convert to int.
1238            (MapRenderer.label_font): The font size mist be an int.
1239    
1240            * Thuban/UI/common.py (Color2wxColour): The color values must be
1241            ints. Also, remove the unnecessary asserts.
1242    
1243            * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
1244            (TestUnicodeStrings.test): Python source code should not contain
1245            non-ascii characters unless an encoding is specified in the file.
1246            Therefore use \x escapes in the string literals for non-ascii
1247            characters.
1248    
1249    2003-11-11  Bernhard Herzog  <[email protected]>
1250    
1251            * Thuban/Model/resource.py (get_system_proj_file): Add a filename
1252            parameter so that this function can be used for all proj files in
1253            Resource/Projections
1254            (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
1255            get_system_proj_file
1256    
1257            * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
1258            ProjFile self.__sysProjFile use a dictionary of system ProjFile
1259            objects self._sys_proj_files
1260            (ProjFrame.build_dialog): Adapt to the new changes in the
1261            ProjectionList constructor. Add a check button to toggle whether
1262            EPSG projections are shown
1263            (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
1264            events.
1265            (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
1266            the busy cursor if the files have not yet been loaded by the
1267            dialog.
1268            (ProjFrame.load_system_proj): Add a parameter for the name of the
1269            proj file. Maintain the dictionary of system projections
1270            self._sys_proj_files
1271    
1272            * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
1273            user_projs parameters into one parameter proj_files which is a
1274            list of proj files.
1275            (ProjectionList._subscribe_proj_files)
1276            (ProjectionList._unsubscribe_proj_files): New. Move
1277            subscription/unsubscription of projfile messages to separate
1278            methods
1279            (ProjectionList.Destroy): The unsubscribe is now done in
1280            _unsubscribe_proj_files
1281            (ProjectionList.update_projections): We now have a list of proj
1282            file objects
1283            (ProjectionList.SetProjFiles): New method to set a new list of
1284            proj file objects
1285    
1286            * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
1287            Specify explicitly which system proj file to load.
1288    
1289    2003-11-11  Bernhard Herzog  <[email protected]>
1290    
1291            * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
1292            instance variables to cut cyclic references. The GC would have
1293            collected the loader eventually but it can happen that it doesn't
1294            run at all until thuban is closed (2.3 but not 2.2 tries a bit
1295            harder and forces a collection when the interpreter terminates)
1296            (load_session): Call the handler's Destroy method to make sure
1297            that it gets garbage collected early. Otherwise it will be
1298            collected very late if at all and it holds some references to e.g.
1299            shapestores and the session which can lead to leaks (of e.g. the
1300            temporary files)
1301    
1302            * test/test_load.py (TestSingleLayer.test_leak): New. test for the
1303            resource leak in load_session
1304    
1305    2003-11-10  Bernhard Herzog  <[email protected]>
1306    
1307            * Thuban/UI/baserenderer.py: Add a way to specify how layers in
1308            extensions are to be rendered.
1309            (_renderer_extensions): New. List with renderer for layers in
1310            extensions
1311            (add_renderer_extension): New. Add a renderer extension
1312            (init_renderer_extensions): New. Init the renderer extensions
1313            (BaseRenderer.render_map_incrementally): Search
1314            _renderer_extensions for how to draw unknown layer types
1315            (BaseRenderer.draw_raster_data): Add format parameter so that
1316            formats other than BMP can be drawn
1317            (BaseRenderer.draw_raster_layer): Pass an explicit format to
1318            draw_raster_data
1319    
1320            * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
1321            strings of the format parameter of draw_raster_data method to wx
1322            constants
1323            (MapRenderer.draw_raster_data): Add the format parameter and use
1324            raster_format_map to map it to the right wxwindows constant for
1325            wxImageFromStream
1326    
1327            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
1328            the format parameter and record it
1329            (TestBaseRenderer.test_raster_no_projection): check the format
1330            paramter of the draw_raster_data method
1331            (TestBaseRenderer.test_renderer_extension): New. Test the renderer
1332            extension facility
1333    
1334    2003-11-07  Bernhard Herzog  <[email protected]>
1335    
1336            Tweak the usage of the sqlite database to make common use cases
1337            more responsive. In most cases copying the data to the sqlite
1338            database takes so long that using sqlite doesn't have enough
1339            advantages.
1340    
1341            * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
1342            comments about performance and query the min and max in separate
1343            statements because only that way will indexes be used.
1344            (TransientTableBase.UniqueValues): Add some comments about
1345            performance.
1346            (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
1347            Do not copy the data to the transient DB but use the transient
1348            copy if it exists. See the new comments for the performance trade
1349            offs
1350    
1351            * test/test_transientdb.py
1352            (TestTransientTable.test_auto_transient_table): Make sure that the
1353            data is copied to the transient database at some point.
1354    
1355    2003-11-03  Bernhard Herzog  <[email protected]>
1356    
1357            * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
1358            globals to locals so that it's a bit faster
1359    
1360    2003-11-03  Bernhard Herzog  <[email protected]>
1361    
1362            * Thuban/UI/baserenderer.py
1363            (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
1364            method. ReadValue is faster than ReadRowAsDict since it only reads
1365            one cell especially now that the dbf file objects actually
1366            implement it.
1367    
1368            * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
1369            read_attribute method of the dbf objects
1370    
1371    2003-11-03  Bernhard Herzog  <[email protected]>
1372    
1373            * Extensions/profiling/profiling.py (popup_dialog_box): New config
1374            variable to indicate whether the result should be shown in a
1375            dialog box
1376            (profile_screen_renderer, time_screen_renderer): Only show a
1377            dialog box if popup_dialog_box is true.
1378            (profile_screen_renderer): Flush stdout after the printing the
1379            first part of the "profiling..." message
1380    
1381            * Thuban/UI/baserenderer.py
1382            (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
1383            brushes for the groups so that they're not created over and over
1384            again
1385    
1386            * Thuban/Model/classification.py (Classification.__getattr__)
1387            (Classification._compile_classification)
1388            (Classification._clear_compiled_classification): New. Methods to
1389            manage a 'compiled' representation of the classification groups
1390            which is created on demand
1391            (Classification.InsertGroup, Classification.RemoveGroup)
1392            (Classification.ReplaceGroup): reset the compiled representation
1393            (Classification.FindGroup): Use the compiled representation to
1394            find the matching group
1395            (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
1396    
1397    2003-10-31  Bernhard Herzog  <[email protected]>
1398    
1399            * Thuban/Model/classification.py (Classification.SetDefaultGroup):
1400            Send a CLASS_CHANGED message
1401            (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
1402            not return the removed group since it wasn't used.
1403    
1404            * test/test_classification.py
1405            (TestClassification.test_set_default_group): New. Test the
1406            SetDefaultGroup method
1407            (TestClassification.test_insert_group): New. Test the InsertGroup
1408            method
1409            (TestClassification.test_remove_group): New. Test the RemoveGroup
1410            method
1411            (TestClassification.test_replace_group): New. Test the
1412            ReplaceGroup method
1413    
1414    2003-10-31  Bernhard Herzog  <[email protected]>
1415    
1416            * test/test_classification.py (TestClassification.setUp):
1417            Subscribe to the CLASS_CHANGED messages
1418            (TestClassification.tearDown): New. Destroy the classification
1419            properly
1420            (TestClassification.test_defaults): Add tests for the default line
1421            width and whether no messages were sent yet
1422            (TestClassification.test_set_default_properties): Add tests for
1423            messages and setting the default line width
1424            (TestClassification.test_add_singleton)
1425            (TestClassification.test_add_range)
1426            (TestClassification.test_multiple_groups): Add tests for messages
1427    
1428    2003-10-31  Bernhard Herzog  <[email protected]>
1429    
1430            Some more refactoring in preparation for new tests:
1431    
1432            * test/test_classification.py (TestClassification.setUp): New.
1433            Instantiate the classification here. Update the test methods
1434            accordingly.
1435            (TestClassification.test_multiple_groups): Make sure that the two
1436            singletons matching 1 are considered different.
1437    
1438    2003-10-31  Bernhard Herzog  <[email protected]>
1439    
1440            * test/test_classification.py (red, green, blue): New. These
1441            constants were used in several cases. Update the relevant methods.
1442            (TestClassification.test_defaults)
1443            (TestClassification.test_set_default_properties)
1444            (TestClassification.test_add_singleton)
1445            (TestClassification.test_add_range)
1446            (TestClassification.test_multiple_groups)
1447            (TestClassification.test_deepcopy): New. These were formerly all
1448            part of the single method test.
1449            (TestClassification.test_deepcopy): Removed.
1450            (TestClassIterator): Removed. The test case is now a method of
1451            TestClassification since it tests part of the public interface of
1452            Classification
1453            (TestClassification.test_iterator): New. Used to be
1454            TestClassIterator effectively
1455    
1456    2003-10-31  Jan-Oliver Wagner <[email protected]>
1457    
1458            GUIfied the functions of the profiling extension.
1459    
1460            * /Extensions/profiling/__init__.py: New: Init to make this
1461            directory a package.
1462    
1463            * Extensions/profiling/profiling.py: Moved menu entries to
1464            the Extensions menu. Applied _() for strings.
1465            (profile_screen_renderer): Catch the detailed printout and present
1466            it in a dialog.
1467            (time_screen_renderer): Raise a dialog to present the result instead
1468            of printing it to stdout.
1469    
1470    2003-10-31  Bernhard Herzog  <[email protected]>
1471    
1472            * test/test_classification.py (TestClassGroupProperties)
1473            (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
1474            (TestClassGroupSingleton, TestClassIterator, TestClassification):
1475            Split TestClassification into several classes, one for each class
1476            being tested. TestClassification itself now only tests
1477            Classification. This split makes changes to the tests a bit easier
1478    
1479    2003-10-31  Bernhard Herzog  <[email protected]>
1480    
1481            * Extensions/profiling/profiling.py: New. Extension to measure
1482            Thuban performance
1483    
1484    2003-10-31  Frank Koormann <[email protected]>
1485    
1486            Added two items to legend popup menu: Remove Layer and Show Layer Table
1487    
1488            * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
1489            LegendPanel._OnShowTable): New event handlers, call the corresponding
1490            mainwindow methods.
1491            (LegendTree._OnRightClick): Added items to popup menu.
1492    
1493    2003-10-30  Bernhard Herzog  <[email protected]>
1494    
1495            * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
1496            EVT_WINDOW_DESTROY
1497            (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
1498            nothing but is convenient for the derived classes.
1499    
1500            * Thuban/UI/tableview.py
1501            (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
1502            Unsubscribe the messages here not in OnClose because that might
1503            get called multiple times. Fixes RT #2196
1504            (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
1505            anymore.
1506    
1507            * README: Update the minimum requirement for wxPython. Since we
1508            now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
1509            the version in which that was introduced for all platforms
1510    
1511    2003-10-30  Frank Koormann <[email protected]>
1512    
1513            * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
1514            the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
1515            frame.
1516    
1517    2003-10-30  Jan-Oliver Wagner <[email protected]>
1518    
1519            Improved APR import extension, added further EPSG definitions
1520            and some cleanup regarding string class.
1521    
1522            * test/test_proj.py (TestProjection.test_get_projection_units_geo):
1523            Added test for alias 'longlat'.
1524    
1525            * Resources/Projections/epsg-deprecated.proj: New. Contains
1526            deprecated EPSG definitions.
1527    
1528            * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
1529            the variable names for objects.
1530    
1531            * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
1532            Copied from importAPR and provided with documentation.
1533    
1534            * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
1535            Moved to apr.py.
1536            (APR_View): Added object ref 'ITheme'.
1537    
1538            * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
1539            split function by corresponding use of the string class method.
1540    
1541            * Thuban/Model/xmlwriter.py: Replaced string replace function by
1542            corresponding string method.
1543    
1544    2003-10-29  Bernhard Herzog  <[email protected]>
1545    
1546            * Thuban/UI/baserenderer.py
1547            (BaseRenderer.draw_shape_layer_incrementally): Speed up the
1548            special case of a classification that only has the default group
1549    
1550    2003-10-27  Bernhard Herzog  <[email protected]>
1551    
1552            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
1553    
1554            * po/de.po: Update.
1555    
1556            * Thuban/UI/application.py
1557            (ThubanApplication.ShowExceptionDialog): Handle translation of the
1558            dialog message properly
1559    
1560    2003-10-27  Bernhard Herzog  <[email protected]>
1561    
1562            Rework how localization works so that we use wx's translation
1563            functions when running Thuban as a normal application but not when
1564            we don't need any UI, such as in the test suite. See the comment
1565            in Thuban/__init__.py for details
1566    
1567            * Thuban/__init__.py (_): Add one level of indirection to make the
1568            translation handling more flexible and to make it possible to use
1569            either wx's translation services or not.
1570            (gettext_identity, translation_function_installed)
1571            (install_translation_function): New function to help with this
1572    
1573            * Thuban/UI/__init__.py: Install the wx specific translation
1574            function if it's OK to do that
1575    
1576            * test/support.py (initthuban): Install a dummy translation
1577            function so that importing Thuban.UI doesn't install a wx specific
1578            one for which would need to import wxPython
1579    
1580    2003-10-27  Bernhard Herzog  <[email protected]>
1581    
1582            * HOWTO-Release: Source archives should be created first and the
1583            binary packages should be created from the source archives.
1584            There's an official debian package now so there's no need to test
1585            the rpm on debian anymore
1586    
1587    2003-10-27  Bernhard Herzog  <[email protected]>
1588    
1589            Several rendering changes:
1590    
1591             - Render the selection into a separate bitmap so that only that
1592               bitmap needs to be redrawn when the selection changes
1593    
1594             - Render incrementally showing previews and allowing interaction
1595               before rendering is complete
1596    
1597             - Update the renderer interface a bit. Most parameters of
1598               RenderMap are now parameters of the constructor
1599    
1600            * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
1601            and the update region as parameters. Update the doc-string
1602            (BaseRenderer.render_map_incrementally): New. Generator function
1603            to renders the map incrementally
1604            (BaseRenderer.render_map): Remove the map argument (it's now in
1605            the constructor) and simply iterate over the
1606            render_map_incrementally generator to draw the map.
1607            (BaseRenderer.draw_shape_layer_incrementally)
1608            (BaseRenderer.draw_shape_layer): Renamed to
1609            draw_shape_layer_incrementally and changed into a generator that
1610            yields True every 500 shapes. Used by render_map_incrementally to
1611            render shape layers incrementally
1612    
1613            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
1614            map and region parameters which are now in the constructor
1615            (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
1616            the inherited render_map_incrementally.
1617            (BaseRenderer.draw_shape_layer): Removed.
1618            (ScreenRenderer.draw_selection_incrementally): New. The selection
1619            drawing part of the removed draw_shape_layer as a generator
1620            (ScreenRenderer.layer_shapes): Update because of the region
1621            parameter change
1622            (ExportRenderer.__init__): New. Extend the inherited constructor
1623            with the destination region for the drawing
1624            (ExportRenderer.RenderMap): Removed the map and region parameters
1625            which are now in the constructor
1626    
1627            * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
1628            bitmap suitable for a preview in a tool
1629            (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
1630            bitmap
1631            (MapPrintout.draw_on_dc): Adapt to new renderer interface
1632            (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
1633            exists
1634            (MapCanvas.OnIdle): Update the logic to deal with incremental
1635            rendering and the selection bitmap
1636            (MapCanvas._do_redraw): Handle the instantiation of the render
1637            iterator and the redraws during rendering
1638            (MapCanvas._render_iterator): New. Generator to incrementally
1639            redraw both bitmaps
1640            (MapCanvas.Export): Adapt to new renderer interface.
1641            (MapCanvas.full_redraw): Reset the selection bitmap and the
1642            renderer iterator too
1643            (MapCanvas.redraw_selection): New. Force a redraw of the selection
1644            bitmap
1645            (MapCanvas.shape_selected): Only redraw the selection bitmap
1646    
1647            * test/test_baserenderer.py
1648            (TestBaseRenderer.test_polygon_no_projection)
1649            (TestBaseRenderer.test_raster_no_projection)
1650            (TestBaseRenderer.test_point_map_projection)
1651            (TestBaseRenderer.test_point_layer_and_map_projection)
1652            (TestBaseRenderer.test_point_layer_projection)
1653            (TestBaseRenderer.test_point_with_classification): Adapt to new
1654            renderer interface
1655    
1656    2003-10-24  Bernhard Herzog  <[email protected]>
1657    
1658            * libraries/thuban/wxproj.cpp (draw_polygon_shape)
1659            (point_in_polygon_shape, shape_centroid): Raise an exception if
1660            the shape can't be read. Previously invalid shape ids would lead
1661            to a segfault.
1662    
1663            * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
1664            New. test whether an exception is raised for invalid shape ids
1665    
1666    2003-10-24  Jan-Oliver Wagner <[email protected]>
1667    
1668            * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
1669            as alias for 'latlong'.
1670    
1671            * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
1672            as alias for 'latlong'.
1673    
1674    2003-10-24  Jan-Oliver Wagner <[email protected]>
1675    
1676            * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
1677            the projection even for the UnknownPanel.
1678            (UnknownProjPanel.__init__): Define the text and create the textctrl
1679            widget.
1680            (UnknownProjPanel._DoLayout): Replaced static text widget by the
1681            textctrl created in __init__.
1682            (UnknownProjPanel.SetProjection): Set the text for the text ctrl
1683            including the parameters of the projection.
1684            
1685    2003-10-24  Jan-Oliver Wagner <[email protected]>
1686    
1687            * Resources/Projections/epsg.proj: New. This is a list of
1688            EPSG codes with parameters for proj. The list has been
1689            generated using devtools/create_epsg.py based on the
1690            file nad/epsg of the proj 4.4.7 package. Four projection
1691            definitions have been deleted as they are not accepted by proj:
1692            "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
1693            and "HD72 / EOV".
1694    
1695    2003-10-22  Bernhard Herzog  <[email protected]>
1696    
1697            Some more tweaks to the projection dialog which should fix RT
1698            #1886.
1699    
1700            * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
1701            the ProjFile's messages and call the base class methods correctly
1702            (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
1703            flag on the newly selected item too. Otherwise some other item is
1704            focused and the first time the focus is moved with the keyboard
1705            the selection moves in unexpected ways.
1706    
1707            * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
1708            focus on the OK button, only on the projection list. That way the
1709            list really has the focus initially
1710            (ProjFrame.OnClose): Call the projection list's Destroy method to
1711            make it unsubscribe all messages
1712    
1713    2003-10-21  Bernhard Herzog  <[email protected]>
1714    
1715            Rework the projection dialog to fix a few bugs, including RT 2166
1716            and most of 2168
1717    
1718            * Thuban/UI/projlist.py: New. The class ProjectionList is a
1719            special wxListCtrl to show a list of projections in a more MVC
1720            fashion
1721    
1722            * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
1723            throughout the class. The main change is to use the ProjectionList
1724            class instead of a normal wxListBox. Also, add an explicit
1725            "Unknown" projection to the projection choice control.
1726            (ProjPanel.__init__): Add an "unknown" ellipsoid
1727            (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
1728            instantiation of the panel's controls to make the tab-order more
1729            natural
1730    
1731    2003-10-21  Bernhard Herzog  <[email protected]>
1732    
1733            * test/test_load.py (TestSingleLayer.file_contents)
1734            (TestSingleLayer.test): Add non-ascii characters to the titles of
1735            session, map and layer. This is effectively a port of the
1736            TestUnicodeStrings test in test_load_0_8.py which for some reason
1737            was only added there.
1738    
1739            * test/test_load_0_9.py (TestSingleLayer.file_contents)
1740            (TestSingleLayer.test): Same as in test_load.py: add non-ascii
1741            characters to the titles of session, map and layer,.
1742    
1743    2003-10-21  Bernhard Herzog  <[email protected]>
1744    
1745            Add EPSG projection handling to .thuban files
1746    
1747            * test/test_save.py (SaveSessionTest.dtd)
1748            (SaveSessionTest.testEmptySession)
1749            (SaveSessionTest.testLayerProjection)
1750            (SaveSessionTest.testRasterLayer)
1751            (SaveSessionTest.testClassifiedLayer)
1752            (SaveSessionTest.test_dbf_table)
1753            (SaveSessionTest.test_joined_table)
1754            (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
1755            (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
1756            use a and epsg projection to test saving them
1757    
1758            * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
1759            namespace
1760            (TestLayerVisibility.file_contents, TestLabels.file_contents)
1761            (TestLayerProjection.file_contents)
1762            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1763            (TestPostGISLayer.file_contents)
1764            (TestPostGISLayerPassword.file_contents)
1765            (TestLoadError.file_contents, TestLoadError.test): Update to use
1766            1.0-dev namespace
1767            (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
1768            use 1.0-dev namespace and use an EPSG projection to test whether
1769            loading it works
1770    
1771            * test/test_load_0_9.py: New. Effectively a copy of test_load.py
1772            as of Thuban 0.9. These are now tests to determine whether Thuban
1773            can still read files generated by Thuban 0.9
1774    
1775            * Thuban/Model/save.py (SessionSaver.write)
1776            (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
1777            namespace
1778            (SessionSaver.write_projection): Write the projection's epsg
1779            attribute
1780    
1781            * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
1782            thuban-1.0-dev.dtd namespace
1783            (SessionLoader.check_attrs): Allow a callable object as conversion
1784            too
1785            (SessionLoader.start_projection, SessionLoader.end_projection)
1786            (SessionLoader.start_parameter): Handle the epsg attribute and
1787            rename a few instance variables to lower case
1788    
1789            * Resources/XML/thuban-1.0.dtd: New. Only difference to
1790            thuban-0.9.dtd is the epsg attribute for projections.
1791    
1792    2003-10-21  Bernhard Herzog  <[email protected]>
1793    
1794            * test/runtests.py (main): Let the user specify which tests to run
1795            on the command line
1796    
1797            * test/support.py (ThubanTestResult.getDescription): Override to
1798            give a better short description. The description can be used as a
1799            parameter to run_tests to run that particular test in isolation.
1800    
1801    2003-10-21  Frank Koormann   <[email protected]>
1802    
1803            Popup menu for legend. Scheduled for the 1.2 release this was too
1804            simple to implement: The popup menu is bound to the legend tree, while
1805            the events are hanlded by its anchestor, the legend panel. This
1806            allows reuse of all the event handlers already implemented for the
1807            legend toolbar buttons.
1808    
1809            * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
1810            to add handlers for the events issued by the popup menu.
1811            (LegendPanel._OnToggleVisibility): Handler for toggling layer
1812            visibility event
1813            (LegendPanel._OnProjection): Handler for layer projection event.
1814            (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
1815            (LegendTree._OnRightClick): Event handler for right click, select item
1816            and pop up menu.
1817            (LegendTree.ToggleVisibility): Toggle layer visibility
1818            (LegendTree.LayerProjection): Raise layer projection dialog for
1819            current layer.
1820    
1821    2003-10-21  Bernhard Herzog  <[email protected]>
1822    
1823            * Resources/Projections/defaults.proj: Use correct DOCTYPE
1824            declaration. The top-level element is projectionlist not projfile
1825    
1826    2003-10-20  Bernhard Herzog  <[email protected]>
1827    
1828            * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
1829            method to write a projfile and display a busy cursor and error
1830            dialogs.
1831            (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
1832            (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
1833            (ProjFrame.__FillAvailList): Translate "<None>" too and display a
1834            busy cursor while loading the user and system prj files.
1835    
1836    2003-10-16  Bernhard Herzog  <[email protected]>
1837    
1838            * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
1839            ProjFile objects
1840            (clear_proj_file_cache): New function to clear the cache. Mainly
1841            useful for use by the test suite
1842            (read_proj_file): Use the cache.
1843    
1844            * test/test_proj.py (TestProjFile): Clarify the doc-string
1845            (ProjFileReadTests): Update doc-string
1846            (ProjFileReadTests.test_get_system_proj_file): Check whether the
1847            system proj files is cached.
1848            (ProjFileLoadTestCase): New base class for the proj file tests
1849            derived from support.FileLoadTestCase to provide some common
1850            behavior.
1851            (TestLoadingProjFile)
1852            (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
1853            (TestProjFileWithInvalidParameters.file_contents): Derive from
1854            ProjFileLoadTestCase
1855            (TestLoadingProjFile.test_caching): New. Test whether the cache
1856            works
1857    
1858    2003-10-16      Silke Reimer    <[email protected]>
1859    
1860            * debian/*: New directory with configuration files for building a thuban
1861              deb-package.
1862    
1863    2003-10-14  Bernhard Herzog  <[email protected]>
1864    
1865            * test/test_proj.py: Execute support.run_tests when run as
1866            __main__ so that missing unsubscribes are detected
1867            (TestProjFile.tearDown): Destroy the proj_file properly
1868    
1869    2003-10-14  Bernhard Herzog  <[email protected]>
1870    
1871            * Thuban/Model/messages.py (PROJECTION_ADDED)
1872            (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
1873            the ProjFile objects
1874    
1875            * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
1876            easily send messages when the projections change
1877            (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
1878            when the change was successful
1879    
1880            * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
1881            proj file messages
1882            (TestProjFile.test_add_remove)
1883            (TestProjFile.test_remove_non_existing)
1884            (TestProjFile.test_replace)
1885            (TestProjFile.test_replace_non_existing): Test whether the right
1886            messages are sent
1887    
1888    2003-10-14  Bernhard Herzog  <[email protected]>
1889    
1890            * test/test_proj.py (TestProjFile.test): Refactor into several
1891            tests
1892            (TestProjFile.test_add_remove)
1893            (TestProjFile.test_remove_non_existing)
1894            (TestProjFile.test_replace)
1895            (TestProjFile.test_replace_non_existing): Some of the new
1896            individual test cases
1897            (TestProjFileSimple): New class for the rest of the test cases
1898            that came out of the refactoring
1899            (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
1900            derived classes don't have to
1901    
1902    2003-10-13  Bernhard Herzog  <[email protected]>
1903    
1904            Add an optional EPSG code to the projection objects and extend the
1905            .proj file format accordingly.
1906    
1907            * Resources/XML/projfile.dtd (element projection): Add epsg
1908            attribute
1909    
1910            * Thuban/Model/proj.py (Projection.__init__): New parameter and
1911            instance variable epsg. Update doc-string
1912            (Projection.EPSGCode, Projection.Label): New methods to provide
1913            access to EPSG code and a label for use in dialogs
1914    
1915            * Thuban/Model/resource.py (ProjFileReader.start_projection)
1916            (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
1917            Handle the epsg code attribute when reading or writing proj files
1918    
1919            * Thuban/UI/projdialog.py (ProjFrame._OnSave)
1920            (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
1921            (ProjFrame.__FillAvailList): Use the projection's Label method to
1922            get the string for the list box
1923    
1924            * test/test_proj.py (TestProjection.test_label)
1925            (TestProjection.test_label_epsg)
1926            (TestProjection.test_epsgcode_for_non_epsg_projection)
1927            (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
1928            for the label and EPSGCode methods
1929            (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
1930            (WriteProjFileTests.test_write_empty_file): Create the ProjFile
1931            objects in the test cases and put the expected contents into the
1932            test case methods too. Update doTestWrite accordingly
1933            (TestLoadingProjFile)
1934            (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
1935            read tests from TestProjFile.
1936            (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
1937            tests are now in the new classes.
1938            (sample_projfile, sample_projfile_data)
1939            (sample_projfile2, sample_projfile_data2): Removed. Not used
1940            anymore.
1941            (TestProjFile.test_read_unreadable_file): No need to reset the
1942            permissions at the end anymore since we use a unique filename
1943    
1944    2003-10-13  Bernhard Herzog  <[email protected]>
1945    
1946            * test/test_proj.py: Some more refactoring of the test cases
1947            (ProjFileTest): New base class for the proj file tests.
1948            (TestProjFile): Derive from ProjFileTest
1949            (TestProjFile.test_read_unreadable_file)
1950            (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
1951            the new filename method to get a unique filename
1952            (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
1953            (WriteProjFileTests): New class for proj file write tests.
1954            Contains the write test that were in TestProjFile originally.
1955    
1956    2003-10-13  Bernhard Herzog  <[email protected]>
1957    
1958            * test/test_proj.py (TestProjFile.testRead)
1959            (TestProjFile.test_read_non_existing_file)
1960            (TestProjFile.test_read_unreadable_file)
1961            (TestProjFile.test_read_empty_file): Split into several methods.
1962    
1963    2003-10-10  Bernhard Herzog  <[email protected]>
1964    
1965            * Thuban/UI/sizers.py: New file with custom sizers.
1966    
1967            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
1968            all projection type specific panels and put them into a
1969            NotebookLikeSizer. This way the dialog doesn't change its size
1970            when a different projection is selected
1971            (ProjFrame.__init__): Rename projection_panels
1972            projection_panel_defs and reuse projection_panels for a list of
1973            the instantiated panels.
1974            (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
1975            (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
1976            the panels
1977            (UnknownProjPanel._DoLayout): Place the newlines in the message
1978            differently to make the panel narrower.
1979            (TMPanel._DoLayout): Layout the parameters in one column.
1980    
1981    2003-10-10  Bernhard Herzog  <[email protected]>
1982    
1983            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
1984            that contains all the setup for the dialog's widgets, layout and
1985            event handling.
1986            (__): Call build_dialog to build the dialog.
1987            (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
1988            Their functionality is now in build_dialog
1989            (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
1990            (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
1991            (ProjFrame.__DoOnProjChoice): Small updates due to slightly
1992            different widget names and hierarchy introduced with build_dialog.
1993    
1994    2003-10-10  Bernhard Herzog  <[email protected]>
1995    
1996            * README: Fix typo.
1997    
1998    2003-10-09  Bernhard Herzog  <[email protected]>
1999    
2000            * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
2001            projection is already in the list. This is *a lot* faster when
2002            loading files with hundreds of projections since it saves a linear
2003            search. OTOH this will allow adding the same projection to the
2004            user.proj file multiple times in the projection dialog but we'll
2005            deal with that later
2006    
2007    2003-10-09  Jan-Oliver Wagner <[email protected]>
2008    
2009            * devtools: New. Directory for developer tools that are not intended
2010            for the regular user.
2011    
2012            * devtools/create_epsg.py: New. Convert the epsg file of proj into
2013            a python .proj file.
2014    
2015    2003-10-09  Bernhard Herzog  <[email protected]>
2016    
2017            * test/test_proj.py
2018            (TestProjection.test_get_parameter_without_equals_sign): New. Test
2019            whether GetParameter handles parameters without "=" sign correctly
2020    
2021            * Thuban/Model/proj.py (Projection.GetParameter): Handle
2022            parameters that do not contain a "=". Update the doc-string
2023    
2024    2003-10-08  Bernhard Herzog  <[email protected]>
2025    
2026            * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
2027            length limit on the projname text control
2028    
2029    2003-10-08  Bernhard Herzog  <[email protected]>
2030    
2031            * test/test_proj.py (TestProjection.test_get_projection_units_geo)
2032            (TestProjection.test_get_projection_units_normal): New. Tests for
2033            the Projection.GetProjectedUnits method
2034    
2035    2003-10-08  Jan-Oliver Wagner <[email protected]>
2036    
2037            * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
2038            Added missing 'val' parameter.
2039    
2040    2003-10-08  Bernhard Herzog  <[email protected]>
2041    
2042            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
2043            projection type of the currently selected projection is not known,
2044            i.e. there's no panel for it, use the UnknownProjPanel
2045            (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
2046            the actual replacing of the proj panel into the new method
2047            _show_proj_panel.
2048            (UnknownProjPanel): Add doc-string.
2049            (UnknownProjPanel._DoLayout): Insert a newline into the text so
2050            that the panel is not so wide.
2051    
2052    2003-10-08  Bernhard Herzog  <[email protected]>
2053    
2054            * Thuban/Model/resource.py (read_proj_file): Return the warnings
2055            too. Update the doc-string
2056            (get_proj_files): Removed. It wasn't used anywhere
2057            (get_system_proj_files, get_system_proj_file): Rename to
2058            get_system_proj_file and return the ProjFile object and not a list
2059            of ProjFile objects. Update the callers.
2060            (get_user_proj_files, get_user_proj_file): Rename to
2061            get_user_proj_file return the ProjFile object and not a list of
2062            ProjFile objects. Update the callers.
2063            (ProjFileReader.__init__): New instance variable for the warnings.
2064            Rename the __pf ivar to projfile. Update the methods referring to
2065            __pf
2066            (ProjFileReader.end_projection): Catch any errors raised when
2067            instantiating the projection and record that as an error. The
2068            projection will not be in the final ProjFile object.
2069            (ProjFileReader.GetWarnings): New method to return the warnings.
2070    
2071            * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
2072            show the warnings from the projfile reader
2073            (ProjFrame._OnImport): Deal with any warnings returned by
2074            read_proj_file
2075            (ProjFrame.__FillAvailList): Deal with any warnings returned by
2076            get_system_proj_file or get_user_proj_file.
2077    
2078            * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
2079            (TestProjFileWithInvalidParameters.file_contents): New test cases
2080            to test whether read_proj_file handles invalid projection
2081            parameters correctly
2082            (TestProjFile.test_get_system_proj_file): New. Simple test for
2083            resource.get_system_proj_file
2084    
2085    2003-10-07  Bernhard Herzog  <[email protected]>
2086    
2087            * test/test_derivedshapestore.py
2088            (TestDerivedShapeStoreExceptions.tearDown): Clear the session
2089            properly so that the temporary directories get deleted correctly
2090    
2091    2003-10-06  Bernhard Herzog  <[email protected]>
2092    
2093            Handle the title changes in a proper MVC way.
2094    
2095            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
2096            canvas' TITLE_CHANGED messages
2097            (MainWindow.update_title): New. Update the main window's title
2098            (MainWindow.__SetTitle): Removed. Use update_title instead.
2099            (MainWindow.SetMap): Use update_title instead of __SetTitle
2100            (MainWindow.RenameMap): Do change the window title explicitly
2101            here. That's handled in a proper MVC way now.
2102            (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
2103            messages
2104    
2105            * Thuban/Lib/connector.py (Conduit): New class to help classes
2106            that forward messages
2107    
2108            * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
2109            (ViewPort): Derive from Conduit instead of Publisher
2110            (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
2111            when calling the inherited versions
2112            (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
2113            methods to subscribe and unsubscribe map messages
2114            (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
2115            handle the map subscriptions
2116            (ViewPort.Map, ViewPort.map_projection_changed)
2117            (ViewPort.layer_projection_changed): Add or update doc-strings
2118    
2119            * test/test_connector.py (TestPublisher.test_issue_simple): Fix
2120            typo
2121            (MyConduit): Helper class for the Conduit test.
2122            (TestConduit): Test cases for Conduit
2123    
2124            * test/test_connector.py: Use support.run_tests as main.
2125    
2126            * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
2127            the TITLE_CHANGED messages
2128            (ViewPortTest.test_forwarding_title_changed): New test to check
2129            whether the viewport forwards the map's TITLE_CHANGED messages
2130            (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
2131            after the port's because the latter may require a still functional
2132            map.
2133    
2134    2003-10-06  Bernhard Herzog  <[email protected]>
2135    
2136            * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
2137            doc-string
2138    
2139    2003-10-06  Bernhard Herzog  <[email protected]>
2140    
2141            * test/test_viewport.py (ViewPortTest.setUp)
2142            (SimpleViewPortTest.test_init_with_size): Move the test for the
2143            initial size as a constructor parameter from ViewPortTest.setUp
2144            method to a new separate test in SimpleViewPortTest.
2145    
2146    2003-10-06  Bernhard Herzog  <[email protected]>
2147    
2148            * test/test_viewport.py (MockView): New class derived from
2149            ViewPort with a mock implementation of GetTextExtent to be used in
2150            the test cases
2151            (ViewPortTest.setUp): Use MockView instead of ViewPort
2152    
2153            * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
2154            into what would be a "pure virtual function" in C++: always raise
2155            NotImplementedError. Mock implementations for test cases don't
2156            belong into the real code
2157    
2158    2003-10-02  Bernhard Herzog  <[email protected]>
2159    
2160            * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
2161            close the dbf file we create so that it's contents have been
2162            written properly.
2163    
2164            * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
2165            libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
2166            Update to shapelib 1.2.10
2167    
2168    2003-10-01  Jan-Oliver Wagner <[email protected]>
2169    
2170            * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
2171            it annoys lintian which warns about these files not being
2172            executable. The #! isn't necessary here since if you absolutely
2173            must execute them you can always say "python <filename>".
2174    
2175    2003-09-26  Bernhard Herzog  <[email protected]>
2176    
2177            * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
2178            only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
2179            is ported to a newer the import will fail, so it should be noticed
2180            immediately that this function is gone.
2181            Fixes RT#1919
2182    
2183    2003-09-26  Bernhard Herzog  <[email protected]>
2184    
2185            Add a DTD for the projection files and make thuban write valid
2186            projection files
2187    
2188            * Resources/XML/projfile.dtd: New. DTD for thuban's projection
2189            files
2190    
2191            * Thuban/Model/resource.py (ProjFileSaver.write): Use
2192            'projectionlist' as the name in the document type declaration so
2193            that it matches the element type of the root element.
2194    
2195            * test/test_proj.py (sample_projfile, sample_projfile2): Use
2196            'projectionlist' as the name in the document type declaration just
2197            as it is done now in the files thuban would write
2198            (sample_projfile, sample_projfile_data): Fix spelling of
2199            "Mercator"
2200            (TestProjFile.doTestWrite): Validate the written and the expected
2201            XML data
2202            (TestProjFile): Derive from ValidationTest so that we can run xml
2203            validation tests
2204    
2205    2003-09-24  Bernhard Herzog  <[email protected]>
2206    
2207            * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
2208            modify the list returned by map.Layers() in place since it is the
2209            actual list of layers used by the map.
2210    
2211    2003-09-23  Jan-Oliver Wagner <[email protected]>
2212    
2213            * Doc/manual/thuban-manual.xml: Added subsection to chapter
2214            Extensions to describe the extensions coming with the Thuban
2215            standard package (gns2shp and importAPR).
2216    
2217    2003-09-23  Bernhard Herzog  <[email protected]>
2218    
2219            * libraries/thuban/wxproj.cpp (project_point): if there's an
2220            inverse but no forward projection, convert to degrees after
2221            applying the inverse projection. Fixes RT#2096
2222    
2223            * test/test_wxproj.py: New. Test cases for wxproj.so. One test
2224            implicitly tests for the fix to RT#2096
2225    
2226            * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
2227            Check that the sequences have the same lengths
2228    
2229            * Resources/Projections/defaults.proj (Geographic projection): Use
2230            a much more precise value for the to_meter attribute.
2231    
2232    2003-09-22  Bernhard Herzog  <[email protected]>
2233    
2234            * test/support.py (initthuban): Make sure to unset the LANG env.
2235            var. so that tests that compare translated strings work. Solves RT
2236            #2094
2237    
2238    2003-09-22  Jan-Oliver Wagner <[email protected]>
2239    
2240            Small improvement of APR import.
2241    
2242            * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
2243            Added tests for text-ranges.
2244    
2245            * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
2246            returns a string object if the range is based on text.
2247    
2248            * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
2249            range retrieval.
2250    
2251    2003-09-22  Jan-Oliver Wagner <[email protected]>
2252    
2253            Initial version of the importAPR extension which is in
2254            experimental state.
2255    
2256            * /Extensions/importAPR/, /Extensions/importAPR/samples/,
2257            /Extensions/importAPR/test/: New directories.
2258    
2259            * /Extensions/importAPR/samples/README: New: Howto load the samples.
2260    
2261            * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
2262            file which refers to the Thuban Iceland demo data.
2263    
2264            * /Extensions/importAPR/test/README: New: Howto execute the tests.
2265    
2266            * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
2267    
2268            * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
2269            as in '.apr'-files.
2270    
2271            * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
2272            ODB Objects as in '.apr', '.avl' and other files.
2273    
2274            * /Extensions/importAPR/__init__.py: New: Init to make this
2275            directory a package.
2276    
2277            * /Extensions/importAPR/importAPR.py: New: Import a ArcView
2278            project file (.apr) and convert it to Thuban.
2279    
2280    2003-09-22  Jan-Oliver Wagner <[email protected]>
2281    
2282            * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
2283    
2284    2003-09-19  Jan-Oliver Wagner <[email protected]>
2285    
2286            * Doc/manual/thuban-manual.xml: Extended section 'Installation'
2287            with description on RPM installation and RPM binary package
2288            creation.
2289    
2290    2003-09-18  Bernhard Herzog  <[email protected]>
2291    
2292            * setup.py (data_files): Only add the mo files if the Locales
2293            directory actually exists, so that setup.py works with a fresh CVS
2294            checkout
2295    
2296    2003-09-12  Jan-Oliver Wagner <[email protected]>
2297    
2298            * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
2299            in viewport, not anymore in view
2300    
2301    2003-09-04  Jan-Oliver Wagner <[email protected]>
2302    
2303            Introducing first Extension (gns2shp).
2304    
2305            * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
2306    
2307            * Extensions/__init__.py: New. init to make this dir a package.
2308    
2309            * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
2310    
2311            * Extensions/gns2shp/test/README: New. some info on this test directory.
2312    
2313            * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
2314    
2315            * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
2316            of Shapefile from GNS text file format
2317    
2318    2003-09-03  Jan-Oliver Wagner <[email protected]>
2319    
2320            Fix/workaround for bug #2019:
2321            https://intevation.de/rt/webrt?serial_num=2019
2322    
2323            * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
2324            (IdentifyView.__init__): Added another button that allows to
2325            stop the identify mode.
2326            (IdentifyView.OnStop): New. Stops the identify mode.
2327    
2328    2003-09-03  Jan-Oliver Wagner <[email protected]>
2329    
2330            Introducing a new exception dialog that allows to exit the
2331            application immediately.
2332            This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
2333    
2334            * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
2335    
2336            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2337            Made strings available to translations. Exchanged the simple
2338            ScrolledMessageDialog by the new ExceptionDialog.
2339    
2340    2003-09-01  Bernhard Herzog  <[email protected]>
2341    
2342            * NEWS: New. Summary of changes and release notes.
2343    
2344            * MANIFEST.in: Add NEWS
2345    
2346    2003-09-01  Bernhard Herzog  <[email protected]>
2347    
2348            * MANIFEST.in: Correct the include statement for the mo-files and
2349            include the documentation too.
2350    
2351            * setup.py (data_files): Add the .mo files
2352            (setup call): Up to version 0.9.0
2353    
2354    2003-09-01  Bernhard Herzog  <[email protected]>
2355    
2356            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
2357            parameter list to just parent and session
2358            (ChooseDBTableDialog.__set_properties): Removed. Setting the
2359            selection of empty list boxes is not allowed (and produces C++
2360            assertion errors) and the rest of the setup is better done in
2361            __init__ anyway.
2362            (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
2363            (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
2364            builtins True/False for booleans to avoid warnings from wxPython
2365    
2366            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
2367            ChooseDBTableDialog constructor parameters.
2368    
2369    2003-09-01  Bernhard Herzog  <[email protected]>
2370    
2371            * Thuban/Model/postgisdb.py
2372            (PostGISTable): Extend doc-string
2373            (PostGISTable._fetch_table_information): Set the column index
2374            correctly, pretending ignored columns don't exist.
2375    
2376            * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
2377            for postgis tables with data types not yet supported by thuban.
2378    
2379    2003-08-29  Bernhard Herzog  <[email protected]>
2380    
2381            * HOWTO-Release: Tweak item about running the tests.
2382    
2383    2003-08-29  Jan-Oliver Wagner <[email protected]>
2384    
2385            * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
2386    
2387    2003-08-29  Bernhard Herzog  <[email protected]>
2388    
2389            Add some missing parameters to projections. Proj complains about
2390            them on windows but for some reason not on Linux.
2391    
2392            * test/test_save.py (SaveSessionTest.testLayerProjection): Add
2393            missing required projection parameters
2394    
2395            * test/test_proj.py (TestProjFile.test): Add missing required
2396            projection parameters
2397    
2398            * test/test_load_0_8.py (TestLayerProjection.file_contents)
2399            (TestLayerProjection.test): Add missing required projection
2400            parameters and tests for them
2401    
2402            * test/test_load.py (TestLayerProjection.file_contents)
2403            (TestLayerProjection.test): Add missing required projection
2404            parameters and tests for them
2405    
2406            * test/test_layer.py (TestLayer.test_base_layer): Add missing
2407            required projection parameters
2408    
2409    2003-08-29  Bernhard Herzog  <[email protected]>
2410    
2411            * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
2412            access the pj_errno because directly accessing pj_errno doesn't
2413            work on windows if the proj library is in a DLL
2414    
2415            * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
2416    
2417    2003-08-28  Bernhard Herzog  <[email protected]>
2418    
2419            * test/test_proj.py: Import things from Thuban after calling
2420            initthuban
2421    
2422            * test/test_load.py (LoadSessionTest.filenames): New class
2423            variable with the filename attributes to normalize
2424            (LoadSessionTest.check_format): Pass self.filenames to
2425            sax_eventlist to normalize the filename attributes
2426    
2427            * test/xmlsupport.py: Add cvs keywords
2428            (SaxEventLister.__init__): New parameter filenames which indicates
2429            attributes that contain filenames
2430            (SaxEventLister.startElementNS): Normalize the filename attributes
2431            with os.path.normpath
2432            (sax_eventlist): New parameter filenames to pass through to
2433            SaxEventLister
2434    
2435            * test/test_derivedshapestore.py: Make this file callable as a
2436            program to execute the tests
2437            (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
2438            the session to self.session so that it gets destroyed properly
2439    
2440            * test/test_layer.py (TestLayer.tearDown): Call the session's
2441            Destroy method
2442    
2443            * test/test_map.py (TestMapBase.tearDown): Destroy self.session
2444            too if it exists
2445            (TestMapAddLayer.test_add_layer): Bind the session to self.session
2446            so that it gets destroyed properly
2447    
2448            * test/postgissupport.py (reason_for_not_running_tests): Add a
2449            test for the existence of popen2.Popen4.
2450    
2451            * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
2452            reliable way to destroy the sessions created in the test cases
2453            (SaveSessionTest.test_dbf_table): Bind the session to self.session
2454            so that it gets destroyed properly
2455            (SaveSessionTest.testLayerProjection): Bind the session to
2456            self.session so that it gets destroyed properly
2457    
2458            * test/test_session.py (UnreferencedTablesTests.tearDown): Make
2459            sure that the session is destroyed properly
2460    
2461            * test/test_shapefilestore.py: Make this callable as a program to
2462            execute the tests
2463    
2464            * test/test_scalebar.py: Remove unnecessary import of _ from
2465            Thuban
2466    
2467            * test/support.py (print_garbage_information): Call initthuban
2468            here because it may be called indirectly from test cases that test
2469            test support modules which do not use anything from thuban itself
2470            (ThubanTestProgram.runTests): Remove unnecessary debug print
2471    
2472    2003-08-28  Bernhard Herzog  <[email protected]>
2473    
2474            * Thuban/version.py (longversion): Update to 0.9
2475    
2476            * Thuban/UI/mainwindow.py: Remove some unused imports
2477    
2478            * README: Add section about required additional software. Add date
2479            and revision CVS keywords
2480    
2481            * HOWTO-Release: Add item about the translations. Add date and
2482            revision CVs keywords and change formatting to match README a bit
2483            better
2484    
2485            * po/de.po: Update for 0.9
2486    
2487            * test/README: Tweak the wording a little because many tests are
2488            not really unittest.
2489    
2490    2003-08-27  Bernhard Herzog  <[email protected]>
2491    
2492            As preparation for the 0.9 release, switch thuban files to a
2493            non-dev namespace
2494    
2495            * Thuban/Model/save.py (SessionSaver.write_session): Write files
2496            with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
2497            namespace
2498    
2499            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2500            http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
2501    
2502            * test/test_save.py (SaveSessionTest.dtd)
2503            (SaveSessionTest.testEmptySession)
2504            (SaveSessionTest.testSingleLayer)
2505            (SaveSessionTest.testLayerProjection)
2506            (SaveSessionTest.testRasterLayer)
2507            (SaveSessionTest.testClassifiedLayer)
2508            (SaveSessionTest.test_dbf_table)
2509            (SaveSessionTest.test_joined_table)
2510            (SaveSessionTest.test_save_postgis): Update for new namespace
2511    
2512            * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
2513            (TestLayerVisibility.file_contents, TestLabels.file_contents)
2514            (TestLayerProjection.file_contents)
2515            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2516            (TestPostGISLayer.file_contents)
2517            (TestPostGISLayerPassword.file_contents)
2518            (TestLoadError.file_contents, TestLoadError.test): Update for new
2519            namespace
2520    
2521    2003-08-27  Bernhard Herzog  <[email protected]>
2522    
2523            Make the table interface distinguish between row ids (an integer
2524            that uniquely identifies a row) and row ordinals (a simple row
2525            count from 0 to NumRows() - 1)
2526    
2527            * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
2528            (PostGISTable.RowOrdinalToId): New methods to conver between row
2529            ids and row ordinals
2530            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
2531            parameter row_is_ordinal to indicate whether the row parameter is
2532            the row id or the ordinal
2533    
2534            * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
2535            (TransientTableBase.RowOrdinalToId)
2536            (AutoTransientTable.RowIdToOrdinal)
2537            (AutoTransientTable.RowOrdinalToId): Same new methods as in
2538            PostGISTable.
2539            (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
2540            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
2541            Same new parameter as in PostGISTable.
2542    
2543            * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
2544            (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
2545            (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
2546            (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
2547            (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
2548            parameter as in PostGISTable.
2549    
2550            * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
2551            (DataTable.RowOrdinalToId): New methods to convert between row ids
2552            and row ordinals.
2553            (TableGrid.SelectRowById): New method to select a row based on its
2554            ID as opposed to its ordinal
2555            (DataTable.GetValue, TableGrid.OnRangeSelect)
2556            (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
2557            (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
2558            (LayerTableFrame.__init__): Convert between row ids and row
2559            ordinals as appropriate
2560    
2561            * test/postgissupport.py (PostGISDatabase.__init__): Add
2562            doc-string.
2563            (PostGISDatabase.initdb): The optional third item in a tuple in
2564            tables is now a (key, value) list with additional arguments to
2565            pass to upload_shapefile
2566            (upload_shapefile): New parameter gid_offset to allow gids that
2567            are not the same as the shapeids in the shapefile
2568            (PostgreSQLServer.get_default_static_data_db): Use the new
2569            gid_offset to make the gids in landmarks 1000 higher than the
2570            shapeids in the shapefile
2571    
2572            * test/test_viewport.py
2573            (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
2574            new shapeids in the landmarks table
2575    
2576            * test/test_transientdb.py
2577            (TestTransientTable.run_iceland_political_tests)
2578            (TestTransientTable.test_transient_joined_table): Add tests for
2579            the new table methods and new keywords arguments.
2580    
2581            * test/test_postgis_db.py
2582            (TestPostGISTable.test_read_row_as_dict_row_count_mode)
2583            (TestPostGISTable.test_read_value_row_count_mode)
2584            (TestPostGISTable.test_row_id_to_ordinal)
2585            (TestPostGISTable.test_row_oridnal_to_id): New test for the new
2586            table methods and the new arguments
2587            (TestPostGISShapestorePoint.test_shapes_in_region)
2588            (TestPostGISShapestorePoint.test_shape_raw_data)
2589            (TestPostGISShapestorePoint.test_shape_points)
2590            (TestPostGISShapestorePoint.test_shape_shapeid)
2591            (TestPostGISShapestorePoint.test_all_shapes)
2592            (TestPostGISTable.test_simple_query)
2593            (TestPostGISTable.test_simple_query)
2594            (TestPostGISTable.test_simple_query)
2595            (TestPostGISTable.test_read_value)
2596            (TestPostGISTable.test_read_row_as_dict): Adapt to the new
2597            shapeids in the landmarks table
2598    
2599            * test/test_memory_table.py
2600            (TestMemoryTable.test_read_row_as_dict_row_count_mode)
2601            (TestMemoryTable.test_read_value_row_count_mode)
2602            (TestMemoryTable.test_row_id_to_ordinal)
2603            (TestMemoryTable.test_row_oridnal_to_id): New test for the new
2604            table methods and the new arguments
2605    
2606            * test/test_dbf_table.py
2607            (TestDBFTable.test_read_row_as_dict_row_count_mode)
2608            (TestDBFTable.test_read_value_row_count_mode)
2609            (TestDBFTable.test_row_id_to_ordinal)
2610            (TestDBFTable.test_row_oridnal_to_id): New test for the new table
2611            methods and the new arguments
2612    
2613    2003-08-26  Bernhard Herzog  <[email protected]>
2614    
2615            * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
2616            more postgis specific but much faster method to get the bounding
2617            box
2618    
2619    2003-08-26  Bernhard Herzog  <[email protected]>
2620    
2621            * Thuban/Model/postgisdb.py (PostGISTable.Title)
2622            (PostGISShapeStore.AllShapes): Add these missing methods.
2623            (PostGISShapeStore.ShapesInRegion): No need to raise
2624            StopIteration. We can simply return
2625    
2626            * test/test_postgis_db.py (TestPostGISTable.test_title)
2627            (TestPostGISShapestorePoint.test_all_shapes): New tests for the
2628            new methods
2629    
2630    2003-08-25  Bernhard Herzog  <[email protected]>
2631    
2632            * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
2633    
2634            * test/test_postgis_db.py (PolygonTests): New class containing
2635            those tests from TestPostGISShapestorePolygon that can also be
2636            used to test MUTLIPOLYGON tables
2637            (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
2638            so derive from that
2639            (TestPostGISShapestoreMultiPolygon): New class with tests for
2640            MUTLIPOLYGON tables
2641    
2642            * test/postgissupport.py (PostGISDatabase.initdb): Allow the
2643            tables argument to have tuples with three items to override the
2644            WKT type used.
2645            (PostgreSQLServer.get_default_static_data_db): Use the above to
2646            create a polygon table with MUTLIPOLYGONs
2647            (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
2648            (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
2649            coords_to*
2650            (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
2651            (wkt_converter): New. Map WKT types to converters
2652            (upload_shapefile): New parameter force_wkt_type to use a
2653            different WKT type than the default
2654    
2655    2003-08-25  Bernhard Herzog  <[email protected]>
2656    
2657            * Thuban/UI/application.py
2658            (ThubanApplication.run_db_param_dialog): New. Suitable as a
2659            db_connection_callback. Main difference is that the dialog run
2660            from this method doesn't have a parent so it can be used even when
2661            there is no main window
2662            (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
2663            no db_connection_callback was given. This way the dialog pops up
2664            even when the .thuban file was given as a command line parameter.
2665    
2666    2003-08-25  Bernhard Herzog  <[email protected]>
2667    
2668            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
2669            before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
2670            which leads to an effectively frozen X session because the user
2671            can only interact with the dialog but the mouse is still grabbed
2672            by the canvas.
2673            Also, call the tool's Hide method before MouseLeftUp because
2674            MouseLeftUp may change the tool's coordinates.
2675    
2676    2003-08-25  Bernhard Herzog  <[email protected]>
2677    
2678            * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
2679            LoadCancelled exceptions and handle them by returning immediately.
2680    
2681    2003-08-25  Bernhard Herzog  <[email protected]>
2682    
2683            GUI part of loading sessions with postgis connections which may
2684            require user interaction to get passwords or updated parameters
2685    
2686            * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
2687            bit nucer and be more generic.
2688            (DBFrame.OnAdd): Adapt to new DBDialog interface
2689    
2690            * Thuban/UI/application.py (ThubanApplication.OpenSession): New
2691            optional parameter db_connection_callback which is passed to
2692            load_session.
2693    
2694            * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
2695            Suitable as a db_connection_callback
2696            (MainWindow.OpenSession): Use self.run_db_param_dialog as the
2697            db_connection_callback of the application's OpenSession method
2698    
2699    
2700    2003-08-25  Bernhard Herzog  <[email protected]>
2701    
2702            Basic loading of sessions containing postgis connections:
2703    
2704            * Thuban/Model/load.py (LoadError): Add doc-string
2705            (LoadCancelled): New exception class to indicate a cancelled load
2706            (SessionLoader.__init__): Add the db_connection_callback parameter
2707            which will be used by the loader to get updated parameters and a
2708            password for a database connection
2709            (SessionLoader.__init__): Add the new XML elements to the
2710            dispatchers dictionary
2711            (SessionLoader.check_attrs): Two new conversions, ascii to convert
2712            to a byte-string object and idref as a generic id reference
2713            (SessionLoader.start_dbconnection)
2714            (SessionLoader.start_dbshapesource): New. Handlers for the new XML
2715            elements
2716            (load_session): Add the db_connection_callback to pass through the
2717            SessionLoader
2718    
2719            * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
2720            New classes to test loading of sessions with postgis database
2721            connections.
2722    
2723    2003-08-25  Bernhard Herzog  <[email protected]>
2724    
2725            * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
2726            replace it and the comment with __BuildDate__ by the Source: and
2727            Id: cvs keywords as used in the other files.
2728    
2729    2003-08-25  Bernhard Herzog  <[email protected]>
2730    
2731            * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
2732            LoadError when a required attribute is missing. The code used to
2733            be commented out for some reason, but probably should have been
2734            active.
2735    
2736            * test/test_load.py (TestLoadError.test): Test the message in the
2737            LoadError too to make sure it really is about the missing
2738            attribute
2739    
2740    2003-08-22  Bernhard Herzog  <[email protected]>
2741    
2742            * test/test_save.py (SaveSessionTest.test_dbf_table)
2743            (SaveSessionTest.test_joined_table): Add XML validation tests.
2744    
2745    2003-08-22  Bernhard Herzog  <[email protected]>
2746    
2747            Implement saving a session with a postgis connection
2748    
2749            * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
2750            elements for database connections and shapestores using db
2751            connections
2752            (session): Add the dbconnections to the content model
2753    
2754            * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
2755            Write the db connections
2756            (SessionSaver.write_session): Call write_db_connections to write
2757            the connection before the data sources
2758            (SessionSaver.write_data_containers): Handle postgis shapestores
2759    
2760            * test/test_save.py (SaveSessionTest.thubanids)
2761            (SaveSessionTest.thubanidrefs): Update for new DTD
2762            (SaveSessionTest.test_save_postgis): New. Test saving a session
2763            with postgis connections
2764    
2765            * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
2766            (PostGISTable.TableName): New accessor methods for the connection
2767            and table name
2768    
2769            * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
2770            (TestPostGISTable.test_dbname): New methods to test the new
2771            PostGISConnection methods
2772    
2773    2003-08-22  Bernhard Herzog  <[email protected]>
2774    
2775            * Thuban/Model/postgisdb.py (ConnectionError): New exception class
2776            for exceptions occurring when establishing a Database connection
2777            (PostGISConnection.connect): Catch psycopg.OperationalError during
2778            connects and raise ConnectionError.
2779    
2780            * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
2781            tests for database exceptions
2782    
2783    2003-08-22  Bernhard Herzog  <[email protected]>
2784    
2785            Prepare the test suite for tests with required authentication
2786    
2787            * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
2788            variables with two predefined users/passwords, one for the admin
2789            and one for a non-privileged user.
2790            (PostgreSQLServer.createdb): Pass the admin name to initdb and add
2791            the non-privileged user to the database and set the admin password
2792            (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
2793            Better error reporting
2794            (PostgreSQLServer.connection_params)
2795            (PostgreSQLServer.connection_string): New methods to return
2796            information about how to connect to the server
2797            (PostgreSQLServer.execute_sql): New. Convenience method to execute
2798            SQL statements
2799            (PostgreSQLServer.require_authentication): Toggle whether the
2800            server requires authentication
2801            (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
2802            Add or alter users
2803            (PostGISDatabase.initdb): Pass the admin name one the
2804            subprocesses' command lines. Grant select rights on
2805            geometry_columns to everybody.
2806            (upload_shapefile): Use the admin name and password when
2807            connecting. Grant select rights on the new table to everybody.
2808    
2809            * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
2810            server's new methods to get the connection parameters.
2811    
2812            * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
2813            (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
2814            server's new methods to get the connection parameters.
2815    
2816            * test/test_postgis_db.py
2817            (TestPostGISConnection.test_gis_tables_empty)
2818            (TestPostGISConnection.test_gis_tables_non_empty)
2819            (PostGISStaticTests.setUp): Use the server's new methods to get
2820            the connection parameters.
2821    
2822    2003-08-22  Bernhard Herzog  <[email protected]>
2823    
2824            * Thuban/UI/about.py (About.__init__): Add the psycopg version.
2825    
2826            * Thuban/version.py: Add psycopg version
2827    
2828            * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
2829            version of the psycopg module
2830    
2831    2003-08-22  Bernhard Herzog  <[email protected]>
2832    
2833            * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
2834            (DBFrame.OnEdit): Removed because it's not used and wouldn't work
2835            at the moment. The functionality should probably be implemented
2836            some time, though.
2837            (DBFrame.OnRemove): Display a message if the connection can't be
2838            removed because it's still in use.
2839    
2840    2003-08-22  Jan-Oliver Wagner <[email protected]>
2841    
2842            * Thuban/UI/about.py (About.__init__): split up the huge about
2843            text into elements/lists for easier translation. This fixes bug
2844            https://intevation.de/rt/webrt?serial_num=2058
2845            Also, made some forgotten string available for the i18n.
2846    
2847    2003-08-21  Bernhard Herzog  <[email protected]>
2848    
2849            Make postgis support really optional including insensitive menu
2850            items.
2851    
2852            * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
2853            whether the postgis is supported.
2854    
2855            * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
2856            to make postgis support optional
2857    
2858            * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
2859            version of Thuban.Model.postgisdb.has_postgis_support
2860            (database_management command): Make it only sensitive if postgis
2861            is supported.
2862    
2863    2003-08-21  Jan-Oliver Wagner <[email protected]>
2864    
2865            * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
2866            (section Adding and Removing Layers): Added text and described
2867            multi-selection.
2868            (chapter Extensions): New.
2869    
2870    2003-08-21  Jan-Oliver Wagner <[email protected]>
2871    
2872            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
2873            settings to allow multiple files to load into the map.
2874            Also reduced selection to *.shp as a default.
2875    
2876    2003-08-20  Bernhard Herzog  <[email protected]>
2877    
2878            Add dialogs and commands to open database connections and add
2879            database layers.
2880    
2881            * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
2882            method to open the database connection management dialog
2883            (MainWindow.AddDBLayer): New method to add a layer from a database
2884            (_has_dbconnections): New helper function to use for sensitivity
2885            (database_management command, layer_add_db command): New commands
2886            that call the above new methods.
2887            (main_menu): Add the new commands to the menu.
2888    
2889            * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
2890            (PostGISConnection.connect): Establish the actual connection in a
2891            separate method and call it in __init__. This makes it easier to
2892            override the behavior in test cases
2893            (PostGISConnection.BriefDescription): New method to return a brief
2894            description for use in dialogs.
2895    
2896            * test/test_postgis_db.py (NonConnection): DB connection that
2897            doesn't actually connect
2898            (TestBriefDescription): New class with tests for the new
2899            BriefDescription method
2900    
2901    2003-08-19  Jan-Oliver Wagner <[email protected]>
2902    
2903            Moved anything from extensions to libraries.
2904    
2905            * libraries: New.
2906    
2907            * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
2908    
2909            * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
2910            Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
2911            been moved here from thuban/extensions/pyprojection/
2912            See there in the Attic for the older history.
2913    
2914            * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
2915            dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
2916            shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
2917            have been moved here from thuban/extensions/pyshapelib/
2918            See there in the Attic for the older history.
2919    
2920            * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
2921            files have been moved here from thuban/extensions/shapelib/
2922            See there in the Attic for the older history.
2923    
2924            * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
2925            gdalwarp.cpp, wxproj.cpp: These files have been moved here from
2926            thuban/extensions/thuban/
2927            See there in the Attic for the older history.
2928    
2929            * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
2930    
2931            * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
2932            gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
2933    
2934            * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
2935            Moved to libraries/shapelib.
2936    
2937            * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
2938            shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
2939            ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
2940            Moved to libraries/pyshapelib.
2941    
2942            * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
2943            LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
2944            Moved to libraries/pyprojection.
2945    
2946            * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
2947    
2948            * extensions: Removed.
2949    
2950    2003-08-19  Bernhard Herzog  <[email protected]>
2951    
2952            * test/test_viewport.py (ViewPortTest): We don't use the
2953            facilities of FileTestMixin so don't derive from it.
2954            (TestViewportWithPostGIS): New class with tests for using a
2955            viewport on a map with postgis layers.
2956    
2957    2003-08-19  Bernhard Herzog  <[email protected]>
2958    
2959            Add the db connection management to the session.
2960    
2961            * Thuban/Model/session.py (Session.__init__): New instance
2962            variable db_connections
2963            (Session.AddDBConnection, Session.DBConnections)
2964            (Session.HasDBConnections, Session.CanRemoveDBConnection)
2965            (Session.RemoveDBConnection): New methods to manage and query the
2966            db connections managed by the session
2967            (Session.OpenDBShapeStore): New method to open a shapestore from a
2968            db connection
2969    
2970            * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
2971            messages for the db connection handling in the session
2972    
2973            * test/test_postgis_session.py: New. test cases for the session's
2974            db connection handling with postgis connections
2975    
2976    2003-08-19  Bernhard Herzog  <[email protected]>
2977    
2978            Add very basic postgis database support and the corresponding test
2979            cases. The test cases require a PostgreSQL + postgis installation
2980            but no existing database. The database will be created
2981            automatically by the test cases
2982    
2983            * test/README: Add note about skipped tests and the requirements
2984            of the postgis tests.
2985    
2986            * Thuban/Model/postgisdb.py: New. Basic postgis database support.
2987    
2988            * test/test_postgis_db.py: New. Test cases for the postgis
2989            support.
2990    
2991            * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
2992            format
2993    
2994            * test/test_wellknowntext.py: New. Test cases for the
2995            wellknowntext parser
2996    
2997            * test/postgissupport.py: New. Support module for tests involving
2998            a postgis database.
2999    
3000            * test/support.py (execute_as_testsuite): Shut down the postmaster
3001            if it's still running after the tests
3002    
3003            * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
3004            well known text format
3005    
3006    2003-08-19  Jan-Oliver Wagner <[email protected]>
3007    
3008            * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
3009            message dialog.
3010    
3011    2003-08-18  Bernhard Herzog  <[email protected]>
3012    
3013            * test/support.py (ThubanTestResult.printErrors): Indent the
3014            reason for the skips in the output to make it a bit more readable.
3015            (execute_as_testsuite): New helper function to run a test suite
3016            and print some more information.
3017            (run_tests): Use execute_as_testsuite to run the tests
3018    
3019            * test/runtests.py (main): Use execute_as_testsuite to run the
3020            tests
3021    
3022    2003-08-18  Bernhard Herzog  <[email protected]>
3023    
3024            Fix some bugs in Thuban and the test suite that were uncovered by
3025            changes introduced in Python 2.3:
3026    
3027            * Thuban/Model/table.py (DBFTable.__init__): Make sure the
3028            filename is an absolute name
3029    
3030            * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
3031            filename is an absolute name
3032    
3033            * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
3034            unique filename to save to and use the correct relative filename
3035            in the expected output.
3036            (SaveSessionTest.test_dbf_table): Use the correct relative
3037            filename in the expected output.
3038    
3039            * test/test_layer.py (TestLayer.test_raster_layer): Update the
3040            test to check whether the filename is absolute.
3041    
3042    2003-08-18  Jan-Oliver Wagner <[email protected]>
3043    
3044            * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
3045    
3046    2003-08-15  Bernhard Herzog  <[email protected]>
3047    
3048            Change the way shapes are returned by a shape store. The
3049            ShapesInRegion method returns an iterator over actual shape
3050            objects instead of a list of shape ids.
3051    
3052            * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
3053            id.
3054            (ShapefileStore.ShapesInRegion): Return an iterator over the
3055            shapes which yields shape objects instead of returning a list of
3056            shape ids
3057            (ShapefileStore.AllShapes): New. Return an iterator over all
3058            shapes in the shape store
3059            (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
3060    
3061            * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
3062            doc-string.
3063    
3064            * Thuban/UI/baserenderer.py
3065            (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
3066            layer_shapes and make it return an iterator containg shapes
3067            instead of a list of ids.
3068            (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
3069            layer_shapes() change
3070    
3071            * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
3072            (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
3073    
3074            * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
3075            changes in the ShapesInRegion return value.
3076            (ViewPort._get_hit_tester): Remove commented out code
3077    
3078            * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
3079            new return value.
3080            (SimpleShapeStore.AllShapes): New. Implement this method too.
3081    
3082            * test/test_layer.py (TestLayer.test_arc_layer)
3083            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
3084            (TestLayer.test_point_layer_with_projection)
3085            (TestLayer.test_derived_store): Adapt to changes in the
3086            ShapesInRegion return value.
3087    
3088            * test/test_shapefilestore.py
3089            (TestShapefileStoreArc.test_shapes_in_region)
3090            (TestShapefileStorePolygon.test_shapes_in_region)
3091            (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
3092            in the ShapesInRegion return value.
3093            (TestShapefileStorePoint.test_all_shapes)
3094            (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
3095            methods
3096    
3097            * test/test_derivedshapestore.py
3098            (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
3099            the ShapesInRegion return value.
3100            (TestDerivedShapeStore.test_all_shapes)
3101            (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
3102            methods
3103    
3104    2003-08-15  Bernhard Herzog  <[email protected]>
3105    
3106            Make the renderers deal correctly with raw vs. python level
3107            representation of shape geometries
3108    
3109            * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
3110            Return a flag useraw in addition to the callable and the parameter
3111            to indicate whether the callable can deal with the raw shape data
3112            or uses the higher level python lists of coordinates. The callable
3113            now should accept either the raw data or the return value of the
3114            shape's Points() method.
3115            (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
3116            change
3117            (BaseRenderer.projected_points): Instead of the shape id use the
3118            points list as parameter.
3119            (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
3120            (BaseRenderer.draw_point_shape): Adapt to projected_points()
3121            change and accept the points list as parameter instead of the
3122            shape id.
3123    
3124            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
3125            the useraw flag as required by the BaseRenderer
3126            (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
3127            changes.
3128    
3129            * test/test_baserenderer.py
3130            (TestBaseRenderer.test_point_with_classification): New test for
3131            rendering a map with classifications.
3132    
3133    2003-08-15  Bernhard Herzog  <[email protected]>
3134    
3135            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
3136            (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
3137            (ViewPort._get_hit_tester, ViewPort.projected_points)
3138            (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
3139            (ViewPort._find_label_at): Split the find_shape_at method into
3140            several new methods and use the functions in the hit-test module.
3141    
3142            * Thuban/UI/hittest.py: New module with Python-level hit-testing
3143            functions
3144    
3145            * test/test_hittest.py: New. Test for the new hittest module
3146    
3147    2003-08-15  Bernhard Herzog  <[email protected]>
3148    
3149            * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
3150            projection to all corners of the bounding box to get a better
3151            approximation of the projected bounding box
3152    
3153            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3154            New. Test coordinate handling of a layer with a projection.
3155            Catches the bug fixed in Layer.ShapesInRegion
3156    
3157    2003-08-15  Bernhard Herzog  <[email protected]>
3158    
3159            Move some of the mock objects in test_baserenderer into their own
3160            module so they can easily be used from other tests
3161    
3162            * test/mockgeo.py: New test helper module with some mock objects
3163            for geometry related things like shapes, shapestores and
3164            projections.
3165    
3166            * test/test_mockgeo.py: New. Tests for the new helper module
3167    
3168            * test/test_baserenderer.py: Some of the mock-objects are in
3169            mockgeo now.
3170    
3171    2003-08-12  Jan-Oliver Wagner <[email protected]>
3172    
3173            * Thuban/UI/about.py (About.__init__): Added Bj�rn Broscheit.
3174    
3175    2003-08-12  Bernhard Herzog  <[email protected]>
3176    
3177            * po/de.po: New. German translations by Bjoern Broscheit
3178    
3179    2003-08-12  Bernhard Herzog  <[email protected]>
3180    
3181            * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
3182            strings have to be one string literal.
3183    
3184    2003-08-11  Bernhard Herzog  <[email protected]>
3185    
3186            * test/support.py (FloatComparisonMixin.assertPointListEquals):
3187            New. This method was used in various derived classes, but it's
3188            better to have it here.
3189    
3190            * test/test_shapefilestore.py
3191            (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
3192            FloatComparisonMixin
3193    
3194            * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
3195            It's now in FloatComparisonMixin
3196    
3197            * test/test_derivedshapestore.py
3198            (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
3199            in FloatComparisonMixin
3200    
3201    2003-08-11  Bernhard Herzog  <[email protected]>
3202    
3203            * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
3204            error message
3205    
3206    2003-08-08  Jan-Oliver Wagner <[email protected]>
3207    
3208            * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
3209            with version number.
3210            Changed title to reflect version number of Thuban.
3211    
3212    2003-08-08  Jan-Oliver Wagner <[email protected]>
3213    
3214            * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
3215            the list corresponds to the "About" web page.
3216    
3217    2003-08-08  Bernhard Herzog  <[email protected]>
3218    
3219            * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
3220            Make sure translated strings are recognized as one string literal.
3221    
3222            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
3223            Make sure translated strings are recognized as one string literal.
3224    
3225            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
3226            translated strings are recognized as one string literal.
3227    
3228            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
3229            sure translated strings are recognized as one string literal.
3230    
3231    2003-08-07  Bernhard Herzog  <[email protected]>
3232    
3233            * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
3234            Simply delegates to the original shapestore.
3235    
3236            * test/test_derivedshapestore.py
3237            (TestDerivedShapeStore.test_raw_format): New. Test case for
3238            DerivedShapeStore.RawShapeFormat
3239    
3240    2003-08-07  Bernhard Herzog  <[email protected]>
3241    
3242            Add raw data interface to shape objects.
3243    
3244            * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
3245            class to ShapefileShape which now holds shapefile specific
3246            information.
3247            (ShapefileShape.compute_bbox): Simplified to not cache any
3248            information. The way this method is used that shouldn't matter
3249            performance wise.
3250            (ShapefileShape.RawData): New. Return the shapeid which is the raw
3251            data format for shapes from shapefiles.
3252            (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
3253            in the shape objects returned by a shapestore. For a
3254            ShapefileStore this is always RAW_SHAPEFILE.
3255            (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
3256            method.
3257    
3258            * test/test_shapefilestore.py
3259            (TestShapefileStore.test_raw_format): New test to test the raw
3260            format feature of shapes.
3261    
3262            * Thuban/Model/layer.py: Remove the unused import of Shape from
3263            data. It was only there for interface compatibility but it's not
3264            used inside of Thuban and the generic Shape class has gone away.
3265    
3266            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
3267            the raw data format and only use an optimized version of its a
3268            shapefile.
3269    
3270    2003-08-07  Bernhard Herzog  <[email protected]>
3271    
3272            * test/test_baserenderer.py (SimpleShape): Shape class for the
3273            tests.
3274            (SimpleShapeStore.Shape): Use SimpleShape instead of
3275            Thuban.Model.data.Shape to make the tests independed of the coming
3276            changes.
3277    
3278    2003-08-07  Bernhard Herzog  <[email protected]>
3279    
3280            * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
3281            (ThubanTestProgram): New classes that extend the respective
3282            classes from unittest. These new version support skipping tests
3283            under certain expected conditions. In the Thuban test suite we
3284            uses this for tests that require the optional gdal support.
3285            (run_tests): Use ThubanTestProgram instead of the unittest.main()
3286    
3287            * test/runtests.py (main): Use the new ThubanTestRunner instead of
3288            the normal one from unittest
3289    
3290            * test/test_layer.py (TestLayer.test_raster_layer): If this test
3291            is not run because gdal support isn't available report this to the
3292            runner.
3293    
3294            * test/test_baserenderer.py
3295            (TestBaseRenderer.test_raster_no_projection): Do not run this test
3296            if gdal support isn't available and report this to the runner.
3297    
3298    2003-08-06  Bernhard Herzog  <[email protected]>
3299    
3300            Rearrange the renderers a bit, partly in preparation for changes
3301            required for the postgis merge, partly to make it more testable.
3302            Also make the representation of coordinates in Shapes more
3303            consistent.
3304    
3305            * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
3306            this class is now in BaseRenderer. This class is now practically
3307            only a specialization of BaseRenderer for rendering to an actual
3308            wx DC.
3309            (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
3310            to get the shapetype specific rendering functions.
3311    
3312            * Thuban/UI/baserenderer.py: New file with the basic rendering
3313            logic. The code in this file is completely independend of wx.
3314            (BaseRenderer): Class with the basic rendering logic
3315    
3316            * test/test_baserenderer.py: New. Test cases for BaseRenderer
3317    
3318            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
3319            error_on_redraw to guard agains endless loops and stack overflows
3320            when there's a bug in the rendering code that raises exceptions.
3321            (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
3322            rendering into a separate method _do_redraw so that error handling
3323            is a bit easier. When an exception occurs, set error_on_redraw to
3324            true. When it's true on entry to OnIdle do nothing and return
3325            immediately.
3326    
3327            * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
3328            Shape object will always have the coordinates as a list of list of
3329            coordinate pairs (tuples).
3330            (Shape.compute_bbox): Adapt to new representation.
3331    
3332            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
3333            (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
3334            Shape objects.
3335    
3336            * test/test_shapefilestore.py
3337            (ShapefileStoreTests.assertFloatTuplesEqual)
3338            (ShapefileStoreTests.assertPointListEquals): Rename to
3339            assertPointListEquals and change purpose to checking equality of
3340            the lists returned by Shape.Points().
3341            (TestShapefileStoreArc.test_shape)
3342            (TestShapefileStorePolygon.test_shape)
3343            (TestShapefileStorePoint.test_shape): Use the new
3344            assertPointListEquals instead of assertFloatTuplesEqual
3345    
3346            * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
3347            (TestLayer.assertPointListEquals): Rename to assertPointListEquals
3348            and change purpose to checking equality of the lists returned by
3349            Shape.Points().
3350            (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
3351            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
3352            (TestLayer.test_derived_store): Use the new assertPointListEquals
3353            instead of assertFloatTuplesEqual
3354    
3355            * test/test_derivedshapestore.py
3356            (TestDerivedShapeStore.assertFloatTuplesEqual)
3357            (TestDerivedShapeStore.assertPointListEquals): Rename to
3358            assertPointListEquals and change purpose to checking equality of
3359            the lists returned by Shape.Points().
3360            (TestDerivedShapeStore.test_shape): Use the new
3361            assertPointListEquals instead of assertFloatTuplesEqual
3362    
3363    2003-08-06  Jan-Oliver Wagner <[email protected]>
3364    
3365            * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
3366            a bounding box. A dialog is raised in case, no bounding box
3367            is found. This fixes bug #2043:
3368            https://intevation.de/rt/webrt?serial_num=2043
3369    
3370    2003-08-05  Bernhard Herzog  <[email protected]>
3371    
3372            * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
3373            object look like a Color instantiation. Formerly it looked like a
3374            tuple.
3375    
3376            * test/test_color.py (TestColor.test_repr)
3377            (TestColor.test_equality, TestColor.test_inequality): New. test
3378            some more apects of the Color class
3379            (TestTransparent.test_repr, TestTransparent.test_hex)
3380            (TestTransparent.test_equality): New. Test cases for the
3381            Transparent object.
3382    
3383    2003-08-04  Jan-Oliver Wagner <[email protected]>
3384    
3385            * Doc/manual/thuban-manual.xml: a number of small improvements.
3386            The resulting file is the version submitted for GREAT-ER II.
3387    
3388    2003-08-01  Bernhard Herzog  <[email protected]>
3389    
3390            * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
3391            Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
3392            Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
3393    
3394            * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
3395            (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
3396            (ThubanEndBusyCursor): Add doc-strings
3397    
3398    2003-08-01  Bernhard Herzog  <[email protected]>
3399    
3400            First step towards PostGIS integration. More abstraction by movin
3401            more code from the layer to the shapestore. More methods of the
3402            layer are now simply delegated to the equivalent method of the
3403            shapestore. The SHAPETYPE_* constants are now in data not in
3404            layer.
3405    
3406            * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
3407            (SHAPETYPE_POINT, Shape): Move these constants and classes from
3408            layer.py to data.py
3409            (ShapefileStore.__init__): More Initialization for the new methods
3410            and functionality.
3411            (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
3412            (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
3413            (ShapefileStore.Shape): New methods that were formerly implemented
3414            in the layer.
3415            (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
3416            (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
3417            (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
3418            equivalents of the new shape methods. These versions are simply
3419            delegated to the original shapstore.
3420    
3421            * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
3422            (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
3423            (Layer.SetShapeStore): Removed the initializatin of instance
3424            variables that were needed for the stuff that's now in
3425            ShapefileStore
3426            (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
3427            (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
3428            shapestore.
3429    
3430            * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
3431            Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
3432            instead of layer.
3433    
3434            * test/test_shapefilestore.py: New. Tests for ShapefileStore.
3435    
3436            * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
3437    
3438            * test/test_layer.py: Import the SHAPETYPE_* constants from data
3439            instead of layer.
3440            (TestLayer.test_derived_store): Remove the test for the exception
3441            when instantiating the DerivedShapeStore with an incompatible
3442            table which is now in test_derivedshapestore.py. Add some more
3443            tests of the layer methods to determine whether they work for a
3444            DerivedShapeStore as well.
3445    
3446    2003-07-31  Jonathan Coles   <[email protected]>
3447    
3448            * Doc/manual/thuban-manual.xml: Fix the list of required packages
3449            by just listing the name and where they can be found.
3450    
3451    2003-07-31  Frank Koormann   <[email protected]>
3452    
3453            * Doc/manual/thuban-manual.xml:
3454            Changed the screenshot elements to figure.
3455            Changed some variablelist elements to itemizedlist.
3456            Added section on GDAL formats.
3457    
3458    2003-07-31  Jonathan Coles   <[email protected]>
3459    
3460            * Doc/manual/thuban-manual.xml: Added a few sentences about
3461            the Fix Border Color option when generating classes.
3462    
3463    2003-07-30  Jonathan Coles   <[email protected]>
3464    
3465            * Thuban/Model/classgen.py: Add docstrings. Rename specific
3466            Ramp instances to use lower_case_style.
3467    
3468            * Thuban/UI/classgen.py: Use renamed Ramp instances.
3469            
3470            * Thuban/UI/classifier.py: Add docstrings.
3471    
3472            * Thuban/UI/dock.py: Add docstrings.
3473    
3474            * test/test_classgen.py: Use renamed Ramp instances.
3475    
3476    2003-07-30  Bernhard Herzog  <[email protected]>
3477    
3478            * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
3479            was never used in Thuban.
3480    
3481    2003-07-30  Bernhard Herzog  <[email protected]>
3482    
3483            * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
3484            method directly instead of going through the transient_table
3485            method. This faster because transient_table may force the copy of
3486            a DBF file into the transient database and setting a table's title
3487            doesnm't affect the title of the associated transient table, so
3488            this fixes RT #2042
3489    
3490            * Thuban/UI/main.py (__version__): Don't import the already
3491            removed show_exception_dialog.
3492    
3493    2003-07-29  Jonathan Coles   <[email protected]>
3494    
3495            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3496            Put back this method and remove the equivalent function since we
3497            are setting the exception hook from within this class (OnInit).
3498    
3499    2003-07-29  Jonathan Coles   <[email protected]>
3500    
3501            * Doc/manual/images/5_2_custom_ramp.png,
3502            Doc/manual/images/5_2_quantiles.png,
3503            Doc/manual/images/5_2_uniform_dist.png,
3504            Doc/manual/images/5_2_unique_values.png,
3505            Doc/manual/images/8_int_error.png: New screen shots.
3506    
3507            * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
3508            some points, and added more screen shots.
3509    
3510    2003-07-29  Bernhard Herzog  <[email protected]>
3511    
3512            * Thuban/Model/data.py: Remove the now unused import of warnings
3513    
3514    2003-07-29  Bernhard Herzog  <[email protected]>
3515    
3516            * Thuban/Model/data.py (SimpleStore): Removed. This class has been
3517            deprecated since before the 0.8 release and isn't used in Thuban
3518            itself anymore.
3519    
3520            * Thuban/Model/transientdb.py: Remove some unnecessary imports
3521    
3522    2003-07-29  Jonathan Coles   <[email protected]>
3523    
3524            * Thuban/UI/application.py (ThubanApplication.OnInit): set the
3525            python exception hook here so that we are sure to catch any
3526            Thuban exception that happen during initialization.
3527    
3528            * Thuban/UI/main.py (main): Don't set the exception hook here,
3529            it will get set in ThubanApplication.OnInit.
3530    
3531    2003-07-29  Jonathan Coles   <[email protected]>
3532                                                                                
3533            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3534            Removed and called it show_exception_dialog() so that the exception
3535            handler can be set before the class is created.
3536                                                                                
3537            * Thuban/UI/main.py (main): Install the exception handler before
3538            a ThubanApplication is created.
3539                                                                                    
3540    2003-07-29  Bernhard Herzog  <[email protected]>
3541    
3542            * po/it.po: New. Italian translation by Maurizio Napolitano
3543    
3544            * po/ru.po: New. Russian translation by Alex Shevlakov
3545    
3546    2003-07-29  Frank Koormann   <[email protected]>
3547    
3548            * Doc/manual/thuban-manual.xml: Extended section on supported
3549            projections.
3550            
3551    2003-07-29  Frank Koormann   <[email protected]>
3552    
3553            * Doc/manual/thuban-manual.xml: gaspell-checked.
3554    
3555    2003-07-29  Jonathan Coles   <[email protected]>
3556    
3557            * Doc/manual/images/3_5_legend.png: Added border to improve look
3558            on white background.
3559    
3560    2003-07-29  Jonathan Coles   <[email protected]>
3561    
3562            * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
3563            descriptions for the legend toolbar.
3564    
3565            * Doc/manual/images/4_2_raster_layer_properties.png: Removed
3566            cursor from dialog box.
3567    
3568    2003-07-28  Jonathan Coles   <[email protected]>
3569    
3570            * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
3571    
3572            * Doc/manual/images/2_4_session_tree.png,
3573            Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
3574            Doc/manual/images/4_2_layer_properties.png,
3575            Doc/manual/images/4_2_raster_layer_properties.png,
3576            Doc/manual/images/5_3_genclass.png,
3577            Doc/manual/images/5_classification.png,
3578            Doc/manual/images/6_projection.png,
3579            Doc/manual/images/7_1_table_view.png,
3580            Doc/manual/images/7_2_5_join.png: New screenshots.
3581    
3582    2003-07-24  Jonathan Coles   <[email protected]>
3583    
3584            * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
3585    
3586    2003-07-24  Jonathan Coles   <[email protected]>
3587    
3588            * Doc/manual/thuban-manual.xml: Added EPS images and wrote
3589            chapter on Layer Management.
3590    
3591            * Doc/manual/Makefile: New. Makefile to generate all formats for the
3592            manual and images.
3593    
3594    2003-07-24  Bernhard Herzog  <[email protected]>
3595    
3596            * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
3597            it annoys lintian which warns about these files not being
3598            executable. The #! isn't necessary here since if you absolutely
3599            must execute them you can always say "python <filename>".
3600    
3601            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
3602            superfluous code to set brush and pen for point shapes
3603    
3604            * Thuban/UI/viewport.py: Remove commented out code that wouldn't
3605            belong in viewport anyway
3606    
3607    2003-07-24  Frank Koormann   <[email protected]>
3608    
3609            * Doc/manual/thuban-manual.xml: Added section on table management.
3610    
3611    2003-07-24  Bernhard Herzog  <[email protected]>
3612    
3613            * test/runtests.py (main): Recognize the long "verbose" option
3614            correctly.
3615    
3616    2003-07-22  Jonathan Coles   <[email protected]>
3617    
3618            * Doc/manual/thuban-manual.xml: Continue to write first revision
3619            of the manual.
3620    
3621            * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
3622            with Begin/EndDrawing() calls to ensure we aren't doing to
3623            many updates to the dc during rendering.
3624            (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
3625            a pen and brush argument so they need to be passed to the function.
3626    
3627            * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
3628            Calculates the minimum and maximum scale values. Factored out
3629            of set_view_transform so that it could be used to zoom all the
3630            way into a single point.
3631            (ViewPort.set_view_transform): Call calc_min_max_scales().
3632            (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
3633            if only a single point is selected.
3634    
3635            * Doc/manual/images/1_2_legend_close.png,
3636            Doc/manual/images/1_2_legend_dock.png,
3637            Doc/manual/images/1_2_mainwindow.png,
3638            Doc/manual/images/1_2_mainwindow.ps,
3639            Doc/manual/images/1_2_mainwindow.sk,
3640            Doc/manual/images/3_2_fullextent.png,
3641            Doc/manual/images/3_2_fulllayerextent.png,
3642            Doc/manual/images/3_2_fullshapeextent.png,
3643            Doc/manual/images/3_2_pan.png,
3644            Doc/manual/images/3_2_zoomin.png,
3645            Doc/manual/images/3_2_zoomout.png,
3646            Doc/manual/images/3_3_identify.png,
3647            Doc/manual/images/3_3_label.png,
3648            Doc/manual/images/3_5_invisible.png,
3649            Doc/manual/images/3_5_movedown.png,
3650            Doc/manual/images/3_5_moveup.png,
3651            Doc/manual/images/3_5_props.png,
3652            Doc/manual/images/3_5_tobottom.png,
3653            Doc/manual/images/3_5_totop.png,
3654            Doc/manual/images/3_5_visible.png: New. Images for the documentation.
3655    
3656    2003-07-18  Bernhard Herzog  <[email protected]>
3657    
3658            * Thuban/UI/messages.py (MAP_REPLACED): New message.
3659    
3660            * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
3661            after the new map has been assigned
3662    
3663            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
3664            Delegate MAP_REPLACED to the canvas too
3665            (MainWindow.prepare_new_session): Removed. Thanks to the new
3666            MAP_REPLACED message it's no longer needed
3667            (MainWindow.OpenSession, MainWindow.NewSession):
3668            prepare_new_session has been removed.
3669    
3670            * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
3671            MAP_REPLACED so that we can close the dialog if a new map is set.
3672            (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
3673            (Classifier.map_replaced): Handle MAP_REPLACED by closing the
3674            dialog
3675    
3676            * test/test_viewport.py (SimpleViewPortTest)
3677            (SimpleViewPortTest.test_default_size): Add doc-strings
3678            (ViewPortTest.setUp): Bind map to self.map so we can use it in
3679            tests. Subscribe to MAP_REPLACED messages too.
3680            (ViewPortTest.tearDown): No need to explicitly unsubscribe
3681            (ViewPortTest.test_set_map): New test for the SetMap method.
3682    
3683    2003-07-18  Bernhard Herzog  <[email protected]>
3684    
3685            * test/test_viewport.py (SimpleViewPortTest.test_default_size):
3686            Move this test from ViewPortTest.setUp to this new separate test
3687            case. setUp is not the place for the actual tests.
3688            (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
3689            more of the test from setUp to the new test test_inital_settings.
3690            (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
3691            (ViewPortTest.test_proj_conv): Split test_proj_conv into
3692            test_win_to_proj and test_proj_to_win and make the tests easier to
3693            understand
3694            (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
3695            (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
3696            (ViewPortTest.test_unprojected_rect_around_point)
3697            (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
3698            Reformat to increase readability.
3699    
3700    2003-07-18  Bernhard Herzog  <[email protected]>
3701    
3702            * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
3703    
3704    2003-07-18  Bernhard Herzog  <[email protected]>
3705    
3706            * test/runtests.py: The test suite can now be run without an X
3707            connection. To make sure this remains true, remove the DISPLAY
3708            environment variable so that an error occurs if the wxGTK is
3709            imported accidentally
3710    
3711    2003-07-18  Bernhard Herzog  <[email protected]>
3712    
3713            * Thuban/UI/viewport.py: Remove unused imports
3714    
3715            * Thuban/UI/view.py: Remove unused imports
3716    
3717    2003-07-18  Bernhard Herzog  <[email protected]>
3718    
3719            * test/test_export.py Remove unused imports. The OutputTransform
3720            function is now in viewport.py and is called output_transform
3721            (TestScalebar.test_output_transform)
3722            (TestScalebar.test_OutputTransform): Renamed to
3723            test_output_transform and updated to use output_transform instead
3724            of OutputTransform
3725    
3726            * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
3727            renamed.
3728            (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
3729            renamed to output_transform
3730    
3731            * Thuban/UI/viewport.py (OutputTransform, output_transform):
3732            Rename to output_transform
3733    
3734    2003-07-18  Bernhard Herzog  <[email protected]>
3735    
3736            * Thuban/Model/layer.py (Layer.__init__): Rename
3737            classificationField to classificatin_column and init it here so
3738            that it can be used in SetClassificationColumn
3739            (Layer.GetClassificationColumn, Layer.GetClassificationField):
3740            Rename to GetClassificationColumn.
3741            (Layer.SetClassificationColumn, Layer.SetClassificationField):
3742            Rename to SetClassificationColumn and issue a LAYER_CHANGED
3743            message if the column changes.
3744            (Layer._classification_changed, Layer.ClassChanged): Rename to
3745            _classification_changed. Update the callers.
3746            (Layer.SetShapeStore): Further field->column renames.
3747    
3748            * Thuban/Model/load.py (SessionLoader.start_classification)
3749            (SessionLoader.start_clpoint): Updates because of
3750            field->column method name changes in the Layer class
3751    
3752            * Thuban/Model/save.py (SessionSaver.write_classification): Updates
3753            because of field->column method name changes in the Layer class
3754    
3755            * Thuban/UI/classifier.py (Classifier.__init__)
3756            (Classifier._OnTry, Classifier._OnRevert): Updates because of
3757            field->column method name changes in the Layer class
3758    
3759            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
3760            because of field->column method name changes in the Layer class
3761    
3762            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
3763            of field->column method name changes in the Layer class
3764    
3765            * test/test_save.py (SaveSessionTest.testClassifiedLayer)
3766            (SaveSessionTest.testClassifiedLayer): Update because of
3767            field->column method name changes in the Layer class
3768    
3769            * test/test_layer.py (SetShapeStoreTests.setUp)
3770            (SetShapeStoreTests.test_sanity): Update because of field->column
3771            method name changes in the Layer class
3772            (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
3773            (TestLayerModification.test_sanity)
3774            (TestLayerModification.test_initial_settings): remove unsued code
3775            and rename to test_sanity.
3776            (TestLayerModification.test_set_classification): New test for
3777            SetClassification and SetClassificationField.
3778    
3779    2003-07-18  Bernhard Herzog  <[email protected]>
3780    
3781            * test/test_classgen.py (TestFixedRamp.test): Extend test to check
3782            the non-fixed values as well. The old test would have accepted a
3783            fixed ramp that only returnes the fixed properties
3784    
3785    2003-07-17  Jonathan Coles   <[email protected]>
3786    
3787            * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
3788            shots for the manual. The XCF file is the source image and
3789            has additional layers to support changes.
3790    
3791            * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
3792    
3793            * Thuban/UI/classifier.py (Classifier.__BuildClassification):
3794            Return both the new class and the field name.
3795    
3796            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
3797            fit the map to the window as this changes any zoom level that
3798            the user may have set.
3799    
3800    2003-07-16  Jonathan Coles   <[email protected]>
3801    
3802            * Thuban/Model/classgen.py (generate_singletons,
3803            generate_uniform_distribution, generate_quantiles): Remove
3804            fixes parameter, but maintain the same functionality by having
3805            the calling function pass a FixedRamp object for the ramp.
3806            (FixedRamp): New. Adapts a ramp to have fixed property values.
3807    
3808            * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
3809            (Classification): Inherit from Publisher.
3810            (Classification.__init__): Remove the layer parameter.
3811            Classifications no longer need to have a parent layer.
3812            (Classification.GetField, Classification.GetFieldType,
3813            Classification.SetFieldInfo): Removed. The field name is stored
3814            in the layer, and the type can be retreived by calling
3815            Layer.GetFieldType().
3816            (Classification._set_layer, Classification.GetLayer): Removed.
3817            Classifications no longer have a parent layer.
3818    
3819            * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
3820            classification.
3821            (Layer.SetShapeStore): Reset the classification first while
3822            we still have the old shape store to work with.
3823            (Layer.GetClassificationField, Layer.SetClassificationField):
3824            New. Method for getting/setting the field to classify on.
3825            (Layer.SetClassification): Simplified now that the layer
3826            simply has to hold a reference to the classification and not
3827            tell the classification who owns it.
3828            Fixes RTbug #2023.
3829    
3830            * Thuban/Model/load.py (SessionLoader.start_classification):
3831            Set the field name on the layer, not the classification.
3832    
3833            * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
3834            classification is modified.
3835    
3836            * Thuban/Model/save.py (SessionSaver.write_classification):
3837            Get the field name and type from the layer.
3838    
3839            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
3840            parameter records to rows and add docstring. Fixes RTbug #1997.
3841    
3842            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
3843            ramp when we need to fix certain values of a ramp rather than
3844            using the old fixes parameter. Fixes RTbug #2024.
3845    
3846            * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
3847            parameter.
3848            (ClassTable.Reset): Add fieldType parameter and use it, rather
3849            than asking the classification.
3850            (Classifier.__init__): Remember the original class's field
3851            and ask the layer for the field type, rather than the classification.
3852            (Classifier.__SetGridTable): Retrieve the field and field type
3853            for the table because they are not in the classification.
3854            (Classifier._OnTry, Classifier._OnRevert): Set the classification
3855            field on the layer in addition to the classification itself.
3856    
3857            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
3858            classification field from layer.
3859    
3860            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
3861            classification field from layer. Split up tests and remove
3862            *-imports. Fixes RTbug #1992.
3863    
3864            * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
3865    
3866            * test/test_classification.py
3867            (TestClassification.test_classification): Remove tests for methods
3868            that no longer exist.
3869    
3870            * test/test_layer.py (SetShapeStoreTests.setUp): Classification
3871            __init__ no longer has a field parameter, use SetClassificationField.
3872            (SetShapeStoreTests.test_sanity): Use layer object to get class
3873            field info.
3874    
3875            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
3876            SetClassificationField on layer to set class field info.
3877    
3878            * test/test_viewport.py: Renamed from test/test_view.py.
3879    
3880    2003-07-16  Jan-Oliver Wagner <[email protected]>
3881    
3882            * Doc/manual/thuban-manual.xml: Added authors and an initial
3883            coarse structure.
3884    
3885    2003-07-15  Bernhard Herzog  <[email protected]>
3886    
3887            * test/support.py (FloatComparisonMixin): This is a mix-in class
3888            and therefore should not be derived from any other class.
3889    
3890            * test/test_range.py (RangeTest): FloatComparisonMixin is a
3891            mix-in, so derive from TestCase as well.
3892    
3893    2003-07-15  Bernhard Herzog  <[email protected]>
3894    
3895            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
3896            draw_func handling a bit to remove one layer of indirection. This
3897            makes the renderer about 10% faster in the non-classifying case
3898            and the code a bit cleaner
3899            (MapRenderer.draw_point_shape): Add the pen and brush parameters
3900            and set them in the dc. Now the draw_point_shape method and
3901            wxproj's draw_polygon_shape function have basically the same
3902            signature so that both can be directly used as draw_func
3903    
3904    2003-07-15  Bernhard Herzog  <[email protected]>
3905    
3906            * Thuban/Model/save.py (SessionSaver.write_classification): Encode
3907            string values (in addition to the labels) as UTF 8
3908    
3909            * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
3910            values if the field type is string
3911    
3912            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
3913            saving a session with non-ascii string classification values.
3914    
3915            * test/test_load.py (TestClassification.file_contents)
3916            (TestClassification.test): Check for non-ascii values in string
3917            classifications
3918    
3919    2003-07-14  Jonathan Coles   <[email protected]>
3920    
3921            * test/test_view.py: New. Tests for ViewPort.
3922    
3923    2003-07-14  Frank Koormann   <[email protected]>
3924    
3925            * Thuban/Model/load.py (SessionLoader.start_map): Encode map
3926            title to latin1.  Fixes https://intevation.de/rt/webrt?serial_num=2013
3927    
3928            * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
3929            unicode strings from session file: session title, map title and
3930            projection name.
3931            
3932    2003-07-10  Jonathan Coles   <[email protected]>
3933    
3934            * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
3935            drag_stop, not drag_move when the mouse is released.
3936    
3937    2003-07-10  Jonathan Coles   <[email protected]>
3938    
3939            The most important part of this is the seperation of view.py into
3940            two pieces. viewport.py now has a class called ViewPort which
3941            contains all the non-wx parts of view.py and can therefore be
3942            tested. view.py contains only the wx-specific parts and is fairly
3943            simple.
3944    
3945            * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
3946            RTTbug #1992.
3947            * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
3948            RTTbug #1992.
3949    
3950            * Thuban/Model/classgen.py (generate_singletons,
3951            generate_uniform_distribution, generate_quantiles):
3952            Added 'fixes' parameter so that property attributes can
3953            be held constant over the generated classification groups.
3954            (CustomRamp.GetProperties): Remove unused variables.
3955    
3956            * Thuban/Model/map.py (Map.SetProjection): Send the old
3957            projection as an argument to listeners of the MAP_PROJECTION_CHANGED
3958            event.
3959    
3960            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
3961            parameter which is a list of records that restricts which
3962            records are saved. Fixes RTbug #1997.
3963    
3964            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3965            Port exception dialog from GREAT-ER. Fixes RTbug #1993.
3966    
3967            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
3968            to allow the user to fix line color/width on generated groups.
3969            (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
3970            functions to optionally fix group properties.
3971    
3972            * Thuban/UI/main.py (main): Set exception hook to the
3973            ShowExceptionDialog. Fixes RTbug #1993.
3974    
3975            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
3976            the table window when it is selectd to be shown.
3977    
3978            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
3979            Export Selection button and move the export buttons underneath
3980            the table.
3981            (QueryTableFrame.UpdateStatusText): Added event argument so
3982            that it can respond to grid selection events. The status text
3983            is now updated even when the table is not associated with a
3984            layer as was previously assumed.
3985            (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
3986            UpdateStatusText responds to these events.
3987            (QueryTableFrame.OnSaveAs): Renamed to doExport.
3988            (QueryTableFrame.doExport): Helper function that saves the
3989            entire table, or selected rows, to a file.
3990            (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
3991            Respond to export button events and call doExport.
3992    
3993            * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
3994            the function doesn't return NULL without first setting a Python
3995            Error.
3996    
3997            * test/runtests.py (main): Only print "Unknown option" for
3998            unsupported options.
3999    
4000            * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
4001            optional epsilon argument to specify floating point accuracy.
4002            (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
4003            for each item test.
4004    
4005            * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
4006            tests for saving selected records.
4007    
4008            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
4009            tests for saving selected records.
4010    
4011            * test/test_map.py (TestMapWithContents.test_set_projection):
4012            MAP_PROJECTION_CHANGED events send the old projection.
4013    
4014            * test/test_session.py
4015            (TestSessionWithContent.test_forward_map_projection):
4016            MAP_PROJECTION_CHANGED events send the old projection.
4017    
4018            * test/test_table.py (TableTest): Update tests to use non-deprecated
4019            functions.
4020    
4021    2003-07-08  Bernhard Herzog  <[email protected]>
4022    
4023            * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
4024            constants in the column objects are the standard ones defined in
4025            the table module.
4026    
4027            * test/test_transientdb.py
4028            (TestTransientTable.test_transienttable_to_dbf): New. Test whether
4029            exporting transient tables as DBF works. This should catch the bug
4030            just fixed in TransientTableBase.Width.
4031    
4032    2003-07-08  Bernhard Herzog  <[email protected]>
4033    
4034            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
4035            interpolated colors correctly.
4036    
4037            * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
4038            New. Test case for the fix in classgen.py
4039    
4040    2003-07-08  Bernhard Herzog  <[email protected]>
4041    
4042            * test/runtests.py (main): Make the default output less verbose
4043            and add a verbosity option (-v) to get the old output
4044    
4045    2003-07-08  Bernhard Herzog  <[email protected]>
4046    
4047            * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
4048            0.9.
4049    
4050            * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
4051            New. Return the join type
4052    
4053            * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
4054            DTD
4055            (SessionSaver.write_data_containers): Save the join type for
4056            joined tables
4057    
4058            * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
4059            namespace
4060            (SessionLoader.start_jointable): Handle the jointype attribute
4061    
4062            * test/test_load_0_8.py: New. Effectively a copy of test_load.py
4063            as of Thuban 0.8. These are now tests to determine whether Thuban
4064            can still read files generated by Thuban 0.8
4065    
4066            * test/test_load.py (LoadSessionTest.dtd)
4067            (TestSingleLayer.file_contents)
4068            (TestLayerVisibility.file_contents, TestLabels.file_contents)
4069            (TestLayerProjection.file_contents)
4070            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4071            (TestJoinedTable.file_contents)
4072            (TestLoadError.file_contents): Update for new DTD
4073            (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
4074            for new join type attribute
4075    
4076            * test/test_save.py (SaveSessionTest.dtd)
4077            (SaveSessionTest.testEmptySession)
4078            (SaveSessionTest.testSingleLayer)
4079            (SaveSessionTest.testLayerProjection)
4080            (SaveSessionTest.testRasterLayer)
4081            (SaveSessionTest.testClassifiedLayer)
4082            (SaveSessionTest.test_dbf_table)
4083            (SaveSessionTest.test_joined_table): Update for new DTD
4084            (SaveSessionTest.test_joined_table): Add test for new join type
4085            attribute
4086    
4087    2003-07-04  Bernhard Herzog  <[email protected]>
4088    
4089            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
4090            function for table_to_dbf
4091            (table_to_dbf): Deal with names longer than the 10 character limit
4092    
4093            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
4094            doc-string
4095            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
4096            long column names
4097    
4098    2003-07-03  Bernhard Herzog  <[email protected]>
4099    
4100            * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
4101    
4102    2003-07-03  Bernhard Herzog  <[email protected]>
4103    
4104            * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
4105            for the Thuban manual and README with some basic information about
4106            the manual
4107    
4108    2003-07-03  Bernhard Herzog  <[email protected]>
4109    
4110            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
4111            Update doc-string
4112            (TransientJoinedTable.create): Do not modify the column objects of
4113            the input tables in place and copy all columns of the input tables
4114            into the joined table after all.
4115    
4116            * test/test_transientdb.py
4117            (TestTransientTable.test_transient_joined_table_same_column_name):
4118            Update to reflect the new behavior
4119            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
4120            Update to reflect the new behavior
4121            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
4122            New test case for a bug which modified the column objects in place
4123    
4124    2003-07-02  Jonathan Coles   <[email protected]>
4125    
4126            * Thuban/Model/classgen.py (generate_singletons,
4127            generate_uniform_distribution, generate_quantiles,
4128            GenQuantiles0): Make sure maxValue isn't less than
4129            one, otherwise we could divide by zero.
4130    
4131            * test/test_classgen.py (ClassGenTest.doClassRangeTest,
4132            ClassGenTest.doClassSingleTest): Call doBoundsTest to
4133            check the end classification groups against the
4134            proper property values.
4135            (ClassGenTest.doBoundsTest): New. Checks the first and
4136            last classification groups to make sure their properties
4137            are the correct upper and lower bounds for a color ramp.
4138    
4139    2003-07-02  Jonathan Coles   <[email protected]>
4140    
4141            * Thuban/Model/classgen.py (generate_singletons,
4142            generate_uniform_distribution, generate_quantiles,
4143            GenQuantiles0): The denominator was one to high when
4144            calculating the index for the ramp causing the index
4145            to never to reach one.
4146    
4147    2003-07-02  Jonathan Coles   <[email protected]>
4148    
4149            Changed the singature of ClassGroupRange.__init__ and
4150            ClassGroupRange.SetRange() so that the min/max values are
4151            passed as a tuple. This makes a better calling scheme for
4152            when a Range object is passed instead.
4153    
4154            * Thuban/Model/classgen.py: Fixed parameters to
4155            ClassGroupRange constructor.
4156    
4157            * Thuban/Model/classification.py (ClassGroupRange.__init__):
4158            Consolidate the min/max parameters into a single _range which
4159            can either be a tuple or a Range object.
4160            (ClassGroupRange.SetRange): Consolidate the min/max parameters
4161            into a single _range which can either be a tuple or a Range object.
4162    
4163            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
4164            call to ClassGroupRange constructor to use a tuple.
4165    
4166            * Thuban/Model/layer.py (Layer.SetClassification): Switch
4167            the classification instance variable to the new class
4168            before calling _set_layer otherwise subscribers to a
4169            LAYER_CHANGED event will not see any difference.
4170    
4171            * test/test_classification.py: Fix tests of ClassGroupRange
4172            so that they use the new signature.
4173    
4174            * test/test_load.py: Fix use of ClassGroupRange so that it
4175            uses the new signature.
4176    
4177            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
4178            uses the new signature.
4179    
4180            * test/test_save.py: Fix use of ClassGroupRange so that it
4181            uses the new signature.
4182    
4183    
4184    2003-07-01  Jonathan Coles   <[email protected]>
4185    
4186            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
4187            Import used objects/class from color.
4188            (generate_singletons): We don't
4189            need the numGroups parameter anymore because we are using
4190            the new ramps with GetProperties().
4191            (generate_uniform_distribution): Use new ramp method
4192            GetProperties().
4193            (generate_quantiles, GenQuantiles0): Use new ramp method
4194            GetProperties().
4195            (CustomRamp.SetNumGroups): Removed. The ramps now map
4196            a value from 0 to 1 to class properties so the number
4197            of groups is not needed ahead of time.
4198            (CustomRamp.next): Removed. CustomRamp does not support
4199            interation anymore.
4200            (CustomRamp.GetProperties): Returns a ClassGroupProperties
4201            object based on the index value from 0 to 1 that is
4202            passed to it.
4203            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
4204            Made into instances of Monochromatic class instread of
4205            deriving from it.
4206            (HotToCold.SetNumGroups): Removed. See CustomRamp.
4207            (HotToCold.next): Removed. See CustomRamp.
4208    
4209            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
4210            (Classification.SetField, Classification.SetFieldType):
4211            Replaced with SetFieldInfo.
4212            (Classification.SetFieldInfo): New. Does a better job of
4213            what SetField and SetFieldType used to do by combining
4214            their function since they should really always be done
4215            at the same time.
4216            (Classification.SetLayer): Renamed to _set_layer.
4217            (Classification._set_layer): Should only be called from
4218            Layer's SetClassification. This does not cause a recursive
4219            call as SetLayer did because we know that Layer knows about
4220            the classification.
4221    
4222            * Thuban/Model/color.py: Fixes RTbug #1971.
4223            (_Transparent): Renamed from Transparent so it doesn't
4224            conflict with the module variable.
4225            (Transparent, Black): Renamed from Color.Transparent,
4226            Color.Black so they are not class variables.
4227    
4228            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
4229            (Layer.Destroy): We don't need to call SetClassification
4230            anymore to clear out the back reference in the classifcation
4231            to the layer. It's better to set it to None using _set_layer,
4232            and we won't be creating another clas object too.
4233            (Layer.SetClassification): Classification._set_layer is not
4234            recursive so remove all the locking variables. Also clean
4235            up the code so that it remains unchanged if something fails.
4236    
4237            * Thuban/Model/load.py: Fixes RTbug #1971.
4238            (SessionLoader.start_classification): Call
4239            Classification.SetFieldInfo().
4240    
4241            * Thuban/Model/save.py: Removed import of Color which wasn't
4242            being used.
4243    
4244            * Thuban/UI/classgen.py: Fixes RTbug #1972.
4245            (ClassGenDialog.__init__): Color ramps are now instances
4246            already so we don't need to create any new objects.
4247            (ClassGenDialog.OnOK): Check for numGroups is no longer
4248            necessary because we never use it.
4249    
4250            * Thuban/UI/classifier.py: Fixes RTbug #1971.
4251            (Classifier.__BuildClassification, Classifier.__SetGridTable):
4252            Call Classification.SetFieldInfo() instead of SetFieldType.
4253    
4254            * Thuban/UI/renderer.py: Fixes RTbug #1971.
4255    
4256            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
4257            (MapCanvas.__init__): Subscribe to the idle time event. Set
4258            background color to white.
4259            (MapCanvas.OnPaint): Set a flag indicating that we should
4260            render the map during idle time. If we already have a bitmap
4261            just draw it now.
4262            (MapCanvas.OnIdle): New. Render the map only during idle time.
4263            This also fixes a problem with the busy cursor under gtk.
4264    
4265            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
4266            Fix calls to generate_singletons because the signature changed.
4267    
4268            * test/test_classification.py: Fix color references and
4269            change calls to Classification.[SetField|SetFieldType] to
4270            SetFieldInfo.
4271    
4272            * test/test_load.py: Fix color references.
4273    
4274            * test/test_load_0_2.py: Fix color references.
4275    
4276            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
4277            Change calls to Classification.[SetField|SetFieldType] to
4278            SetFieldInfo.
4279    
4280    2003-07-01  Frank Koormann   <[email protected]>
4281    
4282            MERGE from the greater-ms3 branch.
4283    
4284            * test/test_transientdb.py
4285            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
4286            New. Test join of two tables with partly equal column names.
4287    
4288            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
4289            If duplicates in left and right tables column names are found,
4290            append '_' (underscores) to the name until it is unique.
4291            Create always new internal names for the resulting table and reference
4292            columns in the join statement with <table>.<column>
4293    
4294    2003-07-01  Bernhard Herzog  <[email protected]>
4295    
4296            * test/test_transientdb.py
4297            (TestTransientTable.test_transient_joined_table_same_column_name):
4298            New. Test whether joining on columns with the same names in both
4299            tables works.
4300            
4301            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
4302            sure to use the right internal names even when joining on field
4303            with the same names in both tables. Also, detect duplicate names
4304            in the joined table correctly.
4305    
4306    2003-07-01  Frank Koormann   <[email protected]>
4307    
4308            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
4309            Reverse List of layers to render in same order as in desktop legend.
4310    
4311    2003-06-30  Jonathan Coles   <[email protected]>
4312    
4313            * Thuban/version.py (make_tuple): Takes a version string
4314            and splits it into a tuple of at most three integers.
4315            Used make_tuple() to make tuple versions of the version
4316            numbers.
4317    
4318            * Thuban/UI/about.py: Add Thuban email addresses.
4319    
4320    2003-06-30  Jonathan Coles   <[email protected]>
4321    
4322            * Thuban/version.py: SQLite/PySQLite version dependencies
4323            were too high.
4324    
4325    2003-06-30  Jonathan Coles   <[email protected]>
4326    
4327            * Thuban/version.py: Update version to 0.8.1
4328            
4329            * MANIFEST.in: Added Projections so that default.proj is
4330            included.
4331    
4332    2003-06-26  Jonathan Coles   <[email protected]>
4333    
4334            New About box with lots more information including library
4335            versions and credits. More/better version checking before
4336            Thuban starts.
4337    
4338            * Thuban/UI/about.py: New. New About box that displays
4339            library version information and credits.
4340    
4341            * Thuban/version.py: Added new 'versions' dictionary which
4342            contains the verions of various libraries which are checked
4343            when the module loads.
4344            (verify_versions): Check all version numbers and returns
4345            a list of errors.
4346    
4347            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
4348            Reset the status of the buttons as the situation warrants,
4349            but in a better more reliable way by not relying on the
4350            current status to determine what needs to change.
4351    
4352            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
4353            (verify_versions): Remove most of the code since it is
4354            now in Thuban.version.verify_versions.o
4355    
4356            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
4357            About box in Thuban.UI.about.
4358    
4359            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
4360            Returns the version of gdal library being used as a string.
4361    
4362            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
4363            Removed.
4364            (get_proj_version): Return the version of PROJ that the file
4365            was compiled with.
4366            (get_gtk_version): Return th version of GTK that the file
4367            was compiled with.
4368    
4369    2003-06-25  Jonathan Coles   <[email protected]>
4370    
4371            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
4372            of the SelectPropertiesDialog should be self so the window
4373            appears on top.
4374            (ClassGroupPropertiesCtrl.DoEdit): The parent
4375            of the SelectPropertiesDialog should be self so the window
4376            appears on top.
4377    
4378            * Thuban/UI/resource.py: Cleaned up how we determine file
4379            extensions.
4380            (GetImageResource): Return an wxImage from our Resources.
4381    
4382    2003-06-24  Jonathan Coles   <[email protected]>
4383    
4384            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
4385            Check that a layer has a classification before trying
4386            to get it. Raster layers don't have classifications.
4387    
4388    2003-06-23  Jonathan Coles   <[email protected]>
4389            
4390            * setup.py: Add Resources/XML to resource list.
4391        
4392    2003-06-23  Jonathan Coles   <[email protected]>
4393    
4394            * setup.cfg: Fix copyright dates
4395        
4396    2003-06-23  Jonathan Coles   <[email protected]>
4397    
4398            * MANIFEST.in: Update with Resources/XML
4399    
4400            * setup.py: Don't include Locale resources yet as we don't
4401            have any and it causes problems building the distribution
4402            for Windows. Update version to 0.8.0.
4403    
4404            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
4405    
4406            * Thuban/UI/mainwindow.py: Add blank line at the end because
4407            file was not being read correctly building the Windows
4408            distribution.
4409    
4410    2003-06-23  Jonathan Coles   <[email protected]>
4411    
4412            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
4413    
4414            * Thuban/version.py: Temporarily update longversion for
4415            the 0.8 release so that it doesn't have the cvs revision.
4416    
4417    2003-06-23  Jonathan Coles   <[email protected]>
4418    
4419            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
4420            to make sure that we don't create reentrant possibilities with
4421            wxYield.
4422    
4423            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
4424            directly to avoid the wxSafeYield() call which generates an
4425            OnPaint event causing infinite recursion. Don't try to catch
4426            exception anymore. This was for before there were limits on map
4427            scaling.
4428    
4429    2003-06-23  Bernhard Herzog  <[email protected]>
4430    
4431            Bug fix for RT #1961:
4432    
4433            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
4434            Register DerivedShapestores with the session
4435    
4436            * Thuban/Model/session.py (Session.Tables): Make sure each table
4437            is only listed once.
4438    
4439            * test/test_load.py (TestJoinedTable.test): Add check_format call.
4440            Update file contents to match the one written out.
4441    
4442    2003-06-20  Bernhard Herzog  <[email protected]>
4443    
4444            * test/xmlsupport.py (SaxEventLister.startElementNS)
4445            (SaxEventLister.endElementNS): Do not include the qname. Python
4446            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
4447            is (presumably incorrectly) None, whereas it's a string with the
4448            element name in the later versions.
4449    
4450            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
4451            (TestEventList.test_even_list_namespace): Update tests to reflect
4452            the new behaviour
4453            (TestEventList.test_even_list_id_normalization): Fix doc-string
4454    
4455    2003-06-20  Jonathan Coles   <[email protected]>
4456    
4457            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
4458            by deriving classes to determine if that layer supports shapes.
4459            (Layer): Override HasShapes and return true.
4460    
4461            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
4462            instead of a direct call to wx[Begin|End]CusyCursor().
4463            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
4464            table data.
4465    
4466            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
4467            New. Wrappers around the wxWindows functions that allow us to
4468            make additional calls such as wxYield which gives the native
4469            system a chance to update the cursor correctly.
4470    
4471            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
4472            instead of a direct call to wx[Begin|End]CusyCursor().
4473    
4474            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
4475            instead of a direct call to wx[Begin|End]CusyCursor().
4476            (MapCanvas.find_shape_at): Check if the current search layer
4477            support shapes, otherwise go on to the next layer.
4478    
4479            * test/test_layer.py: Add tests in each type of layer for
4480            HasClassification() and HasShapes()
4481    
4482    2003-06-20  Jonathan Coles   <[email protected]>
4483    
4484            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
4485            turning on the busy cursor to allow the system to change the
4486            cursor before we begin painting. This fixes a problem that
4487            was occuring only under GTK. Fixes RTbug #1840.
4488    
4489    2003-06-20  Bernhard Herzog  <[email protected]>
4490    
4491            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
4492            version.
4493    
4494            * Thuban/Model/save.py (sort_data_stores): New. Make topological
4495            sort of the data sources so they can be written with sources that
4496            data sources that depend on other data sources come after the
4497            sources they depend on.
4498            (SessionSaver.__init__): Add idmap instance variable to map from
4499            objects to the ids used in the file.
4500            (SessionSaver.get_id, SessionSaver.define_id)
4501            (SessionSaver.has_id): New. Methods to manage the idmap
4502            (SessionSaver.write): Use thuban-0.8.dtd
4503            (SessionSaver.write_session): Add a namespace on the session and
4504            write out the data sources before the maps.
4505            (SessionSaver.write_data_containers): New. Write the data
4506            containers.
4507            (SessionSaver.write_layer): Layer elements now refer to a
4508            shapestore and don't contain filenames anymore.
4509    
4510            * Thuban/Model/load.py (LoadError): Exception class to raise when
4511            errors in the files are discovered
4512            (SessionLoader.__init__): Define dispatchers for elements with a
4513            thuban-0.8 namespace too.
4514            (SessionLoader.check_attrs): New helper method to check and
4515            convert attributes
4516            (AttrDesc): New. Helper class for SessionLoader.check_attrs
4517            (SessionLoader.start_fileshapesource)
4518            (SessionLoader.start_derivedshapesource)
4519            (SessionLoader.start_filetable, SessionLoader.start_jointable):
4520            Handlers for the new elements in the new fileformat
4521            (SessionLoader.start_layer): Handle the shapestore attribute in
4522            addition to filename.
4523            (SessionLoader.start_table, SessionLoader.end_table): Removed.
4524            They were never used in the old formats and aren't needed for the
4525            new.
4526    
4527            * Thuban/Model/session.py (Session.DataContainers): New method to
4528            return all "data containers", i.e. shapestores and tables
4529    
4530            * test/xmlsupport.py (SaxEventLister.__init__)
4531            (SaxEventLister.startElementNS, sax_eventlist): Add support to
4532            normalize IDs.
4533    
4534            * test/test_xmlsupport.py
4535            (TestEventList.test_even_list_id_normalization): New test case for
4536            id normalization
4537    
4538            * test/test_load.py (LoadSessionTest.check_format): Use ID
4539            normalization
4540            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
4541            class atrributes used for ID normalization
4542            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
4543            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
4544            file format
4545            (TestJoinedTable): New test for loading sessions with joined
4546            tables.
4547            (TestLoadError): New. Test whether missing required attributes
4548            cause a LoadError.
4549    
4550            * test/test_save.py (SaveSessionTest.thubanids)
4551            (SaveSessionTest.thubanidrefs): New class attributes for ID
4552            normalization in .thuban files.
4553            (SaveSessionTest.compare_xml): Use id-normalization.
4554            (SaveSessionTest.testEmptySession)
4555            (SaveSessionTest.testLayerProjection)
4556            (SaveSessionTest.testRasterLayer)
4557            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
4558            (SaveSessionTest.testLayerProjection): The filename used was the
4559            same as for testSingleLayer. Use a different one.
4560            (SaveSessionTest.test_dbf_table)
4561            (SaveSessionTest.test_joined_table): New test cases for saving the
4562            new data sources structures.
4563            (TestStoreSort, MockDataStore): Classes to test the sorting of the
4564            data stores for writing.
4565    
4566            * test/runtests.py: Add CVS keywords
4567    
4568    2003-06-20  Jonathan Coles   <[email protected]>
4569    
4570            * test/test_session.py
4571            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
4572            Use the cultural_landmark-point.dbf file for the store so that
4573            the table rows and shape count match.
4574    
4575    2003-06-20  Jonathan Coles   <[email protected]>
4576    
4577            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
4578            an exception if the number of shapes is different from the
4579            number of rows in the table. Address RTbug #1933.
4580    
4581            * test/test_layer.py (TestLayer.test_derived_store): Add
4582            a test for the new exception in DerivedShapeStore.__init__.
4583    
4584            * test/support.py (FloatTestCase): Removed since there is
4585            already FloatComparisonMixin. Fixes RTbug #1954.
4586            (FloatComparisonMixin.assertFloatEqual): Include test for
4587            infinity that was part of FloatTestCase.
4588    
4589            * test/test_range.py (RangeTest): Inherit from
4590            support.FloatComparisonMixin now that we don't have
4591            support.FloatTestCase.
4592    
4593    2003-06-20  Bernhard Herzog  <[email protected]>
4594    
4595            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
4596            the implementation in xmlsupport instead.
4597            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
4598    
4599            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
4600            of test_save
4601    
4602    2003-06-20  Bernhard Herzog  <[email protected]>
4603    
4604            * test/test_load.py (LoadSessionTest.check_format): New helper
4605            method to make sure the test files we load might have been written
4606            by the current thuban version.
4607            (ClassificationTest.TestLayers, TestSingleLayer.test)
4608            (TestLayerVisibility.test, TestClassification.test)
4609            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
4610            Add check_format() calls and fix the thuban data to match the data
4611            that would be written by saving the session loaded from it.
4612    
4613            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
4614            the same class and function in test_save.
4615    
4616            * test/test_xmlsupport.py (TestEventList): New. test cases for
4617            sax_eventlist
4618    
4619    2003-06-20  Bernhard Herzog  <[email protected]>
4620    
4621            * Resources/XML/thuban.dtd: Add comment about which versions of
4622            Thuban are covered by this DTD
4623            (map): Fix content model for layers and raster layers. There can
4624            be any number or layers and raster layers in any order.
4625    
4626    2003-06-20  Jonathan Coles   <[email protected]>
4627    
4628            This is mainly about fixing RTbug #1949.
4629    
4630            * Thuban/Model/classification.py: Remove "from __future__"
4631            import statement since python 2.2 is the earliest supported
4632            version.
4633    
4634            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
4635            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
4636            depending on the units this projection *forwards* into.
4637    
4638            * Thuban/Model/save.py (SessionSaver.write_classification):
4639            Remove unnecessary use of lambdas and nested functions.
4640    
4641            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
4642            adjustment here if the map projection uses degrees.
4643    
4644            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
4645            scale adjust code since it is now done before calling
4646            this method. Don't do anything if the map projection
4647            is None.
4648    
4649    2003-06-19  Bernhard Herzog  <[email protected]>
4650    
4651            Move version specific load tests to their own file.
4652    
4653            * test/test_load.py: Expand the doc-string to explain a bit how to
4654            handle file format changes.
4655            (TestClassification.test): Update the docstring as this test is
4656            not about Thuban 0.2 anymore.
4657    
4658            * test/test_load_0_2.py: New file with the load tests for thuban
4659            files created with Thuban 0.2 and earlier.
4660    
4661    2003-06-19  Bernhard Herzog  <[email protected]>
4662    
4663            Add XML validation to some of the tests. Validation will only be
4664            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
4665            To make the DTD available to the test cases it's moved into
4666            Resources/XML
4667    
4668            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
4669            for versions up to and including 0.2. Two slight changes: added an
4670            encoding specification and fixed the comment which refered to
4671            GRASS, not Thuban
4672    
4673            * test/xmlsupport.py: New support module for tests involving XML.
4674            Currently there's a mix-in class for XML validation.
4675    
4676            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
4677    
4678            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
4679            so that we can validate the
4680            (SaveSessionTest.testEmptySession)
4681            (SaveSessionTest.testSingleLayer)
4682            (SaveSessionTest.testSingleLayer)
4683            (SaveSessionTest.testLayerProjection)
4684            (SaveSessionTest.testRasterLayer)
4685            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
4686    
4687            * test/runtests.py (main): Call print_additional_summary instead
4688            of print_garbage_information
4689    
4690            * test/support.py (resource_dir): New function to return the
4691            "Resource" subdirectory
4692            (print_additional_summary): New function to combine several
4693            summary functions
4694            (run_tests): Use print_additional_summary instead of calling
4695            print_garbage_information directly
4696    
4697    2003-06-19  Bernhard Herzog  <[email protected]>
4698    
4699            * Doc/thuban.dtd (classification): Correct the content model of
4700            the classification element.
4701            (projection): Add the "name" attribute
4702    
4703    2003-06-19  Frank Koormann   <[email protected]>
4704    
4705            MERGE from the greater-ms3 branch.
4706    
4707            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
4708            scale if projection is latlong to get better estimate.
4709    
4710            Fix problem of hidden properties dialog under windows after double
4711            click on layer tree:
4712            The tree control always gets an Expanded / Collapsed event after
4713            the ItemActivated  on double click, which raises the main window again.
4714            We add a second ItemActivated event to the queue, which simply
4715            raises the already displayed window.
4716    
4717            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
4718            raiseProperties initialized to prevent endless loops
4719            (LegendTree._OnItemActivated): Depending on self.raiseProperties
4720            simply raise the properties or open the dialog and issue a second
4721            event.
4722    
4723    2003-06-18  Jonathan Coles   <[email protected]>
4724    
4725            * setup.py: Fix a few problems that occured under Windows.
4726    
4727    2003-06-18  Jonathan Coles   <[email protected]>
4728    
4729            When Thuban loaded the map was redrawn twice because the
4730            legend was being opened after the mainwindow was created
4731            and not during its creation. This meant the map was drawn
4732            initially and then had to be redrawn when the legend
4733            caused the display to change. Now the legend is opened
4734            in the mainwindow constructor which resolves this issue.
4735    
4736            Also, although we were checking for the existence of
4737            gdal and gdalwarp modules, the gdalwarp extension was
4738            still being compiled (which may fail if the system doesn't
4739            have gdal installed). the build_ext command to setup.py
4740            now accepts the flags --with-gdal and --without-gdal.
4741            If --without-gdal is specified setup.py will try to
4742            use the gdal parameters specified by gdal-config. Under
4743            windows, those parameters have to be set in setup.py
4744            as with proj4 an wxWindows.
4745    
4746            * setup.py: Use a list instead of seperate variables for
4747            extension parameters so we can create a generic function
4748            that runs an appropriate *-config script.
4749            (run_cs_script): Renamed from run_wx_script and modified
4750            to accept a second argument which is a list of lists to
4751            be filled in by the values returned from running the command.
4752            (thuban_build_ext): New. Extends the build_ext command and
4753            provides the options --with-gdal/--without-gdal which then
4754            optionally includes the gdalwarp extension.
4755    
4756            * Thuban/Model/resource.py: First check if we can import
4757            the gdalwarp Thuban extension before checking for gdal.
4758            Also added some comments.
4759            
4760            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
4761            the map is None which may be the case if none has been loaded
4762            yet.
4763    
4764            * Thuban/UI/main.py (main): Remove call to ShowLegend.
4765    
4766            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
4767    
4768            * Thuban/UI/renderer.py: Check for gdal support before importing
4769            gdalwarp.
4770            (MapRenderer.render_map): Only try to optimize if we have gdal
4771            support otherwise nothing will get drawn.
4772    
4773            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
4774            during startup before a map has been created. Check if map is None
4775            before using it and do nothing if it is.
4776    
4777    2003-06-17  Jonathan Coles   <[email protected]>
4778    
4779            Fix the problem with raster layers under Windows that caused
4780            Thuban to crash. The view should respond to layer projection
4781            changed events to update the display. Changes to a projection
4782            should not cause the map to be set to full extent.
4783            
4784            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4785            current_map_proj to remember the current map projection so that
4786            when the projection changes we know what the previous projection
4787            was.
4788            (MapCanvas.SetMap): Unsubscribe and subscribe to
4789            LAYER_PROJECTION_CHANGED events.
4790            (MapCanvas.projection_changed): Split into two methods that respond
4791            to map and layer projection changes.
4792            (MapCanvas.map_projection_changed): New. Takes the current view and
4793            projects it using the new projection. This does not cause the
4794            map to be redrawn at full extent.
4795            (MapCanvas.layer_projection_changed): New. Cause a redraw which
4796            will draw each layer in its new projection.
4797            
4798            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
4799            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
4800            under Windows.
4801            
4802            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
4803            to twice sizeof(void*) because there are two digits for each
4804            hex byte.
4805    
4806    2003-06-16  Bernhard Herzog  <[email protected]>
4807    
4808            Update to the layer interface: Direct access to the table,
4809            shapetable, shapefile and filename attributes is now actively
4810            deprecated by issuing deprecation warnings for all places where
4811            this happens.
4812    
4813            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
4814            to the instance variables table, shapetable, shapefile and
4815            filename via __getattr__ so that we can issue a deprecation
4816            warning.
4817            (Layer.SetShapeStore): Don't set the deprecated instance variables
4818            any more
4819            (Layer.SetShapeStore): Don't use deprecated layer instance
4820            variables
4821            (Layer.Destroy): No need to explicitly remove the instance
4822            variables any more
4823            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
4824            instance variables
4825    
4826            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
4827            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
4828            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
4829            use deprecated layer instance variables
4830    
4831            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
4832            deprecated layer instance variables
4833    
4834            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
4835            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
4836            instance variables
4837    
4838            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
4839            deprecated layer instance variables
4840    
4841            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
4842            deprecated layer instance variables
4843    
4844            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
4845            deprecated layer instance variables
4846    
4847            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
4848            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
4849            variables
4850    
4851            * test/runtests.py (main): Turn Thuban's deprecation warnings into
4852            errors so that they're cought by the tests
4853    
4854            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
4855            layer instance variables
4856    
4857    2003-06-16  Jonathan Coles   <[email protected]>
4858    
4859            Fix a problem under Windows whereby if the user double-clicks on a
4860            layer in the legend that tree item will expand or collapse as well
4861            as open the layer properties dialog. The state of the tree item
4862            should not be affected.
4863    
4864            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
4865            preventExpandCollapse and subscribe to expanding and collapsing
4866            events.
4867            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
4868            collapsing events and will veto the event if it has been triggered
4869            by the user double clicking on a layer.
4870            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
4871            that an expanding/collapsing event should be vetoed.
4872    
4873    2003-06-13  Bernhard Herzog  <[email protected]>
4874    
4875            * Thuban/UI/classifier.py (Classifier.OnClose)
4876            (Classifier.map_layers_removed)
4877            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
4878            in OnClose and not in map_layers_removed or
4879            layer_shapestore_replaced to make sure it always happens when the
4880            dialog is closed
4881    
4882    2003-06-13  Jonathan Coles   <[email protected]>
4883    
4884            This puts back a fix for Windows where a panel is needed so that
4885            the background of the table view appears correctly.
4886    
4887            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
4888            object that can be used by derived classes to place any
4889            controls (including the grid) onto.
4890            (QueryTableFrame.__init__): Use the panel as the parent window
4891            for all the controls. Reparent the grid so that the panel is
4892            the parent. Call UpdateStatusText() to correctly initialize
4893            the status bar.
4894    
4895    2003-06-13  Jonathan Coles   <[email protected]>
4896    
4897            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
4898            from wxFrame (as opposed to wxDialog like the other classes)
4899            but otherwise behaves like the other classes. This is needed
4900            for the TableView which isn't really a dialog and needs to
4901            have a status bar and control buttons.
4902    
4903            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
4904            instance variable to keep track of how many rows are selected.
4905            Subscribe once to the the events we are interested in.
4906            (ThubanGrid.OnRangeSelect): Only handle event if event handling
4907            hasn't been turned off.
4908            (ThubanGrid.OnSelectCell): Only handle event if event handling
4909            hasn't been turned off.
4910            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
4911            as an event listener (which changes the event handler stack)
4912            simply set an instance variable to False. This is checked in
4913            the event handlers.
4914            (ThubanGrid.GetNumberSelected): Return the number of currently
4915            selected rows.
4916            (TableFrame): Inherit from ThubanFrame so we can have a
4917            status bar and control buttons.
4918            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
4919            Explicitly set which items are selected in the operator choice and
4920            action choice so there is always a valid selection. Fixes RTbug #1941.
4921            Subscribe to grid cell selection events so we can update the
4922            status bar.
4923            (QueryTableFrame.UpdateStatusText): Update the status bar with
4924            how many rows are in the grid, how many columns, and how many
4925            rows are selected.
4926            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
4927            Call UpdateStatusText when cells are (de)selected.
4928            (QueryTableFrame.OnQuery): Use the string value in the value
4929            combo if either the selected item index is 0 or if the string
4930            cannot be found in the predefined list (this happens if the
4931            user changes the text). Fixes RTbug #1940.
4932            Only turn off the grid event listeners if there a query comes
4933            back with a none empty list of ids. in the case that the list
4934            is empty this causes a grid.ClearSelection() call to actually
4935            clear the grid selection which causes the selected items in
4936            the map to be deselected. Fixes RTbug #1939.
4937    
4938            * test/test_save.py (XMLWriterTest.Encode): Check return values.
4939            Fixes RTbug #1851.
4940    
4941    2003-06-13  Bernhard Herzog  <[email protected]>
4942    
4943            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
4944            self.selected_shape with the current selection to make sure the
4945            contents of the dialog are up to date when it's shown for the
4946            first time.
4947            The dialog used to work without this by luck. The recent fix to
4948            the connector module 'broke' a 'feature' the identify view was
4949            relying on, i.e that subscribing to a message in response to
4950            receiving a message of that type would mean that the new
4951            subscriber would also be called for the same message.
4952            
4953    2003-06-12  Jonathan Coles   <[email protected]>
4954    
4955            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
4956            the image is rendered. Fixes RTbug #1937.
4957    
4958    2003-06-12  Jonathan Coles   <[email protected]>
4959    
4960            * Thuban/Lib/fileutil.py: As is done under Windows, create the
4961            user directory if it doesn't exist on a posix system.
4962            Fixes RTbug #1815.
4963    
4964            * Thuban/Model/resource.py (get_user_proj_files): Moved the
4965            called to get_application_dir here, so that the directory
4966            will only be called if this method is invoked.
4967    
4968            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
4969            the projfilepath if no projection is selected.
4970    
4971    2003-06-12  Jonathan Coles   <[email protected]>
4972    
4973            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
4974            the scalebar if the current map has no projection set.
4975    
4976            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
4977            projfilepath label to just the basename of the projection file
4978            rather than include the entire path.
4979    
4980            * Thuban/Model/resource.py: Fix missed proj functions that
4981            needed to be renamed.
4982    
4983    2003-06-12  Jonathan Coles   <[email protected]>
4984    
4985            * Thuban/Model/classification.py: Removed assert statements that
4986            tested if the variable was an instance of Color.
4987    
4988            * Thuban/Model/color.py (Color): Remove commented code that isn't
4989            used.
4990            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
4991            Fixes RTbug #1835.
4992            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
4993            Needed now that the class doesn't inherit from Color.
4994    
4995    2003-06-12  Jonathan Coles   <[email protected]>
4996    
4997            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
4998            check unicode strings.
4999    
5000            * test/test_layer.py: Check for existence of gdal.
5001    
5002    2003-06-12  Jonathan Coles   <[email protected]>
5003        
5004            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
5005            that was in load.py
5006    
5007            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
5008            that was in save.py
5009    
5010    2003-06-12  Jonathan Coles   <[email protected]>
5011    
5012            This is largely a collection of bug fixes. We also handle the
5013            case where gdal is not on the system. The XMLReader and XMLWriter
5014            classes were moved into there own files to resolve some circular
5015            import references and because they shouldn't really be in the
5016            file that is dediciated to reading/writing session files since
5017            they are also used elsewhere.
5018    
5019            * Thuban/Model/classgen.py: Renamed functions to follow the
5020            function_names_with_underscores style. Fixes RTbug #1903.
5021            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
5022    
5023            * Thuban/Model/layer.py: Import gdal only if it available.
5024            (RasterLayer): Handle the case where the gdal library is unavailable.
5025            Addresses RTbug #1877.
5026    
5027            * Thuban/Model/load.py (XMLReader): Moved into seperate file
5028            xmlreader.py.
5029    
5030    2003-06-12  Jonathan Coles   <[email protected]>
5031    
5032            This is largely a collection of bug fixes. We also handle the
5033            case where gdal is not on the system. The XMLReader and XMLWriter
5034            classes were moved into there own files to resolve some circular
5035            import references and because they shouldn't really be in the
5036            file that is dediciated to reading/writing session files since
5037            they are also used elsewhere.
5038    
5039            * Thuban/Model/classgen.py: Renamed functions to follow the
5040            function_names_with_underscores style. Fixes RTbug #1903.
5041            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
5042    
5043            * Thuban/Model/layer.py: Import gdal only if it available.
5044            (RasterLayer): Handle the case where the gdal library is unavailable.
5045            Addresses RTbug #1877.
5046    
5047            * Thuban/Model/load.py (XMLReader): Moved into seperate file
5048            xmlreader.py.
5049    
5050            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
5051            file xmlwriter.py.
5052    
5053            * Thuban/Model/resource.py: Renamed functions to following the
5054            function_names_with_underscores style.
5055            (has_gdal_support): New function that returns true if the gdal
5056            library is available. Addresses RTbug #1877.
5057    
5058            * Thuban/UI/application.py (ThubanApplication.OpenSession):
5059            Display a message box if the gdal library is not available, but
5060            only if there are any layers that would use it. Addresses RTbug #1877.
5061    
5062            * Thuban/UI/classgen.py: Use renamed projection resource functions.
5063            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
5064            when using integers versus floats.
5065    
5066            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
5067            determine if the "Add Image Layer" menu option should be
5068            greyed out or not. Addresses RTbug #1877.
5069    
5070            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
5071    
5072            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
5073            optimize if a raster layer is visible. Fixes RTbug #1931.
5074            Only draw the raster layer if the gdal library is available.
5075            Addresses RTbug #1877.
5076    
5077            * test/test_classgen.py: Add tests for generate_singletons,
5078            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
5079            (test_calculate_quantiles): Fix some tests to catch the new
5080            ValueError that is raised.
5081    
5082            * test/test_proj.py: Use renamed projection resource functions.
5083    
5084            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
5085            test for saving classified layers. Fixes RTbug #1902.
5086            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
5087    
5088    2003-06-12  Jan-Oliver Wagner <[email protected]>
5089    
5090            Fix for http://intevation.de/rt/webrt?serial_num=1900.
5091    
5092            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
5093    
5094            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
5095            multiplechoicedialog.py rather than from the wxPython library.
5096    
5097    2003-06-11  Frank Koormann  <[email protected]>
5098    
5099            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
5100            update.
5101    
5102    2003-06-11  Frank Koormann  <[email protected]>
5103    
5104            * Thuban/Lib/fileutil.py (get_application_dir): New function to
5105            determine the absolute .thuban/thuban directory under
5106            "posix" (os.expanduser) and "nt" (read AppData registry key).
5107    
5108            * Thuban/Model/resource.py: Use get_application_dir
5109    
5110            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
5111            Use get_application_dir.
5112    
5113    2003-06-10  Bernhard Herzog  <[email protected]>
5114    
5115            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
5116            the messages MAP_LAYERS_REMOVED messages
5117            (LayerTableFrame.OnClose): Unsubscribe from it.
5118            (LayerTableFrame.map_layers_removed): New. Receiver for
5119            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
5120            dialog is showing is removed.
5121    
5122    2003-06-10  Bernhard Herzog  <[email protected]>
5123    
5124            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
5125            of the receivers list so that unsubscribing in a receiver doesn't
5126            modify it while iterating over it.
5127    
5128            * test/test_connector.py
5129            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
5130            unsubscribing in a receiver works correctly. See docstring for
5131            details
5132    
5133    2003-06-10  Bernhard Herzog  <[email protected]>
5134    
5135            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
5136            message.
5137    
5138            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
5139            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
5140            LAYER_CHANGED will still be sent if the classification changes.
5141    
5142            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
5143            parameter so we can subscribe to some of its messages
5144            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
5145            and the layer's LAYER_SHAPESTORE_REPLACED
5146            (Classifier.unsubscribe_messages): New. Unsubscribe from message
5147            subscribed to in __init__
5148            (Classifier.map_layers_removed)
5149            (Classifier.layer_shapestore_replaced): receivers for the messages
5150            subscribed to in __init__. Unsubscribe and close the dialog
5151    
5152            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
5153            the map to the Classifier dialog
5154    
5155            * test/test_layer.py (SetShapeStoreTests): Derive from
5156            SubscriberMixin as well so we can test messages
5157            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
5158            messages
5159            (SetShapeStoreTests.tearDown): Clear the messages again
5160            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
5161            for the modified flag too
5162            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
5163            to check whether SetShapeStore sets the modified flag
5164            (SetShapeStoreTests.test_set_shape_store_different_field_name)
5165            (SetShapeStoreTests.test_set_shape_store_same_field)
5166            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
5167            Add tests for the messages. This checks both the new
5168            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
5169    
5170    2003-06-06  Jan-Oliver Wagner <[email protected]>
5171    
5172            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
5173            the menu items.
5174    
5175    2003-06-05  Frank Koormann  <[email protected]>
5176    
5177            * Thuban/UI/identifyview.py (IdentifyView.__init__):
5178            Layout reimplemented without panel. Make life easier to fit the list
5179            in the dialog.
5180    
5181    2003-06-05  Frank Koormann  <[email protected]>
5182    
5183            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
5184            once on initialisation (Former implementation resulted in multiple
5185            entries for each projection).
5186            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
5187            if set, select the projection found under the specified name. This
5188            overwrites any other selection estimate.
5189            Removed projchoice filling from this method.
5190            (ProjFrame._OnSave, ProjFrame._OnAddToList):
5191            Updated call of ProjFrame.__FillAvailList
5192            (LCCPanel._DoLayout): Moved parameter controls in more common order.
5193    
5194            * Resources/Projections/defaults.proj: Extended defaults representing
5195            various common European projections.
5196    
5197    2003-06-05  Frank Koormann  <[email protected]>
5198    
5199            * Thuban/UI/identifyview.py (IdentifyView.__init__):
5200            Use ListCtrl instead of GridCtrl
5201    
5202            * Thuban/Model/resource.py:
5203            Guess location of .thuban directory from tempdir parent directory.
5204    
5205            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
5206            Guess location of .thuban directory from tempdir parent directory.
5207    
5208    2003-06-04  Bernhard Herzog  <[email protected]>
5209    
5210            Do not cache the values returned by the tree widget's
5211            GetFirstChild and GetNextChild methods because it led to lots of
5212            segfaults. The new way requires more brute force but is more
5213            reliable.
5214    
5215            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
5216            variable layer2id
5217            (LegendTree.find_layer): New method to do with brute force what
5218            layer2id tried to accomplish
5219            (LegendTree._OnMsgLayerChanged)
5220            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
5221            Use find_layer instead of layer2id
5222            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
5223            update layer2id anymore
5224            (LegendTree._OnMsgMapLayersRemoved)
5225            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
5226    
5227    2003-06-03  Thomas Koester  <[email protected]>
5228    
5229            * Thuban/Model/classgen.py (GenQuantiles0): New function.
5230    
5231    2003-06-02  Bernhard Herzog  <[email protected]>
5232    
5233            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
5234            New commands.
5235            (main_menu): Add the new commands.
5236            (MainWindow.TableRename): New. Implementation of the table_rename
5237            command.
5238            (MainWindow.RenameLayer): New. Implementation of the layer_rename
5239            command.
5240    
5241            * Thuban/Model/session.py (Session.AddTable): call self.changed to
5242            set the modified flag
5243    
5244            * test/test_session.py (TestSessionSimple.test_add_table): Test
5245            whether the modified flag is set properly
5246    
5247            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
5248            instead of issue so that the modified flags get updated.
5249    
5250            * test/test_base.py (SomeTitledObject): Derive from Modifiable
5251            instead of Publisher to reflect reality better and to accomodate
5252            the fact that SetTitle now calls changed instead of issue
5253    
5254    2003-06-02  Bernhard Herzog  <[email protected]>
5255    
5256            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
5257            acquisition has to happen before the try in a try-finally.
5258    
5259    2003-06-02  Bernhard Herzog  <[email protected]>
5260    
5261            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
5262            possible that a layer is removed that is not currently selected in
5263            the legend so don't check for this.
5264    
5265    2003-05-30  Bernhard Herzog  <[email protected]>
5266    
5267            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
5268            variables to None that have direct or indirect references to
5269            shapefiles or dbf files to make sure that they do go away and the
5270            files are closed.
5271    
5272    2003-05-30  Bernhard Herzog  <[email protected]>
5273    
5274            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
5275            availImgListIndices when a new image list is created
5276            
5277    2003-05-30  Bernhard Herzog  <[email protected]>
5278    
5279            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
5280            changing_selection to indicate whether the LegendTree code itself
5281            is currently changing the selection
5282            (LegendTree.normalize_selection): New method to normalize the
5283            selection by selecting the layer item even if the user clicked on
5284            the classification.
5285            (LegendTree._OnSelChanged): normalize the selection. This works
5286            around a bug in wx which doesn't keep track of the selection
5287            properly when subtrees are deleted.
5288    
5289    2003-05-30  Bernhard Herzog  <[email protected]>
5290    
5291            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
5292            maximum and minimum scale factors.
5293    
5294            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
5295            changes in classgen.py
5296    
5297    2003-05-30  Jonathan Coles   <[email protected]>
5298    
5299            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
5300            all the methods functions. Fixes RTBug #1903.
5301    
5302            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
5303            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
5304            RTBug #1907.
5305    
5306            * Thuban/UI/classgen.py: Use classgen functions that were part
5307            of the ClassGenerator class. Put try/finally blocks around
5308            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
5309            RTBug #1904.
5310    
5311            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
5312    
5313            * Thuban/UI/legend.py: The legend was cleared and repopulated any
5314            time something changed which caused some state to be lost such
5315            as which children were expanded or collapsed. Fixes RTBug #1901.
5316            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
5317            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
5318            the legend but not in the map.
5319            (LegendTree.__FillTree): Move main functionality out into smaller
5320            methods that can be used by other methods.
5321            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
5322            if they are available.
5323            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
5324            that we override the wxTreeCtrl method. Iterate over children
5325            and call __RemoveLayer.
5326            (LegendTree.__AddLayer): New. Add a new layer to the legend.
5327            (LegendTree.__RemoveLayer): Remove a layer from the legend.
5328            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
5329            Should only be called with the id of a layer branch.
5330            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
5331            Returns the root item or creates one if necessary.
5332    
5333            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
5334            ProjectRasterFile with tuple arguments instead of strings.
5335    
5336            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
5337            with try/finally. Fixes RTBug #1904.
5338    
5339            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
5340            with try/finally. Fixes RTBug #1904.
5341            (MapCanvas.FitSelectedToWindow): If a single point is selected
5342            simply center it on the display. Fixes RTBug #1849.
5343    
5344            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
5345            to be compiled as a standalone app. Now the code can only be
5346            called from Python which simplifies the parameter passing.
5347            (ProjectRasterFile): Handle Python arguments. Remove code that
5348            checks for a destination dataset. Add more clean up code.
5349    
5350            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
5351            TestMapWithContents.test_lower_layer_bottom):
5352            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
5353            Fixes RTBug #1907.
5354    
5355            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
5356            extent to the map when the legend is toggled. Fixes RTBug #1881.
5357    
5358    2003-05-29  Jan-Oliver Wagner <[email protected]>
5359    
5360            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
5361            unsubscribes all that is subcribed in __init__.
5362    
5363    2003-05-28  Bernhard Herzog  <[email protected]>
5364    
5365            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
5366            (MainWindow.CanDuplicateLayer): New methods to implement the
5367            Layer/Duplicate command.
5368            (layer_duplicate command): New.
5369            (main_menu): Add layer_duplicate to the Layer menu.
5370    
5371    2003-05-28  Bernhard Herzog  <[email protected]>
5372    
5373            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
5374            renderer so that NULL/None values get displayed differently (by a
5375            gray rectangle).
5376            (TableGrid.__init__): Override the default renderers
5377    
5378    2003-05-28  Bernhard Herzog  <[email protected]>
5379    
5380            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
5381            classification to "None" if the type of the field has changed.
5382    
5383            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
5384            test for the Layer.SetShapeStore method
5385    
5386    2003-05-28  Jan-Oliver Wagner <[email protected]>
5387    
5388            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
5389            does not necessarily have a filename).
5390    
5391    2003-05-28  Jan-Oliver Wagner <[email protected]>
5392    
5393            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
5394            sort the selection list for the dialog.
5395    
5396    2003-05-28  Frank Koormann  <[email protected]>
5397    
5398            * extensions/thuban/wxproj.cpp
5399            (project_point): Removed cast to int for projected point coordinates.
5400            (shape_centroid): Return last point if all polygon vertices fall
5401            to one point.
5402    
5403    2003-05-28  Bernhard Herzog  <[email protected]>
5404    
5405            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
5406            with layers that don't have shapestores, i.e. raster layers.
5407    
5408    2003-05-28  Bernhard Herzog  <[email protected]>
5409    
5410            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
5411            when determining the title from the filename.
5412    
5413            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
5414            reflect changes in the way the title is derived from the filename
5415    
5416    2003-05-28  Frank Koormann  <[email protected]>
5417    
5418            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
5419            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
5420    
5421    2003-05-27  Bernhard Herzog  <[email protected]>
5422    
5423            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
5424            delegate SelectedLayer.
5425            (MainWindow.LayerUnjoinTable): Implement.
5426            (_can_unjoin): New. Helper function for the sensitivity of the
5427            layer/unjoin command.
5428    
5429            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
5430            (DerivedShapeStore.OrigShapeStore): New. Return the original
5431            shapestore. Used to figure out how to unjoin.
5432            (DerivedShapeStore.Shapefile): Fix a typo.
5433    
5434    2003-05-27  Bernhard Herzog  <[email protected]>
5435    
5436            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
5437            well
5438            (JoinDialog.__init__): Use the layer parameter and only build the
5439            left choice when a layer is given
5440            (JoinDialog.OnJoin): Handle layer joins as well
5441            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
5442            that the user selects the "Select..." item. The sensitivitly
5443            updating is now in update_sensitivity
5444            (JoinDialog.y): New method to refactor the sensitivity update of
5445            the join button into its own method.
5446    
5447            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
5448    
5449    2003-05-27  Bernhard Herzog  <[email protected]>
5450    
5451            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
5452            iff there are unreferenced tables in the session
5453    
5454    2003-05-27  Bernhard Herzog  <[email protected]>
5455    
5456            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
5457    
5458            * Thuban/Model/session.py (Session.UnreferencedTables): New method
5459            to return tables that are not referenced by other tables or shape
5460            stores and can be removed.
5461            (Session.RemoveTable): Issue a TABLE_REMOVED message after
5462            removing the table
5463    
5464            * Thuban/UI/mainwindow.py: Remove unused imports
5465            (MainWindow.TableClose): Implement.
5466    
5467            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
5468            messages so that the frame will be automatically closed when a new
5469            session is opened or the table is removed.
5470            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
5471            __init__
5472            (TableFrame.close_on_session_replaced)
5473            (TableFrame.close_on_table_removed): New. Subscribers that close
5474            the window
5475    
5476            * test/test_session.py (TestSessionMessages.test_remove_table)
5477            (TestSessionSimple.test_remove_table): Move the test to
5478            TestSessionSimple and add test for the TABLE_REMOVED message
5479            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
5480            (TestSessionSimple.test_unreferenced_tables) New. Test for the
5481            UnreferencedTables method.
5482            (UnreferencedTablesTests): New. Class with some more sophisticated
5483            tests for UnreferencedTables.
5484    
5485    2003-05-27  Frank Koormann  <[email protected]>
5486    
5487            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
5488            display has some unwanted side effects. Removed again.
5489    
5490    2003-05-27  Frank Koormann  <[email protected]>
5491    
5492            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
5493    
5494            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
5495    
5496    2003-05-27  Jan-Oliver Wagner <[email protected]>
5497    
5498            * test/test_menu.py (MenuTest.test): Added test for
5499            Menu.RemoveItem().
5500    
5501            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
5502            the menu.
5503    
5504    2003-05-27  Frank Koormann  <[email protected]>
5505            
5506            Nonmodal dialogs without parent (i.e. they can fall behind the main
5507            window)
5508    
5509            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
5510            all dialogs in the dialogs dictionary and the canvas.
5511    
5512            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
5513            parent, i.e. can fall behind other windows.
5514            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
5515            dictionary before removing it.
5516    
5517            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
5518    
5519            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
5520            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
5521            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
5522    
5523    2003-05-27  Bernhard Herzog  <[email protected]>
5524    
5525            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
5526            tableview dialog
5527            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
5528            Also, don't use the table's titles as the dialog names. The titles
5529            aren't guaranteed to be unique.
5530            (MainWindow.TableOpen): Open a table view dialog after opening the
5531            table
5532    
5533    2003-05-27  Bernhard Herzog  <[email protected]>
5534    
5535            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
5536            effect can be achieved by simply closing the window showing the
5537            table.
5538            (MainWindow.TableHide): Removed.
5539            (main_menu): Removed "table_hide"
5540    
5541    2003-05-27  Frank Koormann  <[email protected]>
5542    
5543            Fix legend tree display problems under Win32
5544    
5545            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
5546            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
5547            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
5548    
5549            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
5550    
5551    2003-05-27  Jan-Oliver Wagner <[email protected]>
5552    
5553            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
5554            'after' now allows to insert separators almost anywhere in the menu.
5555    
5556    2003-05-27  Frank Koormann  <[email protected]>
5557    
5558            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
5559            "S" of selection box label to hint on hot key (Alt-S). Works under
5560            Win32 but is ignored under GTK.
5561    
5562    2003-05-26  Frank Koormann  <[email protected]>
5563    
5564            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
5565            Center Choices.
5566    
5567    2003-05-26  Bernhard Herzog  <[email protected]>
5568    
5569            Remove the Precision methods again. They're too DBF specific to be
5570            part of the table interface and they're only used in table_to_dbf
5571            anyway.
5572            
5573            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
5574            fixed precision of 12 for doubles.
5575            (TransientTableBase.Precision): Removed
5576            (AutoTransientTable.Width): Delegate to self.table.
5577    
5578            * Thuban/Model/table.py (DBFTable.Precision)
5579            (MemoryTable.Precision): Removed.
5580            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
5581            (table_to_dbf): Use a fixed precision of 12 for floats unless the
5582            column object specifies something else.
5583    
5584            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
5585            test for table_to_dbf
5586    
5587    2003-05-26  Bernhard Herzog  <[email protected]>
5588    
5589            * test/test_transientdb.py
5590            (TestTransientTable.run_iceland_political_tests): Fix a comment.
5591    
5592    2003-05-26  Bernhard Herzog  <[email protected]>
5593    
5594            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
5595            implementation. Mark parts of the file format strings for
5596            localization.
5597    
5598            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
5599            file and add the table to the tables managed by the session
5600    
5601            * test/test_session.py (TestSessionSimple.test_open_table_file):
5602            New. test case for OpenTableFile
5603    
5604    2003-05-26  Jan-Oliver Wagner <[email protected]>
5605    
5606            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
5607            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
5608            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
5609            Replace the true/false of wxWindows by True/False of Python 2.2.1.
5610    
5611    2003-05-26  Jan-Oliver Wagner <[email protected]>
5612    
5613            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
5614            already a selection present, update the grid accordingly.
5615    
5616            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
5617            resizeable and increase its initial size.
5618    
5619    2003-05-26  Frank Koormann  <[email protected]>
5620    
5621            Table export functionality
5622    
5623            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
5624            Return width (in characters) for a column.
5625            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
5626            (table_to_dbf): Write table to dbf file.
5627            (table_to_csv): Write table to csv file.
5628    
5629            * Thuban/Model/transientdb.py (TransientTableBase.Width,
5630            TransientTableBase.Precision): Return column width and precision.
5631    
5632            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
5633            or table_to_csv depending on file selection.
5634    
5635            * test/test_dbf_table.py:
5636            Test table_to_dbf (extension of former part of test).
5637    
5638            * test/test_csv_table.py:
5639            Test table_to_csv.
5640    
5641    2003-05-23  Jan-Oliver Wagner <[email protected]>
5642    
5643            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
5644            Use QueryTableFrame instead of TableFrame.
5645    
5646            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
5647            table window with 'Layer Table:' instead of 'Table:'.
5648    
5649    2003-05-23  Jan-Oliver Wagner <[email protected]>
5650    
5651            Give all tables a title via mix-in TitledObject.LayerShowTable
5652    
5653            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
5654            only if it exists.
5655    
5656            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
5657            and call its init-method with a default title. Remove Title() method.
5658    
5659            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
5660            AutoTransientTable): mix-in TitledObject and call its init-method with
5661            a default title. Remove Title() method.
5662    
5663    2003-05-23  Bernhard Herzog  <[email protected]>
5664    
5665            * Thuban/Model/session.py (Session.AddShapeStore): Define
5666            AddShapeStore analogously to AddTable.
5667    
5668            * test/test_session.py (TestSessionSimple.test_add_shapestore):
5669            New. Test for AddShapeStore
5670    
5671    2003-05-23  Jan-Oliver Wagner <[email protected]>
5672    
5673            Introducing QueryTableFrame and a very coarse ShowTable implementation.
5674    
5675            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
5676            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
5677            The latter implements the selection GUI without dependency on a layer.
5678            LayerTableFrame now is derived from QueryTableFrame and connects
5679            to a layer.
5680    
5681            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
5682            implementation that still needs work.
5683    
5684            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
5685    
5686    2003-05-22  Frank Koormann  <[email protected]>
5687    
5688            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5689            Added "outer_join = False" as optional parameter.
5690            (TransientJoinedTable.create): If outer join is true, perform a
5691            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
5692            the left table. Records not matching are filled with 0 / None.
5693    
5694            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
5695            (JoinDialog.OnJoin): Consider outer join check box.
5696    
5697    2003-05-22  Bernhard Herzog  <[email protected]>
5698    
5699            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
5700            somewhat safer way. Storing the traceback in a local variable can
5701            lead to memory leaks
5702    
5703    2003-05-22  Bernhard Herzog  <[email protected]>
5704    
5705            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
5706            the wxMessageDialog's Destroy() method.
5707    
5708    2003-05-22  Frank Koormann  <[email protected]>
5709    
5710            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
5711            TransientTable.Title()
5712    
5713    2003-05-22  Frank Koormann  <[email protected]>
5714    
5715            Join Dialog, initial version.
5716    
5717            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
5718    
5719            * Thuban/UI/join.py (JoinDialog): Functional implementation of
5720            former framework. Renamed Table1/Table2 to LeftTable/RightTable
5721            in all occurences.
5722    
5723            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
5724            Typo fixed.
5725    
5726    2003-05-22  Bernhard Herzog  <[email protected]>
5727    
5728            Give the tables titles so that the GUI can display more meaningful
5729            names. For now the titles are fixed but depend on e.g. filenames
5730            or the titles of the joined tables.
5731    
5732            * Thuban/Model/transientdb.py (TransientTable.Title)
5733            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
5734    
5735            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
5736    
5737            * test/test_transientdb.py
5738            (TestTransientTable.test_auto_transient_table_title): New. Test
5739            for the Title method
5740            (TestTransientTable.test_transient_joined_table)
5741            (TestTransientTable.test_transient_table): Add test for the Title
5742            methods
5743    
5744            * test/test_memory_table.py (TestMemoryTable.test_title): New.
5745            Test for the Title method
5746    
5747            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
5748            the Title method
5749    
5750    2003-05-22  Bernhard Herzog  <[email protected]>
5751    
5752            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
5753            Provide a better way to destroy the layers
5754            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
5755            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
5756            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
5757            the new way to destroy the layers.
5758            (TestLayer.test_derived_store): New. Test for using a layer with a
5759            DerivedShapeStore
5760    
5761            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
5762            filename if the shape store actually has one.
5763    
5764    2003-05-22  Bernhard Herzog  <[email protected]>
5765    
5766            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
5767            for the filename
5768    
5769            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
5770            for the FileName method
5771            (TestDBFTableWriting.test_write): Fix spelling of filename
5772    
5773    2003-05-22  Thomas Koester  <[email protected]>
5774    
5775            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
5776            from SciParam that now really is immutable.
5777    
5778    2003-05-22  Frank Koormann  <[email protected]>
5779    
5780            Layer Top/Bottom placement added to legend.
5781    
5782            * Thuban/UI/legend.py
5783            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
5784            bound to tool events.
5785            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
5786            New, methods binding the event methods with the map methods.
5787    
5788            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
5789            layer at top/bottom of layer stack.
5790    
5791            * Resources/Bitmaps/top_layer.xpm: New button icon.
5792    
5793            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
5794    
5795    2003-05-22  Bernhard Herzog  <[email protected]>
5796    
5797            * Thuban/Model/session.py (Session.RemoveTable): New method to
5798            remove tables
5799    
5800            * test/test_session.py (TestSessionSimple.test_remove_table): New.
5801            Test for RemoveTable
5802    
5803    2003-05-22  Thomas Koester  <[email protected]>
5804    
5805            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
5806            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
5807    
5808    2003-05-22  Bernhard Herzog  <[email protected]>
5809    
5810            Implement a way to discover dependencies between tables and
5811            shapestores.
5812    
5813            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
5814            (TransientJoinedTable.Dependencies)
5815            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
5816            interface
5817            (TransientJoinedTable.__init__): Keep tack of the original table
5818            objects in addition to the corresponding transient tables.
5819    
5820            * Thuban/Model/table.py (DBFTable.Dependencies)
5821            (MemoryTable.Dependencies): New. Implement the dependencies
5822            interface
5823    
5824            * Thuban/Model/data.py (ShapeTable): New. Helper class for
5825            ShapefileStore
5826            (ShapefileStore.__init__): Use ShapeTable instead of
5827            AutoTransientTable
5828            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
5829            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
5830            methods for filename and type
5831            (ShapefileStore.Dependencies): New. Implement the dependencies
5832            interface
5833            (DerivedShapeStore): New class to replace SimpleStore. The main
5834            difference to SimpleStore is that it depends not on a shapefile
5835            but another shapestore which expresses the dependencies a bit
5836            better
5837            (SimpleStore.__init__): Add deprecation warning.
5838    
5839            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
5840            Test for the Dependencies method.
5841    
5842            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
5843            New. Test for the Dependencies method.
5844    
5845            * test/test_transientdb.py
5846            (TestTransientTable.test_auto_transient_table_dependencies): New.
5847            Test for the Dependencies method.
5848            (TestTransientTable.test_transient_joined_table): Add test for the
5849            Dependencies method.
5850    
5851            * test/test_session.py (TestSessionSimple.setUp)
5852            (TestSessionSimple.tearDown): New. Implement a better way to
5853            destroy the sessions.
5854            (TestSessionSimple.test_initial_state)
5855            (TestSessionSimple.test_add_table): Bind session to self.session
5856            so that it's destroyed by tearDown
5857            (TestSessionSimple.test_open_shapefile): New. Test for
5858            OpenShapefile and the object it returns
5859    
5860    2003-05-22  Bernhard Herzog  <[email protected]>
5861    
5862            * Thuban/Model/session.py (Session.AddTable): New method to
5863            register tables with the session.
5864            (Session.Tables): Return the tables registered with AddTable too.
5865    
5866            * test/test_session.py (TestSessionSimple.test_add_table): New.
5867            Test case for the AddTable method
5868    
5869    2003-05-22  Frank Koormann  <[email protected]>
5870    
5871            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
5872            lower right corner, center labels for selections, initialize controls
5873            in reasonable order for keyboard navigation.
5874    
5875            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
5876            (ProjFrame.__DoOnProjAvail): Determine position of current projection
5877            using the wxListBox.FindString() method. Still a problem (#1886)
5878    
5879            * Thuban/UI/classifier.py
5880            (Classifier.__init__, SelectPropertiesDialog.__init__)
5881    
5882            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
5883            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
5884            different classification types from here to __init__.
5885            (GenUniquePanel.__init__): Set the column width of the first field
5886            in the Field ListCtrl to the full width.
5887    
5888            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
5889            Button to 'Export'. Center Buttons in Selection Box, set Focus to
5890            Grid.
5891            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
5892            changes focus to the Selection when pressing "Alt-S".
5893    
5894            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
5895            the text if not visible. The italic font sometimes exceeds the
5896            rendering area.
5897    
5898    2003-05-21  Jonathan Coles   <[email protected]>
5899    
5900            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
5901            to OnClose so that Thuban closes correctly.
5902    
5903            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
5904            DockFrame.OnClose, not DockFrame._OnClose.
5905    
5906    2003-05-21  Jonathan Coles   <[email protected]>
5907    
5908            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
5909            references to 'inf' and use new Range __init__ to pass floats
5910            directly rather than converting them to strings first.
5911            Fixes RTBug #1876.
5912    
5913            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
5914            Use new Range ___init__ to pass floats.
5915    
5916            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
5917            filename is a valid image file. Throw IOError otherwise.
5918    
5919            * Thuban/Model/range.py: Brought over new Range from SciParam that
5920            is immutable and has an __init__ which can accept floats.
5921    
5922            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
5923            into try block. AddLayer doesn't throw any exceptions anymore.
5924            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
5925            try block.
5926    
5927            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
5928            the first item in choices. Fixes RTBug #1882.
5929    
5930            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
5931            has gone to 0 which is a serious problem. abort.
5932            (MapRenderer.draw_raster_layer): Catch IOError seperately and
5933            print the error from GDAL.
5934    
5935            * Thuban/UI/tableview.py (TableGrid.__init__): Call
5936            ToggleEventListeners to turn on listening.
5937            (TableGrid.ToggleEventListeners): New. Turns event listening on
5938            and off so as to prevent excessive messages.
5939            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
5940            to suppress excessive messages when selecting many rows.
5941            Fixes RTBug #1880.
5942    
5943            * Thuban/UI/view.py: Added checks against if scale == 0. This
5944            is a serious problem that can occur when an image without
5945            geo data is loading and causes the map projection bounds to
5946            go to infinity. Right now, the solution is to simply try
5947            to recover.
5948    
5949            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
5950            to set the MFILEReceiver attributes even if the data is NULL.
5951    
5952            * extensions/thuban/gdalwarp.cpp: Improved the error handling
5953            and passed GDAL messages back up to the Python layer. Also
5954            tried to fix some memory leaks that were present in the original
5955            utility but didn't matter because the program aborted.
5956    
5957            * test/test_range.py: Copied over tests from SciParam. Removed
5958            tests against importing. Fixes RTBug #1867.
5959    
5960    2003-05-21  Bernhard Herzog  <[email protected]>
5961    
5962            * test/test_load.py: Remove unused imports and restructure the
5963            test code
5964            (LoadSessionTest): Split into one class for each test and turn
5965            LoadSessionTest itself into the base class for all such session
5966            tests.
5967            (ClassificationTest): New base class for load tests that test
5968            classifications
5969            (TestSingleLayer, TestLayerVisibility, TestClassification)
5970            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
5971            for the individual tests
5972    
5973            * test/support.py (FileLoadTestCase.filename): New base class for
5974            file loading tests
5975    
5976    2003-05-21  Jan-Oliver Wagner <[email protected]>
5977    
5978            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
5979            Mercator' to 'UTM Zone 32' as a more convenient example.
5980            Added 'Gauss Krueger Zone 6'.
5981    
5982            * Data/iceland_sample_raster.thuban: political polygon now
5983            filled transparent to have the raster image visible at once.
5984    
5985    2003-05-21  Frank Koormann  <[email protected]>
5986    
5987            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
5988            OnClose() to keep in sync with extensions. Internally Thuban
5989            still uses "underscored" names.
5990    
5991    2003-05-20  Jonathan Coles   <[email protected]>
5992    
5993            This puts back Raster layer support. These layers support projections
5994            through the GDAL library. Currently, the CVS version is being used.
5995            There are no Debian packages available although this may change soon.
5996            A GDAL driver was extended to support writing to memory rather to
5997            files.
5998    
5999            There is still some work that needs to be done, such as some error
6000            handling when loading invalid images or when there is a problem
6001            projecting the image. This putback simply checks in the majority
6002            of the work.
6003    
6004            * setup.py: Add gdalwarp library extension.
6005    
6006            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
6007            Defaults to False, but can be overridden by subclasses if they
6008            support classification.
6009            (RasterLayer): New. Defines a new layer that represents an
6010            image.
6011    
6012            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
6013            tag handler.
6014            (SessionLoader.start_layer): Encode the filename.
6015            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
6016            New. Supports reading a rasterlayer tag.
6017    
6018            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
6019    
6020            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
6021            get a string in Latin1. If we get such as string convert it to
6022            unicode first, otherwise leave if alone before encoding.
6023            (SessionSaver.write_layer): Add support for writing both Layers
6024            and RasterLayers.
6025    
6026            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
6027            The right argument may not be a string, it could also be a Column.
6028    
6029            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
6030            Make initial window size 600x400. Fixes RTBug #1872.
6031    
6032            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
6033            the dialog is constructed so that we can support layers that
6034            do not have classifications.
6035            (Classifier._OnTry): Only build a classification if the layer
6036            supports one.
6037    
6038            * Thuban/UI/legend.py: Change all checks that a layer is an
6039            instance of Layer into checks against BaseLayer.
6040            (LegendTree.__FillTreeLayer): Only add children to a branch if
6041            the layer supports classification.
6042    
6043            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
6044            MainWindow.OpenSession): Don't proceed with an action if the
6045            user chooses Cancel when they are asked to save changes.
6046            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
6047            user to select an image file. Create a new RasterLayer and add
6048            it to the map.
6049    
6050            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
6051            for rendering RasterLayer layers.
6052            (MapRenderer.draw_raster_layer): Actually method that calls
6053            the GDALWarp python wrapper and constructs an image from the
6054            data returned.
6055    
6056            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
6057            Choices symbols to match those used in the table query method.
6058            Replace deprecated method calls on table with new method names.
6059    
6060            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
6061            how small the scale can get. This still needs more testing.
6062    
6063            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
6064            Provides a driver to output in .bmp format.
6065    
6066            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
6067            New. Provides IO routines which write to memory, rather than a file.
6068    
6069            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
6070            of the gdalwarp utility provided in GDAL. Added function calls
6071            that can be accessed from python.
6072    
6073            * Data/iceland_sample_raster.thuban: New. Sample file that uses
6074            a raster layer.
6075    
6076            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
6077            layer image data.
6078    
6079            * Doc/thuban.dtd: Added rasterlayer attribute definition.
6080    
6081            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
6082            tests associated with the raster layer code.
6083    
6084            * test/test_transientdb.py
6085            (TestTransientTable.test_auto_transient_table_query): Added a test
6086            for using a Column object as the "right" parameter to a query.
6087    
6088    2003-05-19  Frank Koormann  <[email protected]>
6089    
6090            * Thuban/version.py (get_changelog_date):
6091            Catch exceptions if ChangeLog does not exist.
6092    
6093            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
6094    
6095    2003-05-19  Frank Koormann  <[email protected]>
6096    
6097            Extended version information for Thuban
6098    
6099            * Thuban/version.py: New, version information for Thuban: Last
6100            modification date and last ChangeLog entry date.
6101    
6102            * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
6103            information: Display Thuban, wxPython and Python version.
6104    
6105    2003-05-16  Bernhard Herzog  <[email protected]>
6106    
6107            * Thuban/Model/save.py: Remove some unused imports including the
6108            __future__ import for nested_scopes as Thuban relies on Python 2.2
6109            now.
6110            (XMLWriter.encode): Remove the special case for a None argument.
6111            In the saver encode is always called with a string argument.
6112    
6113    2003-05-16  Bernhard Herzog  <[email protected]>
6114    
6115            * Thuban/UI/__init__.py: Remove the work-around for the locale bug
6116            in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
6117            of the bug was that e.g. float("1.2") would fail. Thuban now
6118            requires 2.4.x.
6119            
6120    2003-05-16  Frank Koormann   <[email protected]>
6121    
6122            Printing enhancement and WMF export (under Win32)
6123    
6124            * Thuban/UI/renderer.py (ExportRenderer): New, derived from
6125            ScreenRenderer. Renders Map, Legend and Scalebar for export.
6126            (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
6127            PrintRender.
6128    
6129            * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
6130            to fullfil information needed for PrinterRenderer.
6131            (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
6132            (MapCanvas.Print): Adapted to new MapPrintout.
6133            (OutputTransform): General calculations to transform from canvas
6134            coordinates to export/printing devices.
6135    
6136            * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
6137            new method_command to call ExportMap, with platform dependency (only
6138            __WXMSW__)
6139      
6140            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
6141            of scalebar drawing area as new parameters.
6142            
6143            * Thuban/Model/scalebar.py (roundInterval): round long instead of int
6144    
6145            * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
6146            Update to extended scalebar.DrawScalebar header.
6147    
6148            * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
6149    
6150            * test/test_scalebar.py: Made test executable as standalone.
6151    
6152    2003-05-16  Bernhard Herzog  <[email protected]>
6153    
6154            * Thuban/Model/table.py (Table): Remove this compatibility alias
6155            for DBFTable.
6156    
6157            * test/test_table.py: Import DBFTable as Table because that alias
6158            doesn't exist anymore.
6159    
6160            * Thuban/UI/classgen.py: Remove some unused imports
6161    
6162    2003-05-14  Jonathan Coles   <[email protected]>
6163    
6164            * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
6165            Fix docstring.
6166            (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
6167            (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
6168            values of the supplied range to determine the beginning and end
6169            bounds of the generated classes.
6170    
6171            * Thuban/Model/range.py (Range.number_re): Now accepts floats that
6172            do not have a leading 0 (.5 is now accepted as well as 0.5).
6173    
6174            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
6175            call to ClassGenerator.GenUniformDistribution.
6176    
6177            * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
6178            layout bug with the 'Projection' label.
6179    
6180            * test/support.py (FloatTestCase): New. Needed for the Range tests.
6181    
6182            * test/test_range.py: New. Imported from SciParam.
6183    
6184    2003-05-12  Jonathan Coles   <[email protected]>
6185    
6186            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
6187            to table.UniqueValues() with calls that retrieve all the values
6188            from the table. This will need to be replaced by a method on table
6189            which can simply return the list (perhaps more efficiently).
6190    
6191    2003-05-12  Jonathan Coles   <[email protected]>
6192    
6193            The return value of ClassGenerator.CalculateQuantiles has changed.
6194            Refer to the documentation for details.
6195    
6196            * test/test_classgen.py: Modified Quantile tests to use the
6197            new return values.
6198    
6199            * Thuban/Model/classgen.py
6200            (ClassGenerator.GenQuantiles): Add comments describing the parameters,
6201            use new return values from CalculateQuantiles to produce the correct
6202            range bounds in the Classification.
6203            (ClassGenerator.CalculateQuantiles): Add more comments describing
6204            the return values and parameters. Make minor adjustments to improve
6205            the legibility of the code. Fix problem with adjusted not being set
6206            in most cases.
6207    
6208    2003-05-12  Frank Koormann <[email protected]>
6209            
6210            * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
6211            and latin1. Fixes #1851 finally.
6212    
6213    2003-05-09  Jonathan Coles   <[email protected]>
6214    
6215            * test/test_classgen.py: New. Tests the Quantile algorithm.
6216    
6217            * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
6218            Clean up debugging statement, add comments, fix a small bug in the
6219            returned adjusted percentiles.
6220            
6221    2003-05-09  Jonathan Coles   <[email protected]>
6222    
6223            Introduces Range class from SciParam into the ClassGroupRange class,
6224            and such ranges can now be saved and loaded from disk.
6225    
6226            Quantiles are now available in the Classification Generator.
6227    
6228            Initial support for building Queries on a table. Doesn't do anything
6229            but run some tests.
6230    
6231            * Thuban/Model/classification.py: Explicit imports.
6232            (ClassGroupRange): Use the Range class to store the underlying
6233            range information. The interface remains the same, except for
6234            GetRange(), and you can also supply a Range object as the min
6235            parameter to SetRange or __init__.
6236    
6237            * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
6238            string appropriately for use in Thuban. Fixes RTbug #1851.
6239            (SessionLoader.end_projection): Handle the context of the
6240            projection tag a bit better by looking at what objects are not
6241            None. There was an assumption that a projection tag for a map
6242            could occur before any layers.
6243            (SessionLoader.start_clrange): Provide backward compatibility for
6244            reading min/max values as well as the new range parameter.
6245    
6246            * Thuban/Model/map.py: Explicit imports.
6247    
6248            * Thuban/Model/resource.py: Import _.
6249            (ProjFileSaver.write): write header using projfile.dtd.
6250    
6251            * Thuban/Model/save.py: Explicit imports.
6252            (XMLWriter.encode): New. Encode the given string from a format
6253            used by Thuban into UTF-8. Fixes RTbug #1851.
6254    
6255            * Thuban/UI/classgen.py: Explicit imports.
6256            (ClassGenDialog.__init__): Clean up the code and add support
6257            for Quantiles.
6258            (ClassGenDialog.OnOK): Add support for Quantiles.
6259            (GenQuantilesPanel): New. Input panel for Quantiles.
6260            (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
6261            GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
6262    
6263            * Thuban/Model/classgen.py: New. Contains all the classes named above.
6264    
6265            * Thuban/UI/classifier.py: Explicit imports.
6266            (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
6267            ClassTable.SetValueAsCustom): Reworked to use new Range class.
6268    
6269            * Thuban/UI/legend.py: Explicit imports.
6270    
6271            * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
6272            a Table menu and associated method calls.
6273            (MainWindow.choose_color): Removed. No longer needed.
6274    
6275            * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
6276            should be disabled if no projection is selected in the available
6277            list.
6278    
6279            * Thuban/UI/renderer.py: Explicit imports.
6280    
6281            * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
6282            with correctly selecting the rows and issuing the right events.
6283            Be sure to call Skip() to allow the grid to do some of its own
6284            handling which allows the rows to actually be selected.
6285            (LayerTableGrid.select_shapes): Rename from select_shape. Supports
6286            selecting multiple shapes.
6287            (LayerTableFrame): Support for building Queries.
6288            (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
6289    
6290            * Thuban/UI/tree.py: Explicit imports.
6291    
6292            * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
6293            table view can call it.
6294    
6295            * test/test_classification.py: Explicit imports.
6296            (TestClassification.test_ClassGroupRange): Fix test for new
6297            Range class.
6298    
6299            * Doc/thuban.dtd: Add range parameter for clrange.
6300    
6301            * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
6302            object in ClassGroupRange, and also uesd for inputting ranges in
6303            the classifer table and elsewhere.
6304    
6305            * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
6306            yet.
6307    
6308    2003-05-09  Frank Koormann <[email protected]>
6309    
6310            * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
6311    
6312    2003-05-08  Frank Koormann <[email protected]>
6313    
6314            Coding style updates
6315    
6316            * test/test_scalebar.py: Replaced tab indentation by spaces.
6317    
6318            * Thuban/UI/scalebar.py: Explicit imports.
6319    
6320    2003-05-08  Frank Koormann <[email protected]>
6321    
6322            * Thuban/UI/scalebar.py
6323            (ScaleBar.DrawScalebar): Format string bug fixed.
6324    
6325    2003-05-08  Frank Koormann <[email protected]>
6326    
6327            Reorganization of scalebar component (no wx in Thuban/Model)
6328    
6329            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
6330            (deriveInterval):
6331            Calculate scalebar interval and unit which fits in width for scale.
6332            (roundInterval): Round float.
6333    
6334            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
6335    
6336            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
6337    
6338            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
6339    
6340    2003-05-08  Frank Koormann <[email protected]>
6341    
6342            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
6343            Initialize ScaleBar with canvas.map
6344    
6345            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
6346            round intervals to display smarter lengths
6347            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
6348            layer. If the maps has no projection applied grey the scalebar.
6349    
6350    2003-05-07  Frank Koormann <[email protected]>
6351            
6352            Basic Scalebar features added.
6353    
6354            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
6355    
6356            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
6357            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
6358            and the renderer.
6359    
6360            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
6361    
6362            * Thuban/UI/messages.py: SCALE_CHANGED added.
6363    
6364    2003-05-07  Bernhard Herzog  <[email protected]>
6365    
6366            * Thuban/Model/session.py (Session.__init__): New instance
6367            variable shapestores to hold a list of all open shapestore objects
6368            (Session.ShapeStores): New. Accessor method for the shapestores
6369            list.
6370            (Session._add_shapestore, Session._clean_weak_store_refs): New.
6371            Internal methods to maintain the shapestores list.
6372            (Session.Tables): New. Return all tables open in the session.
6373            (Session.OpenShapefile): Insert the new ShapeStore into the
6374            shapestores list.
6375    
6376            * test/test_session.py (TestSessionSimple.test_initial_state): Add
6377            tests for ShapeStores and Tables
6378            (TestSessionWithContent.test_shape_stores)
6379            (TestSessionWithContent.test_tables): New. Test cases for
6380            ShapeStores and Tables
6381    
6382    2003-05-07  Bernhard Herzog  <[email protected]>
6383    
6384            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
6385            Add comments about the optimizations used.
6386            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
6387            Implement the ReadValue table interface method.
6388    
6389            * test/test_transientdb.py
6390            (TestTransientTable.run_iceland_political_tests)
6391            (TestTransientTable.test_transient_joined_table): Add tests for
6392            ReadValue
6393    
6394    2003-05-07  Frank Koormann <[email protected]>
6395    
6396            * Resources/Bitmaps/fulllayerextent.xpm,
6397            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
6398            new icons.
6399    
6400    2003-05-06  Bernhard Herzog  <[email protected]>
6401    
6402            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
6403            New. Simply delegate to the transient table's version.
6404    
6405            * test/test_transientdb.py
6406            (TestTransientTable.test_auto_transient_table_query): New. Test
6407            case for AutoTransientTable's SimpleQuery
6408    
6409    2003-05-06  Bernhard Herzog  <[email protected]>
6410    
6411            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
6412            Implement a simple query method for the query dialog
6413            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
6414            the row index or shapeid.
6415            (TransientTable.create): Insert the right value of the row index
6416            (TransientJoinedTable.create): Copy the row index of the left
6417            table to the joined result table
6418    
6419            * test/test_transientdb.py
6420            (TestTransientTable.test_transient_table_read_twice): Fix
6421            doc-string
6422            (TestTransientTable.test_transient_table_query): New. Test for the
6423            SimpleQuery method
6424    
6425    2003-05-06  Bernhard Herzog  <[email protected]>
6426    
6427            Convert all table users to use the new table interface. This only
6428            covers Thuban itself, not GREAT-ER or other applications built on
6429            Thuban yet, so the compatibility interface stays in place for the
6430            time being but it now issues DeprecationWarnings.
6431    
6432            Finally, the new Table interface has a new method, HasColumn.
6433    
6434            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
6435            issue deprecation warnings when they're. The warnings refer to the
6436            caller of the method.
6437            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
6438            for the deprecation warnings
6439    
6440            * test/test_table.py: Ignore the deprecation warnings for the old
6441            table in the tests in this module. The purpose of the tests is to
6442            test the old interface, after all.
6443    
6444            * test/test_transientdb.py
6445            (TestTransientTable.run_iceland_political_tests): Use the
6446            constants for the types. Add a test for HasColumn
6447            (TestTransientTable.test_transient_joined_table): Adapt to new
6448            table interface. Add a test for HasColumn
6449            (TestTransientTable.test_transient_table_read_twice): Adapt to new
6450            table interface
6451    
6452            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
6453            Adapt to new table interface
6454    
6455            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
6456            new table interface
6457    
6458            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
6459            (RecordTable.SetTable): Adapt to new table interface
6460    
6461            * Thuban/UI/classifier.py (Classifier.__init__)
6462            (Classifier.__init__): Adapt to new table interface
6463    
6464            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
6465            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
6466            to new table interface
6467    
6468            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
6469            (AutoTransientTable.HasColumn): Implement the new table interface
6470            method
6471            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
6472            (AutoTransientTable.UniqueValues): Adapt to new table interface
6473    
6474            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
6475            Adapt to new table interface
6476    
6477            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
6478            simplify opening shapefiles a bit easier.
6479            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
6480            (TestLayer.test_point_layer): Use the new helper method
6481            (TestLayer.test_get_field_type): New. Test for the GetFieldType
6482            method
6483    
6484            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
6485            the new table method
6486    
6487            * test/test_memory_table.py (TestMemoryTable.test_has_column):
6488            Test for the new table method HasColumn
6489    
6490    2003-05-06  Jonathan Coles   <[email protected]>
6491    
6492            Addresses the "Selection Extent" wish of RTbug #1787.
6493    
6494            * Resources/Bitmaps/fulllayerextent.xpm,
6495            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
6496            extent. These are just place holders for the real bitmaps.
6497    
6498            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
6499            calculate the bounding box once (the first time compute_bbox() is
6500            called).
6501            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
6502            the bounding box for the shapes in lat/long coordinates.
6503    
6504            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
6505            option.
6506            (MainWindow.has_selected_shapes): New. Returns true if there are
6507            any selected shapes.
6508            (MainWindow.FullSelectionExtent): New. Calls
6509            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
6510            (_has_selected_shapes): New. Returns true if there are any
6511            selected shapes.
6512    
6513            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
6514            true if there are any selected shapes.
6515    
6516            * Thuban/UI/view.py (MapCanvas): Added delegated method
6517            HasSelectedShapes.
6518            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
6519            shapes on the canvas using the map projection (if any).
6520    
6521            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
6522            for Layer.ShapesBoundingBox().
6523    
6524    2003-05-06  Bernhard Herzog  <[email protected]>
6525    
6526            * Resources/Projections/defaults.proj: Fix spelling of Mercator
6527    
6528    2003-05-05  Jonathan Coles   <[email protected]>
6529    
6530            Addresses the "Full Layer Extent" wish of RTbug #1787.
6531    
6532            * Resources/Projections/defaults.proj: Added UK National Grid.
6533    
6534            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
6535            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
6536            when the user selects the menu option.
6537    
6538            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
6539            scales the given layer on the canvas using the map projection.
6540    
6541    2003-05-05  Bernhard Herzog  <[email protected]>
6542    
6543            Convert the table implementations to a new table interface. All
6544            tables use a common mixin class to provide backwards compatibility
6545            until all table users have been updated.
6546    
6547            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
6548            provide backwards compatibility for table classes implementing the
6549            new interface
6550            (DBFTable, MemoryTable): Implement the new table interface. Use
6551            OldTableInterfaceMixin as base for compatibility
6552            (DBFColumn, MemoryColumn): New. Column description for DBFTable
6553            and MemoryTable resp.
6554    
6555            * test/test_dbf_table.py: New. Test cases for the DBFTable with
6556            the new table interface.
6557    
6558            * test/test_memory_table.py: New. Test cases for the MemoryTable
6559            with the new table interface.
6560    
6561            * test/test_table.py: Document the all tests in this file as only
6562            for backwards compatibility. The equivalent tests for the new
6563            interface are in test_memory_table.py and test_dbf_table.py
6564            (MemoryTableTest.test_read): field_info should be returning tuples
6565            with four items
6566            (MemoryTableTest.test_write): Make doc-string a more precise.
6567    
6568            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
6569            table interface. Derive from from OldTableInterfaceMixin for
6570            compatibility.
6571            (TransientTableBase.create): New intance variable column_map to
6572            map from names and indices to column objects
6573            (TransientTable.create): Use the new table interface of the input
6574            table
6575            (AutoTransientTable): Convert to new table interface. Derive from
6576            from OldTableInterfaceMixin for compatibility.
6577            (AutoTransientTable.write_record): Removed. It's not implemented
6578            yet and we still have to decide how to handle writing with the new
6579            table and data framework.
6580    
6581            * test/test_transientdb.py
6582            (TestTransientTable.run_iceland_political_tests)
6583            (TestTransientTable.test_transient_joined_table): Use the new
6584            table interface
6585    
6586    2003-05-05  Jonathan Coles   <[email protected]>
6587    
6588            This is namely a collection of UI updates to improve user interactivity.
6589            Tabbing between controls now exists and you can use ESC to close dialog
6590            boxes; ENTER will active the default button.
6591    
6592            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
6593            order that the controls are created so that tabbing works correctly.
6594            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
6595            wxDialog can handle the default button correctly.
6596            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
6597            same reasons as for OnOK.
6598            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
6599            when we ask the table for the maximum/minimum values of a field
6600            which could take a very long time.
6601    
6602            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
6603            order that the controls are created so that tabbing works correctly.
6604            (SelectPropertiesDialog.__init__): Rearrange the order that the
6605            controls are created so that tabbing works correctly.
6606    
6607            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
6608            to derive from a wxDialog but behave like the original implementation
6609            which was derived from a wxFrame. wxDialog provides useful key
6610            handling functionality like ESC calling OnCancel and ENTER calling
6611            OnOK which is lost with wxFrame.
6612    
6613            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
6614            new dialogs.
6615    
6616            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
6617            order that the controls are created so that tabbing works correctly.
6618            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
6619            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
6620            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
6621            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
6622            can provide the "UK National Grid" as a default projection.
6623            (UTMPanel.__init__): Rearrange the order that the controls are
6624            created so that tabbing works correctly.
6625    
6626    2003-05-05  Bernhard Herzog  <[email protected]>
6627    
6628            * extensions/thuban/wxproj.cpp: Fix some of the comments.
6629            (project_point): If a map projection but no layer projection is
6630            given, convert degrees to radians before applying the map
6631            projection.
6632    
6633            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
6634            (TableGrid.allow_messages): New methods to make it possible to
6635            inhibit message sending.
6636            (TableGrid.issue): Only send the message if not inhibited.
6637            (LayerTableGrid.select_shape): Use the new methods to make sure
6638            that no ROW_SELECTED message is sent while we're updating the
6639            selected rows to match the selected shapes.
6640    
6641    2003-05-02  Jan-Oliver Wagner <[email protected]>
6642    
6643            Implementation of MemoryTable.
6644    
6645            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
6646            implementation that operates on a list of tuples. All of the data
6647            are kept in the memory.
6648    
6649            * test/test_table.py (MemoryTableTest): New.
6650    
6651            * test/test_transientdb.py (SimpleTable): Removed.
6652            (TestTransientTable.test_transient_joined_table,
6653            (TestTransientTable.test_transient_table_read_twice): Replaced
6654            SimpleTable by MemoryTable.
6655    
6656    2003-04-30  Jonathan Coles   <[email protected]>
6657    
6658            * Data/iceland_sample.thuban: Now contains correct projections
6659            for each of the layers.
6660    
6661            * Resources/Projections/defaults.proj: Geographic projection
6662            contains unit conversion parameter.
6663    
6664    2003-04-30  Jonathan Coles   <[email protected]>
6665    
6666            The most important part of this putback is the projection changes.
6667            It should now be possible to specify the projection that a layer
6668            is in and then specify a different projection for the map. The
6669            projection dialog has an extra parameter for a geographic projection
6670            which lets the user select if the input is in degrees or radians.
6671    
6672            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
6673            to say that the parameter is a tuple of unprojected
6674            points (which is what the callers to this method were assuming).
6675            Also, since the points are unprojected we need to projected them.
6676    
6677            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
6678            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
6679            groups are selected, move the layer up/down. Fixes RTbug #1833.
6680    
6681            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
6682    
6683            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
6684            parameter in call to SetClientData.
6685            (GeoPanel): Add support for selecting the units that the
6686            source data is in (Radians or Degrees).
6687    
6688            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
6689            the rendering loop by reducing the number of if's, removing the
6690            unnecessary try/except block, and checking if the old group
6691            is the same as the new one (which happens a lot if there is
6692            no classification, or lots of shapes are in the same group).
6693    
6694            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
6695            around the redraw routine to try to catch problems that the user
6696            may create by selecting invalid projections for the data set and
6697            map. Clears the display if there are any problems and prints the
6698            error.
6699            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
6700            rectangle.
6701    
6702            * extensions/thuban/wxproj.cpp (project_point): First invert the
6703            supplied point (which should be in projected coordinates) using
6704            the layer's projection and then project the point using the
6705            map's projection.
6706            (project_points): Use project_point() to project each point.
6707    
6708    2003-04-30  Jan-Oliver Wagner <[email protected]>
6709    
6710            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
6711            don't set the Classification to None if the classfication field
6712            is None (ie only a DEFAULT).
6713    
6714    2003-04-30  Bernhard Herzog  <[email protected]>
6715    
6716            * Thuban/UI/view.py: Fix some typos.
6717    
6718            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
6719            not pop up the dialog if the selection becomes empty (this could
6720            happen if e.g. a new selection is opened while the identify tool
6721            is active and dialog had been closed)
6722    
6723    2003-04-30  Bernhard Herzog  <[email protected]>
6724    
6725            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
6726            instance variable read_record_last_result
6727            (TransientTableBase.read_record): Make sure reading the same
6728            record twice works. The implementation uses the new instance
6729            variable read_record_last_result
6730    
6731            * test/test_transientdb.py
6732            (TestTransientTable.test_transient_table_read_twice): New test
6733            case for the above bug-fix.
6734    
6735    2003-04-29  Jonathan Coles   <[email protected]>
6736    
6737            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
6738    
6739            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
6740    
6741            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
6742            (ClassTable.SetValueAsCustom): Rename keyword argument in
6743            ClassGroup* constructors to match argument name.
6744    
6745    2003-04-29  Bernhard Herzog  <[email protected]>
6746    
6747            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
6748            transient DB if it exists to make sure it doesn't leave a journal
6749            file in the temp directory.
6750    
6751            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
6752            self.conn to None after closing the connection to make sure it's
6753            not closed twice
6754    
6755    2003-04-29  Jonathan Coles   <[email protected]>
6756    
6757            Add a visible parameter in the layer XML tag. The default value is
6758            "true". If anything other than "false" is specified we also assume
6759            "true". Addresses RTbug #1025.
6760    
6761            * Doc/thuban.dtd: Add visible parameter to a layer.
6762    
6763            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
6764            of visible from 1 to True.
6765            (Layer.__init__): Change default value of visible from 1 to True.
6766    
6767            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
6768            parameter.
6769    
6770            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
6771            parameter.
6772    
6773            * test/test_load.py: Add new test data contents_test_visible.
6774            (LoadSessionTest.setUp): save test data.
6775            (LoadSessionTest.testLayerVisibility): Test if the visible flag
6776            is loaded correctly.
6777    
6778            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
6779            for saving an invisible layer.
6780    
6781    2003-04-29  Jonathan Coles   <[email protected]>
6782    
6783            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
6784            legend dialog box and tell it to change its map to the one
6785            supplied to SetMap(). Fixes RTbug #1770.
6786    
6787    2003-04-29  Bernhard Herzog  <[email protected]>
6788    
6789            Next step of table implementation. Introduce a transient database
6790            using SQLite that some of the data is copied to on demand. This
6791            allows us to do joins and other operations that require an index
6792            for good performance with reasonable efficiency. Thuban now needs
6793            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
6794            haven't tested that.
6795            
6796            * Thuban/Model/transientdb.py: New. Transient database
6797            implementation.
6798    
6799            * test/test_transientdb.py: New. Tests for the transient DB
6800            classes.
6801    
6802            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
6803            classes to help automatically remove temporary files and
6804            directories.
6805            (Session.__init__): New instance variables temp_dir for the
6806            temporary directory and transient_db for the SQLite database
6807            (Session.temp_directory): New. Create a temporary directory if not
6808            yet done and return its name. Use AutoRemoveDir to have it
6809            automatically deleted
6810            (Session.TransientDB): Instantiate the transient database if not
6811            done yet and return it.
6812    
6813            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
6814            AutoTransientTable so that data is copied to the transient DB on
6815            demand.
6816            (SimpleStore): New class that simply combines a table and a
6817            shapefile
6818    
6819            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
6820            DBFTable and update its doc-string to reflect the fact that this
6821            is only the table interface to a DBF file. Table is now an alias
6822            for DBFTable for temporary backwards compatibility.
6823    
6824            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
6825            the last reference to the session goes away so that the temporary
6826            files are removed properly.
6827    
6828            * test/test_load.py (LoadSessionTest.tearDown): Remove the
6829            reference to the session to make sure the temporary files are
6830            removed.
6831    
6832    2003-04-29  Bernhard Herzog  <[email protected]>
6833    
6834            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
6835            the __parser instance variable into a normal local variable in
6836            read. It's only used there and read will never be called more than
6837            once. Plus it introduces a reference cycle that keeps can keep the
6838            session object alive for a long time.
6839    
6840    2003-04-29  Jonathan Coles   <[email protected]>
6841    
6842            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
6843            Projection an immutable item. Fixes RTbug #1825.
6844            (Projection.__init__): Initialize instance variables here.
6845            (ProjFile.Replace): New. Replace the given projection object with
6846            the new projection object. This solves the problem of needing the
6847            mutator Projection.SetProjection() in the ProjFrame class and
6848            allows a projection to change parameters without changing its
6849            location in the file.
6850    
6851            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
6852            be of type wxSAVE and should verify overwriting a file.
6853    
6854            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
6855            ProjFile.Replace() method instead of the mutator
6856            Projection.SetProjection(). Also requires that we reassign the
6857            client data to the new projection.
6858    
6859            * test/test_proj.py (TestProjection.test): Test GetName() and
6860            GetAllParameters()
6861            (TestProjFile.test): Remove tests for Set*() methods. Add tests
6862            for Replace().
6863    
6864    2003-04-25  Jonathan Coles   <[email protected]>
6865    
6866            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
6867            to save the name of the projection.
6868    
6869            * test/test_save.py (SaveSessionTest.testLayerProjection): New
6870            test to verify layer projections are saved correctly.
6871    
6872    2003-04-25  Jonathan Coles   <[email protected]>
6873    
6874            * Thuban/Model/proj.py (Projection.SetName): Set the name
6875            to "Unknown" if name is None.
6876            (Projection.SetAllParameters): New. Set the projection's
6877            parameter list to the one supplied.
6878            (Projection.SetProjection): New. Set the projection's
6879            properties to those of the supplied Projection.
6880    
6881            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
6882            the dialog title to include the map's title.
6883            (MainWindow.LayerProjection): Set the dialog title to include
6884            the layer's title.
6885    
6886            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
6887            error dialogs into a single method call.
6888            (ProjFrame.__VerifyButtons): Add more states to check.
6889            (ProjFrame.__GetProjection): Return the current state of an
6890            edited projection or None.
6891            (ProjFrame.__FillAvailList): Remove checks for states that
6892            shouldn't exist.
6893            (ProjFrame._OnNew): Clear all selected items and supply
6894            a projection panel if necessary.
6895    
6896            * test/test_proj.py (TestProjFile.test): Add tests for
6897            ProjFile.SetAllParameters, ProjFile.SetProjection,
6898            ProjFile.SetName.
6899    
6900    2003-04-25  Jonathan Coles   <[email protected]>
6901    
6902            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
6903            takes an optional argument to select the current projection.
6904            This does not guarantee that the item is visible due to
6905            limited wxWindows functionality. Fixes RTBug #1821.
6906    
6907    2003-04-25  Jonathan Coles   <[email protected]>
6908    
6909            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
6910            the projection name and use it when constructing the Projection
6911            object.
6912    
6913            * Thuban/Model/proj.py (Projection.__init__): Change the default
6914            value for 'name' to None and then test if name is equal to None
6915            in the body of the constructor. This way the caller doesn't have to
6916            know what the default value should be. Namely, useful in load.py
6917            where we have to pick a default value if the 'name' parameter
6918            doesn't exist in the XML file.
6919    
6920            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
6921            Tests a file where a layer has a projection.
6922    
6923    2003-04-25  Jonathan Coles   <[email protected]>
6924    
6925            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
6926            tree for projection information.
6927    
6928            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
6929            XMLReader.GetFileName.
6930            (SessionLoader): Added support for loading projection tags that
6931            appear inside a layer.
6932    
6933            * Thuban/Model/proj.py (ProjFile): Document the class. Move
6934            back to using a list because the order of the projections in
6935            the file is important to maintain. Fixes RTbug #1817.
6936    
6937            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
6938            to ProjFile.GetFilename.
6939    
6940            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
6941            information.
6942    
6943            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
6944            ProjFrame._OnSaveAs. Removed old dead code from previous
6945            implementation.
6946            (ProjFrame._OnExport): Add support for exporting more than one
6947            projection to a single file.
6948            (ProjFrame.__FillAvailList): use string formatting (% operator)
6949            to build strings that are (partly) translated. Fixes RTbug #1818.
6950    
6951            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
6952            class.
6953    
6954    2003-04-24  Bernhard Herzog  <[email protected]>
6955    
6956            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
6957    
6958            * po/fr.po: New. French translation by Daniel Calvelo Aros
6959    
6960            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
6961            empty strings.
6962    
6963    2003-04-24  Jonathan Coles   <[email protected]>
6964    
6965            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
6966            implement the interface that the ProjFrame dialog expects.
6967    
6968            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
6969            name of the projection to be changed.
6970            (ProjFile): Use a dictionary instead of a list so that removing
6971            projections is easier and we are sure about uniqueness.
6972            (ProjFile.Remove): Remove the given projection object.
6973    
6974            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
6975            Return a list with only one projection file instead of searching for
6976            any projection file. This simplifies many things if the user can
6977            only have one system file and one user file.
6978    
6979            * Thuban/UI/classgen.py: Change all references to
6980            genCombo to genChoice.
6981    
6982            * Thuban/UI/mainwindow.py: Add a Projection option under the
6983            layer menu.
6984            (MainWindow.LayerProjection): New. Open up a projection window
6985            for a layer.
6986    
6987            * Thuban/UI/projdialog.py: Large changes to how the dialog is
6988            laid out. Use three panels instead of one. One for the list of
6989            projections, one for the edit controls, and one for the buttons.
6990            Fixed resizing problems so that the dialog resizes correctly
6991            when the projection panel changes. Added import/export, save, and
6992            new buttons/functionality.
6993    
6994    2003-04-24  Bernhard Herzog  <[email protected]>
6995    
6996            First step towards table management. Introduce a simple data
6997            abstraction so that we replace the data a layer uses more easily
6998            in the next step.
6999    
7000            * Thuban/Model/data.py: New file with a simple data abstraction
7001            that bundles shapefile and dbffile into one object.
7002    
7003            * Thuban/Model/session.py (Session.OpenShapefile): New method to
7004            open shapefiles and return a shape store object
7005    
7006            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
7007            object instead of a shapefile filename. This introduces a new
7008            instance variable store holding the datastore. For intermediate
7009            backwards compatibility keep the old instance variables.
7010            (open_shapefile): Removed. No longer needed with the shape store.
7011            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
7012            get the shape store used by a layer.
7013            (Layer.Destroy): No need to explicitly destroy the shapefile or
7014            table anymore.
7015    
7016            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
7017            (MainWindow.AddLayer): Use the session's OpenShapefile method to
7018            open shapefiles
7019    
7020            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
7021            session's OpenShapefile method to open shapefiles
7022    
7023            * test/test_classification.py
7024            (TestClassification.test_classification): Use the session's
7025            OpenShapefile method to open shapefiles and build the filename in
7026            a more platform independed way
7027    
7028            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
7029            Implement to have a session to use in the tests
7030            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7031            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
7032            session's OpenShapefile method to open shapefiles
7033            (TestLayerLegend.setUp): Instantiate a session so that we can use
7034            it to open shapefiles.
7035            (TestLayerLegend.tearDown): Make sure that all references to
7036            layers and session are removed otherwise we may get a resource
7037            leak
7038    
7039            * test/test_map.py (TestMapAddLayer.test_add_layer)
7040            (TestMapWithContents.setUp): Instantiate a session so that we can
7041            use it to open shapefiles.
7042            (TestMapWithContents.tearDown): Make sure that all references to
7043            layers, maps and sessions are removed otherwise we may get a
7044            resource leak
7045            ("__main__"): use support.run_tests() so that more info about
7046            uncollected garbage is printed
7047    
7048            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
7049            session's OpenShapefile method to open shapefiles
7050            ("__main__"): use support.run_tests() so that more info about
7051            uncollected garbage is printed
7052    
7053            * test/test_selection.py (TestSelection.tearDown): Make sure that
7054            all references to the session and the selection are removed
7055            otherwise we may get a resource leak
7056            (TestSelection.get_layer): Instantiate a session so that we can
7057            use it to open shapefiles.
7058            ("__main__"): use support.run_tests() so that more info about
7059            uncollected garbage is printed
7060    
7061            * test/test_session.py (TestSessionBase.tearDown)
7062            (TestSessionWithContent.tearDown): Make sure that all references
7063            to the session and layers are removed otherwise we may get a
7064            resource leak
7065            (TestSessionWithContent.setUp): Use the session's OpenShapefile
7066            method to open shapefiles
7067    
7068    2003-04-24  Jonathan Coles   <[email protected]>
7069    
7070            * Thuban/Model/load.py (XMLReader.read): Should have been checking
7071            if the file_or_filename object had the 'read' attribute.
7072    
7073    2003-04-23  Jonathan Coles   <[email protected]>
7074    
7075            * Thuban/Model/resource.py: Fixes RTbug #1813.
7076            (ReadProjFile): Add documentation about which exceptions are raised.
7077            Always pass the exceptions up to the caller.
7078            (GetProjFiles): If the directory can't be read return an empty list.
7079            If any of the proj files can't be read skip that file and go
7080            on to the next one.
7081    
7082            * test/test_proj.py: Added test cases to handle nonexistent files,
7083            unreadable files, and files that don't parse correctly.
7084    
7085    2003-04-23  Jonathan Coles   <[email protected]>
7086    
7087            Projection dialog. Allows the user to select from a list
7088            of projection templates and optionally edit them and save new ones.
7089    
7090            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
7091            (ProjPanel): Base class for projection specific panels.
7092            (TMPanel): Projection panel for Transverse Mercartor.
7093            (UTMPanel): Projection panel for Universal Transverse Mercartor.
7094            (LCCPanel): Projection panel for Lambert Conic Conformal.
7095            (GeoPanel): Projetion panel for Geographic Projection.
7096    
7097    2003-04-23  Jonathan Coles   <[email protected]>
7098    
7099            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
7100            promote symmetry. There now exists XMLReader and XMLWriter.
7101            (XMLReader.read): New. Call to read the given file descriptor or
7102            filename.
7103            (XMLReader.close): New. Make sure the file is closed.
7104            (XMLReader.GetFileName): New. Return just the file name that is being
7105            read from.
7106            (XMLReader.GetDirectory): New. Return just the directory of the file
7107            that is being read.
7108            (XMLReader.AddDispatchers): New. Take a dictionary which contains
7109            the names of functions to call as the XML tree is parsed.
7110            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
7111            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
7112            (SessionLoader): Removed class variables start_dispatcher and
7113            end_dispatcher since this functionality is now part of a class
7114            instance. Fixes RTbug #1808.
7115            (SessionLoader.__init__): Add dispatcher functions.
7116            (load_xmlfile): Code was moved into the XMLReader.read().
7117            (load_session): Use modified SessionLoader.
7118    
7119            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
7120            map's projection.
7121    
7122            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
7123            GetAllParameters.
7124            (Projection.GetParameter): Returns the value for the given parameter.
7125    
7126            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
7127            (GetProjFiles): Renamed from GetProjections. Now returns a list
7128            of ProjFile objects.
7129            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
7130            a list of ProjFile objects whose files are not user defined.
7131            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
7132            list of ProjFile objects whose files are user defined.
7133            (ProjFileReader): Extend new XMLReader.
7134    
7135            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
7136            promote symmetry.
7137    
7138            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
7139            control instead of a wxComboBox. wxChoice controls do not generate
7140            events as the uses highlights possible choices which fixes problems
7141            with resizing the dialog when the use selects an option.
7142    
7143            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
7144            control instead of a wxComboBox.
7145    
7146            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
7147            dialog.
7148    
7149            * test/test_proj.py (TestProjection.test): New tests for GetParameter
7150            method.
7151    
7152    2003-04-22  Bernhard Herzog  <[email protected]>
7153    
7154            * Thuban/UI/mainwindow.py: Remove some unused imports and global
7155            constants
7156    
7157            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7158            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
7159    
7160    2003-04-17  Bernhard Herzog  <[email protected]>
7161    
7162            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
7163            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
7164            anymore.
7165            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
7166            (Layer.ShapeType, Layer.Shape): No need to call
7167            self.open_shapefile since it's always called in __init__
7168    
7169            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
7170            In wxPython 2.4 there's no need to extend MainLoop anymore since
7171            wxPython itself makes sure OnExit is called.
7172    
7173    2003-04-16  Jonathan Coles   <[email protected]>
7174    
7175            Initial putback of projection management code. Includes new
7176            classes to read and write projection files. The current load
7177            and save classes were abstracted a bit so they could be reused.
7178            The Projection class was extended to provide new methods and
7179            have a name.
7180    
7181            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
7182            general XML reading methods that were part of ProcessSession.
7183    
7184            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
7185            name.
7186            (ProjFile): New. Represents a file that contains projection
7187            information.
7188    
7189            * Thuban/Model/resource.py: New. Contains general utilities
7190            for read and writing projection files.
7191    
7192            * Thuban/Model/save.py (XMLSaver): New. Contains all the
7193            general XML writing methods that were part of SessionSaver.
7194            (SessionSaver): Renamed from Saver.
7195    
7196            * test/test_proj.py: New test cases for the projection
7197            file read and write functions.
7198    
7199    2003-04-16  Jonathan Coles   <[email protected]>
7200    
7201            * Thuban/Model/classification.py: Use repr() around values
7202            in the ClassGroup*.__repr__() methods so it is clearer when
7203            a value is a string and when it is a number.
7204    
7205            * test/test_load.py: Rework the classification test to test
7206            that we can load old files.
7207            (testLabels): Test a file where the groups have labels.
7208    
7209    2003-04-16  Bernhard Herzog  <[email protected]>
7210    
7211            Safer implementation of the performance enhancements of the
7212            low-level renderer:
7213            
7214            * extensions/thuban/wxproj.cpp (extract_projection)
7215            (extract_pointer): Rename extract_projection to extract_pointer
7216            and redefine its purpose to return the pointer stored in a CObject
7217            returned by the object's cobject method. Update all callers.
7218            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
7219            handling of these low-level parameters so that each s_draw_info
7220            instance is handled as a CObject at python level that also
7221            contains real references to the actual python objects which
7222            contain the values in the struct. Add free_draw_info as the
7223            destructor.
7224            (draw_polygon_shape): Add the py_draw_info parameter which must a
7225            cobject containing an s_draw_info pointer.
7226    
7227            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
7228            method to instantiat the low-level render parameter
7229            (MapRenderer.draw_shape_layer): Use the new method. Remove some
7230            commented out code.
7231            (MapRenderer.draw_polygon_shape): Make the first parameter not the
7232            layer but the low-level render parameter
7233            (ScreenRenderer.draw_shape_layer): Use the low-level render
7234            parameter.
7235    
7236    2003-04-15  Jonathan Coles   <[email protected]>
7237    
7238            * Thuban/Model/classification.py: Implemented __repr__ for
7239            the ClassGroup* classes to make debugging a bit easier.
7240            (ClassGroup.SetLabel): Check that the string is an instance
7241            of StringTypes not StringType. Accounts for Unicode strings.
7242    
7243            * Thuban/Model/color.py: Implemented __repr__ to make
7244            debugging a bit easier.
7245    
7246            * Thuban/Model/save.py (Saver.write_classification): Need to
7247            save the group label.
7248    
7249            * test/test_load.py (testClassification): New. Loads the
7250            iceland_sample_test.thuban file and checks if it was loaded
7251            correctly.
7252    
7253    2003-04-15  Jonathan Coles   <[email protected]>
7254    
7255            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
7256            to improve rendering performance by initializing the variables
7257            that are not change each time draw_polygon_shape() is called.
7258            The values are stored in a global struct draw_info.
7259            (draw_polygon_shape): Removed initialization code that is
7260            now in draw_polygon_init().
7261    
7262            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
7263            drawing initialization call to draw_polygon_init()
7264            (MapRenderer.draw_polygon_shape): Use new signature of
7265            draw_polygon_shape.
7266    
7267            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
7268            weirdness by setting the range to (1, maxint).
7269    
7270            * Thuban/Model/classification.py (ClassGroupProperties): Make
7271            instance variables private and optimize comparison operator
7272            by first checking if the color references are the same.
7273            (ClassGroupSingleton): Make instance variables private.
7274            (ClassGroupRange): Make instance variables private.
7275    
7276            * HOWTO-Release: Filled in missing steps for releasing packages.
7277    
7278    2003-04-15  Bernhard Herzog  <[email protected]>
7279    
7280            First stab at internationalized messages:
7281    
7282            * Thuban/__init__.py (_): Implement the translation function for
7283            real using the python gettext module.
7284    
7285            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
7286            translate empty strings.
7287    
7288            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7289            Add a missing space to a warning message
7290    
7291            * po/README: New. Notes about the management of the translation
7292            files.
7293    
7294            * po/Makefile: New. Makefile to help manage the translation files.
7295    
7296            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
7297    
7298            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
7299            translations and support files in po/
7300    
7301            * setup.py (data_files): Add the *.mo files to the data_files too
7302    
7303            * README: Add note about the translations when building from CVS
7304    
7305    2003-04-14  Jonathan Coles   <[email protected]>
7306    
7307            * Thuban/UI/dock.py: Fixes some window resizing problems most
7308            noticable under windows. Always assume the button bitmaps will
7309            be there. Code clean up.
7310            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
7311            images for the dock/undock button to the same images.
7312            Work around for RTbug #1801.
7313    
7314            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
7315            be allowed to grow within the sizer. Fixes a bug under Windows
7316            where the toolbar wasn't being drawn.
7317    
7318    2003-04-14  Frank Koormann   <[email protected]>
7319    
7320            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
7321            Updated design to try to make the button functionality more
7322            transparent.
7323    
7324    2003-04-14  Jonathan Coles   <[email protected]>
7325    
7326            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
7327            finalize the intialization of the panel.
7328    
7329            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
7330            creation of the panel. Should be the last thing called in the
7331            initializer of a subclass.
7332    
7333            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
7334            set the current selections in the combo boxes. This is needed
7335            under Windows.
7336    
7337            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
7338            level panel to the dialog so that the background colors are
7339            consistent under Windows.
7340    
7341    2003-04-11  Jonathan Coles   <[email protected]>
7342    
7343            * Thuban/UI/classgen.py: Change color ramps to start at white
7344            not black.
7345    
7346            * Thuban/UI/legend.py: Enable/disable the legend buttons when
7347            the legend changes. Fixes RTbug #1793.
7348    
7349            * test/test_classification.py: Added test for copying of
7350            classifications.
7351    
7352    2003-04-11  Jonathan Coles   <[email protected]>
7353    
7354            * Thuban/UI/resource.py: New. Centralize the loading of resources
7355            such as bitmaps.
7356    
7357            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
7358            added images to the move buttons, added 'reverse' button.
7359            (CustomRampPanel.__init__): Added images to the move buttons.
7360            (GreyRamp): New. Generates a ramp from white to black.
7361            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
7362    
7363            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
7364            ID_PROPERTY_*.
7365            (Classifier.__init__): Minor changes to the layout.
7366            (Classifier._OnTitleChanged): Listen for when the user edits the
7367            title and update the dialog's title and the layer's title.
7368    
7369            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
7370    
7371            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
7372            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
7373            if the layer's title changes.
7374    
7375            * Thuban/UI/mainwindow.py: Added new menu item and associated code
7376            to open a dialog to rename the map.
7377            (MainWindow): Use new resource class to import bitmaps.
7378    
7379    2003-04-11  Jonathan Coles   <[email protected]>
7380    
7381            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
7382            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
7383            Resources/Bitmaps/group_use_none.xpm,
7384            Resources/Bitmaps/group_use_not.xpm,
7385            Resources/Bitmaps/hide_layer.xpm,
7386            Resources/Bitmaps/layer_properties.xpm,
7387            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
7388            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
7389            New.
7390    
7391    2003-04-10  Jonathan Coles   <[email protected]>
7392    
7393            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
7394            Should pass group to ClassGroup constructor.
7395    
7396    2003-04-10  Jonathan Coles   <[email protected]>
7397    
7398            * Thuban/Model/classification.py: (ClassGroup): Move all the common
7399            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
7400            here. Implement SetVisible(), IsVisible().
7401            (ClassGroup.__init__): Add group parameter which acts as a copy
7402            constructor.
7403    
7404            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
7405            "Visible" check boxes.
7406            (Classifier): Rename the buttons and refactor the code to match
7407            the new labels.
7408    
7409            * Thuban/UI/legend.py: Classify button is now called "Properties".
7410            Refactored the code to change variable names.
7411            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
7412    
7413            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
7414            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
7415            renamed to MainWindow.LayerEditProperties.
7416            (MainWindow.ToggleLegend): Don't include map name in legend title.
7417            (MainWindow.SetMap): Added the map name to the window title.
7418            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
7419            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
7420            Functionality is found in the layer properties dialog.
7421    
7422            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
7423            draw visible groups.
7424    
7425    2003-04-09  Jonathan Coles   <[email protected]>
7426    
7427            * Thuban/UI/classgen.py: Modifications to allow simple
7428            addition and selection of new color schemes.
7429            (MonochromaticRamp): New. Generates a ramp between two colors.
7430            (RedRamp): New. Generates a ramp of all red.
7431            (GreenRamp): New. Generates a ramp of all green.
7432            (BlueRamp): New. Generates a ramp of all blue.
7433    
7434    2003-04-09  Jonathan Coles   <[email protected]>
7435    
7436            * Thuban/Model/classification.py (Classification.__deepcopy__):
7437            Need to copy over field and fieldType attributes.
7438    
7439            * Thuban/Model/table.py (Table.field_range): New. Retrive the
7440            maximum and minimum values over the entire table for a given
7441            field.
7442            (Table.GetUniqueValues): New. Retrieve all the unique values
7443            in the table for a given field.
7444    
7445            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
7446            (GenUniquePanel): New. Controls to allow the user to select
7447            which unique field values they would like in the classification.
7448            (CustomRampPanel): Code that was in ClassGenDialog that allows
7449            the user to select the properties for a custom ramp.
7450            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
7451    
7452            * Thuban/UI/classifier.py: Removed a lot of debugging code.
7453            (Classifier._SetClassification): Callback method so that the
7454            class generator can set the classification in the grid.
7455            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
7456            editing of a group properties class into a wxWindows control.
7457    
7458            * Thuban/UI/dock.py: It was decided that if the user closes
7459            a dockable window the window should simply hide itself. That
7460            way if the user wants to show the dock again it appears in the
7461            same place as it was when it was closed.
7462            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
7463            (DockableWindow._OnButtonClose): Hide the window instead of
7464            destroying it.
7465            (DockableWindow._OnClose): Hide the window instead of
7466            destroying it.
7467    
7468            * Thuban/UI/legend.py (LegendTree): Use a private method to
7469            consistently set the font and style of the text. Fixes RTbug #1786.
7470    
7471            * Thuban/UI/mainwindow.py: Import just the Classifier class.
7472    
7473    2003-04-07  Bernhard Herzog  <[email protected]>
7474    
7475            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
7476            to the map module
7477    
7478    2003-04-07  Bernhard Herzog  <[email protected]>
7479    
7480            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
7481            favor of ToggleSessionTree
7482            (MainWindow.ToggleSessionTree): New method to toggle visibility of
7483            the session tree.
7484            (MainWindow.SessionTreeShown): New method to return whether the
7485            session tree is currently shown.
7486            (MainWindow.ToggleLegend): New method to toggle visibility of the
7487            legend
7488            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
7489            LegendShown
7490            (MainWindow.LegendShown): New method to return whether the legend
7491            is currently shown.
7492            (_method_command): Add checked parameter so we can define check
7493            menu items
7494            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
7495            mainwindow methods.
7496            (show_session_tree, show_legend commands): Removed.
7497            (toggle_session_tree, toggle_legend commands): New commands to
7498            toggle the visibility of the dialogs
7499    
7500    2003-04-07  Jonathan Coles   <[email protected]>
7501    
7502            * Thuban/UI/classgen.py: Fix Windows problem.
7503    
7504            * Thuban/UI/dock.py: Fix Windows problem.
7505    
7506            * Thuban/UI/mainwindow.py: Use False instead of false.
7507            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
7508    
7509    2003-04-07  Jonathan Coles   <[email protected]>
7510    
7511            Since we now say that the order of the groups in a classification
7512            matters, it makes sense to be able to manipulate that order. Most
7513            of the changes to Thuban/Model/classification.py are to that end.
7514    
7515            * Thuban/Model/classification.py (Classification.AppendGroup,
7516            Classification.InsertGroup, Classification.ReplaceGroup,
7517            Classification.RemoveGroup, Classification.GetGroup): Do as the
7518            names imply.
7519            (Classification.FindGroup): This was called GetGroup, but GetGroup
7520            takes an index, while FindGroup takes a value.
7521            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
7522            REFERENCE. Currently there is a cyclic reference between the layer
7523            and its classification. If the classification doesn't need to know
7524            its owning layer we can change this, since it may make sense to be
7525            able to use the same classification with different layers.
7526    
7527            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
7528    
7529            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
7530            not AddGroup()
7531    
7532            * Thuban/UI/classifier.py: Now that we can depend on the order in
7533            a Classification and have methods to manipulate that order we don't
7534            need to use our own data structures in the grid. We can simply make
7535            the grid/table access the information they need from a copy of
7536            the classification object.
7537            (Classifier._OnCloseBtn): Event handler for when the user clicks
7538            'Close'. This is needed so if the user applies changes and then
7539            continues to change the table the user has the option of discarding
7540            the most recent changes and keeping what they applied.
7541    
7542            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
7543            into the same group.
7544    
7545            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
7546            with a really old version of proj, PJ_VERSION won't even be defined.
7547            If it isn't defined then just compile so that the function always
7548            returns Py_False.
7549    
7550            * test/test_classification.py: Fix tests to use the renamed methods.
7551            Still need to write tests for the new methods.
7552    
7553    2003-04-04  Jonathan Coles   <[email protected]>
7554    
7555            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
7556            call to SetSelection out of the method and before the call
7557            to __SelectField in __init__. This prevents a recursion of events
7558            when _OnFieldSelect is triggered by the user.
7559    
7560    2003-04-04  Jonathan Coles   <[email protected]>
7561    
7562            * Thuban/Model/classification.py: Rename Color.None to
7563            Color.Transparent.
7564            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
7565            Don't bother copying the color, since Colors are immutable.
7566    
7567            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
7568            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
7569            Thuban/UI/renderer.py, Thuban/UI/view.py:
7570            Rename Color.None to Color.Transparent.
7571        
7572            * test/test_classification.py, test/test_load.py: Rename Color.None
7573            to Color.Transparent.
7574    
7575    2003-04-04  Jonathan Coles   <[email protected]>
7576    
7577            * Thuban/Model/classification.py: Fix assert calls.
7578            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
7579            Copy the color parameter rather than hold onto a reference.
7580    
7581            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
7582            the color object.
7583            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
7584            are sure there exists only one refernce to Color.None in the system.
7585            This allows us to use 'is' rather than the comparision functions.
7586            
7587            * Thuban/Model/save.py: Fix assert calls.
7588            
7589            * Thuban/UI/classifier.py: Fix assert calls.
7590            (ClassGrid._OnCellDClick): Call up to the classifier to open the
7591            dialog to edit the groups properties.
7592            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
7593            correctly if a cell is resized.
7594            (ClassTable.SetClassification): New. Changes the classification
7595            that is in the table.
7596            (ClassTable.__SetRow): Allow groups to be prepended.
7597            (Classifier): New code for opening the EditProperties and
7598            GenerateRanges dialogs.
7599            (SelectPropertiesDialog.__GetColor): Only set the color in the
7600            color dialog if the current color is not None.
7601            
7602            * Thuban/UI/dock.py: Fix assert calls.
7603            
7604            * Thuban/UI/legend.py: Fix assert calls.
7605            
7606            * Thuban/UI/renderer.py: Fix assert calls.
7607            
7608            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
7609            classifications.
7610            (GenRangePanel): Panel specific to range generation.
7611            (GenSingletonPanel): Panel specific to singleton generation.
7612            (ClassGenerator): Class responsible for actually generating
7613            the classification from the data gathered in the dialog box.
7614            (PropertyRamp): Generates properties whose values range from
7615            a starting property to an ending property.
7616    
7617    2003-04-03  Bernhard Herzog  <[email protected]>
7618    
7619            * test/support.py (print_garbage_information): New function that
7620            prints information about still connected messages and memory
7621            leaks.
7622            (run_suite): Removed.
7623            (run_tests): New function for use as a replacement of
7624            unittest.main in the test_* files. This one calls
7625            print_garbage_information at the end.
7626    
7627            * test/runtests.py (main): Use support.print_garbage_information
7628    
7629            * test/test_layer.py: Use support.run_tests instead of
7630            unittest.main so we get memory leak information
7631            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7632            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7633            (TestLayerLegend.test_visibility): Call the layer's Destroy method
7634            to fix a memory leak.
7635    
7636            * test/test_classification.py: Use support.run_tests instead of
7637            unittest.main so we get memory leak information
7638            (TestClassification.test_classification): Call the layer's Destroy
7639            method to fix a memory leak.
7640    
7641    2003-04-02  Bernhard Herzog  <[email protected]>
7642    
7643            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
7644            Handle the reference counts of the return value and errors in
7645            PyArg_ParseTuple correctly.
7646    
7647            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
7648            sure the filename is absolute to avoid problems when saving the
7649            session again
7650    
7651            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
7652    
7653    2003-04-01  Jonathan Coles   <[email protected]>
7654    
7655            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
7656            that there actually are points in the returned list of points
7657            before trying to index into the list. The list may be empty if
7658            the shape is a Null Shape.
7659    
7660    2003-04-01  Bernhard Herzog  <[email protected]>
7661    
7662            * test/test_map.py: Don't use from <module> import *
7663    
7664    2003-04-01  Jonathan Coles   <[email protected]>
7665    
7666            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
7667            LAYER_LEGEND_CHANGED
7668    
7669            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
7670            self.Destroy() to close the window after yesterday's changes.
7671    
7672            * test/test_map.py, test/test_session.py: Fix messages that
7673            are sent from maps and layers.
7674    
7675    2003-03-31  Jonathan Coles   <[email protected]>
7676    
7677            * Thuban/UI/classifier.py: Commented out some debugging statements.
7678            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
7679            RTbug #1769.
7680    
7681            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
7682            position (although position doesn't work yet under GTK).
7683            (DockableWindow.Destroy): New. Called when the window must be
7684            closed. Namely needed when the DockFrame closes and must close
7685            its children.
7686            (DockFrame): Listen for EVT_CLOSE and destroy all children.
7687    
7688            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
7689            when then window is told to close.
7690            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
7691            comment in source for more info.
7692    
7693            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
7694    
7695            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
7696            symmetry with other such methods.
7697            (MainWindow.ShowLegend): Show the legend docked by default.
7698    
7699    2003-03-28  Jonathan Coles   <[email protected]>
7700    
7701            * Thuban/UI/classifier.py: Support for highlighting a specific
7702            group within the grid when the classification dialog is opened.
7703            Also contains a lot of debugging printouts which will later
7704            be removed.
7705    
7706            * Thuban/UI/dock.py: Complete rework on the dock code so that
7707            that it is fairly removed from the rest of the Thuban application.
7708            It is easy to add new docks which the rest of the program having
7709            to be aware of them.
7710    
7711            * Thuban/UI/legend.py: Modifications to support selecting a
7712            specific group in the classification dialog. Changed how layers
7713            are drawn when the layer is visible/invisible.
7714    
7715            * Thuban/UI/mainwindow.py: Removed legend specific code and
7716            replaced it with calls to the new dock code.
7717    
7718            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
7719            to check if scale > 0. Trying to track down a divide by zero.
7720    
7721    2003-03-26  Jonathan Coles   <[email protected]>
7722    
7723            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
7724            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
7725            now part of DockableWindow.
7726            (LegendPanel.DoOnSelChanged): Select the current layer in the
7727            map.
7728            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
7729            with the selected layer and/or group.
7730    
7731    2003-03-26  Jonathan Coles   <[email protected]>
7732    
7733            This putback contains the code for dockable windows. There is
7734            no support in wxWindows as of this date for windows that can
7735            attach themselves to other windows.
7736    
7737            The current model contains a DockableWindow which has a parent
7738            window for when it is detached and a dock window that it puts
7739            its contents in when it is docked. The contents of a DockableWindow
7740            must be a DockPanel. DockPanel itself derives from wxPanel.
7741    
7742            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
7743            message, not a LAYER_LEGEND_CHANGED message.
7744    
7745            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
7746    
7747            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
7748            as one of the style properties for the fieldTypeText item to
7749            be sure that its size is correct when the text changes.
7750    
7751            * Thuban/UI/dock.py: New. Classes for the DockPanel and
7752            DockableWindow.
7753    
7754            * Thuban/UI/legend.py: Added some more buttons and made the
7755            LegendPanel a DockPanel.
7756    
7757            * Thuban/UI/mainwindow.py: Added sash windows to the main window
7758            and supporting functions for manipulating the sashes.
7759            (MainWindow.ShowLegend): Create a DockableWindow with the
7760            LegendPanel as the contents.
7761    
7762            * Thuban/UI/messages.py: Added DOCKABLE_* messages
7763    
7764            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
7765            not LAYER_LEGEND_CHANGED, messages.
7766    
7767    2003-03-25  Jonathan Coles   <[email protected]>
7768    
7769            * setup.py: Added custom script bdist_rpm_build_script so that
7770            when the rpm is built the path to wx-config is correct.
7771    
7772            * setup.cfg: Added line saying to use the custom build script
7773    
7774    2003-03-20  Jonathan Coles   <[email protected]>
7775    
7776            Initial implementation of the Legend.
7777    
7778            * Thuban/UI/legend.py: New. Creates a window that shows the map's
7779            Legend information and allows the user to add/modify classifications
7780            and how the layers are drawn on the map.
7781    
7782            * setup.py: New command 'build_docs' which currently uses
7783            happydoc to generate html documentation for Thuban.
7784    
7785            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
7786            Returns a string which is appropriately describes the group.
7787    
7788            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
7789            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
7790    
7791            * Thuban/Model/map.py (Map): Rename messages and use new, more
7792            specific, messages.
7793    
7794            * Thuban/Model/messages.py: New message to indicate that a layer's
7795            data has changed (LAYER_CHANGED). New map messages to indicate
7796            when layers have been added/removed/changed or if the stacking order
7797            of the layers has changed.
7798    
7799            * Thuban/Model/session.py: Rename and use new messages.
7800    
7801            * Thuban/UI/classifier.py: Remember if any changes have actually
7802            been applied so that if the dialog is cancelled without an application
7803            of changes we don't have to set a new classification.
7804            (ClassDataPreviewer): Pulled out the window specific code and put it
7805            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
7806            symbols on any DC.
7807            
7808            * Thuban/UI/mainwindow.py: New code to open the legend.
7809    
7810            * Thuban/UI/view.py: Use new message names.
7811    
7812    2003-03-19  Jonathan Coles   <[email protected]>
7813    
7814            * Thuban/UI/main.py (verify_versions): New. Checks the versions
7815            of Python, wxPython, and some other libraries.
7816    
7817            * extensions/thuban/wxproj.cpp (check_version): Checks the given
7818            version against what wxproj was compiled with.
7819            (check_version_gtk): If wxproj was compiled with gtk then check
7820            the given version against the version of the gtk library
7821            currently being used.
7822    
7823    2003-03-14  Bernhard Herzog  <[email protected]>
7824    
7825            * test/test_command.py: Run the tests when the module is run as a
7826            script
7827    
7828    2003-03-14  Bernhard Herzog  <[email protected]>
7829    
7830            Implement selection of multiple selected shapes in the same layer:
7831    
7832            - Introduce a new class to hold the selection. This basically
7833              replaces the interactor which was nothing more than the
7834              selection anyway. A major difference is of course that the new
7835              selection class supports multiple selected shapes in one layer
7836            
7837            - Move the object that represents the selection from the
7838              application to the canvas. The canvas is a better place than the
7839              application because the selection represents which shapes and
7840              layer of the map displayed by the canvas are selected and
7841              affects how the map is drawn.
7842    
7843            - Make the selection and its messages publicly available through
7844              the mainwindow.
7845    
7846            - The non-modal dialogs do not get a reference to the interactor
7847              anymore as they can simply refer to their parent, the
7848              mainwindow, for the what the interactor had to offer.
7849    
7850            * Thuban/UI/selection.py: New module with a class to represent the
7851            selection.
7852    
7853            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
7854            these unused messages
7855    
7856            * Thuban/UI/application.py (ThubanApplication.OnInit)
7857            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
7858            interactor is gone now.
7859            (ThubanApplication.CreateMainWindow): There is no interactor
7860            anymore so we pass None as the interactor argument for now for
7861            compatibility.
7862    
7863            * Thuban/UI/view.py (MapCanvas.delegated_messages)
7864            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
7865            Unsubscribe, delegate messages according to the delegated_messages
7866            class variable.
7867            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
7868            attributes from instance variables as described with the
7869            delegated_methods class variable.
7870            (MapCanvas.__init__): New instance variable selection holding the
7871            current selection
7872            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
7873            pass them on to the renderer
7874            (MapCanvas.SetMap): Clear the selection when a different map is
7875            selected.
7876            (MapCanvas.shape_selected): Simple force a complete redraw. The
7877            selection class now takes care of only issueing SHAPES_SELECTED
7878            messages when the set of selected shapes actually does change.
7879            (MapCanvas.SelectShapeAt): The selection is now managed in
7880            self.selection
7881    
7882            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
7883            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
7884            Unsubscribe, delegate messages according to the delegated_messages
7885            class variable.
7886            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
7887            attributes from instance variables as described with the
7888            delegated_methods class variable.
7889            (MainWindow.__init__): The interactor as ivar is gone. The
7890            parameter is still there for compatibility. The selection messages
7891            now come from the canvas.
7892            (MainWindow.current_layer, MainWindow.has_selected_layer):
7893            Delegate to the the canvas.
7894            (MainWindow.LayerShowTable, MainWindow.Classify)
7895            (MainWindow.identify_view_on_demand): The dialogs don't need the
7896            interactor parameter anymore.
7897    
7898            * Thuban/UI/tableview.py (TableFrame.__init__)
7899            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
7900            (LayerTableFrame.row_selected): The interactor is gone. It's job
7901            from the dialog's point of view is now done by the mainwindow,
7902            i.e. the parent. Subscribe to SHAPES_SELECTED instead
7903            of SELECTED_SHAPE
7904            
7905            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
7906            is gone. It's job from the dialog's point of view is now done by
7907            the mainwindow, i.e. the parent.
7908            
7909            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
7910            gone. It's job from the dialog's point of view is now done by the
7911            mainwindow, i.e. the parent.
7912    
7913            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
7914            gone. It's job from the dialog's point of view is now done by the
7915            mainwindow, i.e. the parent.
7916            (SessionTreeCtrl.__init__): New parameter mainwindow which is
7917            stored as self.mainwindow. The mainwindow is need so that the tree
7918            can still subscribe to the selection messages.
7919            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
7920            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
7921            selection is now accessible through the mainwindow. Subscribe to
7922            SHAPES_SELECTED instead of SELECTED_SHAPE
7923    
7924            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
7925            SHAPES_SELECTED message now.
7926            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
7927            so deal with multiple shapes
7928            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
7929            gone. It's job from the dialog's point of view is now done by the
7930            mainwindow, i.e. the parent.
7931    
7932            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
7933            parameter is now a list of shape ids.
7934            (RecordTable.SetTable): The second parameter is now a list of
7935            indices.
7936    
7937            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
7938            selected_shape parameter and ivar to selected_shapes. It's now a
7939            list of shape ids.
7940            (MapRenderer.draw_label_layer): Deal with multiple selected
7941            shapes. Rearrange the code a bit so that the setup and shape type
7942            distinctions are only executed once.
7943    
7944            * test/test_selection.py: Test cases for the selection class
7945    
7946    2003-03-11  Jonathan Coles   <[email protected]>
7947    
7948            * Thuban/Model/load.py: Temporary fix so that the xml reader
7949            doesn't cause Thuban to crash.
7950    
7951            * Thuban/Model/layer.py: Handle the cyclic references between
7952            a layer and its classification better, and be sure to disconnect
7953            the classification from the layer when the layer is destroyed
7954            so that we don't maintain a cyclic reference that may not be
7955            garbage collected.
7956    
7957            * Thuban/Model/classification.py: See comment for layer.py.
7958    
7959    2003-03-12  Jan-Oliver Wagner <[email protected]>
7960    
7961            * HOWTO-Release: New. Information on the steps for releasing
7962            a new version of Thuban.
7963    
7964    2003-03-11  Jonathan Coles   <[email protected]>
7965    
7966            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
7967            Use True instead of true.
7968            (Classifier): Should have a single panel in which all the controls lie.
7969    
7970            * Thuban/UI/proj4dialog.py: Add normal border.
7971    
7972            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
7973    
7974            * Thuban/UI/mainwindow.py: Use True instead of true.
7975    
7976            * setup.py: Update some definitions to use wxWindows2.4 files
7977    
7978            * Data/iceland_sample_class.thuban: Fixed file so that the
7979            field_type information is present.
7980    
7981    2003-03-10  Jonathan Coles   <[email protected]>
7982    
7983            * Thuban/UI/classifier.py (Classifier.__init__): Make the
7984            field type label grow so that when the text changes the
7985            size is updated correctly. This may be a wxWindows bug.
7986    
7987    2003-03-10  Jonathan Coles   <[email protected]>
7988    
7989            * Thuban/UI/application.py: Changed SESSION_CHANGED to
7990            SESSION_REPLACED.
7991    
7992            * Thuban/UI/classifier.py: Wrap text with _().
7993            (ClassGrid.CreateTable): Set dimensions and size hints here,
7994            instead of in Reset, so we only set the size once.
7995    
7996            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
7997    
7998            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
7999            Call Close() instead of Shutdown().
8000    
8001            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
8002    
8003            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
8004            Go back to using OnClose() instead of Shutdown().
8005    
8006    2003-03-10  Jonathan Coles   <[email protected]>
8007    
8008            * Thuban/UI/classifier.py (Classifier): SelectField() needed
8009            to know the old field index as well as the new one.
8010    
8011    2003-03-10  Jonathan Coles   <[email protected]>
8012    
8013            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
8014            to correctly set the table information and call this from
8015            __init__ and from _OnFieldSelect so that all the information
8016            is up to date when the dialog opens and when a field is changed.
8017    
8018    2003-03-10  Jonathan Coles   <[email protected]>
8019    
8020            * Thuban/Model/classification.py (Classification): Don't use
8021            layer's message function directly, use the ClassChanged() method
8022            when then classification changes. SetField/SetFieldType/SetLayer
8023            must keep the information about field name and field type in
8024            sync when an owning layer is set or removed.
8025    
8026            * Thuban/Model/layer.py: Added ClassChanged() so that the
8027            classification can tell the layer when its data has changed.
8028            (Layer.SetClassification): Accepts None as an arguement to
8029            remove the current classification and correctly handles
8030            adding a new classification.
8031    
8032            * Thuban/Model/load.py: Comment out print statement
8033    
8034            * test/test_classification.py, test/test_save.py: New and
8035            improved tests.
8036    
8037    2003-03-07  Jonathan Coles   <[email protected]>
8038    
8039            * Thuban/Model/classification.py: Implemented __copy__ and
8040            __deepcopy__ for ClassGroup* and ClassGroupProperites so
8041            they can easily be copied by the classifier dialog.
8042            (ClassGroupProperites.__init__): The default line color should
8043            have been Color.Black.
8044    
8045            * Thuban/UI/classifier.py: Setting and Getting table values now
8046            uses a consistent set of functions.
8047            (Classifier): Now non-modal. Has field type label which changes
8048            as the field changes. Keep track of buttons in a list so that
8049            we can enable/disable the buttons when the None field is selected.
8050            (SelectPropertiesDialog): Add buttons to make the colors transparent.
8051    
8052            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
8053            does what OnClose did, but can be called by the application to
8054            close a window. Needed when a session changes, and we have to
8055            close the classifier windows.
8056    
8057            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
8058            Shuts down open dialogs. Used when a new session is created
8059            or a session is opened.
8060            (MainWindow.SaveSession): Should only call application.SaveSession()
8061            if we don't call SaveSessionAs first.
8062            (MainWindow.Classify): Allow different classifier dialogs for
8063            different layers.
8064    
8065            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
8066            the parent class handle it. Add Shutdown() to unsubscibe from
8067            event notification and call the parent Shutdown(). This was
8068            necessary so the application can close the tree window.
8069    
8070    2003-03-06  Jonathan Coles   <[email protected]>
8071    
8072            * Thuban/Model/classification.py: Minor documentation changes,
8073            Addition of __eq__ and __ne__ methods.
8074            (Classification.SetLayer): prevent recursion between this method
8075            and Layer.SetClassification().
8076    
8077            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
8078    
8079            * Thuban/Model/layer.py (SetClassification): prevent recursion
8080            between this method and Classification.SetLayer().
8081    
8082            * test/test_classification.py, test/test_load.py,
8083            test/test_session.py: Fixed and added tests for the classification
8084            classes.
8085    
8086    2003-03-06  Bernhard Herzog  <[email protected]>
8087    
8088            * Thuban/UI/classifier.py (ClassGrid.__init__)
8089            (ClassGrid.CreateTable): Move the SetSelectionMode call to
8090            CreateTable because otherwise it triggers an assertion in
8091            wxPython/wxGTK 2.4.
8092    
8093    2003-03-05  Jonathan Coles   <[email protected]>
8094    
8095            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
8096    
8097            * Thuban/Model/load.py: import FIELDTYPE constants from table.
8098    
8099            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
8100    
8101            * Thuban/Model/table.py: Put FIELDTYPE constants back.
8102    
8103    2003-03-05  Jonathan Coles   <[email protected]>
8104    
8105            * Thuban/UI/classifier.py: Added class documentation.
8106            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
8107            Store just the groups in the table and generate the other
8108            column information when it is requested. Add "None" field
8109            to pull-down to select no classification.
8110    
8111            * Thuban/common.py: Moved FIELDTYPE constants from table.py
8112            (Str2Num): Only catch ValueError exceptions.
8113    
8114            * Thuban/Model/classification.py: Class documentation. Renaming
8115            of methods with Stroke to Line. Groups are stored in a single
8116            list with the default as the first element. Groups are searched
8117            in the order they appear in the list.
8118    
8119            * Thuban/Model/color.py: Documentation.
8120    
8121            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
8122            the kind of data represented by a field.
8123    
8124            * Thuban/Model/load.py (ProcessSession): Use proper string
8125            conversion function; fixes RTbug #1713.
8126    
8127            * Thuban/Model/save.py (Saver): Store field type information.
8128    
8129            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
8130            (Table): Add field_info_by_name() to retrieve field information
8131            by specifying the field name, not the number.
8132    
8133            * Thuban/UI/mainwindow.py: Function name changes.
8134    
8135            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
8136            get the layer classification once. Don't try to classify
8137            values when the field is None: just use the default properties.
8138    
8139            * Thuban/UI/view.py: Function name changes.
8140    
8141            * Doc/thuban.dtd: Add field_type attribute to a classification.
8142    
8143    2003-03-04  Bernhard Herzog  <[email protected]>
8144    
8145            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
8146            the fill and stroke layer attributes optional with suitable
8147            default values. Add the stroke_width layer attribute. Use correct
8148            syntax for empty elements. Make the attribute list for labels
8149            refer to the label element.
8150    
8151    2003-03-04  Bernhard Herzog  <[email protected]>
8152    
8153            * setup.py (thuban_build_py.build): Add a comment about distutils in
8154            Python 2.3 containing some of the functionality we implement in
8155            setup.py ourselves.
8156    
8157            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
8158            before the selection mode. Doing it the other way round triggers
8159            an assertion in wxWindows.
8160    
8161            * Thuban/Model/save.py (escape): Fix typo in doc-string
8162    
8163            * Thuban/Model/classification.py: Remove unnecessary wxPython
8164            import
8165    
8166    2003-03-04  Jonathan Coles   <[email protected]>
8167    
8168            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
8169            Parameter 'value' should default to None.
8170    
8171            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
8172            the class attribute __classification is now private.
8173    
8174            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
8175            Classifier to ClassGrid. Added support for removing selected rows,
8176            which including code for keeping track of when cells are selected,
8177            and deselected.
8178            (ClassTable): Support for added/removing rows. Fixed a problem
8179            with __ParseInput whereby it would not allow strings (only numbers)
8180            to be entered.
8181            (Classifier): Added button and supporting code for removing
8182            selected rows.
8183    
8184    2003-02-27  Jonathan Coles   <[email protected]>
8185    
8186            * Thuban/common.py: Moved color conversion functions into
8187            Thuban/UI/common.py.
8188            (Str2Num): Now converts the float (not the string) to a long/int
8189            so that an exception isn't thrown.
8190    
8191            * Thuban/UI/common.py: Common functions used in several UI modules
8192    
8193            * Thuban/Model/classification.py: Changed the class hierarchy
8194            so that a Classification consists of Groups which return
8195            Properties when a value matches a Group.
8196    
8197            * Thuban/Model/layer.py: Fixed name resolution problem.
8198    
8199            * Thuban/Model/load.py: Use new Classification and Group functions.
8200    
8201            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
8202            failure.
8203            (Saver.write_classification): Use new Classification and Group
8204            functions.
8205    
8206            * Thuban/UI/classifier.py: Changes to use new Classification and Group
8207            functions. Fix to create a tuple with a single value instead of
8208            simply returning the value.
8209    
8210            * Thuban/UI/renderer.py: Use new Classification and Group functions.
8211            Use common.py functions.
8212    
8213            * Thuban/UI/tree.py: Use common.py functions.
8214            
8215            * test/test_classification.py: Use new Classification and Group
8216            classes.
8217    
8218    2003-02-24  Jonathan Coles   <[email protected]>
8219    
8220            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
8221            functions from Thuban color objects to wxWindow colour objects.
8222    
8223            * Thuban/Model/classification.py (Classification): Renamed
8224            GetProperties() to GetClassData(). Used the new iterator
8225            in TreeInfo().
8226            (ClassIterator): Iterator implementation to iterate over the
8227            ClassData objects in a classification object.
8228    
8229            * Thuban/Model/save.py (Saver.write_classificaton): Uses
8230            the new iterator to save the classification information.
8231    
8232            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
8233            for changing the stroke and fill colors and previewing the
8234            changes.
8235    
8236            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
8237            MainWindow.SaveSessionAs): Text string changes so the dialogs
8238            have more meaningful titles.
8239    
8240            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
8241            Classification method name from GetProperties to GetClassData.
8242    
8243            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
8244            instead of accessing now non-existent class variables.
8245    
8246    2003-02-24  Bernhard Herzog  <[email protected]>
8247    
8248            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
8249            unneeded Shape() call. Rendering is substantially faster without
8250            it and it avoids some problems with broken shape files.
8251    
8252    2003-02-20  Frank Koormann   <[email protected]>
8253    
8254            Force minimal size of identify and label dialogs. The autosizing
8255            looked too ugly.
8256    
8257            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
8258            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
8259            Set size of listctrl.
8260            * Thuban/UI/identifyview.py (IdentifyView.__init__):
8261            Set size of dialog.
8262    
8263    2003-02-19  Jonathan Coles   <[email protected]>
8264    
8265            * test/test_classification.py, test/test_layer.py,
8266            test/test_load.py, test/test_map.py, test/test_session.py:
8267            Updated the tests to use the new functions that are in the
8268            respective classes.
8269    
8270            * Thuban/Model/classification.py (Classification):
8271            Uses the new ClassData* classes. Modification messages are
8272            passed up to the parent layer (if it exists).
8273            (ClassData): New class to encapsulate the common data in each
8274            classification property.
8275            (ClassDataDefault): Represents the Default class. data.
8276            (ClassDataPoint): Represents a single class. data point
8277            (ClassDataRange): Represents a class. range
8278            (ClassDataMap): Represents a class. map (unused).
8279    
8280            * Thuban/Model/color.py: Added Color.None to represent something
8281            with no color. Color.Black represents the color black.
8282            (NoColor): Helper class derived from Color to represent something
8283            with no color.
8284    
8285            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
8286            stroke_width attributes. Made the 'classification' attribute private.
8287            New methods for setting/getting the classification.
8288    
8289            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
8290            to get the classifcation and use the new ClassData* classes to
8291            hold the classification data. Use Str2Num to convert numbers
8292            properly.
8293    
8294            * Thuban/Model/save.py (Saver): Use new Color and Classification
8295            methods
8296    
8297            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
8298            custom grid.
8299            (ClassTable): Support for editing Values and Labels and for
8300            changing what type (point or range) of data is stored in each
8301            property based on how the user enters the data.
8302            (Classifier): Support for saving the new classifications and
8303            launching the dialog to edit a property.
8304            (SelectPropertiesDialog): New class for editing the visual
8305            properties of a classification (stroke color, width, and fill color)
8306            (ClassPreviewer): Took the Draw method from ClassRenderer and
8307            made most of it into this new class. Intend to use this class in
8308            the SelectPropertiesDialog for previewing changes.
8309    
8310            * Thuban/UI/renderer.py: Use new Color and Classification methods.
8311    
8312            * Thuban/UI/tree.py: Formatting changes.
8313    
8314            * Doc/thuban.dtd: Add 'label' element
8315    
8316            * Thuban/common.py: New. Contains common routines used throughout
8317            the code.
8318            (Str2Num): Takes a string and converts it to the "best" type of
8319            number.
8320    
8321    2003-02-14  Bernhard Herzog  <[email protected]>
8322    
8323            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
8324            dragging flag is always set to 0 even when the tool implementation
8325            raises an exception
8326    
8327    2003-02-11  Bernhard Herzog  <[email protected]>
8328    
8329            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
8330            method to create a splash screen.
8331            (ThubanApplication.ShowMainWindow): New. Show the main window.
8332            Needed so the splash screen can display the mainwindow
8333            (ThubanApplication.OnInit): Call the
8334            new splash_screen method to determine whether the application
8335            should display a splash screen. If it displays a splash screen do
8336            not immediately show the main window.
8337    
8338    2003-02-11  Jonathan Coles  <[email protected]>
8339    
8340            * Thuban/Model/classification.py: Added import line to fix
8341            feature conflicts between running on python2.2 and python2.1.
8342    
8343            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
8344            onto the clinfo parameter, so removed the deepcopy().
8345    
8346    2003-02-10  Jonathan Coles  <[email protected]>
8347    
8348            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
8349            Added element_open variable to track opening and closing of tags
8350            so that tags that don't span more than one line are closed with
8351            /> instead of </tag_name>. Use the GetDefault*() methods of
8352            the Classification class.
8353    
8354            * Thuban/Model/classification.py (Classificaton): Added set and
8355            get methods for the default data. The class also takes a layer
8356            reference so that modification messages can be sent. Fixed the
8357            methods to use the new ClassData class.
8358            (ClassData): New class to encapsulate the classification data
8359    
8360            * Thuban/Model/layer.py (Layer): Remove the
8361            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
8362            SetDefault*() methods on the layer's classification object.
8363            (Layer.__init__): Use the new SetDefault*() methods in the
8364            Classification class.
8365    
8366            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
8367            object instead of a dictionary.
8368    
8369            * Thuban/UI/classifier.py (ClassRenderer): New class to
8370            draw the classifications in the dialog box's table.
8371            (Classifier): Modified to use the ClassRenderer class.
8372    
8373            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
8374            methods of the Classification class.
8375    
8376            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
8377            of the ClassData class.
8378    
8379            * test/test_classification.py, test/test_layer.py,
8380            test/test_map.py, test/test_session.py: Fix the tests to work
8381            with the above code changes.
8382    
8383    2003-02-03  Jonathan Coles  <[email protected]>
8384    
8385            * Thuban/Model/classification.py (Classification): Added getNull()
8386            to return the NullData reference
8387    
8388            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
8389            Layer.SetStrokeWidth): Modified these functions to change the
8390            null data in the classification rather than keep these values
8391            directly in the Layer class. Menu options to change these values
8392            work again.
8393    
8394    2003-01-28  Jonathan Coles  <[email protected]>
8395    
8396            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
8397            Fixed crashing problem on some systems. Dialog box shows
8398            classification data.
8399    
8400            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
8401            Colors in the tree view.
8402    
8403            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
8404            the tree info for classifications. Commented out unnecessary lines.
8405    
8406            * Thuban/Model/classification.py (Classification.TreeInfo): New
8407            function to add information about the classification into the
8408            tree view.
8409    
8410    2003-01-27  Jan-Oliver Wagner <[email protected]>
8411    
8412            * Thuban/__init__.py (_): New.
8413    
8414            * Thuban/Model/classification.py, Thuban/Model/extension.py,
8415            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
8416            Thuban/Model/session.py, Thuban/UI/application.py,
8417            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
8418            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
8419            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
8420            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
8421            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
8422    
8423    2003-01-27  Jonathan Coles  <[email protected]>
8424    
8425            * Thuban/Model/layer.py: Classification initialization calls.
8426    
8427            * Thuban/Model/classification.py: Created class to encapsulate
8428            a layer classification. Supports specific data points and
8429            ranges.
8430    
8431            * Thuban/Model/load.py: Added support for loading classification
8432            information.
8433    
8434            * Thuban/Model/save.py: Added support for saving classification
8435            information.
8436    
8437            * Thuban/UI/classifier.py: Initial class for a dialog box for
8438            specifying classification information.
8439    
8440            * Thuban/UI/mainwindows.py: Support for opening the classifier
8441            dialog.
8442    
8443            * Thuban/UI/renderer.py: Support for drawing a layer with the
8444            classification information.
8445    
8446            * Data/iceland_sample_class.thuban: iceland_sample with
8447            classification data.
8448    
8449            * test/test_classification: Tests for the Classification class.
8450    
8451    2002-12-09  Bernhard Herzog  <[email protected]>
8452    
8453            * test/test_command.py: New. Tests for the command classes.
8454    
8455            * Thuban/UI/command.py (ToolCommand): New class for tool commands.
8456            (Command.IsTool): New method to distinguish between command
8457            switching tools and other commands.
8458    
8459            * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
8460            the tool to avoid direct assignments to instance variables
8461            (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
8462            (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
8463            change the tool
8464    
8465            * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
8466            active tool's command turns insensitive, disable the tool.
8467            (_tool_command): Use the new ToolCommand class
8468    
8469            * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
8470            SelectTool method to change the tool
8471            (iconfile): Use the ToolCommand class
8472    
8473    2002-12-03  Bernhard Herzog  <[email protected]>
8474    
8475            * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
8476            the case of selected items that are not children of Layers or Maps
8477            properly. Previously this bug would trigger an assertion in
8478            wxWindows.
8479    
8480    2002-11-06  Frank Koormann  <[email protected]>
8481    
8482            * Thuban/UI/mainwindow.py: Altered the order of tools in the
8483            toolbar: First now are all navigation tools (Zoom In/Out, Pan,
8484            Full Extent).
8485    
8486    2002-10-23  Bernhard Herzog  <[email protected]>
8487    
8488            * setup.py (setup call): version now 0.1.3
8489    
8490            * MANIFEST.in: Add the files in test/
8491    
8492            * test/README: Add note about tests requiring the iceland data
8493    
8494            * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
8495            copyright notice.
8496    
8497    2002-10-18  Bernhard Herzog  <[email protected]>
8498    
8499            * test/test_map.py
8500            (TestMapWithContents.test_projected_bounding_box): Use an explicit
8501            epsilon.
8502    
8503            * test/support.py (FloatComparisonMixin.assertFloatEqual)
8504            (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
8505            message if the assertion fails and don't return the return value
8506            of self.assert_. In assertFloatSeqEqual the return meant that not
8507            all items of the sequence were compared.
8508    
8509    2002-09-20  Bernhard Herzog  <[email protected]>
8510    
8511            * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
8512    
8513            * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
8514    
8515            * test/test_map.py (TestMapWithContents.test_tree_info): Create
8516            the string with the bounding box on the fly because of platform
8517            differences in the way %g is handled.
8518    
8519            * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
8520            DBFfile too because Thuban layers can't yet cope missing DBF
8521            files.
8522    
8523    2002-09-20  Bernhard Herzog  <[email protected]>
8524    
8525            * test/test_menu.py: Use initthuban instead of
8526            add_thuban_dir_to_path to initialize Thuban.
8527    
8528            * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
8529            Mixin class for float comparisons
8530            (SubscriberMixin): New. Mixin class to test messages sent through
8531            the Connector class
8532    
8533            * test/README: Fix a typo and add the -v flag to the command for
8534            individual tests
8535    
8536            * test/test_session.py: New. Test cases for Thuban.Model.session
8537    
8538            * test/test_proj.py: New. Test cases for Thuban.Model.proj
8539    
8540            * test/test_map.py: New. Test cases for Thuban.Model.map
8541    
8542            * test/test_layer.py: New. Test cases for Thuban.Model.layer
8543    
8544            * test/test_label.py: New. Test cases for Thuban.Model.label
8545    
8546            * test/test_connector.py: New. Test cases for Thuban.Lib.connector
8547    
8548            * test/test_color.py: New. Test cases for Thuban.Model.color
8549    
8550            * test/test_base.py: New. Test cases for Thuban.Model.base
8551    
8552    2002-09-13  Bernhard Herzog  <[email protected]>
8553    
8554            * Thuban/Model/session.py (Session.forwarded_channels): Forward
8555            the CHANGED channel too.
8556    
8557            * Thuban/Model/map.py (Map.forwarded_channels): Forward the
8558            CHANGED channel too.
8559            (Map.__init__): Call the Modifiable constructor as well.
8560    
8561            * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
8562            event if the modified flag changes.
8563            (Modifiable.changed): Tweak the doc-string.
8564    
8565            * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
8566            (MainWindow.set_position_text): Put the code that puts the text
8567            with the mouse position into the status bar into the new method
8568            set_position_text so that it can overwritten in derived classes.
8569    
8570    2002-09-12  Bernhard Herzog  <[email protected]>
8571    
8572            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
8573            message box on the main window.
8574    
8575    2002-09-11  Bernhard Herzog  <[email protected]>
8576    
8577            * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
8578            the 'E' because it's less likely to interfere with other menu
8579            entries.
8580            (MainWindow.build_menu): remove an incorrect comment.
8581    
8582    2002-09-10  Bernhard Herzog  <[email protected]>
8583    
8584            * Thuban/UI/mainwindow.py (MainWindow.Map): New.
8585            (_tool_command): Add sensitive parameter
8586            (_has_visible_map): Sensitivity callback to tools and other
8587            commands that require a visible map. Use it in map_zoom_in_tool,
8588            map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
8589            and map_full_extent
8590    
8591    2002-09-06  Bernhard Herzog  <[email protected]>
8592    
8593            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
8594            VIEW_POSITION
8595    
8596    2002-09-04  Frank Koormann  <[email protected]>
8597    
8598            * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
8599    
8600    2002-09-02  Bernhard Herzog  <[email protected]>
8601    
8602            * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
8603            wxWindows already and our implementation doesn't work correctly
8604            with wxGTK 2.3:
8605            (MapCanvas.__init__): Remove the instance variable
8606            (MapCanvas.OnPaint): Always call do_redraw when there's a map to
8607            be drawin
8608            (MapCanvas.OnIdle): Removed.
8609    
8610            * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
8611            a parameter to determine the size of the rectangle.
8612            (MapCanvas.find_shape_at): Create the box around the point on a
8613            layer by layer basis and make the size depend on the shape type.
8614            This solves a problem with the selection of point shapes at the
8615            border of the layer's bounding box
8616    
8617    2002-08-30  Bernhard Herzog  <[email protected]>
8618    
8619            * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
8620            for the sensitivity  of remove layer.
8621            (_can_remove_layer): New. Sensitivity callback for remove layer
8622            (Command layer_remove): Use _can_remove_layer
8623    
8624            * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
8625            determine whether a given layer can be deleted.
8626    
8627            * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
8628            (MapCanvas.do_redraw): Get rid of the unused update_region
8629            instance variable
8630    
8631            * Thuban/UI/view.py: Add/update some doc-strings.
8632    
8633            * test/: new subdirectory with a bunch of unit tests.
8634    
8635            * test/README, test/test_table.py, test/test_save.py,
8636            test/test_menu.py, test/test_load.py: Initial set of tests and
8637            brief instructions on how to run them
8638    
8639    2002-08-29  Bernhard Herzog  <[email protected]>
8640    
8641            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
8642            arcs with multiple parts.
8643    
8644            * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
8645            Handle degenrate rectangles.
8646    
8647            * Thuban/Model/table.py: Make writing records work correctly:
8648            (Table.__init__): Keep track of whether the DBF is open for
8649            writing
8650            (Table.write_record): Open the DBF file for writing when necessary
8651    
8652    2002-08-27  Bernhard Herzog  <[email protected]>
8653    
8654            * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
8655            dbf files only for reading by default. Use a new writable dbf
8656            object for writing.
8657    
8658    2002-08-26  Bernhard Herzog  <[email protected]>
8659    
8660            * Thuban/UI/mainwindow.py: Refactor the context creation:
8661            (MainWindow.Context): New method to return a context
8662            (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
8663            new method
8664    
8665            * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
8666            layer table specific code from TableGrid into LayerTableGrid
8667            (TableFrame, LayerTableFrame): Split the layer table specific code
8668            from TableFrame into LayerTableFrame
8669            (LayerTableGrid.select_shape): Remove a debug print
8670    
8671            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
8672            LayerTableFrame
8673    
8674    2002-08-23  Bernhard Herzog  <[email protected]>
8675    
8676            * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
8677            absolute filename.
8678    
8679    2002-08-22  Bernhard Herzog  <[email protected]>
8680    
8681            * Thuban/Model/table.py (Table.write_record): New method to write
8682            records.
8683            (Table.__init__): Open the DBF file for writing too.
8684    
8685            * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
8686            into the underlying table.
8687    
8688            * extensions/shapelib/shapefil.h (DBFCommit),
8689            extensions/shapelib/dbfopen.c (DBFCommit): New API function to
8690            commit any changes made to the DBF file.
8691    
8692            * Thuban/UI/mainwindow.py (make_check_current_tool)
8693            (_tool_command): Put the code that generates the "checked"
8694            callback into a separate function so that we can reuse it
8695            elsewhere
8696    
8697            * Thuban/Model/save.py (Saver): New class to handle serializing a
8698            session into an XML file. The main reason to introduce a class is
8699            that applications built on Thuban can derive from it so that they
8700            can save additional information in a session file.
8701            (save_session): Delegate almost all the work to the Saver class.
8702            Rename the filename argument to file because it may be a file like
8703            object now.
8704    
8705            * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
8706            code. Remove the little test code which would be executed when the
8707            module is run as a script which didn't work anymore since it can't
8708            import the other Thuban modules.
8709            (ProcessSession, load_session): Refactor the ProcessSession to
8710            have one method for each element start and end tag so that derived
8711            classes can easily override the processing of individual tags.
8712            Also, always parse with namespaces enabled because applications
8713            built on top of Thuban will likely use namespaces if they extend
8714            the session file format.
8715    
8716    2002-08-21  Bernhard Herzog  <[email protected]>
8717    
8718            * setup.py (ThubanInstall.run): Don't repr install_lib_orig
8719            because thubaninit_contents will do it for us.
8720    
8721    2002-08-16  Jan-Oliver Wagner <[email protected]>
8722    
8723            * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
8724            tree window already open
8725    
8726    2002-08-15  Bernhard Herzog  <[email protected]>
8727    
8728            * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
8729            with self.
8730    
8731            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
8732            when we have actually captured it.
8733    
8734            * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
8735            shapefile and destroy the table.
8736    
8737            * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
8738    
8739    2002-08-14  Bernhard Herzog  <[email protected]>
8740    
8741            * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
8742            instance variable columns
8743            (RecordTable.GetTypeName): row and col may be negative in some
8744            cases.
8745    
8746            * setup.py (InstallLocal.initialize_options)
8747            (InstallLocal.finalize_options, InstallLocal.user_options): New
8748            option create-init-file to build a thubaninit.py when running
8749            install_local
8750            (InstallLocal.run): Create the thubaninit.py module when requested
8751            (thubaninit_contents): Split the template into several parts and
8752            create a new function thubaninit_contents that creates the
8753            contents of a thubaninit module.
8754            (ThubanInstall.run): Use the new function to create the thubaninit
8755            module.
8756    
8757    2002-07-30  Bernhard Herzog  <[email protected]>
8758    
8759            * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
8760            cleanup.
8761            (ThubanApplication.MainLoop): Extend to automatically call OnExit.
8762    
8763            * Thuban/Model/session.py (Session.Destroy): Don't bypass the
8764            direct base class' Destroy method.
8765    
8766            * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
8767            layers.
8768            (Map.Destroy): Destroy the label_layer as well and call the
8769            inherited Desatroymethod first so that no more messages are
8770            issued.
8771            (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
8772            message if the stacking order actually has changed. Add
8773            doc-strings.
8774            (Map.BoundingBox): Correct the doc-string.
8775            (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
8776            (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
8777    
8778            * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
8779            all labels.
8780    
8781    2002-07-29  Bernhard Herzog  <[email protected]>
8782    
8783            * Thuban/Model/map.py (Map.subscribe_layer_channels)
8784            (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
8785            to a layer's channels into separate methods.
8786            (Map.RemoveLayer, Map.AddLayer): Call the new methods
8787            (Map.Destroy): Unsubscribe from a layer's channels before
8788            destroying it.
8789    
8790            * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
8791            selected_layer parameter to searched_layer which is the layer to
8792            search in.
8793            (MapCanvas.SelectShapeAt): New parameter layer to restrict the
8794            search to that layer. Return the selected layer and shape.
8795    
8796            * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
8797            typo
8798    
8799    2002-07-24  Bernhard Herzog  <[email protected]>
8800    
8801            * Thuban/UI/application.py (ThubanApplication.create_session):
8802            Extend the doc string.
8803            (ThubanApplication.subscribe_session)
8804            (ThubanApplication.unsubscribe_session): New methods to
8805            subscribe/unsubscribe to/from session channels.
8806            (ThubanApplication.SetSession): Call the new methods here.
8807            (ThubanApplication.maps_changed, ThubanApplication.set_map):
8808            Renamed set_map to maps_changed. Its now a subscriber for
8809            MAPS_CHANGED.
8810    
8811            * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
8812            x-coordinate in case of simple clicks
8813    
8814            * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
8815            don't pass it as a parameter
8816    
8817            * Thuban/Model/session.py (Session.RemoveMap): New
8818    
8819            * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
8820            window size into a parameter.
8821    
8822    2002-07-23  Bernhard Herzog  <[email protected]>
8823    
8824            * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
8825            just commands.
8826    
8827            * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
8828            parameter list a bit to allow setting the window title and the
8829            initial message in the status bar. Update the callers.
8830    
8831            * Thuban/UI/application.py (ThubanApplication.OnInit)
8832            (ThubanApplication.CreateMainWindow): Put the mainwindow
8833            instantiation into a separate method so that it can be overridden
8834            by a subclass.
8835    
8836    2002-07-19  Bernhard Herzog  <[email protected]>
8837    
8838            * Thuban/Model/session.py: Issue a CHANGED message every time
8839            another changed message is issued to make it easier to get
8840            notified of changes.
8841            (Session): Update the doc string
8842            (Session.forward): Issue changed-events as CHANGED as well.
8843            (Session.changed): Overwrite the inherited version to issue
8844            CHANGED events as well.
8845    
8846            * Thuban/UI/tree.py: We can now simply subscribe to the session's
8847            CHANGED channel to be informed of changes.
8848            (SessionTreeCtrl.session_channels): Not needed any longer.
8849            (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
8850            Only have to (un)subscribe CHANGED
8851    
8852            * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
8853    
8854            * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
8855            for the wxPython locale bug to __init__.py so that it's
8856            automatically executed by anybody using UI code from Thuban.
8857    
8858    2002-07-18  Bernhard Herzog  <[email protected]>
8859    
8860            * Thuban/UI/main.py (main): app no longer needs to be global
8861    
8862            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
8863            as parameter and store it in an instance variable
8864            (MainWindow.invoke_command, MainWindow.update_command_ui)
8865            (MainWindow.save_modified_session, MainWindow.NewSession)
8866            (MainWindow.OpenSession, MainWindow.SaveSession)
8867            (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
8868            application object.
8869    
8870            * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
8871            the main window with self.
8872    
8873            * Thuban/UI/context.py: New module with the context class
8874    
8875            * Thuban/UI/command.py (Command): Update doc string.
8876    
8877            * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
8878            MainWindow.update_command_ui): Pass an instance of the context
8879            class to the command's methods
8880            (check_current_tool, call_method): Handle the new context
8881            implementation
8882    
8883            * Examples/simple_extensions/simple_tool.py (simple_tool,
8884            check_simple_tool): Handle the new context implementation
8885    
8886            * Examples/simple_extensions/simple_command.py (simple_command):
8887            Handle the new context implementation. Update the comments about
8888            the context.
8889    
8890            * Thuban/UI/application.py (ThubanApplication.SetSession): Add
8891            doc-string
8892            (ThubanApplication.Session): New method to return the session
8893            object
8894    
8895            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
8896            interactor's selected_layer may not be a layer of the current
8897            session when the tree is updated while a new session is being set.
8898    
8899    2002-07-17  Bernhard Herzog  <[email protected]>
8900    
8901            * Thuban/UI/tree.py (color_string): Removed. No longer used.
8902            (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
8903            update_tree into update_tree and add_items. The tree now uses a
8904            more generic way to display the contents of the tree.
8905            (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
8906    
8907            * Thuban/Model/layer.py (Layer.TreeInfo),
8908            Thuban/Model/extension.py (Extension.TreeInfo),
8909            Thuban/Model/map.py (Map.TreeInfo),
8910            Thuban/Model/session.py (Session.TreeInfo):
8911            Add TreeInfo methods to implement the new tree view update scheme
8912    
8913    2002-07-16  Bernhard Herzog  <[email protected]>
8914    
8915            * Thuban/UI/application.py: Don't use "import from" for the
8916            MainWindow. It can't always be resolved.
8917            (ThubanApplication.OnInit): change reference to MainWindow
8918            accordingly.
8919    
8920            * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
8921            completely
8922    
8923    2002-07-10  Bernhard Herzog  <[email protected]>
8924    
8925            * setup.py (create_init_module): New configurable variable whose
8926            default depends on the platform we're running on.
8927            (ThubanInstall.initialize_options): Initialize
8928            self.create_init_module from the global create_init_module
8929            (ThubanInstall.user_options): indictate that the options
8930            create-init-module and init-module-dir have arguments.
8931    
8932            * setup.py: In the setup call change the version number to include
8933            cvs.
8934    
8935            * MANIFEST.in: Add the files in Examples
8936    
8937    2002-07-09  Bernhard Herzog  <[email protected]>
8938    
8939            * setup.py: In the setup call, use the thuban homepage as the
8940            value of the url parameter.
8941    
8942            * Examples: New subdirectory for examples.
8943    
8944            * Examples/simple_extensions/simple_tool.xpm,
8945            Examples/simple_extensions/simple_tool.py,
8946            Examples/simple_extensions/simple_command.py,
8947            Examples/simple_extensions/README: Simple examples showing how to
8948            add new commands and tools.
8949    
8950            * setup.cfg (bdist_rpm): Add the default value for prefix and tell
8951            bdist_rpm that we also have an install script.
8952            (bdist_inno): Add 2002 to the copyright notice.
8953    
8954            * setup.py: Create a file in python's site-packages directory to
8955            make installation of Thuban as a library easier.
8956            (ThubanInstall.user_options): Add two new options,
8957            create-init-module and init-module-dir
8958            (ThubanInstall.expand_with_pure_python_dirs): New method to expand
8959            filenames for installation in the default directories.
8960            (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
8961            the inherited methods to capture some filenames before they're
8962            transformed too much by distutils.
8963            (ThubanInstall.run): Create the init module if requested.
8964            (ThubanInstall.thuban_init_filename): New method to return the
8965            full name of the init module.
8966            (ThubanInstall.get_outputs): Append the filename of the init
8967            module.
8968    
8969    2002-07-08  Bernhard Herzog  <[email protected]>
8970    
8971            * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
8972            handle the prefix properly which means that the default for the
8973            installation prefix should be /usr for RPMs and /usr/local when
8974            doing a normal source install.
8975            (bdist_rpm_install_script): Script to override the default install
8976            commands in the specfile generated by the bdist_rpm command.
8977            (thuban_bdist_rpm.user_options): Add a prefix option
8978            (thuban_bdist_rpm.initialize_options): Init the prefix option.
8979            Create the script files for the spec files as empty files here
8980            (thuban_bdist_rpm._make_spec_file): Override the inherited method
8981            to fill the script files with content.
8982    
8983            * Thuban/Model/save.py (relative_filename): Wrapper around
8984            Thuban.Lib.fileutil.relative_filename that accepts an empty dir
8985            argument. save_session now automatically uses this version,
8986            solving a problem when saving to a relative filename.
8987    
8988            * setup.py: In the setup call, make sure that the library
8989            directories are under $prefix/lib not directly under $prefix.
8990    
8991    2002-06-20  Jan-Oliver Wagner <[email protected]>
8992    
8993            * Thuban/Model/extension.py: new module to handle extension objects.
8994            * Thuban/Model/messages.py: new messages for extensions.
8995            * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
8996            Session.AddExtension): new for handling extensions.
8997            Also some other minor changes to round up extension handling.
8998            * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
8999            of Extension titles and title and names of its objects.
9000    
9001    2002-05-29  Bernhard Herzog  <[email protected]>
9002    
9003            * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
9004            the events for a command.
9005            (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
9006            Call bind_command_events to bind the events. add_toolbar_command
9007            can now bind events too so that it's possible to have commands
9008            that are only available through the toolbar.
9009            (MainWindow.init_ids): New instance variable events_bound to keep
9010            track of for which commands events have been bound.
9011    
9012    2002-05-28  Bernhard Herzog  <[email protected]>
9013    
9014            * Thuban/UI/menu.py: New module to build and manage menus.
9015    
9016            * Thuban/UI/mainwindow.py: Remove some unused imports.
9017            (MainWindow.__init__, main_menu): move the definition of the main
9018            menu from __init__ to the Menu instance main_menu.
9019            (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
9020            build the menu bar and sub-menus from a menu description.
9021    
9022            * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
9023            startup file
9024            (ThubanApplication.read_startup_files): New method to run
9025            ~/.thuban/thubanstart.py
9026    
9027            * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
9028            Move the toolbar definition to the Menu instance main_toolbar.
9029            (MainWindow.build_toolbar): New method to build the toolbar
9030            similar to the build_menu methods
9031    
9032    2002-05-23  Bernhard Herzog  <[email protected]>
9033    
9034            * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
9035            layer_outline_color. Fix it in the definition of the command too.
9036    
9037            * Thuban/UI/command.py (Command): Fix typo in doc string
9038    
9039    2002-05-22  Bernhard Herzog  <[email protected]>
9040    
9041            * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
9042            in the docstring
9043    
9044    2002-05-15  Bernhard Herzog  <[email protected]>
9045    
9046            * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
9047            when the shapefile is empty.
9048            (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
9049            now return None for empty shapefiles. Update doc-strings.
9050    
9051            * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
9052            the layer's bbox being None.
9053    
9054            * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
9055            layer's bbox being None.
9056    
9057            * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
9058            necessary.
9059            (MapCanvas.__init__): New instance variables, last_selected_layer
9060            and last_selected_shape to determine how the selection has
9061            changed.
9062    
9063            * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
9064            AutoSizeColumns because it will cause a traversal of the entire
9065            table which for large .dbf files will take a very long time.
9066    
9067    2002-05-14  Bernhard Herzog  <[email protected]>
9068    
9069            * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
9070            maximum depth for the tree than shapelib does by default.
9071    
9072    2002-05-10  Bernhard Herzog  <[email protected]>
9073    
9074            * setup.py (py_modules): The shptree modules doesn't have a
9075            wrapper, so don't include it in the py_modules
9076    
9077    2002-05-08  Bernhard Herzog  <[email protected]>
9078    
9079            * extensions/shapelib/shptree.c (compare_ints): Make arguments
9080            const void * as in the qsort prototype
9081            (SHPTreeFindLikelyShapes): Remove some unused variables.
9082    
9083            * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
9084            maintains to redraw the window during a drag.
9085            (MapCanvas.unprojected_rect_around_point): New method to determine
9086            a small region around a point for hit-testing.
9087            (MapCanvas.find_shape_at): Only test the shapes in a small region
9088            around the point.
9089    
9090            * setup.py: Increment the version to 0.1.2
9091    
9092            * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
9093            debug print and set session to None after unsubscribing
9094    
9095    2002-05-07  Bernhard Herzog  <[email protected]>
9096    
9097            * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
9098            the file to have a .thuban extension.
9099    
9100            * Thuban/UI/tree.py (session_channels): New class constant with
9101            all the session channels to subscribe to to update the tree
9102            (SessionTreeCtrl.session_changed): Remember the session so that we
9103            can unsubscribe properly. Use the new class constant to
9104            unsubscribe from the old session and subscribe to the new one.
9105            (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
9106            subscriptions of the SessionTreeCtrl.
9107            (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
9108    
9109            * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
9110            Session Tree" command to the file menu.
9111    
9112            * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
9113            as update_region to the renderer.
9114    
9115            * Thuban/UI/renderer.py
9116            (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
9117            update box is now directly a tuple, not a wxRect anymore.
9118    
9119            * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
9120            prints.
9121    
9122    2002-05-07  Bernhard Herzog  <[email protected]>
9123    
9124            * setup.py: Add the shptree extension module. See
9125            extensions/pyshapelib/ChangeLog for more details.
9126    
9127            * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
9128            extensions/shapelib/dbfopen.c: Really update to the versions of
9129            shapelib 1.2.9. For some reason it wasn't really done on
9130            2002-04-11.
9131    
9132            * extensions/shapelib/shptree.c: Modified version of shptree.c of
9133            shapelib 1.2.9. The only real difference is the use of qsort
9134            instead of a bubble sort implementation
9135    
9136            * Thuban/Model/layer.py (Layer.__init__): New instance variable
9137            shapetree to hold the shapelib quadtree for the shapefile
9138            (Layer.open_shapefile): Create the quad tree.
9139            (Layer.ShapesInRegion): New method to return the ids of shapes in
9140            a given region using the quad tree.
9141    
9142            * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
9143            comment
9144            (draw_polygon_shape): Accept both arcs and polygons.
9145            (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
9146            the api.
9147    
9148            * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
9149            return the shape ids to be rendered in a given layer.
9150            (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
9151            ids. Use draw_polygon_shape to draw arc shapes as well.
9152            (ScreenRenderer.RenderMap): New parameter for the rectangle that
9153            has to be updated
9154            (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
9155            calling it's ShapesInRegion method.
9156    
9157            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
9158            update_region for the update region.
9159            (MapCanvas.OnPaint): Maintain the update region
9160            (MapCanvas.do_redraw): Pass the bounding box of the update_region
9161            to the renderer when drawing the bitmap. Reset the update_region.
9162    
9163    2002-05-03  Bernhard Herzog  <[email protected]>
9164    
9165            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
9166            MainWindow.OpenSession): Change the file extension of the session
9167            files to .thuban
9168    
9169            * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
9170            Move the map channels to be forwarded by the session into the
9171            class constant with forwarded_channels. Also add
9172            LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
9173            forwarded_channels
9174    
9175            * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
9176            typo and some rewording).
9177    
9178    2002-05-02  Bernhard Herzog  <[email protected]>
9179    
9180            * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
9181            around to speed up most redraws:
9182            (MapCanvas.__init__): New instance variable bitmap which holds the
9183            bitmap
9184            (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
9185            self.bitmap to draw.
9186            (MapCanvas.full_redraw): New method to force a full redraw
9187            including the bitmap
9188            (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
9189            make sure the bitmap is redrawn.
9190            (MapCanvas.projection_changed, MapCanvas.set_view_transform,
9191            MapCanvas.shape_selected): Call full_redraw instead of readraw to
9192            make sure the bitmap is redrawn.
9193            (MapCanvas.OnSize): New method to handle size events so that the
9194            bitmap can be redrawn.
9195    
9196    2002-04-29  Bernhard Herzog  <[email protected]>
9197    
9198            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
9199            canvas' VIEW_POSITION event
9200            (MainWindow.view_position_changed): Handler for VIEW_POSITION.
9201            Update the text in the status-bar accordingly.
9202    
9203            * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
9204            (MapCanvas.__del__): Implement because Publisher.__del__ has to be
9205            called.
9206            (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
9207            current_position
9208            (MapCanvas.set_current_position): New method to set
9209            current_position. Issue a VIEW_POSITION event
9210            (MapCanvas.CurrentPosition): New public method to return the value
9211            of current_position. Should be called when the VIEW_POSITION event
9212            is processed.
9213            (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
9214            Update the position.
9215            (MapCanvas.OnLeaveWindow): Set the position to None.
9216    
9217            * Thuban/UI/messages.py (VIEW_POSITION): New message for the
9218            position in the statusbar
9219    
9220    2002-04-26  Frank Koormann <[email protected]>
9221    
9222            * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
9223    
9224    2002-04-24  Frank Koormann <[email protected]>
9225    
9226            * Resources/Bitmaps/identify.xpm: shadow added
9227    
9228            * Resources/Bitmaps/fullextent.xpm: new
9229    
9230    2002-04-22  Jan-Oliver Wagner <[email protected]>
9231    
9232            * Thuban/UI/tree.py (update_tree): added test for None on map bounding
9233            box
9234    
9235    2002-04-21  Jan-Oliver Wagner <[email protected]>
9236    
9237            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
9238    
9239            * Thuban/UI/tree.py (update_tree): added added map extent
9240    
9241            * Thuban/UI/mainwindow.py (_method_command): extended by parameter
9242            icon; added map_full_extend as tool
9243    
9244    2002-04-19  Jan-Oliver Wagner <[email protected]>
9245    
9246            * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
9247            saving _new_ sessions
9248    
9249            * Thuban/Model/session.py (create_empty_session): new session
9250            don't have a filename (set to None)
9251    
9252            * Thuban/UI/tree.py (update_tree): added filename and modified flag
9253    
9254            * Thuban/Model/load.py (ProcessSession): convert projection
9255            parameters from unicode to regular string
9256    
9257            * Data/iceland_sample.session: Added UTM Zone 26 projection.
9258    
9259    2002-04-11  Bernhard Herzog  <[email protected]>
9260    
9261            * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
9262            extensions/shapelib/dbfopen.c: Update to the versions of shapelib
9263            1.2.9
9264    
9265            * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
9266            the pyshapelib directoy into the list of include dirs, so that
9267            pyshapelib_api.h can be found.
9268    
9269            * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
9270            holds the pyshapelib C-API
9271            (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
9272            pyshapelib_api to access the shapelib functions.
9273            (initwxproj): Import the c_api from the shapelib module and
9274            initialize pyshapelib_api.
9275    
9276    2002-04-04  Bernhard Herzog  <[email protected]>
9277    
9278            * setup.py (thuban_bdist_rpm.initialize_options): Use
9279            initialize_options to create the scripts for the rpm.
9280    
9281            * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
9282    
9283    2002-04-03  Bernhard Herzog  <[email protected]>
9284    
9285            * setup.py: Increment version to 0.1.1
9286    
9287            * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
9288            Layer" and "Remove Layer" commands from the layer menu to the map
9289            menu
9290    
9291    2002-02-15  Bernhard Herzog  <[email protected]>
9292    
9293            * Thuban/Model/layer.py (Layer.Shape): list append only takes one
9294            argument (python <= 1.5.2 erroneously accepted multiuple
9295            arguments)
9296    
9297    2002-02-04  Bernhard Herzog  <[email protected]>
9298    
9299            * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
9300            RecordGrid in the identifyview.
9301            (IdentifyView.__init__): Use IdentifyGridCtrl instead of
9302            IdentifyListCtrl. The grid allows editing of the values.
9303    
9304            * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
9305            implementing a grid for a single row of a thuban table.
9306    
9307            * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
9308            layers by default. Easier to use than the previous default of only
9309            searching through the select layer which meant that if no layer
9310            was selected, you couldn't select a shape.
9311    
9312            * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
9313    
9314            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
9315            stroke_width attribute
9316    
9317            * Thuban/Model/save.py (save_session): Write the new stroke_width
9318            attribute
9319    
9320            * Thuban/Model/load.py (ProcessSession.startElement): Read the
9321            stroke_width attribute
9322    
9323            * Thuban/Model/layer.py (Layer.__init__): New parameter and
9324            instance variable stroke_width
9325            (Layer.SetStrokeWidth): Set the stroke_width.
9326    
9327    2002-02-01  Bernhard Herzog  <[email protected]>
9328    
9329            * extensions/thuban/wxproj.cpp (project_points): Fix two
9330            off-by-one errors in the last loop that joins the various parts
9331            together.
9332    
9333    2002-01-14  Bernhard Herzog  <[email protected]>
9334    
9335            * setup.py (data_dist.make_distribution): Fix some typos
9336    
9337    2001-09-18  Bernhard Herzog  <[email protected]>
9338    
9339            * README: Slight tweaking in preparation for the 0.1 release
9340    
9341            * setup.cfg: Add section for sdist to create both tgz and zip
9342            archives
9343    
9344            * setup.py: increase version number to 0.1
9345            (data_dist): New command class for data distribution
9346    
9347    2001-09-14  Bernhard Herzog  <[email protected]>
9348    
9349            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
9350            Handle the case of no layer (i.e. layer is None) properly.
9351    
9352            * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
9353            Set the initial selection of the combo boxes to reflect the
9354            projection we're starting with in a way that works on windows,
9355            too.
9356    
9357            * Thuban/Lib/connector.py (Connector.print_connections): Print the
9358            puiblisher's ids in hex to make it easier to compare them to the
9359            standard repr of python methods
9360    
9361            * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
9362            messages
9363    
9364    2001-09-13  Bernhard Herzog  <[email protected]>
9365    
9366            * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
9367            deselect the layer if no layer is selected
9368    
9369            * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
9370            idle time when there actually is something to draw. If there's
9371            nothing to draw simply clear the window
9372            (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
9373            (MapCanvas.SetMap): force a redraw in all cases because
9374            FitMapToWindow doesn't always do it.
9375            (MapCanvas.ZoomFactor): Add an optional parameter, center, to
9376            specify the point to move into the center of the window
9377            (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
9378            dragged, zoon in/out by a factor of 2
9379            (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
9380            index, i.e. reversed drawing order) so that objects appearing to
9381            be in from of others are selected first. This is probably mostly
9382            relevant for point shapes where the symbols used may overlap
9383    
9384            * Thuban/Model/session.py (create_empty_session): Unset the
9385            modified bit before returning it
9386    
9387            * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
9388            create_empty_session session to create the new, empty session.
9389    
9390            * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
9391            the tool bitmaps.
9392            (MainWindow.OnClose, MainWindow.save_modified_session): Separate
9393            the code that asks whether the session should be saved into the
9394            new method save_modified_session.
9395            (MainWindow.OpenSession, MainWindow.NewSession): Use the new
9396            method to save modified session here too.
9397    
9398  2001-09-11  Bernhard Herzog  <[email protected]>  2001-09-11  Bernhard Herzog  <[email protected]>
9399    
9400          * setup.py (InnoIconItem): fix typo          * setup.py (InnoIconItem): fix typo
# Line 62  Line 9459 
9459          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
9460          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
9461    
9462          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
9463          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
9464          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
9465          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
9466          the application's OnInit method          the application's OnInit method
# Line 79  Line 9476 
9476          layer to the tableview dialog.          layer to the tableview dialog.
9477    
9478          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
9479          (TableGrid):          (TableGrid):
9480          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
9481          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
9482          (TableFrame.__init__):          (TableFrame.__init__):
# Line 146  Line 9543 
9543  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
9544    
9545          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
9546            
9547          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
9548          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
9549            
9550          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
9551          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
9552          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 196  Line 9593 
9593          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
9594          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
9595          link_file method          link_file method
9596            
9597          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
9598          the window when the first layer is added to the map.          the window when the first layer is added to the map.
9599    
# Line 233  Line 9630 
9630          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
9631          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
9632          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
9633            
9634          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
9635          installer          installer
9636    

Legend:
Removed from v.55  
changed lines
  Added in v.2197

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26