/[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 1272 by jonathan, Fri Jun 20 16:43:13 2003 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]>  2003-06-20  Jonathan Coles   <[email protected]>
4483    
4484          * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after          * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
# Line 229  Line 4710 
4710          Fix problem of hidden properties dialog under windows after double          Fix problem of hidden properties dialog under windows after double
4711          click on layer tree:          click on layer tree:
4712          The tree control always gets an Expanded / Collapsed event after          The tree control always gets an Expanded / Collapsed event after
4713          the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply          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.          raises the already displayed window.
4716    
4717          * Thuban/UI/legend.py (LegendTree.__init__): Instance variable          * Thuban/UI/legend.py (LegendTree.__init__): Instance variable

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26