/[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 924 by frank, Mon May 19 09:12:42 2003 UTC revision 2111 by joey, Wed Mar 17 10:44:53 2004 UTC
# Line 1  Line 1 
1    2004-03-16  Martin Schulze  <[email protected]>
2    
3            * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
4            comprehensive test for the getMapURL method, built compare URLs
5            according to the documentation in OGC 01-068r3
6    
7            * Extensions/wms/capabilities.py (WMSCapabilities): Added the
8            class WMSCapabilities to manage capabilites, will incorporate
9            parsing the capabilities response and provide details for other
10            classes.
11    
12    2004-03-12  Bernhard Herzog  <[email protected]>
13    
14            Support views in addition to normal tables in the postgis
15            shapestore
16    
17            * Thuban/Model/postgisdb.py
18            (PostGISShapeStore._fetch_table_information): Add a fallback for
19            the case where the table name is not in the geometry_columns
20            table.  This is usually the case for views.  Also, set
21            self.shapestore here.
22            (PostGISShapeStore.ShapeType): No need to query the database all
23            the time.  The shape type is now determined in
24            _fetch_table_information
25    
26            * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
27            (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
28            New parameter to specify views.
29            (PostGISDatabase.has_data): Also compare the views.  New views
30            parameter
31            (PostGISDatabase.initdb): Create the views.
32            (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
33            view
34    
35            * test/test_postgis_db.py
36            (TestPostGISShapestorePointFromViews): New.  Test a
37            PostGISShapeStore with a view
38            (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
39            the geometry_column explicitly to test whether that works
40    
41    2004-03-12  Bernhard Herzog  <[email protected]>
42    
43            Final step for explicit id/geometry columns: Loading and saving
44    
45            * Resources/XML/thuban-1.1.dtd: New.  Derived from thuban-1.0.dtd
46            with the following changes:
47            (dbshapesource): Two new attributes id_column and geometry_column
48    
49            * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
50            (SessionSaver.write_session): Use the new namespace
51            (SessionSaver.write_data_containers): Write the new dbshapesource
52            parameters
53    
54            * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
55            the new file format version
56            (SessionLoader.start_dbshapesource): Handle the new db parameters
57    
58            * test/test_save.py: Update to the new dtd and namespace
59            (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
60            mock object to provide a working IDColumn method.
61    
62            * test/test_load_1_0.py: New.  Copy of the test_load.py before
63            today's changes but with the round-trip tests removed.
64    
65            * test/test_load_0_9.py: Update doc-string.
66    
67            * test/test_load.py: Update all .thuban files to the new dtd and
68            namespace.
69            (TestPostGISLayer.file_contents): Add the new dbshapesource
70            paramters
71    
72    2004-03-11  Bernhard Herzog  <[email protected]>
73    
74            Next step for explicit id/geometry columns: User interaction
75    
76            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
77            the dialog is constructed. Add combo boxes to select id and
78            geometry column.  Rename some instance variables.
79            (ChooseDBTableDialog.GetTable): Return id and geometry column
80            names
81            (ChooseDBTableDialog.OnTableSelect): New. Event handler for
82            selections in the table list
83    
84            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
85            and geometry_column
86    
87            * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
88            parameters for id_column and geometry column of PostGISShapeStore
89            here as well.
90    
91            * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
92            (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
93            (PostGISConnection.GeometryTables): Use a better query to
94            determine which relations in the database might be usable for
95            shapestores.  Now supports views as well but is more PostgreSQL
96            specific
97            (PostGISConnection.table_columns): New. Somewhat experimental
98            method to let the db dialogs provide lists of columns to users so
99            that they can select id and geometry columns.
100            (PostGISTable.__init__): The default value of the id_column
101            parameter is now None it still means "gid" effectively, though.
102            (PostGISTable.IDColumn): New introspection method to return a
103            column object for the id column
104            (PostGISShapeStore.GeometryColumn): New introspection method to
105            return a column object for the geometry column
106    
107            * test/test_postgis_db.py
108            (TestPostGISConnection.test_gis_tables_non_empty):
109            Removed. Subsumed by the new:
110            (TestPostGISConnection.test_gis_tables_with_views_and_tables):
111            New. Tes the GeometryTables and table_columns methods with actual
112            tables and views.
113            (PointTests.test_id_column, PointTests.test_geometry_column):
114            New. tests for the new methods.
115            (TestPostGISShapestorePoint.setUp)
116            (TestPostGISShapestorePointSRID.setUp)
117            (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
118            instance variables needed by the new tests
119    
120    2004-03-11  Bernhard Herzog  <[email protected]>
121    
122            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
123            numbers given to ReadValue are ordinals.
124    
125    2004-03-11  Bernhard Herzog  <[email protected]>
126    
127            Elimiate the requirement for PostGIS tables to have a column
128            called "gid".
129    
130            * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
131            id_column to specify which column to use to identify rows.  Also
132            new instance variables id_column and quoted_id_column
133            (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
134            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
135            (PostGISTable.SimpleQuery): Use the id column name provided to the
136            constructor instead of "gid"
137            (PostGISShapeStore.__init__): New parameter id_column analogously
138            to PostGISTable.__init__.  This parameter is simply passed through
139            to the base class constructor
140            (PostGISShapeStore._create_col_from_description): Fix typo in
141            doc-string
142            (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
143            (PostGISShapeStore.ShapesInRegion): Use the id column name
144            provided to the constructor instead of "gid"
145    
146            * test/postgissupport.py
147            (PostgreSQLServer.get_default_static_data_db): New static table
148            landmarks_point_id with an id column != "gid.  Update the comments
149            a bit.
150            (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
151            doc-
152            (upload_shapefile): New parameter gid_column to use a name other
153            than "gid" for the column to store the shape ids
154    
155            * test/test_postgis_db.py (TableTests): New.  Mixin-class
156            containing all tests previously in TestPostGISTable.  The actual
157            tests are the same but the code is a bit more configurable to
158            allow for different id columns etc.
159            (TestPostGISTable): Derive from TableTests now for the actual
160            tests.
161            (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
162            except that it the landmarks_point_id table to test the id_column
163            parameter
164            (PointTests): Extend the doc-string
165            (TestPostGISShapestorePointExplicitGIDColumn)
166            (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
167            from PointTests to test the explicit id_column parameter.  One
168            tests with the name of the column holding the shape ids, the other
169            uses PostgreSQL's OID column.  For the latter a number of methods
170            have to be overwritten to make them independent of the actual id
171            values.
172    
173    2004-03-08  Silke Reimer  <[email protected]>
174    
175            Update debian directory:
176    
177            * debian/changelog: Added new version.
178            * deiban/rules: Updated management of patches (with cbds)
179            * debian/control: Added cbds to dependencies
180            * debian/patches/*: New. Adds better support for patches of thuban in
181                            debian
182            * debian/menu: Syntax of menu changed slightly
183            * debian/setup.py.patch: removed because it has been moved to
184                            debian/patechs/setup.py.patch
185            
186    
187    2004-02-26  Bernhard Herzog  <[email protected]>
188    
189            Create the Doc/technotes directory for text files with information
190            for developers
191    
192            * Doc/technotes/README: New. README for the technotes
193    
194            * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
195            Thuban
196    
197            * Doc/technotes/release_process.txt: New. Used to be
198            HOWTO-Release.  Now slightly adapted to technote formatting style.
199    
200            * HOWTO-Release: Removed.  It's contents are now in
201            Doc/technotes/release_process.txt
202    
203    2004-02-25  Bernhard Herzog  <[email protected]>
204    
205            * libraries/thuban/wxproj.cpp (get_wx_version): New.  Return the
206            version of wxWindows the module was compiled with so we can check
207            that against the wxPython version.
208    
209            * Thuban/version.py (thuban_branch, thuban_release): New variables
210            controlling which and how Thuban versions are shown.  See the
211            comments for details.
212            (verify_versions): Also check that the wx version that wxproj is
213            compiled against matches that of the wxPython we use at runtime
214    
215    2004-02-20  Bernhard Herzog  <[email protected]>
216    
217            * Extensions/wms/wms.py (epsg_code_to_projection): Use
218            get_system_proj_file to read the epsg projections.  The old way
219            depended on the current directory being the top Thuban directory.
220    
221    2004-02-20  Bernhard Herzog  <[email protected]>
222    
223            * Extensions/svgexport/test/test_svgmapwriter.py
224            (TestVirtualDC.test_clippath): Remove a debug print
225    
226    2004-02-20  Bernhard Herzog  <[email protected]>
227    
228            * Extensions/svgexport/__init__.py: New.  Turn
229            Extensions/svgexport into a package.
230    
231            * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
232            doc-string a bit.  The doc-string must come first, otherwise it's
233            not a doc-string.  The __future__ import must be the first thing
234            after the doc-string.  Use only double quotes in doc-strings.
235            Single quotes trip up emacs syntax highlighting if the text
236            contains apostrophes.
237    
238    2004-02-20  Bernhard Herzog  <[email protected]>
239    
240            * Extensions/svgexport/test/__init__.py,
241            Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
242            suite for svgexport
243    
244            * test/runtests.py (find_test_modules): New. Function with the
245            module finding code from main.
246            (main): Use find_test_modules to figure out the default test
247            modules and take modules from Extensions.svgexport.test too.
248    
249    2004-02-19  Bernhard Herzog  <[email protected]>
250    
251            * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
252            the mainwindow has a reference to the map of the initial session.
253            This fixes a bug introduced with the fix for RT#2245
254    
255    2004-02-19  Bernhard Herzog  <[email protected]>
256    
257            * Extensions/svgexport/svgsaver.py,
258            Extensions/svgexport/svgmapwriter.py,
259            Extensions/svgexport/maplegend.py: Added again.  This time in the
260            correct place.
261    
262    2004-02-17  Bernhard Herzog  <[email protected]>
263    
264            Fix for RT#2245
265    
266            * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
267            instance variables before trying to create any windows.  Creating
268            windows can start an event loop if e.g. message boxes are popped
269            up for some reason, and event handlers, especially EVT_UPDATE_UI
270            may want to access things from the application.
271            (ThubanApplication.maps_changed): The mainwindow may not have been
272            created yet, so check whether it has been created before calling
273            its methods
274    
275            * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
276            have a map
277    
278    2004-02-17  Bernhard Herzog  <[email protected]>
279    
280            * test/test_svgmapwriter.py, Extensions/svgsaver.py,
281            Extensions/svgmapwriter.py, Extensions/maplegend.py,
282            extensions/svgexport/svgsaver.py,
283            extensions/svgexport/svgmapwriter.py,
284            extensions/svgexport/maplegend.py: Removed.  These files were in
285            the wrong places or didn't work at all.
286    
287    2004-02-16  Bernhard Herzog  <[email protected]>
288    
289            * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
290            line
291    
292    2004-02-16  Bernhard Herzog  <[email protected]>
293    
294            * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
295    
296    2004-02-15  Markus Rechtien  <[email protected]>
297            
298            * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
299            to write a session to a file in SVG format.
300            * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
301            to write a SVG map of a session.
302            * Extensions/svgexport/maplegend: New. Writes a basic maplegend
303            in SVG format for the current session.
304    
305    2004-02-13  Bernhard Herzog  <[email protected]>
306    
307            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
308            can't be created, return immediately after displaying the error
309            message.
310    
311    2004-02-11  Bernhard Herzog  <[email protected]>
312    
313            Handle postgis tables with more than one geometry column.
314    
315            * Thuban/Model/postgisdb.py
316            (PostGISTable._fetch_table_information): Delegate the creation of
317            column objects to a different method so that we can extend that in
318            derived classes
319            (PostGISTable._create_col_from_description): New. Column object
320            creation part of _fetch_table_information
321            (PostGISShapeStore._create_col_from_description): New. Extend
322            inherited method to handle geometry columns
323            (PostGISShapeStore.__init__): New parameter geometry_column to
324            specify which geometry column to use.  Optional but mandatory for
325            tables with more than one geometry column
326            (PostGISShapeStore._fetch_table_information): Also use the name of
327            the geometry column when looking for the srid
328            (PostGISShapeStore.ShapeType): Also use the name of the geometry
329            column when looking for the shape type
330    
331            * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
332            NonConnectionStore to changes in the PostGISShapeStore
333    
334            * test/test_postgis_db.py
335            (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
336            PostGISShapeStore with tables having two geometry columns.
337    
338    2004-02-10  Bernhard Herzog  <[email protected]>
339    
340            Fix some postgis problems.  What remains to be done is real
341            handling of SRIDs as they affect how reprojection is done
342    
343            * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
344            doc-string
345            (PostGISShapeStore._fetch_table_information): New. Extend
346            inherited method to retrieve srid
347            (PostGISShapeStore.BoundingBox): Handle tables without data.
348            extent yields NULL for those
349            (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
350    
351            * test/test_postgis_db.py
352            (TestPostGISSpecialCases.test_shapestore_empty_table): New test
353            for the special case of a table without any data
354            (TestPostGISShapestorePointSRID): New class with tests for a table
355            that uses srids
356            (PolygonTests): Fix a doc-string typo
357    
358            * test/postgissupport.py (PostGISDatabase.__init__): New parameter
359            reference_systems with a specification of spacial reference
360            systems to create in the new db.
361            (PostgreSQLServer.new_postgis_db)
362            (PostgreSQLServer.get_static_data_db): New parameter
363            reference_systems to be passed through ultimately to
364            PostGISDatabase.  In new_postgis_db also check whether an existing
365            db already has the right srids
366            (PostgreSQLServer.get_default_static_data_db): Add srids and a
367            table that uses srids
368            (PostGISDatabase.initdb): Create the entries for the reference
369            systems
370            (PostGISDatabase.has_data): Add reference_systems parameter to
371            check for those too
372            (upload_shapefile): New parameter srid to create tables with a
373            specific srid
374    
375    2004-02-06  Frank Koormann  <[email protected]>
376    
377            * po/pt_BR.po: Fixed charset
378    
379    2004-02-05  Frank Koormann  <[email protected]>
380    
381            * po/pt_BR.po: Fixed format string for error message, missing %s
382            added (Thuban/UI/application.py:273)
383    
384    2004-02-03  Frank Koormann  <[email protected]>
385            
386            First version of Portuguese (Brazilian) translation
387    
388            * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
389            Brazilian Portuguese by Eduardo Patto Kanegae.
390    
391            * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
392            translators.
393    
394    
395    2004-01-22  Frank Koormann  <[email protected]>
396    
397            * Doc/manual/thuban-manual.xml: Added section on installation of
398            Thuban under Win32 systems. Fixed image path references in the postgis
399            section. Some minor source formattings.
400    
401    2004-01-21  Frank Koormann  <[email protected]>
402    
403            Make Thuban remember path selections (at least for one application run).
404    
405            * Thuban/UI/application.py (Application.OnInit): Initialize path as a
406            attribute of application object. Path is a dictionary of
407            strings, currently with the items "data" and "projection".  
408            (Application.SetPath): New, stores path for the specified item.
409            (Application.Path): New, return path for the specified item.
410    
411            * Thuban/UI/mainwindow.py
412            (MainWindow.OpenSession, MainWindow.SaveSessionAs,
413            MainWindow.AddLayer, MainWindow.AddRasterLayer,
414            MainWindow.TableOpen): Access "data" path information of the
415            application.
416            
417            * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
418            Access "projection" path information of the application.
419    
420    2004-01-05  Bernhard Herzog  <[email protected]>
421    
422            * po/ru.po: Updated translations from Alex Shevlakov
423    
424    2004-01-05  Bernhard Herzog  <[email protected]>
425    
426            * po/Makefile, po/README: Move the description of how to generate
427            the translation statistics to the README.
428    
429    2003-12-23  Bernhard Herzog  <[email protected]>
430    
431            * NEWS: Update for 1.0.0
432    
433            * po/it.po: Another update from Maurizio Napolitano
434    
435    2003-12-23  Bernhard Herzog  <[email protected]>
436    
437            * po/it.po: Updated translation from Maurizio Napolitano
438    
439    2003-12-23  Bernhard Herzog  <[email protected]>
440    
441            * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
442            for translation
443    
444            * Thuban/UI/mainwindow.py (MainWindow.TableRename)
445            (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
446            strings for translation
447    
448            * po/de.po: Update with the newly marked strings.
449    
450    2003-12-22  Bernhard Herzog  <[email protected]>
451    
452            * HOWTO-Release: Fix the places where version numbers have to be
453            updated
454    
455    2003-12-22  Bernhard Herzog  <[email protected]>
456    
457            * setup.py (setup call): 1.0.0, yeah!
458    
459            * Thuban/version.py (longversion): 1.0.0, yeah!
460    
461            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
462            1.0.0 namespace too
463    
464            * Thuban/Model/save.py (SessionSaver.write_session): Save with
465            1.0.0 namespace
466    
467            * test/test_load.py (LoadSessionTest.dtd)
468            (TestSingleLayer.file_contents)
469            (TestNonAsciiColumnName.file_contents)
470            (TestLayerVisibility.file_contents)
471            (TestClassification.file_contents, TestLabels.file_contents)
472            (TestLayerProjection.file_contents)
473            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
474            (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
475            (TestPostGISLayerPassword.file_contents)
476            (TestLoadError.file_contents, TestLoadError.test): Update for
477            1.0.0 namespace
478    
479            * test/test_save.py (SaveSessionTest.dtd)
480            (SaveSessionTest.testEmptySession)
481            (SaveSessionTest.testSingleLayer)
482            (SaveSessionTest.testLayerProjection)
483            (SaveSessionTest.testRasterLayer)
484            (SaveSessionTest.testClassifiedLayer)
485            (SaveSessionTest.test_dbf_table)
486            (SaveSessionTest.test_joined_table)
487            (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
488    
489    2003-12-22  Bernhard Herzog  <[email protected]>
490    
491            * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
492            alignment flags are byte strings not unicode and that they have
493            valid values
494    
495            * test/test_load.py (TestLabelLayer): New. Test loading (and
496            indirectly saving) of maps with labels.
497    
498    2003-12-22  Bernhard Herzog  <[email protected]>
499    
500            * Thuban/UI/tableview.py (TableGrid.OnDestroy)
501            (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
502            unsubscribe all subscribers.
503            (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
504            self.grid since it may already have been destroyed.
505            Fixes RT #2256
506    
507    2003-12-19  Bernhard Herzog  <[email protected]>
508    
509            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
510    
511    2003-12-16  Bernhard Herzog  <[email protected]>
512            
513            * debian/bitmappath.patch, debian/setup.py.patch:
514                    added to ensure compliance with FHS for debian
515            * debian/rules, debian/changelog:
516                added patches in rules to ensure compliance with FHS for debian
517    
518    2003-12-16  Bernhard Herzog  <[email protected]>
519    
520            * po/Makefile (mo): Make the output a bit nicer so that it prints
521            statistics about the translations. Add a comment how produce even
522            nicer statistics with sed.
523    
524    2003-12-09  Frank Koormann   <[email protected]>
525    
526            * Resources/Projections/defaults.proj:
527            French projection sample with correct accents (UNICODE).
528    
529    2003-12-05  Bernhard Herzog  <[email protected]>
530    
531            * MANIFEST.in: Add the devtools directory
532    
533            * setup.py (setup call): Use license instead of licence. This
534            silences a deprecation warning on Python 2.3
535    
536    2003-12-05  Frank Koormann   <[email protected]>
537    
538            Documentation synced with 1.0rc1
539    
540            * Doc/manual/thuban-manual.xml:
541            Minor formatting changes and references to database layers .
542            Introduction.Internationalization: New section on i18n.
543            MapManagement.AddingandRemovingLayers: Added item on database layers.  
544            MapManagement.TheLegend: Added section and screenshot on popup menu.
545            ProjectionManagement: Updated screenshot and sentence on EPSG.
546            Appendix.SupportedDataSources: Added PostGIS.
547            Appendix.WorkingwithPostGIS: New section.
548    
549            * Doc/manual/images/6_projection.png: Updated screenshot including
550            EPSG checkboxes.
551    
552            * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
553    
554            * Doc/manual/images/app_postgis_add_layer.png,
555            Doc/manual/images/app_postgis_db_add.png,
556            Doc/manual/images/app_postgis_db_management.png:
557            New screenshots focussing on database layers
558    
559    2003-12-05  Frank Koormann   <[email protected]>
560    
561            * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
562            write warning to stderr instead of rising a warning dialog
563    
564    2003-12-03  Bernhard Herzog  <[email protected]>
565    
566            Fix for RT #2243
567    
568            * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
569            New. Like has_selected_layer but for shape layers only
570            (_has_selected_shape_layer): New. Like _has_selected_layer but for
571            shape layers only
572            (layer_show_table command, layer_jointable command): Use these
573            commands should only be available for shape layers
574    
575    2003-12-03  Bernhard Herzog  <[email protected]>
576    
577            * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
578            publishers that are wx objects and may have been destroyed by wx
579            already. Fixes RT #2242.
580    
581    2003-12-03  Bernhard Herzog  <[email protected]>
582    
583            * po/ru.po: Updates from Alex Shevlakov
584    
585    2003-12-03  Silke Reimer <silkeintevation.de>
586    
587            * debian/control, debian/changelog: Added gdal-support to
588                    debian package, updated to new thuban version
589    
590    
591    2003-12-03  Bernhard Herzog  <[email protected]>
592    
593            * Thuban/Lib/version.py: New. Module for version number
594            manipulations. The version of make_tuple here also deals better
595            with more unusual version number strings, such as e.g.
596            "1.2+cvs20031111"
597    
598            * Thuban/version.py (make_tuple): Removed. It's now in
599            Thuban.Lib.version. Use that implementation instead.
600    
601            * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
602    
603    2003-12-02  Bernhard Herzog  <[email protected]>
604    
605            * MANIFEST.in: Add debian files
606    
607            * setup.py (setup call): Add packages for the Extensions so that
608            they're installed too
609            (data_files): Add READMEs and sample data from some Extensions
610    
611            * NEWS: Add note about the extensions in binary packages
612    
613    2003-12-02  Bernhard Herzog  <[email protected]>
614    
615            * Thuban/Model/save.py (SessionSaver.write_session): Save files
616            with the thuban-1.0rc1
617    
618            * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
619            thuban-1.0rc1 namespace too
620    
621            * test/test_save.py (SaveSessionTest.dtd)
622            (SaveSessionTest.testEmptySession)
623            (SaveSessionTest.testSingleLayer)
624            (SaveSessionTest.testLayerProjection)
625            (SaveSessionTest.testRasterLayer)
626            (SaveSessionTest.testClassifiedLayer)
627            (SaveSessionTest.test_dbf_table)
628            (SaveSessionTest.test_joined_table)
629            (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
630            namespace
631    
632            * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
633            namespace
634            (TestSingleLayer.file_contents)
635            (TestNonAsciiColumnName.file_contents)
636            (TestLayerVisibility.file_contents)
637            (TestClassification.file_contents, TestLabels.file_contents)
638            (TestLayerProjection.file_contents)
639            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
640            (TestPostGISLayer.file_contents)
641            (TestPostGISLayerPassword.file_contents)
642            (TestLoadError.file_contents, TestLoadError.test): Update to
643            thuban-1.0rc1 namespace
644    
645    2003-12-01  Bernhard Herzog  <[email protected]>
646    
647            * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
648            nt to better match Intevation's current w32 setup
649    
650            * HOWTO-Release: Add note about updating MANIFEST.in
651    
652            * MANIFEST.in: Add the Extensions
653    
654            * NEWS: Update for 1.0rc1
655    
656    2003-12-01  Bernhard Herzog  <[email protected]>
657    
658            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
659            cards for the dialog so that shapefiles ending in all uppercase
660            SHP are listed too
661    
662    2003-11-28  Bernhard Herzog  <[email protected]>
663    
664            * Thuban/version.py (longversion): Update to 1.0rc1
665    
666            * setup.py (setup call): Update version to 1.0rc1. Use the
667            [email protected] email address as author email instead of my
668            personal one.
669    
670    2003-11-28  Bernhard Herzog  <[email protected]>
671    
672            * po/de.po: Update german translation.
673    
674    2003-11-28  Bernhard Herzog  <[email protected]>
675    
676            Unify the filenames stored in .thuban files so that the .thuban
677            files are more platform independend
678    
679            * Thuban/Model/save.py (unify_filename): New. Unify filenames so
680            that they can be used on both windows and unix
681            (SessionSaver.prepare_filename): New. Handle all filename
682            transformations for filenames stored in the thuban file
683            (SessionSaver.write_data_containers, SessionSaver.write_layer):
684            Use prepare_filename
685    
686            * test/test_save.py (SaveSessionTest.testSingleLayer)
687            (SaveSessionTest.testLayerProjection)
688            (SaveSessionTest.testRasterLayer)
689            (SaveSessionTest.testClassifiedLayer)
690            (SaveSessionTest.test_dbf_table)
691            (SaveSessionTest.test_joined_table): Filenames are always stored
692            with slashes on all currently supported platforms so adapt all
693            tests to this
694    
695            * test/test_load.py (LoadSessionTest.filenames): With the new
696            filename scheme the filenames in the tests should be
697            understandable on all currently supported platforms so we turn
698            this into an empty list because we don't have to normalize them
699            anymore
700    
701    2003-11-28  Bernhard Herzog  <[email protected]>
702    
703            * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
704            Add the ellipsoid to the projection since some Proj versions
705            complain if it's missing.
706    
707    2003-11-27  Bernhard Herzog  <[email protected]>
708    
709            Corect some bounding box projection problems
710    
711            * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
712            version of ForwardBBox
713            (Projection._transform_bbox): New. common implementation of
714            ForwardBBox and InverseBBox
715            (Projection.ForwardBBox): Use _transform_bbox.
716    
717            * test/test_proj.py (TestProjection.test): Add test for
718            InverseBBox
719    
720            * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
721            (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
722            new InverseBBox method to determine the unprojected bounding box
723            (Layer.ShapesInRegion): Use the ForwardBBox method to project the
724            bbox.
725    
726            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
727            Removed.
728            (TestLayer.test_arc_layer_with_projection): New. This test is
729            better able to test whether bounding boxes are projected correctly
730            than test_point_layer_with_projection
731    
732            * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
733            InverseBBox to unproject bboxes
734    
735    2003-11-25  Bernhard Herzog  <[email protected]>
736    
737            * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
738            source code.
739    
740    2003-11-25  Bernhard Herzog  <[email protected]>
741    
742            * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
743            there for backwards compatibility and all code relying on that
744            should have been updated by now.
745    
746    2003-11-25  Bernhard Herzog  <[email protected]>
747    
748            * test/test_load.py (TestClassification.test): Add the missing
749            round trip test.
750            (TestClassification.file_contents): Update to the newest file
751            format
752    
753    2003-11-25  Bernhard Herzog  <[email protected]>
754    
755            Add very experimental (and possibly dangerous) extension to draw
756            polygons:
757    
758            * Extensions/drawshape/README: New. Brief installation
759            instructions
760    
761            * Extensions/drawshape/drawshape.py: New. Implementation of the
762            drawshape extensions
763    
764            * Extensions/drawshape/patch.diff: Patch to apply before the
765            extension can be used.
766    
767    2003-11-24  Bernhard Herzog  <[email protected]>
768    
769            * Thuban/Model/data.py (ShapefileStore._open_shapefile)
770            (ShapefileStore.__init__): Factor opening the shapefile into a
771            separate method (the new _open_shapefile). This makes the code a
772            bit more readable but the real reason is that it makes some evil
773            hacks easier. :-)
774    
775    2003-11-24  Bernhard Herzog  <[email protected]>
776    
777            * Thuban/Model/load.py (SessionLoader.check_attrs): If no
778            converter is specified for an attribute assume it's a string
779            containing only Latin1 characters. Update doc-string accordingly.
780            This change should fix many places where unicode objects might
781            accidentally enter Thuban.
782    
783            * test/test_load.py (TestNonAsciiColumnName): New test to check
784            what happens with column names in DBF files that contain non-ascii
785            characters
786    
787    2003-11-21  Bernhard Herzog  <[email protected]>
788    
789            Enable the experimental attribute editing again and introduce a
790            command line switch to actually activate it
791    
792            * Thuban/UI/main.py (options): New. Container for options set on
793            the commmand line
794            (main): Add the --enable-attribute-editing flag.
795    
796            * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
797            editing is enabled use the grid ctrl which allows editing of the
798            values
799    
800            * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
801            New. Just delegate this to the underlying table.
802    
803    2003-11-20  Bernhard Herzog  <[email protected]>
804    
805            * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
806            Skip this test if run under non-posix systems since it only works
807            there
808    
809    2003-11-19  Bernhard Herzog  <[email protected]>
810    
811            * Thuban/Model/resource.py: Rework the way gdal support is
812            determined so that we can give a reason in the about why gdal is
813            not supported.
814            (gdal_support_status): New. Variable holding a string with the
815            reason for no gdal support
816    
817            * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
818            not supported to the message
819    
820    2003-11-19  Bernhard Herzog  <[email protected]>
821    
822            Remove the old table interface and its test cases
823    
824            * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
825            (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
826            anymore
827    
828            * Thuban/Model/transientdb.py (TransientTableBase)
829            (AutoTransientTable): Do not derive from OldTableInterfaceMixin
830            anymore
831    
832            * test/test_table.py: Removed since the old interface it tests is
833            gone.
834    
835            * test/runtests.py (main): The old table interface is gone and
836            with it the deprecation warnings so remove the code that turns
837            these warnings into errors
838    
839    2003-11-19  Bernhard Herzog  <[email protected]>
840    
841            * test/test_table.py: Revert to revision 1.5 again. Changing the
842            tests to use the new table interface is completely wrong since the
843            whole purpose of the tests in this module is to test the old
844            interface.
845    
846    2003-11-18  Bernhard Herzog  <[email protected]>
847    
848            * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
849            New. Test whether the connection matches a set of connection
850            parameters
851    
852            * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
853            (DBFrame.OnAdd): Use the new MatchesParameters method when looking
854            for existing connections with the same parameters and break out of
855            the loop correctly.
856    
857            * test/test_postgis_db.py (TestBriefDescription)
858            (TestPostGISSimple.test_brief_description): Rename
859            TestBriefDescription to TestPostGISSimple and the test method to
860            test_brief_description so that we can add more test methods.
861            (TestPostGISSimple.test_matches_parameters): New. Test the new
862            MatchesParameters method
863    
864    2003-11-18  Bernhard Herzog  <[email protected]>
865    
866            * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
867            _was_destroyed, to indicate whether an publisher instance has
868            already been destroyed.
869            (Publisher.Unsubscribe): Only disconnect if the publisher has not
870            been destroyed yet.
871            (Publisher.Destroy): Set the _was_destroyed flag to true.
872    
873            * test/test_connector.py
874            (TestPublisher.test_unsubscribe_after_destroy): New. Test that
875            calling Unsubscribe after Destroy doesn't raise an exception
876    
877    2003-11-14  Bernhard Herzog  <[email protected]>
878    
879            * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
880            typo in doc-string
881    
882    2003-11-13  Bernhard Herzog  <[email protected]>
883    
884            Quote table and column names properly for postgis.
885    
886            * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
887            quote an identifier for use in an sql statement
888            (PostGISColumn.__init__): Add the quoted_name attribute
889            (PostGISTable.__init__): New instance variable quoted_tablename
890            (PostGISTable._fetch_table_information): Use the quoted table
891            name. New isntance variable quoted_geo_col with a quoted version
892            of geometry_column
893            (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
894            (PostGISTable.RowOrdinalToId): Use the quoted table name
895            (PostGISTable.ReadValue, PostGISTable.ValueRange)
896            (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
897            (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
898            (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
899            Use quoted table and column names
900    
901            * test/test_postgis_db.py (TestPostGISSpecialCases)
902            (TestPostGISIgnoredColumns): Rename the class to
903            TestPostGISSpecialCases because that better describes the new
904            cases
905            (TestPostGISSpecialCases.test_unsupported_types)
906            (TestPostGISSpecialCases.test): Rename the method to
907            test_unsupported_types because we need a more descriptive name now
908            that there are more methods
909            (TestPostGISSpecialCases.test_table_name_quoting)
910            (TestPostGISSpecialCases.test_column_name_quoting)
911            (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
912            cases to test quoting of table and column names in PostGISTable
913            and PostGISShapeStore
914    
915            * test/postgissupport.py
916            (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
917            AddGeometryColumn desn't support table or column names with sapces
918            or double quotes
919    
920    2003-11-12  Jan-Oliver Wagner <[email protected]>
921    
922            * Extensions/wms/__init__.py: New: Init to make this
923            directory a package.
924    
925            * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
926    
927    2003-11-11  Bernhard Herzog  <[email protected]>
928    
929            * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
930            Constant for the file woth deprecated epsg projections
931            (get_system_proj_file): Update doc-string
932    
933            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
934            above the EPS widgets, introduce a check box for the deprecated
935            eps projections and a label for the epsg widgets
936            (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
937            too
938    
939    2003-11-11  Bernhard Herzog  <[email protected]>
940    
941            Avoid warnings when run under Python 2.3
942    
943            * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
944            (BaseRenderer.draw_label_layer): Coordinates must be ints.
945    
946            * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
947            real method so that we can convert to int.
948            (MapRenderer.label_font): The font size mist be an int.
949    
950            * Thuban/UI/common.py (Color2wxColour): The color values must be
951            ints. Also, remove the unnecessary asserts.
952    
953            * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
954            (TestUnicodeStrings.test): Python source code should not contain
955            non-ascii characters unless an encoding is specified in the file.
956            Therefore use \x escapes in the string literals for non-ascii
957            characters.
958    
959    2003-11-11  Bernhard Herzog  <[email protected]>
960    
961            * Thuban/Model/resource.py (get_system_proj_file): Add a filename
962            parameter so that this function can be used for all proj files in
963            Resource/Projections
964            (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
965            get_system_proj_file
966    
967            * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
968            ProjFile self.__sysProjFile use a dictionary of system ProjFile
969            objects self._sys_proj_files
970            (ProjFrame.build_dialog): Adapt to the new changes in the
971            ProjectionList constructor. Add a check button to toggle whether
972            EPSG projections are shown
973            (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
974            events.
975            (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
976            the busy cursor if the files have not yet been loaded by the
977            dialog.
978            (ProjFrame.load_system_proj): Add a parameter for the name of the
979            proj file. Maintain the dictionary of system projections
980            self._sys_proj_files
981    
982            * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
983            user_projs parameters into one parameter proj_files which is a
984            list of proj files.
985            (ProjectionList._subscribe_proj_files)
986            (ProjectionList._unsubscribe_proj_files): New. Move
987            subscription/unsubscription of projfile messages to separate
988            methods
989            (ProjectionList.Destroy): The unsubscribe is now done in
990            _unsubscribe_proj_files
991            (ProjectionList.update_projections): We now have a list of proj
992            file objects
993            (ProjectionList.SetProjFiles): New method to set a new list of
994            proj file objects
995    
996            * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
997            Specify explicitly which system proj file to load.
998    
999    2003-11-11  Bernhard Herzog  <[email protected]>
1000    
1001            * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
1002            instance variables to cut cyclic references. The GC would have
1003            collected the loader eventually but it can happen that it doesn't
1004            run at all until thuban is closed (2.3 but not 2.2 tries a bit
1005            harder and forces a collection when the interpreter terminates)
1006            (load_session): Call the handler's Destroy method to make sure
1007            that it gets garbage collected early. Otherwise it will be
1008            collected very late if at all and it holds some references to e.g.
1009            shapestores and the session which can lead to leaks (of e.g. the
1010            temporary files)
1011    
1012            * test/test_load.py (TestSingleLayer.test_leak): New. test for the
1013            resource leak in load_session
1014    
1015    2003-11-10  Bernhard Herzog  <[email protected]>
1016    
1017            * Thuban/UI/baserenderer.py: Add a way to specify how layers in
1018            extensions are to be rendered.
1019            (_renderer_extensions): New. List with renderer for layers in
1020            extensions
1021            (add_renderer_extension): New. Add a renderer extension
1022            (init_renderer_extensions): New. Init the renderer extensions
1023            (BaseRenderer.render_map_incrementally): Search
1024            _renderer_extensions for how to draw unknown layer types
1025            (BaseRenderer.draw_raster_data): Add format parameter so that
1026            formats other than BMP can be drawn
1027            (BaseRenderer.draw_raster_layer): Pass an explicit format to
1028            draw_raster_data
1029    
1030            * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
1031            strings of the format parameter of draw_raster_data method to wx
1032            constants
1033            (MapRenderer.draw_raster_data): Add the format parameter and use
1034            raster_format_map to map it to the right wxwindows constant for
1035            wxImageFromStream
1036    
1037            * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
1038            the format parameter and record it
1039            (TestBaseRenderer.test_raster_no_projection): check the format
1040            paramter of the draw_raster_data method
1041            (TestBaseRenderer.test_renderer_extension): New. Test the renderer
1042            extension facility
1043    
1044    2003-11-07  Bernhard Herzog  <[email protected]>
1045    
1046            Tweak the usage of the sqlite database to make common use cases
1047            more responsive. In most cases copying the data to the sqlite
1048            database takes so long that using sqlite doesn't have enough
1049            advantages.
1050    
1051            * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
1052            comments about performance and query the min and max in separate
1053            statements because only that way will indexes be used.
1054            (TransientTableBase.UniqueValues): Add some comments about
1055            performance.
1056            (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
1057            Do not copy the data to the transient DB but use the transient
1058            copy if it exists. See the new comments for the performance trade
1059            offs
1060    
1061            * test/test_transientdb.py
1062            (TestTransientTable.test_auto_transient_table): Make sure that the
1063            data is copied to the transient database at some point.
1064    
1065    2003-11-03  Bernhard Herzog  <[email protected]>
1066    
1067            * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
1068            globals to locals so that it's a bit faster
1069    
1070    2003-11-03  Bernhard Herzog  <[email protected]>
1071    
1072            * Thuban/UI/baserenderer.py
1073            (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
1074            method. ReadValue is faster than ReadRowAsDict since it only reads
1075            one cell especially now that the dbf file objects actually
1076            implement it.
1077    
1078            * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
1079            read_attribute method of the dbf objects
1080    
1081    2003-11-03  Bernhard Herzog  <[email protected]>
1082    
1083            * Extensions/profiling/profiling.py (popup_dialog_box): New config
1084            variable to indicate whether the result should be shown in a
1085            dialog box
1086            (profile_screen_renderer, time_screen_renderer): Only show a
1087            dialog box if popup_dialog_box is true.
1088            (profile_screen_renderer): Flush stdout after the printing the
1089            first part of the "profiling..." message
1090    
1091            * Thuban/UI/baserenderer.py
1092            (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
1093            brushes for the groups so that they're not created over and over
1094            again
1095    
1096            * Thuban/Model/classification.py (Classification.__getattr__)
1097            (Classification._compile_classification)
1098            (Classification._clear_compiled_classification): New. Methods to
1099            manage a 'compiled' representation of the classification groups
1100            which is created on demand
1101            (Classification.InsertGroup, Classification.RemoveGroup)
1102            (Classification.ReplaceGroup): reset the compiled representation
1103            (Classification.FindGroup): Use the compiled representation to
1104            find the matching group
1105            (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
1106    
1107    2003-10-31  Bernhard Herzog  <[email protected]>
1108    
1109            * Thuban/Model/classification.py (Classification.SetDefaultGroup):
1110            Send a CLASS_CHANGED message
1111            (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
1112            not return the removed group since it wasn't used.
1113    
1114            * test/test_classification.py
1115            (TestClassification.test_set_default_group): New. Test the
1116            SetDefaultGroup method
1117            (TestClassification.test_insert_group): New. Test the InsertGroup
1118            method
1119            (TestClassification.test_remove_group): New. Test the RemoveGroup
1120            method
1121            (TestClassification.test_replace_group): New. Test the
1122            ReplaceGroup method
1123    
1124    2003-10-31  Bernhard Herzog  <[email protected]>
1125    
1126            * test/test_classification.py (TestClassification.setUp):
1127            Subscribe to the CLASS_CHANGED messages
1128            (TestClassification.tearDown): New. Destroy the classification
1129            properly
1130            (TestClassification.test_defaults): Add tests for the default line
1131            width and whether no messages were sent yet
1132            (TestClassification.test_set_default_properties): Add tests for
1133            messages and setting the default line width
1134            (TestClassification.test_add_singleton)
1135            (TestClassification.test_add_range)
1136            (TestClassification.test_multiple_groups): Add tests for messages
1137    
1138    2003-10-31  Bernhard Herzog  <[email protected]>
1139    
1140            Some more refactoring in preparation for new tests:
1141    
1142            * test/test_classification.py (TestClassification.setUp): New.
1143            Instantiate the classification here. Update the test methods
1144            accordingly.
1145            (TestClassification.test_multiple_groups): Make sure that the two
1146            singletons matching 1 are considered different.
1147    
1148    2003-10-31  Bernhard Herzog  <[email protected]>
1149    
1150            * test/test_classification.py (red, green, blue): New. These
1151            constants were used in several cases. Update the relevant methods.
1152            (TestClassification.test_defaults)
1153            (TestClassification.test_set_default_properties)
1154            (TestClassification.test_add_singleton)
1155            (TestClassification.test_add_range)
1156            (TestClassification.test_multiple_groups)
1157            (TestClassification.test_deepcopy): New. These were formerly all
1158            part of the single method test.
1159            (TestClassification.test_deepcopy): Removed.
1160            (TestClassIterator): Removed. The test case is now a method of
1161            TestClassification since it tests part of the public interface of
1162            Classification
1163            (TestClassification.test_iterator): New. Used to be
1164            TestClassIterator effectively
1165    
1166    2003-10-31  Jan-Oliver Wagner <[email protected]>
1167    
1168            GUIfied the functions of the profiling extension.
1169    
1170            * /Extensions/profiling/__init__.py: New: Init to make this
1171            directory a package.
1172    
1173            * Extensions/profiling/profiling.py: Moved menu entries to
1174            the Extensions menu. Applied _() for strings.
1175            (profile_screen_renderer): Catch the detailed printout and present
1176            it in a dialog.
1177            (time_screen_renderer): Raise a dialog to present the result instead
1178            of printing it to stdout.
1179    
1180    2003-10-31  Bernhard Herzog  <[email protected]>
1181    
1182            * test/test_classification.py (TestClassGroupProperties)
1183            (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
1184            (TestClassGroupSingleton, TestClassIterator, TestClassification):
1185            Split TestClassification into several classes, one for each class
1186            being tested. TestClassification itself now only tests
1187            Classification. This split makes changes to the tests a bit easier
1188    
1189    2003-10-31  Bernhard Herzog  <[email protected]>
1190    
1191            * Extensions/profiling/profiling.py: New. Extension to measure
1192            Thuban performance
1193    
1194    2003-10-31  Frank Koormann <[email protected]>
1195    
1196            Added two items to legend popup menu: Remove Layer and Show Layer Table
1197    
1198            * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
1199            LegendPanel._OnShowTable): New event handlers, call the corresponding
1200            mainwindow methods.
1201            (LegendTree._OnRightClick): Added items to popup menu.
1202    
1203    2003-10-30  Bernhard Herzog  <[email protected]>
1204    
1205            * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
1206            EVT_WINDOW_DESTROY
1207            (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
1208            nothing but is convenient for the derived classes.
1209    
1210            * Thuban/UI/tableview.py
1211            (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
1212            Unsubscribe the messages here not in OnClose because that might
1213            get called multiple times. Fixes RT #2196
1214            (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
1215            anymore.
1216    
1217            * README: Update the minimum requirement for wxPython. Since we
1218            now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
1219            the version in which that was introduced for all platforms
1220    
1221    2003-10-30  Frank Koormann <[email protected]>
1222    
1223            * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
1224            the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
1225            frame.
1226    
1227    2003-10-30  Jan-Oliver Wagner <[email protected]>
1228    
1229            Improved APR import extension, added further EPSG definitions
1230            and some cleanup regarding string class.
1231    
1232            * test/test_proj.py (TestProjection.test_get_projection_units_geo):
1233            Added test for alias 'longlat'.
1234    
1235            * Resources/Projections/epsg-deprecated.proj: New. Contains
1236            deprecated EPSG definitions.
1237    
1238            * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
1239            the variable names for objects.
1240    
1241            * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
1242            Copied from importAPR and provided with documentation.
1243    
1244            * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
1245            Moved to apr.py.
1246            (APR_View): Added object ref 'ITheme'.
1247    
1248            * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
1249            split function by corresponding use of the string class method.
1250    
1251            * Thuban/Model/xmlwriter.py: Replaced string replace function by
1252            corresponding string method.
1253    
1254    2003-10-29  Bernhard Herzog  <[email protected]>
1255    
1256            * Thuban/UI/baserenderer.py
1257            (BaseRenderer.draw_shape_layer_incrementally): Speed up the
1258            special case of a classification that only has the default group
1259    
1260    2003-10-27  Bernhard Herzog  <[email protected]>
1261    
1262            * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
1263    
1264            * po/de.po: Update.
1265    
1266            * Thuban/UI/application.py
1267            (ThubanApplication.ShowExceptionDialog): Handle translation of the
1268            dialog message properly
1269    
1270    2003-10-27  Bernhard Herzog  <[email protected]>
1271    
1272            Rework how localization works so that we use wx's translation
1273            functions when running Thuban as a normal application but not when
1274            we don't need any UI, such as in the test suite. See the comment
1275            in Thuban/__init__.py for details
1276    
1277            * Thuban/__init__.py (_): Add one level of indirection to make the
1278            translation handling more flexible and to make it possible to use
1279            either wx's translation services or not.
1280            (gettext_identity, translation_function_installed)
1281            (install_translation_function): New function to help with this
1282    
1283            * Thuban/UI/__init__.py: Install the wx specific translation
1284            function if it's OK to do that
1285    
1286            * test/support.py (initthuban): Install a dummy translation
1287            function so that importing Thuban.UI doesn't install a wx specific
1288            one for which would need to import wxPython
1289    
1290    2003-10-27  Bernhard Herzog  <[email protected]>
1291    
1292            * HOWTO-Release: Source archives should be created first and the
1293            binary packages should be created from the source archives.
1294            There's an official debian package now so there's no need to test
1295            the rpm on debian anymore
1296    
1297    2003-10-27  Bernhard Herzog  <[email protected]>
1298    
1299            Several rendering changes:
1300    
1301             - Render the selection into a separate bitmap so that only that
1302               bitmap needs to be redrawn when the selection changes
1303    
1304             - Render incrementally showing previews and allowing interaction
1305               before rendering is complete
1306    
1307             - Update the renderer interface a bit. Most parameters of
1308               RenderMap are now parameters of the constructor
1309    
1310            * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
1311            and the update region as parameters. Update the doc-string
1312            (BaseRenderer.render_map_incrementally): New. Generator function
1313            to renders the map incrementally
1314            (BaseRenderer.render_map): Remove the map argument (it's now in
1315            the constructor) and simply iterate over the
1316            render_map_incrementally generator to draw the map.
1317            (BaseRenderer.draw_shape_layer_incrementally)
1318            (BaseRenderer.draw_shape_layer): Renamed to
1319            draw_shape_layer_incrementally and changed into a generator that
1320            yields True every 500 shapes. Used by render_map_incrementally to
1321            render shape layers incrementally
1322    
1323            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
1324            map and region parameters which are now in the constructor
1325            (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
1326            the inherited render_map_incrementally.
1327            (BaseRenderer.draw_shape_layer): Removed.
1328            (ScreenRenderer.draw_selection_incrementally): New. The selection
1329            drawing part of the removed draw_shape_layer as a generator
1330            (ScreenRenderer.layer_shapes): Update because of the region
1331            parameter change
1332            (ExportRenderer.__init__): New. Extend the inherited constructor
1333            with the destination region for the drawing
1334            (ExportRenderer.RenderMap): Removed the map and region parameters
1335            which are now in the constructor
1336    
1337            * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
1338            bitmap suitable for a preview in a tool
1339            (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
1340            bitmap
1341            (MapPrintout.draw_on_dc): Adapt to new renderer interface
1342            (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
1343            exists
1344            (MapCanvas.OnIdle): Update the logic to deal with incremental
1345            rendering and the selection bitmap
1346            (MapCanvas._do_redraw): Handle the instantiation of the render
1347            iterator and the redraws during rendering
1348            (MapCanvas._render_iterator): New. Generator to incrementally
1349            redraw both bitmaps
1350            (MapCanvas.Export): Adapt to new renderer interface.
1351            (MapCanvas.full_redraw): Reset the selection bitmap and the
1352            renderer iterator too
1353            (MapCanvas.redraw_selection): New. Force a redraw of the selection
1354            bitmap
1355            (MapCanvas.shape_selected): Only redraw the selection bitmap
1356    
1357            * test/test_baserenderer.py
1358            (TestBaseRenderer.test_polygon_no_projection)
1359            (TestBaseRenderer.test_raster_no_projection)
1360            (TestBaseRenderer.test_point_map_projection)
1361            (TestBaseRenderer.test_point_layer_and_map_projection)
1362            (TestBaseRenderer.test_point_layer_projection)
1363            (TestBaseRenderer.test_point_with_classification): Adapt to new
1364            renderer interface
1365    
1366    2003-10-24  Bernhard Herzog  <[email protected]>
1367    
1368            * libraries/thuban/wxproj.cpp (draw_polygon_shape)
1369            (point_in_polygon_shape, shape_centroid): Raise an exception if
1370            the shape can't be read. Previously invalid shape ids would lead
1371            to a segfault.
1372    
1373            * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
1374            New. test whether an exception is raised for invalid shape ids
1375    
1376    2003-10-24  Jan-Oliver Wagner <[email protected]>
1377    
1378            * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
1379            as alias for 'latlong'.
1380    
1381            * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
1382            as alias for 'latlong'.
1383    
1384    2003-10-24  Jan-Oliver Wagner <[email protected]>
1385    
1386            * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
1387            the projection even for the UnknownPanel.
1388            (UnknownProjPanel.__init__): Define the text and create the textctrl
1389            widget.
1390            (UnknownProjPanel._DoLayout): Replaced static text widget by the
1391            textctrl created in __init__.
1392            (UnknownProjPanel.SetProjection): Set the text for the text ctrl
1393            including the parameters of the projection.
1394            
1395    2003-10-24  Jan-Oliver Wagner <[email protected]>
1396    
1397            * Resources/Projections/epsg.proj: New. This is a list of
1398            EPSG codes with parameters for proj. The list has been
1399            generated using devtools/create_epsg.py based on the
1400            file nad/epsg of the proj 4.4.7 package. Four projection
1401            definitions have been deleted as they are not accepted by proj:
1402            "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
1403            and "HD72 / EOV".
1404    
1405    2003-10-22  Bernhard Herzog  <[email protected]>
1406    
1407            Some more tweaks to the projection dialog which should fix RT
1408            #1886.
1409    
1410            * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
1411            the ProjFile's messages and call the base class methods correctly
1412            (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
1413            flag on the newly selected item too. Otherwise some other item is
1414            focused and the first time the focus is moved with the keyboard
1415            the selection moves in unexpected ways.
1416    
1417            * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
1418            focus on the OK button, only on the projection list. That way the
1419            list really has the focus initially
1420            (ProjFrame.OnClose): Call the projection list's Destroy method to
1421            make it unsubscribe all messages
1422    
1423    2003-10-21  Bernhard Herzog  <[email protected]>
1424    
1425            Rework the projection dialog to fix a few bugs, including RT 2166
1426            and most of 2168
1427    
1428            * Thuban/UI/projlist.py: New. The class ProjectionList is a
1429            special wxListCtrl to show a list of projections in a more MVC
1430            fashion
1431    
1432            * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
1433            throughout the class. The main change is to use the ProjectionList
1434            class instead of a normal wxListBox. Also, add an explicit
1435            "Unknown" projection to the projection choice control.
1436            (ProjPanel.__init__): Add an "unknown" ellipsoid
1437            (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
1438            instantiation of the panel's controls to make the tab-order more
1439            natural
1440    
1441    2003-10-21  Bernhard Herzog  <[email protected]>
1442    
1443            * test/test_load.py (TestSingleLayer.file_contents)
1444            (TestSingleLayer.test): Add non-ascii characters to the titles of
1445            session, map and layer. This is effectively a port of the
1446            TestUnicodeStrings test in test_load_0_8.py which for some reason
1447            was only added there.
1448    
1449            * test/test_load_0_9.py (TestSingleLayer.file_contents)
1450            (TestSingleLayer.test): Same as in test_load.py: add non-ascii
1451            characters to the titles of session, map and layer,.
1452    
1453    2003-10-21  Bernhard Herzog  <[email protected]>
1454    
1455            Add EPSG projection handling to .thuban files
1456    
1457            * test/test_save.py (SaveSessionTest.dtd)
1458            (SaveSessionTest.testEmptySession)
1459            (SaveSessionTest.testLayerProjection)
1460            (SaveSessionTest.testRasterLayer)
1461            (SaveSessionTest.testClassifiedLayer)
1462            (SaveSessionTest.test_dbf_table)
1463            (SaveSessionTest.test_joined_table)
1464            (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
1465            (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
1466            use a and epsg projection to test saving them
1467    
1468            * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
1469            namespace
1470            (TestLayerVisibility.file_contents, TestLabels.file_contents)
1471            (TestLayerProjection.file_contents)
1472            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1473            (TestPostGISLayer.file_contents)
1474            (TestPostGISLayerPassword.file_contents)
1475            (TestLoadError.file_contents, TestLoadError.test): Update to use
1476            1.0-dev namespace
1477            (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
1478            use 1.0-dev namespace and use an EPSG projection to test whether
1479            loading it works
1480    
1481            * test/test_load_0_9.py: New. Effectively a copy of test_load.py
1482            as of Thuban 0.9. These are now tests to determine whether Thuban
1483            can still read files generated by Thuban 0.9
1484    
1485            * Thuban/Model/save.py (SessionSaver.write)
1486            (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
1487            namespace
1488            (SessionSaver.write_projection): Write the projection's epsg
1489            attribute
1490    
1491            * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
1492            thuban-1.0-dev.dtd namespace
1493            (SessionLoader.check_attrs): Allow a callable object as conversion
1494            too
1495            (SessionLoader.start_projection, SessionLoader.end_projection)
1496            (SessionLoader.start_parameter): Handle the epsg attribute and
1497            rename a few instance variables to lower case
1498    
1499            * Resources/XML/thuban-1.0.dtd: New. Only difference to
1500            thuban-0.9.dtd is the epsg attribute for projections.
1501    
1502    2003-10-21  Bernhard Herzog  <[email protected]>
1503    
1504            * test/runtests.py (main): Let the user specify which tests to run
1505            on the command line
1506    
1507            * test/support.py (ThubanTestResult.getDescription): Override to
1508            give a better short description. The description can be used as a
1509            parameter to run_tests to run that particular test in isolation.
1510    
1511    2003-10-21  Frank Koormann   <[email protected]>
1512    
1513            Popup menu for legend. Scheduled for the 1.2 release this was too
1514            simple to implement: The popup menu is bound to the legend tree, while
1515            the events are hanlded by its anchestor, the legend panel. This
1516            allows reuse of all the event handlers already implemented for the
1517            legend toolbar buttons.
1518    
1519            * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
1520            to add handlers for the events issued by the popup menu.
1521            (LegendPanel._OnToggleVisibility): Handler for toggling layer
1522            visibility event
1523            (LegendPanel._OnProjection): Handler for layer projection event.
1524            (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
1525            (LegendTree._OnRightClick): Event handler for right click, select item
1526            and pop up menu.
1527            (LegendTree.ToggleVisibility): Toggle layer visibility
1528            (LegendTree.LayerProjection): Raise layer projection dialog for
1529            current layer.
1530    
1531    2003-10-21  Bernhard Herzog  <[email protected]>
1532    
1533            * Resources/Projections/defaults.proj: Use correct DOCTYPE
1534            declaration. The top-level element is projectionlist not projfile
1535    
1536    2003-10-20  Bernhard Herzog  <[email protected]>
1537    
1538            * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
1539            method to write a projfile and display a busy cursor and error
1540            dialogs.
1541            (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
1542            (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
1543            (ProjFrame.__FillAvailList): Translate "<None>" too and display a
1544            busy cursor while loading the user and system prj files.
1545    
1546    2003-10-16  Bernhard Herzog  <[email protected]>
1547    
1548            * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
1549            ProjFile objects
1550            (clear_proj_file_cache): New function to clear the cache. Mainly
1551            useful for use by the test suite
1552            (read_proj_file): Use the cache.
1553    
1554            * test/test_proj.py (TestProjFile): Clarify the doc-string
1555            (ProjFileReadTests): Update doc-string
1556            (ProjFileReadTests.test_get_system_proj_file): Check whether the
1557            system proj files is cached.
1558            (ProjFileLoadTestCase): New base class for the proj file tests
1559            derived from support.FileLoadTestCase to provide some common
1560            behavior.
1561            (TestLoadingProjFile)
1562            (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
1563            (TestProjFileWithInvalidParameters.file_contents): Derive from
1564            ProjFileLoadTestCase
1565            (TestLoadingProjFile.test_caching): New. Test whether the cache
1566            works
1567    
1568    2003-10-16      Silke Reimer    <[email protected]>
1569    
1570            * debian/*: New directory with configuration files for building a thuban
1571              deb-package.
1572    
1573    2003-10-14  Bernhard Herzog  <[email protected]>
1574    
1575            * test/test_proj.py: Execute support.run_tests when run as
1576            __main__ so that missing unsubscribes are detected
1577            (TestProjFile.tearDown): Destroy the proj_file properly
1578    
1579    2003-10-14  Bernhard Herzog  <[email protected]>
1580    
1581            * Thuban/Model/messages.py (PROJECTION_ADDED)
1582            (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
1583            the ProjFile objects
1584    
1585            * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
1586            easily send messages when the projections change
1587            (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
1588            when the change was successful
1589    
1590            * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
1591            proj file messages
1592            (TestProjFile.test_add_remove)
1593            (TestProjFile.test_remove_non_existing)
1594            (TestProjFile.test_replace)
1595            (TestProjFile.test_replace_non_existing): Test whether the right
1596            messages are sent
1597    
1598    2003-10-14  Bernhard Herzog  <[email protected]>
1599    
1600            * test/test_proj.py (TestProjFile.test): Refactor into several
1601            tests
1602            (TestProjFile.test_add_remove)
1603            (TestProjFile.test_remove_non_existing)
1604            (TestProjFile.test_replace)
1605            (TestProjFile.test_replace_non_existing): Some of the new
1606            individual test cases
1607            (TestProjFileSimple): New class for the rest of the test cases
1608            that came out of the refactoring
1609            (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
1610            derived classes don't have to
1611    
1612    2003-10-13  Bernhard Herzog  <[email protected]>
1613    
1614            Add an optional EPSG code to the projection objects and extend the
1615            .proj file format accordingly.
1616    
1617            * Resources/XML/projfile.dtd (element projection): Add epsg
1618            attribute
1619    
1620            * Thuban/Model/proj.py (Projection.__init__): New parameter and
1621            instance variable epsg. Update doc-string
1622            (Projection.EPSGCode, Projection.Label): New methods to provide
1623            access to EPSG code and a label for use in dialogs
1624    
1625            * Thuban/Model/resource.py (ProjFileReader.start_projection)
1626            (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
1627            Handle the epsg code attribute when reading or writing proj files
1628    
1629            * Thuban/UI/projdialog.py (ProjFrame._OnSave)
1630            (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
1631            (ProjFrame.__FillAvailList): Use the projection's Label method to
1632            get the string for the list box
1633    
1634            * test/test_proj.py (TestProjection.test_label)
1635            (TestProjection.test_label_epsg)
1636            (TestProjection.test_epsgcode_for_non_epsg_projection)
1637            (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
1638            for the label and EPSGCode methods
1639            (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
1640            (WriteProjFileTests.test_write_empty_file): Create the ProjFile
1641            objects in the test cases and put the expected contents into the
1642            test case methods too. Update doTestWrite accordingly
1643            (TestLoadingProjFile)
1644            (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
1645            read tests from TestProjFile.
1646            (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
1647            tests are now in the new classes.
1648            (sample_projfile, sample_projfile_data)
1649            (sample_projfile2, sample_projfile_data2): Removed. Not used
1650            anymore.
1651            (TestProjFile.test_read_unreadable_file): No need to reset the
1652            permissions at the end anymore since we use a unique filename
1653    
1654    2003-10-13  Bernhard Herzog  <[email protected]>
1655    
1656            * test/test_proj.py: Some more refactoring of the test cases
1657            (ProjFileTest): New base class for the proj file tests.
1658            (TestProjFile): Derive from ProjFileTest
1659            (TestProjFile.test_read_unreadable_file)
1660            (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
1661            the new filename method to get a unique filename
1662            (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
1663            (WriteProjFileTests): New class for proj file write tests.
1664            Contains the write test that were in TestProjFile originally.
1665    
1666    2003-10-13  Bernhard Herzog  <[email protected]>
1667    
1668            * test/test_proj.py (TestProjFile.testRead)
1669            (TestProjFile.test_read_non_existing_file)
1670            (TestProjFile.test_read_unreadable_file)
1671            (TestProjFile.test_read_empty_file): Split into several methods.
1672    
1673    2003-10-10  Bernhard Herzog  <[email protected]>
1674    
1675            * Thuban/UI/sizers.py: New file with custom sizers.
1676    
1677            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
1678            all projection type specific panels and put them into a
1679            NotebookLikeSizer. This way the dialog doesn't change its size
1680            when a different projection is selected
1681            (ProjFrame.__init__): Rename projection_panels
1682            projection_panel_defs and reuse projection_panels for a list of
1683            the instantiated panels.
1684            (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
1685            (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
1686            the panels
1687            (UnknownProjPanel._DoLayout): Place the newlines in the message
1688            differently to make the panel narrower.
1689            (TMPanel._DoLayout): Layout the parameters in one column.
1690    
1691    2003-10-10  Bernhard Herzog  <[email protected]>
1692    
1693            * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
1694            that contains all the setup for the dialog's widgets, layout and
1695            event handling.
1696            (__): Call build_dialog to build the dialog.
1697            (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
1698            Their functionality is now in build_dialog
1699            (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
1700            (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
1701            (ProjFrame.__DoOnProjChoice): Small updates due to slightly
1702            different widget names and hierarchy introduced with build_dialog.
1703    
1704    2003-10-10  Bernhard Herzog  <[email protected]>
1705    
1706            * README: Fix typo.
1707    
1708    2003-10-09  Bernhard Herzog  <[email protected]>
1709    
1710            * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
1711            projection is already in the list. This is *a lot* faster when
1712            loading files with hundreds of projections since it saves a linear
1713            search. OTOH this will allow adding the same projection to the
1714            user.proj file multiple times in the projection dialog but we'll
1715            deal with that later
1716    
1717    2003-10-09  Jan-Oliver Wagner <[email protected]>
1718    
1719            * devtools: New. Directory for developer tools that are not intended
1720            for the regular user.
1721    
1722            * devtools/create_epsg.py: New. Convert the epsg file of proj into
1723            a python .proj file.
1724    
1725    2003-10-09  Bernhard Herzog  <[email protected]>
1726    
1727            * test/test_proj.py
1728            (TestProjection.test_get_parameter_without_equals_sign): New. Test
1729            whether GetParameter handles parameters without "=" sign correctly
1730    
1731            * Thuban/Model/proj.py (Projection.GetParameter): Handle
1732            parameters that do not contain a "=". Update the doc-string
1733    
1734    2003-10-08  Bernhard Herzog  <[email protected]>
1735    
1736            * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
1737            length limit on the projname text control
1738    
1739    2003-10-08  Bernhard Herzog  <[email protected]>
1740    
1741            * test/test_proj.py (TestProjection.test_get_projection_units_geo)
1742            (TestProjection.test_get_projection_units_normal): New. Tests for
1743            the Projection.GetProjectedUnits method
1744    
1745    2003-10-08  Jan-Oliver Wagner <[email protected]>
1746    
1747            * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
1748            Added missing 'val' parameter.
1749    
1750    2003-10-08  Bernhard Herzog  <[email protected]>
1751    
1752            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
1753            projection type of the currently selected projection is not known,
1754            i.e. there's no panel for it, use the UnknownProjPanel
1755            (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
1756            the actual replacing of the proj panel into the new method
1757            _show_proj_panel.
1758            (UnknownProjPanel): Add doc-string.
1759            (UnknownProjPanel._DoLayout): Insert a newline into the text so
1760            that the panel is not so wide.
1761    
1762    2003-10-08  Bernhard Herzog  <[email protected]>
1763    
1764            * Thuban/Model/resource.py (read_proj_file): Return the warnings
1765            too. Update the doc-string
1766            (get_proj_files): Removed. It wasn't used anywhere
1767            (get_system_proj_files, get_system_proj_file): Rename to
1768            get_system_proj_file and return the ProjFile object and not a list
1769            of ProjFile objects. Update the callers.
1770            (get_user_proj_files, get_user_proj_file): Rename to
1771            get_user_proj_file return the ProjFile object and not a list of
1772            ProjFile objects. Update the callers.
1773            (ProjFileReader.__init__): New instance variable for the warnings.
1774            Rename the __pf ivar to projfile. Update the methods referring to
1775            __pf
1776            (ProjFileReader.end_projection): Catch any errors raised when
1777            instantiating the projection and record that as an error. The
1778            projection will not be in the final ProjFile object.
1779            (ProjFileReader.GetWarnings): New method to return the warnings.
1780    
1781            * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
1782            show the warnings from the projfile reader
1783            (ProjFrame._OnImport): Deal with any warnings returned by
1784            read_proj_file
1785            (ProjFrame.__FillAvailList): Deal with any warnings returned by
1786            get_system_proj_file or get_user_proj_file.
1787    
1788            * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
1789            (TestProjFileWithInvalidParameters.file_contents): New test cases
1790            to test whether read_proj_file handles invalid projection
1791            parameters correctly
1792            (TestProjFile.test_get_system_proj_file): New. Simple test for
1793            resource.get_system_proj_file
1794    
1795    2003-10-07  Bernhard Herzog  <[email protected]>
1796    
1797            * test/test_derivedshapestore.py
1798            (TestDerivedShapeStoreExceptions.tearDown): Clear the session
1799            properly so that the temporary directories get deleted correctly
1800    
1801    2003-10-06  Bernhard Herzog  <[email protected]>
1802    
1803            Handle the title changes in a proper MVC way.
1804    
1805            * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
1806            canvas' TITLE_CHANGED messages
1807            (MainWindow.update_title): New. Update the main window's title
1808            (MainWindow.__SetTitle): Removed. Use update_title instead.
1809            (MainWindow.SetMap): Use update_title instead of __SetTitle
1810            (MainWindow.RenameMap): Do change the window title explicitly
1811            here. That's handled in a proper MVC way now.
1812            (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
1813            messages
1814    
1815            * Thuban/Lib/connector.py (Conduit): New class to help classes
1816            that forward messages
1817    
1818            * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
1819            (ViewPort): Derive from Conduit instead of Publisher
1820            (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
1821            when calling the inherited versions
1822            (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
1823            methods to subscribe and unsubscribe map messages
1824            (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
1825            handle the map subscriptions
1826            (ViewPort.Map, ViewPort.map_projection_changed)
1827            (ViewPort.layer_projection_changed): Add or update doc-strings
1828    
1829            * test/test_connector.py (TestPublisher.test_issue_simple): Fix
1830            typo
1831            (MyConduit): Helper class for the Conduit test.
1832            (TestConduit): Test cases for Conduit
1833    
1834            * test/test_connector.py: Use support.run_tests as main.
1835    
1836            * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
1837            the TITLE_CHANGED messages
1838            (ViewPortTest.test_forwarding_title_changed): New test to check
1839            whether the viewport forwards the map's TITLE_CHANGED messages
1840            (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
1841            after the port's because the latter may require a still functional
1842            map.
1843    
1844    2003-10-06  Bernhard Herzog  <[email protected]>
1845    
1846            * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
1847            doc-string
1848    
1849    2003-10-06  Bernhard Herzog  <[email protected]>
1850    
1851            * test/test_viewport.py (ViewPortTest.setUp)
1852            (SimpleViewPortTest.test_init_with_size): Move the test for the
1853            initial size as a constructor parameter from ViewPortTest.setUp
1854            method to a new separate test in SimpleViewPortTest.
1855    
1856    2003-10-06  Bernhard Herzog  <[email protected]>
1857    
1858            * test/test_viewport.py (MockView): New class derived from
1859            ViewPort with a mock implementation of GetTextExtent to be used in
1860            the test cases
1861            (ViewPortTest.setUp): Use MockView instead of ViewPort
1862    
1863            * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
1864            into what would be a "pure virtual function" in C++: always raise
1865            NotImplementedError. Mock implementations for test cases don't
1866            belong into the real code
1867    
1868    2003-10-02  Bernhard Herzog  <[email protected]>
1869    
1870            * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
1871            close the dbf file we create so that it's contents have been
1872            written properly.
1873    
1874            * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
1875            libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
1876            Update to shapelib 1.2.10
1877    
1878    2003-10-01  Jan-Oliver Wagner <[email protected]>
1879    
1880            * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
1881            it annoys lintian which warns about these files not being
1882            executable. The #! isn't necessary here since if you absolutely
1883            must execute them you can always say "python <filename>".
1884    
1885    2003-09-26  Bernhard Herzog  <[email protected]>
1886    
1887            * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
1888            only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
1889            is ported to a newer the import will fail, so it should be noticed
1890            immediately that this function is gone.
1891            Fixes RT#1919
1892    
1893    2003-09-26  Bernhard Herzog  <[email protected]>
1894    
1895            Add a DTD for the projection files and make thuban write valid
1896            projection files
1897    
1898            * Resources/XML/projfile.dtd: New. DTD for thuban's projection
1899            files
1900    
1901            * Thuban/Model/resource.py (ProjFileSaver.write): Use
1902            'projectionlist' as the name in the document type declaration so
1903            that it matches the element type of the root element.
1904    
1905            * test/test_proj.py (sample_projfile, sample_projfile2): Use
1906            'projectionlist' as the name in the document type declaration just
1907            as it is done now in the files thuban would write
1908            (sample_projfile, sample_projfile_data): Fix spelling of
1909            "Mercator"
1910            (TestProjFile.doTestWrite): Validate the written and the expected
1911            XML data
1912            (TestProjFile): Derive from ValidationTest so that we can run xml
1913            validation tests
1914    
1915    2003-09-24  Bernhard Herzog  <[email protected]>
1916    
1917            * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
1918            modify the list returned by map.Layers() in place since it is the
1919            actual list of layers used by the map.
1920    
1921    2003-09-23  Jan-Oliver Wagner <[email protected]>
1922    
1923            * Doc/manual/thuban-manual.xml: Added subsection to chapter
1924            Extensions to describe the extensions coming with the Thuban
1925            standard package (gns2shp and importAPR).
1926    
1927    2003-09-23  Bernhard Herzog  <[email protected]>
1928    
1929            * libraries/thuban/wxproj.cpp (project_point): if there's an
1930            inverse but no forward projection, convert to degrees after
1931            applying the inverse projection. Fixes RT#2096
1932    
1933            * test/test_wxproj.py: New. Test cases for wxproj.so. One test
1934            implicitly tests for the fix to RT#2096
1935    
1936            * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
1937            Check that the sequences have the same lengths
1938    
1939            * Resources/Projections/defaults.proj (Geographic projection): Use
1940            a much more precise value for the to_meter attribute.
1941    
1942    2003-09-22  Bernhard Herzog  <[email protected]>
1943    
1944            * test/support.py (initthuban): Make sure to unset the LANG env.
1945            var. so that tests that compare translated strings work. Solves RT
1946            #2094
1947    
1948    2003-09-22  Jan-Oliver Wagner <[email protected]>
1949    
1950            Small improvement of APR import.
1951    
1952            * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
1953            Added tests for text-ranges.
1954    
1955            * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
1956            returns a string object if the range is based on text.
1957    
1958            * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
1959            range retrieval.
1960    
1961    2003-09-22  Jan-Oliver Wagner <[email protected]>
1962    
1963            Initial version of the importAPR extension which is in
1964            experimental state.
1965    
1966            * /Extensions/importAPR/, /Extensions/importAPR/samples/,
1967            /Extensions/importAPR/test/: New directories.
1968    
1969            * /Extensions/importAPR/samples/README: New: Howto load the samples.
1970    
1971            * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
1972            file which refers to the Thuban Iceland demo data.
1973    
1974            * /Extensions/importAPR/test/README: New: Howto execute the tests.
1975    
1976            * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
1977    
1978            * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
1979            as in '.apr'-files.
1980    
1981            * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
1982            ODB Objects as in '.apr', '.avl' and other files.
1983    
1984            * /Extensions/importAPR/__init__.py: New: Init to make this
1985            directory a package.
1986    
1987            * /Extensions/importAPR/importAPR.py: New: Import a ArcView
1988            project file (.apr) and convert it to Thuban.
1989    
1990    2003-09-22  Jan-Oliver Wagner <[email protected]>
1991    
1992            * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
1993    
1994    2003-09-19  Jan-Oliver Wagner <[email protected]>
1995    
1996            * Doc/manual/thuban-manual.xml: Extended section 'Installation'
1997            with description on RPM installation and RPM binary package
1998            creation.
1999    
2000    2003-09-18  Bernhard Herzog  <[email protected]>
2001    
2002            * setup.py (data_files): Only add the mo files if the Locales
2003            directory actually exists, so that setup.py works with a fresh CVS
2004            checkout
2005    
2006    2003-09-12  Jan-Oliver Wagner <[email protected]>
2007    
2008            * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
2009            in viewport, not anymore in view
2010    
2011    2003-09-04  Jan-Oliver Wagner <[email protected]>
2012    
2013            Introducing first Extension (gns2shp).
2014    
2015            * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
2016    
2017            * Extensions/__init__.py: New. init to make this dir a package.
2018    
2019            * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
2020    
2021            * Extensions/gns2shp/test/README: New. some info on this test directory.
2022    
2023            * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
2024    
2025            * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
2026            of Shapefile from GNS text file format
2027    
2028    2003-09-03  Jan-Oliver Wagner <[email protected]>
2029    
2030            Fix/workaround for bug #2019:
2031            https://intevation.de/rt/webrt?serial_num=2019
2032    
2033            * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
2034            (IdentifyView.__init__): Added another button that allows to
2035            stop the identify mode.
2036            (IdentifyView.OnStop): New. Stops the identify mode.
2037    
2038    2003-09-03  Jan-Oliver Wagner <[email protected]>
2039    
2040            Introducing a new exception dialog that allows to exit the
2041            application immediately.
2042            This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
2043    
2044            * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
2045    
2046            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2047            Made strings available to translations. Exchanged the simple
2048            ScrolledMessageDialog by the new ExceptionDialog.
2049    
2050    2003-09-01  Bernhard Herzog  <[email protected]>
2051    
2052            * NEWS: New. Summary of changes and release notes.
2053    
2054            * MANIFEST.in: Add NEWS
2055    
2056    2003-09-01  Bernhard Herzog  <[email protected]>
2057    
2058            * MANIFEST.in: Correct the include statement for the mo-files and
2059            include the documentation too.
2060    
2061            * setup.py (data_files): Add the .mo files
2062            (setup call): Up to version 0.9.0
2063    
2064    2003-09-01  Bernhard Herzog  <[email protected]>
2065    
2066            * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
2067            parameter list to just parent and session
2068            (ChooseDBTableDialog.__set_properties): Removed. Setting the
2069            selection of empty list boxes is not allowed (and produces C++
2070            assertion errors) and the rest of the setup is better done in
2071            __init__ anyway.
2072            (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
2073            (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
2074            builtins True/False for booleans to avoid warnings from wxPython
2075    
2076            * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
2077            ChooseDBTableDialog constructor parameters.
2078    
2079    2003-09-01  Bernhard Herzog  <[email protected]>
2080    
2081            * Thuban/Model/postgisdb.py
2082            (PostGISTable): Extend doc-string
2083            (PostGISTable._fetch_table_information): Set the column index
2084            correctly, pretending ignored columns don't exist.
2085    
2086            * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
2087            for postgis tables with data types not yet supported by thuban.
2088    
2089    2003-08-29  Bernhard Herzog  <[email protected]>
2090    
2091            * HOWTO-Release: Tweak item about running the tests.
2092    
2093    2003-08-29  Jan-Oliver Wagner <[email protected]>
2094    
2095            * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
2096    
2097    2003-08-29  Bernhard Herzog  <[email protected]>
2098    
2099            Add some missing parameters to projections. Proj complains about
2100            them on windows but for some reason not on Linux.
2101    
2102            * test/test_save.py (SaveSessionTest.testLayerProjection): Add
2103            missing required projection parameters
2104    
2105            * test/test_proj.py (TestProjFile.test): Add missing required
2106            projection parameters
2107    
2108            * test/test_load_0_8.py (TestLayerProjection.file_contents)
2109            (TestLayerProjection.test): Add missing required projection
2110            parameters and tests for them
2111    
2112            * test/test_load.py (TestLayerProjection.file_contents)
2113            (TestLayerProjection.test): Add missing required projection
2114            parameters and tests for them
2115    
2116            * test/test_layer.py (TestLayer.test_base_layer): Add missing
2117            required projection parameters
2118    
2119    2003-08-29  Bernhard Herzog  <[email protected]>
2120    
2121            * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
2122            access the pj_errno because directly accessing pj_errno doesn't
2123            work on windows if the proj library is in a DLL
2124    
2125            * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
2126    
2127    2003-08-28  Bernhard Herzog  <[email protected]>
2128    
2129            * test/test_proj.py: Import things from Thuban after calling
2130            initthuban
2131    
2132            * test/test_load.py (LoadSessionTest.filenames): New class
2133            variable with the filename attributes to normalize
2134            (LoadSessionTest.check_format): Pass self.filenames to
2135            sax_eventlist to normalize the filename attributes
2136    
2137            * test/xmlsupport.py: Add cvs keywords
2138            (SaxEventLister.__init__): New parameter filenames which indicates
2139            attributes that contain filenames
2140            (SaxEventLister.startElementNS): Normalize the filename attributes
2141            with os.path.normpath
2142            (sax_eventlist): New parameter filenames to pass through to
2143            SaxEventLister
2144    
2145            * test/test_derivedshapestore.py: Make this file callable as a
2146            program to execute the tests
2147            (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
2148            the session to self.session so that it gets destroyed properly
2149    
2150            * test/test_layer.py (TestLayer.tearDown): Call the session's
2151            Destroy method
2152    
2153            * test/test_map.py (TestMapBase.tearDown): Destroy self.session
2154            too if it exists
2155            (TestMapAddLayer.test_add_layer): Bind the session to self.session
2156            so that it gets destroyed properly
2157    
2158            * test/postgissupport.py (reason_for_not_running_tests): Add a
2159            test for the existence of popen2.Popen4.
2160    
2161            * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
2162            reliable way to destroy the sessions created in the test cases
2163            (SaveSessionTest.test_dbf_table): Bind the session to self.session
2164            so that it gets destroyed properly
2165            (SaveSessionTest.testLayerProjection): Bind the session to
2166            self.session so that it gets destroyed properly
2167    
2168            * test/test_session.py (UnreferencedTablesTests.tearDown): Make
2169            sure that the session is destroyed properly
2170    
2171            * test/test_shapefilestore.py: Make this callable as a program to
2172            execute the tests
2173    
2174            * test/test_scalebar.py: Remove unnecessary import of _ from
2175            Thuban
2176    
2177            * test/support.py (print_garbage_information): Call initthuban
2178            here because it may be called indirectly from test cases that test
2179            test support modules which do not use anything from thuban itself
2180            (ThubanTestProgram.runTests): Remove unnecessary debug print
2181    
2182    2003-08-28  Bernhard Herzog  <[email protected]>
2183    
2184            * Thuban/version.py (longversion): Update to 0.9
2185    
2186            * Thuban/UI/mainwindow.py: Remove some unused imports
2187    
2188            * README: Add section about required additional software. Add date
2189            and revision CVS keywords
2190    
2191            * HOWTO-Release: Add item about the translations. Add date and
2192            revision CVs keywords and change formatting to match README a bit
2193            better
2194    
2195            * po/de.po: Update for 0.9
2196    
2197            * test/README: Tweak the wording a little because many tests are
2198            not really unittest.
2199    
2200    2003-08-27  Bernhard Herzog  <[email protected]>
2201    
2202            As preparation for the 0.9 release, switch thuban files to a
2203            non-dev namespace
2204    
2205            * Thuban/Model/save.py (SessionSaver.write_session): Write files
2206            with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
2207            namespace
2208    
2209            * Thuban/Model/load.py (SessionLoader.__init__): Accept the
2210            http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
2211    
2212            * test/test_save.py (SaveSessionTest.dtd)
2213            (SaveSessionTest.testEmptySession)
2214            (SaveSessionTest.testSingleLayer)
2215            (SaveSessionTest.testLayerProjection)
2216            (SaveSessionTest.testRasterLayer)
2217            (SaveSessionTest.testClassifiedLayer)
2218            (SaveSessionTest.test_dbf_table)
2219            (SaveSessionTest.test_joined_table)
2220            (SaveSessionTest.test_save_postgis): Update for new namespace
2221    
2222            * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
2223            (TestLayerVisibility.file_contents, TestLabels.file_contents)
2224            (TestLayerProjection.file_contents)
2225            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2226            (TestPostGISLayer.file_contents)
2227            (TestPostGISLayerPassword.file_contents)
2228            (TestLoadError.file_contents, TestLoadError.test): Update for new
2229            namespace
2230    
2231    2003-08-27  Bernhard Herzog  <[email protected]>
2232    
2233            Make the table interface distinguish between row ids (an integer
2234            that uniquely identifies a row) and row ordinals (a simple row
2235            count from 0 to NumRows() - 1)
2236    
2237            * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
2238            (PostGISTable.RowOrdinalToId): New methods to conver between row
2239            ids and row ordinals
2240            (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
2241            parameter row_is_ordinal to indicate whether the row parameter is
2242            the row id or the ordinal
2243    
2244            * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
2245            (TransientTableBase.RowOrdinalToId)
2246            (AutoTransientTable.RowIdToOrdinal)
2247            (AutoTransientTable.RowOrdinalToId): Same new methods as in
2248            PostGISTable.
2249            (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
2250            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
2251            Same new parameter as in PostGISTable.
2252    
2253            * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
2254            (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
2255            (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
2256            (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
2257            (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
2258            parameter as in PostGISTable.
2259    
2260            * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
2261            (DataTable.RowOrdinalToId): New methods to convert between row ids
2262            and row ordinals.
2263            (TableGrid.SelectRowById): New method to select a row based on its
2264            ID as opposed to its ordinal
2265            (DataTable.GetValue, TableGrid.OnRangeSelect)
2266            (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
2267            (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
2268            (LayerTableFrame.__init__): Convert between row ids and row
2269            ordinals as appropriate
2270    
2271            * test/postgissupport.py (PostGISDatabase.__init__): Add
2272            doc-string.
2273            (PostGISDatabase.initdb): The optional third item in a tuple in
2274            tables is now a (key, value) list with additional arguments to
2275            pass to upload_shapefile
2276            (upload_shapefile): New parameter gid_offset to allow gids that
2277            are not the same as the shapeids in the shapefile
2278            (PostgreSQLServer.get_default_static_data_db): Use the new
2279            gid_offset to make the gids in landmarks 1000 higher than the
2280            shapeids in the shapefile
2281    
2282            * test/test_viewport.py
2283            (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
2284            new shapeids in the landmarks table
2285    
2286            * test/test_transientdb.py
2287            (TestTransientTable.run_iceland_political_tests)
2288            (TestTransientTable.test_transient_joined_table): Add tests for
2289            the new table methods and new keywords arguments.
2290    
2291            * test/test_postgis_db.py
2292            (TestPostGISTable.test_read_row_as_dict_row_count_mode)
2293            (TestPostGISTable.test_read_value_row_count_mode)
2294            (TestPostGISTable.test_row_id_to_ordinal)
2295            (TestPostGISTable.test_row_oridnal_to_id): New test for the new
2296            table methods and the new arguments
2297            (TestPostGISShapestorePoint.test_shapes_in_region)
2298            (TestPostGISShapestorePoint.test_shape_raw_data)
2299            (TestPostGISShapestorePoint.test_shape_points)
2300            (TestPostGISShapestorePoint.test_shape_shapeid)
2301            (TestPostGISShapestorePoint.test_all_shapes)
2302            (TestPostGISTable.test_simple_query)
2303            (TestPostGISTable.test_simple_query)
2304            (TestPostGISTable.test_simple_query)
2305            (TestPostGISTable.test_read_value)
2306            (TestPostGISTable.test_read_row_as_dict): Adapt to the new
2307            shapeids in the landmarks table
2308    
2309            * test/test_memory_table.py
2310            (TestMemoryTable.test_read_row_as_dict_row_count_mode)
2311            (TestMemoryTable.test_read_value_row_count_mode)
2312            (TestMemoryTable.test_row_id_to_ordinal)
2313            (TestMemoryTable.test_row_oridnal_to_id): New test for the new
2314            table methods and the new arguments
2315    
2316            * test/test_dbf_table.py
2317            (TestDBFTable.test_read_row_as_dict_row_count_mode)
2318            (TestDBFTable.test_read_value_row_count_mode)
2319            (TestDBFTable.test_row_id_to_ordinal)
2320            (TestDBFTable.test_row_oridnal_to_id): New test for the new table
2321            methods and the new arguments
2322    
2323    2003-08-26  Bernhard Herzog  <[email protected]>
2324    
2325            * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
2326            more postgis specific but much faster method to get the bounding
2327            box
2328    
2329    2003-08-26  Bernhard Herzog  <[email protected]>
2330    
2331            * Thuban/Model/postgisdb.py (PostGISTable.Title)
2332            (PostGISShapeStore.AllShapes): Add these missing methods.
2333            (PostGISShapeStore.ShapesInRegion): No need to raise
2334            StopIteration. We can simply return
2335    
2336            * test/test_postgis_db.py (TestPostGISTable.test_title)
2337            (TestPostGISShapestorePoint.test_all_shapes): New tests for the
2338            new methods
2339    
2340    2003-08-25  Bernhard Herzog  <[email protected]>
2341    
2342            * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
2343    
2344            * test/test_postgis_db.py (PolygonTests): New class containing
2345            those tests from TestPostGISShapestorePolygon that can also be
2346            used to test MUTLIPOLYGON tables
2347            (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
2348            so derive from that
2349            (TestPostGISShapestoreMultiPolygon): New class with tests for
2350            MUTLIPOLYGON tables
2351    
2352            * test/postgissupport.py (PostGISDatabase.initdb): Allow the
2353            tables argument to have tuples with three items to override the
2354            WKT type used.
2355            (PostgreSQLServer.get_default_static_data_db): Use the above to
2356            create a polygon table with MUTLIPOLYGONs
2357            (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
2358            (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
2359            coords_to*
2360            (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
2361            (wkt_converter): New. Map WKT types to converters
2362            (upload_shapefile): New parameter force_wkt_type to use a
2363            different WKT type than the default
2364    
2365    2003-08-25  Bernhard Herzog  <[email protected]>
2366    
2367            * Thuban/UI/application.py
2368            (ThubanApplication.run_db_param_dialog): New. Suitable as a
2369            db_connection_callback. Main difference is that the dialog run
2370            from this method doesn't have a parent so it can be used even when
2371            there is no main window
2372            (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
2373            no db_connection_callback was given. This way the dialog pops up
2374            even when the .thuban file was given as a command line parameter.
2375    
2376    2003-08-25  Bernhard Herzog  <[email protected]>
2377    
2378            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
2379            before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
2380            which leads to an effectively frozen X session because the user
2381            can only interact with the dialog but the mouse is still grabbed
2382            by the canvas.
2383            Also, call the tool's Hide method before MouseLeftUp because
2384            MouseLeftUp may change the tool's coordinates.
2385    
2386    2003-08-25  Bernhard Herzog  <[email protected]>
2387    
2388            * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
2389            LoadCancelled exceptions and handle them by returning immediately.
2390    
2391    2003-08-25  Bernhard Herzog  <[email protected]>
2392    
2393            GUI part of loading sessions with postgis connections which may
2394            require user interaction to get passwords or updated parameters
2395    
2396            * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
2397            bit nucer and be more generic.
2398            (DBFrame.OnAdd): Adapt to new DBDialog interface
2399    
2400            * Thuban/UI/application.py (ThubanApplication.OpenSession): New
2401            optional parameter db_connection_callback which is passed to
2402            load_session.
2403    
2404            * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
2405            Suitable as a db_connection_callback
2406            (MainWindow.OpenSession): Use self.run_db_param_dialog as the
2407            db_connection_callback of the application's OpenSession method
2408    
2409    
2410    2003-08-25  Bernhard Herzog  <[email protected]>
2411    
2412            Basic loading of sessions containing postgis connections:
2413    
2414            * Thuban/Model/load.py (LoadError): Add doc-string
2415            (LoadCancelled): New exception class to indicate a cancelled load
2416            (SessionLoader.__init__): Add the db_connection_callback parameter
2417            which will be used by the loader to get updated parameters and a
2418            password for a database connection
2419            (SessionLoader.__init__): Add the new XML elements to the
2420            dispatchers dictionary
2421            (SessionLoader.check_attrs): Two new conversions, ascii to convert
2422            to a byte-string object and idref as a generic id reference
2423            (SessionLoader.start_dbconnection)
2424            (SessionLoader.start_dbshapesource): New. Handlers for the new XML
2425            elements
2426            (load_session): Add the db_connection_callback to pass through the
2427            SessionLoader
2428    
2429            * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
2430            New classes to test loading of sessions with postgis database
2431            connections.
2432    
2433    2003-08-25  Bernhard Herzog  <[email protected]>
2434    
2435            * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
2436            replace it and the comment with __BuildDate__ by the Source: and
2437            Id: cvs keywords as used in the other files.
2438    
2439    2003-08-25  Bernhard Herzog  <[email protected]>
2440    
2441            * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
2442            LoadError when a required attribute is missing. The code used to
2443            be commented out for some reason, but probably should have been
2444            active.
2445    
2446            * test/test_load.py (TestLoadError.test): Test the message in the
2447            LoadError too to make sure it really is about the missing
2448            attribute
2449    
2450    2003-08-22  Bernhard Herzog  <[email protected]>
2451    
2452            * test/test_save.py (SaveSessionTest.test_dbf_table)
2453            (SaveSessionTest.test_joined_table): Add XML validation tests.
2454    
2455    2003-08-22  Bernhard Herzog  <[email protected]>
2456    
2457            Implement saving a session with a postgis connection
2458    
2459            * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
2460            elements for database connections and shapestores using db
2461            connections
2462            (session): Add the dbconnections to the content model
2463    
2464            * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
2465            Write the db connections
2466            (SessionSaver.write_session): Call write_db_connections to write
2467            the connection before the data sources
2468            (SessionSaver.write_data_containers): Handle postgis shapestores
2469    
2470            * test/test_save.py (SaveSessionTest.thubanids)
2471            (SaveSessionTest.thubanidrefs): Update for new DTD
2472            (SaveSessionTest.test_save_postgis): New. Test saving a session
2473            with postgis connections
2474    
2475            * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
2476            (PostGISTable.TableName): New accessor methods for the connection
2477            and table name
2478    
2479            * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
2480            (TestPostGISTable.test_dbname): New methods to test the new
2481            PostGISConnection methods
2482    
2483    2003-08-22  Bernhard Herzog  <[email protected]>
2484    
2485            * Thuban/Model/postgisdb.py (ConnectionError): New exception class
2486            for exceptions occurring when establishing a Database connection
2487            (PostGISConnection.connect): Catch psycopg.OperationalError during
2488            connects and raise ConnectionError.
2489    
2490            * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
2491            tests for database exceptions
2492    
2493    2003-08-22  Bernhard Herzog  <[email protected]>
2494    
2495            Prepare the test suite for tests with required authentication
2496    
2497            * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
2498            variables with two predefined users/passwords, one for the admin
2499            and one for a non-privileged user.
2500            (PostgreSQLServer.createdb): Pass the admin name to initdb and add
2501            the non-privileged user to the database and set the admin password
2502            (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
2503            Better error reporting
2504            (PostgreSQLServer.connection_params)
2505            (PostgreSQLServer.connection_string): New methods to return
2506            information about how to connect to the server
2507            (PostgreSQLServer.execute_sql): New. Convenience method to execute
2508            SQL statements
2509            (PostgreSQLServer.require_authentication): Toggle whether the
2510            server requires authentication
2511            (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
2512            Add or alter users
2513            (PostGISDatabase.initdb): Pass the admin name one the
2514            subprocesses' command lines. Grant select rights on
2515            geometry_columns to everybody.
2516            (upload_shapefile): Use the admin name and password when
2517            connecting. Grant select rights on the new table to everybody.
2518    
2519            * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
2520            server's new methods to get the connection parameters.
2521    
2522            * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
2523            (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
2524            server's new methods to get the connection parameters.
2525    
2526            * test/test_postgis_db.py
2527            (TestPostGISConnection.test_gis_tables_empty)
2528            (TestPostGISConnection.test_gis_tables_non_empty)
2529            (PostGISStaticTests.setUp): Use the server's new methods to get
2530            the connection parameters.
2531    
2532    2003-08-22  Bernhard Herzog  <[email protected]>
2533    
2534            * Thuban/UI/about.py (About.__init__): Add the psycopg version.
2535    
2536            * Thuban/version.py: Add psycopg version
2537    
2538            * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
2539            version of the psycopg module
2540    
2541    2003-08-22  Bernhard Herzog  <[email protected]>
2542    
2543            * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
2544            (DBFrame.OnEdit): Removed because it's not used and wouldn't work
2545            at the moment. The functionality should probably be implemented
2546            some time, though.
2547            (DBFrame.OnRemove): Display a message if the connection can't be
2548            removed because it's still in use.
2549    
2550    2003-08-22  Jan-Oliver Wagner <[email protected]>
2551    
2552            * Thuban/UI/about.py (About.__init__): split up the huge about
2553            text into elements/lists for easier translation. This fixes bug
2554            https://intevation.de/rt/webrt?serial_num=2058
2555            Also, made some forgotten string available for the i18n.
2556    
2557    2003-08-21  Bernhard Herzog  <[email protected]>
2558    
2559            Make postgis support really optional including insensitive menu
2560            items.
2561    
2562            * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
2563            whether the postgis is supported.
2564    
2565            * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
2566            to make postgis support optional
2567    
2568            * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
2569            version of Thuban.Model.postgisdb.has_postgis_support
2570            (database_management command): Make it only sensitive if postgis
2571            is supported.
2572    
2573    2003-08-21  Jan-Oliver Wagner <[email protected]>
2574    
2575            * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
2576            (section Adding and Removing Layers): Added text and described
2577            multi-selection.
2578            (chapter Extensions): New.
2579    
2580    2003-08-21  Jan-Oliver Wagner <[email protected]>
2581    
2582            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
2583            settings to allow multiple files to load into the map.
2584            Also reduced selection to *.shp as a default.
2585    
2586    2003-08-20  Bernhard Herzog  <[email protected]>
2587    
2588            Add dialogs and commands to open database connections and add
2589            database layers.
2590    
2591            * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
2592            method to open the database connection management dialog
2593            (MainWindow.AddDBLayer): New method to add a layer from a database
2594            (_has_dbconnections): New helper function to use for sensitivity
2595            (database_management command, layer_add_db command): New commands
2596            that call the above new methods.
2597            (main_menu): Add the new commands to the menu.
2598    
2599            * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
2600            (PostGISConnection.connect): Establish the actual connection in a
2601            separate method and call it in __init__. This makes it easier to
2602            override the behavior in test cases
2603            (PostGISConnection.BriefDescription): New method to return a brief
2604            description for use in dialogs.
2605    
2606            * test/test_postgis_db.py (NonConnection): DB connection that
2607            doesn't actually connect
2608            (TestBriefDescription): New class with tests for the new
2609            BriefDescription method
2610    
2611    2003-08-19  Jan-Oliver Wagner <[email protected]>
2612    
2613            Moved anything from extensions to libraries.
2614    
2615            * libraries: New.
2616    
2617            * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
2618    
2619            * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
2620            Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
2621            been moved here from thuban/extensions/pyprojection/
2622            See there in the Attic for the older history.
2623    
2624            * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
2625            dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
2626            shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
2627            have been moved here from thuban/extensions/pyshapelib/
2628            See there in the Attic for the older history.
2629    
2630            * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
2631            files have been moved here from thuban/extensions/shapelib/
2632            See there in the Attic for the older history.
2633    
2634            * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
2635            gdalwarp.cpp, wxproj.cpp: These files have been moved here from
2636            thuban/extensions/thuban/
2637            See there in the Attic for the older history.
2638    
2639            * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
2640    
2641            * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
2642            gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
2643    
2644            * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
2645            Moved to libraries/shapelib.
2646    
2647            * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
2648            shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
2649            ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
2650            Moved to libraries/pyshapelib.
2651    
2652            * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
2653            LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
2654            Moved to libraries/pyprojection.
2655    
2656            * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
2657    
2658            * extensions: Removed.
2659    
2660    2003-08-19  Bernhard Herzog  <[email protected]>
2661    
2662            * test/test_viewport.py (ViewPortTest): We don't use the
2663            facilities of FileTestMixin so don't derive from it.
2664            (TestViewportWithPostGIS): New class with tests for using a
2665            viewport on a map with postgis layers.
2666    
2667    2003-08-19  Bernhard Herzog  <[email protected]>
2668    
2669            Add the db connection management to the session.
2670    
2671            * Thuban/Model/session.py (Session.__init__): New instance
2672            variable db_connections
2673            (Session.AddDBConnection, Session.DBConnections)
2674            (Session.HasDBConnections, Session.CanRemoveDBConnection)
2675            (Session.RemoveDBConnection): New methods to manage and query the
2676            db connections managed by the session
2677            (Session.OpenDBShapeStore): New method to open a shapestore from a
2678            db connection
2679    
2680            * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
2681            messages for the db connection handling in the session
2682    
2683            * test/test_postgis_session.py: New. test cases for the session's
2684            db connection handling with postgis connections
2685    
2686    2003-08-19  Bernhard Herzog  <[email protected]>
2687    
2688            Add very basic postgis database support and the corresponding test
2689            cases. The test cases require a PostgreSQL + postgis installation
2690            but no existing database. The database will be created
2691            automatically by the test cases
2692    
2693            * test/README: Add note about skipped tests and the requirements
2694            of the postgis tests.
2695    
2696            * Thuban/Model/postgisdb.py: New. Basic postgis database support.
2697    
2698            * test/test_postgis_db.py: New. Test cases for the postgis
2699            support.
2700    
2701            * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
2702            format
2703    
2704            * test/test_wellknowntext.py: New. Test cases for the
2705            wellknowntext parser
2706    
2707            * test/postgissupport.py: New. Support module for tests involving
2708            a postgis database.
2709    
2710            * test/support.py (execute_as_testsuite): Shut down the postmaster
2711            if it's still running after the tests
2712    
2713            * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
2714            well known text format
2715    
2716    2003-08-19  Jan-Oliver Wagner <[email protected]>
2717    
2718            * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
2719            message dialog.
2720    
2721    2003-08-18  Bernhard Herzog  <[email protected]>
2722    
2723            * test/support.py (ThubanTestResult.printErrors): Indent the
2724            reason for the skips in the output to make it a bit more readable.
2725            (execute_as_testsuite): New helper function to run a test suite
2726            and print some more information.
2727            (run_tests): Use execute_as_testsuite to run the tests
2728    
2729            * test/runtests.py (main): Use execute_as_testsuite to run the
2730            tests
2731    
2732    2003-08-18  Bernhard Herzog  <[email protected]>
2733    
2734            Fix some bugs in Thuban and the test suite that were uncovered by
2735            changes introduced in Python 2.3:
2736    
2737            * Thuban/Model/table.py (DBFTable.__init__): Make sure the
2738            filename is an absolute name
2739    
2740            * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
2741            filename is an absolute name
2742    
2743            * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
2744            unique filename to save to and use the correct relative filename
2745            in the expected output.
2746            (SaveSessionTest.test_dbf_table): Use the correct relative
2747            filename in the expected output.
2748    
2749            * test/test_layer.py (TestLayer.test_raster_layer): Update the
2750            test to check whether the filename is absolute.
2751    
2752    2003-08-18  Jan-Oliver Wagner <[email protected]>
2753    
2754            * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
2755    
2756    2003-08-15  Bernhard Herzog  <[email protected]>
2757    
2758            Change the way shapes are returned by a shape store. The
2759            ShapesInRegion method returns an iterator over actual shape
2760            objects instead of a list of shape ids.
2761    
2762            * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
2763            id.
2764            (ShapefileStore.ShapesInRegion): Return an iterator over the
2765            shapes which yields shape objects instead of returning a list of
2766            shape ids
2767            (ShapefileStore.AllShapes): New. Return an iterator over all
2768            shapes in the shape store
2769            (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
2770    
2771            * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
2772            doc-string.
2773    
2774            * Thuban/UI/baserenderer.py
2775            (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
2776            layer_shapes and make it return an iterator containg shapes
2777            instead of a list of ids.
2778            (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
2779            layer_shapes() change
2780    
2781            * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
2782            (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
2783    
2784            * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
2785            changes in the ShapesInRegion return value.
2786            (ViewPort._get_hit_tester): Remove commented out code
2787    
2788            * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
2789            new return value.
2790            (SimpleShapeStore.AllShapes): New. Implement this method too.
2791    
2792            * test/test_layer.py (TestLayer.test_arc_layer)
2793            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
2794            (TestLayer.test_point_layer_with_projection)
2795            (TestLayer.test_derived_store): Adapt to changes in the
2796            ShapesInRegion return value.
2797    
2798            * test/test_shapefilestore.py
2799            (TestShapefileStoreArc.test_shapes_in_region)
2800            (TestShapefileStorePolygon.test_shapes_in_region)
2801            (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
2802            in the ShapesInRegion return value.
2803            (TestShapefileStorePoint.test_all_shapes)
2804            (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
2805            methods
2806    
2807            * test/test_derivedshapestore.py
2808            (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
2809            the ShapesInRegion return value.
2810            (TestDerivedShapeStore.test_all_shapes)
2811            (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
2812            methods
2813    
2814    2003-08-15  Bernhard Herzog  <[email protected]>
2815    
2816            Make the renderers deal correctly with raw vs. python level
2817            representation of shape geometries
2818    
2819            * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
2820            Return a flag useraw in addition to the callable and the parameter
2821            to indicate whether the callable can deal with the raw shape data
2822            or uses the higher level python lists of coordinates. The callable
2823            now should accept either the raw data or the return value of the
2824            shape's Points() method.
2825            (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
2826            change
2827            (BaseRenderer.projected_points): Instead of the shape id use the
2828            points list as parameter.
2829            (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
2830            (BaseRenderer.draw_point_shape): Adapt to projected_points()
2831            change and accept the points list as parameter instead of the
2832            shape id.
2833    
2834            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
2835            the useraw flag as required by the BaseRenderer
2836            (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
2837            changes.
2838    
2839            * test/test_baserenderer.py
2840            (TestBaseRenderer.test_point_with_classification): New test for
2841            rendering a map with classifications.
2842    
2843    2003-08-15  Bernhard Herzog  <[email protected]>
2844    
2845            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
2846            (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
2847            (ViewPort._get_hit_tester, ViewPort.projected_points)
2848            (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
2849            (ViewPort._find_label_at): Split the find_shape_at method into
2850            several new methods and use the functions in the hit-test module.
2851    
2852            * Thuban/UI/hittest.py: New module with Python-level hit-testing
2853            functions
2854    
2855            * test/test_hittest.py: New. Test for the new hittest module
2856    
2857    2003-08-15  Bernhard Herzog  <[email protected]>
2858    
2859            * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
2860            projection to all corners of the bounding box to get a better
2861            approximation of the projected bounding box
2862    
2863            * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2864            New. Test coordinate handling of a layer with a projection.
2865            Catches the bug fixed in Layer.ShapesInRegion
2866    
2867    2003-08-15  Bernhard Herzog  <[email protected]>
2868    
2869            Move some of the mock objects in test_baserenderer into their own
2870            module so they can easily be used from other tests
2871    
2872            * test/mockgeo.py: New test helper module with some mock objects
2873            for geometry related things like shapes, shapestores and
2874            projections.
2875    
2876            * test/test_mockgeo.py: New. Tests for the new helper module
2877    
2878            * test/test_baserenderer.py: Some of the mock-objects are in
2879            mockgeo now.
2880    
2881    2003-08-12  Jan-Oliver Wagner <[email protected]>
2882    
2883            * Thuban/UI/about.py (About.__init__): Added Bj�rn Broscheit.
2884    
2885    2003-08-12  Bernhard Herzog  <[email protected]>
2886    
2887            * po/de.po: New. German translations by Bjoern Broscheit
2888    
2889    2003-08-12  Bernhard Herzog  <[email protected]>
2890    
2891            * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
2892            strings have to be one string literal.
2893    
2894    2003-08-11  Bernhard Herzog  <[email protected]>
2895    
2896            * test/support.py (FloatComparisonMixin.assertPointListEquals):
2897            New. This method was used in various derived classes, but it's
2898            better to have it here.
2899    
2900            * test/test_shapefilestore.py
2901            (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
2902            FloatComparisonMixin
2903    
2904            * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
2905            It's now in FloatComparisonMixin
2906    
2907            * test/test_derivedshapestore.py
2908            (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
2909            in FloatComparisonMixin
2910    
2911    2003-08-11  Bernhard Herzog  <[email protected]>
2912    
2913            * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
2914            error message
2915    
2916    2003-08-08  Jan-Oliver Wagner <[email protected]>
2917    
2918            * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
2919            with version number.
2920            Changed title to reflect version number of Thuban.
2921    
2922    2003-08-08  Jan-Oliver Wagner <[email protected]>
2923    
2924            * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
2925            the list corresponds to the "About" web page.
2926    
2927    2003-08-08  Bernhard Herzog  <[email protected]>
2928    
2929            * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
2930            Make sure translated strings are recognized as one string literal.
2931    
2932            * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
2933            Make sure translated strings are recognized as one string literal.
2934    
2935            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
2936            translated strings are recognized as one string literal.
2937    
2938            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2939            sure translated strings are recognized as one string literal.
2940    
2941    2003-08-07  Bernhard Herzog  <[email protected]>
2942    
2943            * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
2944            Simply delegates to the original shapestore.
2945    
2946            * test/test_derivedshapestore.py
2947            (TestDerivedShapeStore.test_raw_format): New. Test case for
2948            DerivedShapeStore.RawShapeFormat
2949    
2950    2003-08-07  Bernhard Herzog  <[email protected]>
2951    
2952            Add raw data interface to shape objects.
2953    
2954            * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
2955            class to ShapefileShape which now holds shapefile specific
2956            information.
2957            (ShapefileShape.compute_bbox): Simplified to not cache any
2958            information. The way this method is used that shouldn't matter
2959            performance wise.
2960            (ShapefileShape.RawData): New. Return the shapeid which is the raw
2961            data format for shapes from shapefiles.
2962            (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
2963            in the shape objects returned by a shapestore. For a
2964            ShapefileStore this is always RAW_SHAPEFILE.
2965            (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
2966            method.
2967    
2968            * test/test_shapefilestore.py
2969            (TestShapefileStore.test_raw_format): New test to test the raw
2970            format feature of shapes.
2971    
2972            * Thuban/Model/layer.py: Remove the unused import of Shape from
2973            data. It was only there for interface compatibility but it's not
2974            used inside of Thuban and the generic Shape class has gone away.
2975    
2976            * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
2977            the raw data format and only use an optimized version of its a
2978            shapefile.
2979    
2980    2003-08-07  Bernhard Herzog  <[email protected]>
2981    
2982            * test/test_baserenderer.py (SimpleShape): Shape class for the
2983            tests.
2984            (SimpleShapeStore.Shape): Use SimpleShape instead of
2985            Thuban.Model.data.Shape to make the tests independed of the coming
2986            changes.
2987    
2988    2003-08-07  Bernhard Herzog  <[email protected]>
2989    
2990            * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
2991            (ThubanTestProgram): New classes that extend the respective
2992            classes from unittest. These new version support skipping tests
2993            under certain expected conditions. In the Thuban test suite we
2994            uses this for tests that require the optional gdal support.
2995            (run_tests): Use ThubanTestProgram instead of the unittest.main()
2996    
2997            * test/runtests.py (main): Use the new ThubanTestRunner instead of
2998            the normal one from unittest
2999    
3000            * test/test_layer.py (TestLayer.test_raster_layer): If this test
3001            is not run because gdal support isn't available report this to the
3002            runner.
3003    
3004            * test/test_baserenderer.py
3005            (TestBaseRenderer.test_raster_no_projection): Do not run this test
3006            if gdal support isn't available and report this to the runner.
3007    
3008    2003-08-06  Bernhard Herzog  <[email protected]>
3009    
3010            Rearrange the renderers a bit, partly in preparation for changes
3011            required for the postgis merge, partly to make it more testable.
3012            Also make the representation of coordinates in Shapes more
3013            consistent.
3014    
3015            * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
3016            this class is now in BaseRenderer. This class is now practically
3017            only a specialization of BaseRenderer for rendering to an actual
3018            wx DC.
3019            (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
3020            to get the shapetype specific rendering functions.
3021    
3022            * Thuban/UI/baserenderer.py: New file with the basic rendering
3023            logic. The code in this file is completely independend of wx.
3024            (BaseRenderer): Class with the basic rendering logic
3025    
3026            * test/test_baserenderer.py: New. Test cases for BaseRenderer
3027    
3028            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
3029            error_on_redraw to guard agains endless loops and stack overflows
3030            when there's a bug in the rendering code that raises exceptions.
3031            (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
3032            rendering into a separate method _do_redraw so that error handling
3033            is a bit easier. When an exception occurs, set error_on_redraw to
3034            true. When it's true on entry to OnIdle do nothing and return
3035            immediately.
3036    
3037            * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
3038            Shape object will always have the coordinates as a list of list of
3039            coordinate pairs (tuples).
3040            (Shape.compute_bbox): Adapt to new representation.
3041    
3042            * Thuban/UI/viewport.py (ViewPort.find_shape_at)
3043            (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
3044            Shape objects.
3045    
3046            * test/test_shapefilestore.py
3047            (ShapefileStoreTests.assertFloatTuplesEqual)
3048            (ShapefileStoreTests.assertPointListEquals): Rename to
3049            assertPointListEquals and change purpose to checking equality of
3050            the lists returned by Shape.Points().
3051            (TestShapefileStoreArc.test_shape)
3052            (TestShapefileStorePolygon.test_shape)
3053            (TestShapefileStorePoint.test_shape): Use the new
3054            assertPointListEquals instead of assertFloatTuplesEqual
3055    
3056            * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
3057            (TestLayer.assertPointListEquals): Rename to assertPointListEquals
3058            and change purpose to checking equality of the lists returned by
3059            Shape.Points().
3060            (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
3061            (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
3062            (TestLayer.test_derived_store): Use the new assertPointListEquals
3063            instead of assertFloatTuplesEqual
3064    
3065            * test/test_derivedshapestore.py
3066            (TestDerivedShapeStore.assertFloatTuplesEqual)
3067            (TestDerivedShapeStore.assertPointListEquals): Rename to
3068            assertPointListEquals and change purpose to checking equality of
3069            the lists returned by Shape.Points().
3070            (TestDerivedShapeStore.test_shape): Use the new
3071            assertPointListEquals instead of assertFloatTuplesEqual
3072    
3073    2003-08-06  Jan-Oliver Wagner <[email protected]>
3074    
3075            * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
3076            a bounding box. A dialog is raised in case, no bounding box
3077            is found. This fixes bug #2043:
3078            https://intevation.de/rt/webrt?serial_num=2043
3079    
3080    2003-08-05  Bernhard Herzog  <[email protected]>
3081    
3082            * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
3083            object look like a Color instantiation. Formerly it looked like a
3084            tuple.
3085    
3086            * test/test_color.py (TestColor.test_repr)
3087            (TestColor.test_equality, TestColor.test_inequality): New. test
3088            some more apects of the Color class
3089            (TestTransparent.test_repr, TestTransparent.test_hex)
3090            (TestTransparent.test_equality): New. Test cases for the
3091            Transparent object.
3092    
3093    2003-08-04  Jan-Oliver Wagner <[email protected]>
3094    
3095            * Doc/manual/thuban-manual.xml: a number of small improvements.
3096            The resulting file is the version submitted for GREAT-ER II.
3097    
3098    2003-08-01  Bernhard Herzog  <[email protected]>
3099    
3100            * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
3101            Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
3102            Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
3103    
3104            * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
3105            (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
3106            (ThubanEndBusyCursor): Add doc-strings
3107    
3108    2003-08-01  Bernhard Herzog  <[email protected]>
3109    
3110            First step towards PostGIS integration. More abstraction by movin
3111            more code from the layer to the shapestore. More methods of the
3112            layer are now simply delegated to the equivalent method of the
3113            shapestore. The SHAPETYPE_* constants are now in data not in
3114            layer.
3115    
3116            * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
3117            (SHAPETYPE_POINT, Shape): Move these constants and classes from
3118            layer.py to data.py
3119            (ShapefileStore.__init__): More Initialization for the new methods
3120            and functionality.
3121            (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
3122            (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
3123            (ShapefileStore.Shape): New methods that were formerly implemented
3124            in the layer.
3125            (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
3126            (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
3127            (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
3128            equivalents of the new shape methods. These versions are simply
3129            delegated to the original shapstore.
3130    
3131            * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
3132            (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
3133            (Layer.SetShapeStore): Removed the initializatin of instance
3134            variables that were needed for the stuff that's now in
3135            ShapefileStore
3136            (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
3137            (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
3138            shapestore.
3139    
3140            * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
3141            Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
3142            instead of layer.
3143    
3144            * test/test_shapefilestore.py: New. Tests for ShapefileStore.
3145    
3146            * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
3147    
3148            * test/test_layer.py: Import the SHAPETYPE_* constants from data
3149            instead of layer.
3150            (TestLayer.test_derived_store): Remove the test for the exception
3151            when instantiating the DerivedShapeStore with an incompatible
3152            table which is now in test_derivedshapestore.py. Add some more
3153            tests of the layer methods to determine whether they work for a
3154            DerivedShapeStore as well.
3155    
3156    2003-07-31  Jonathan Coles   <[email protected]>
3157    
3158            * Doc/manual/thuban-manual.xml: Fix the list of required packages
3159            by just listing the name and where they can be found.
3160    
3161    2003-07-31  Frank Koormann   <[email protected]>
3162    
3163            * Doc/manual/thuban-manual.xml:
3164            Changed the screenshot elements to figure.
3165            Changed some variablelist elements to itemizedlist.
3166            Added section on GDAL formats.
3167    
3168    2003-07-31  Jonathan Coles   <[email protected]>
3169    
3170            * Doc/manual/thuban-manual.xml: Added a few sentences about
3171            the Fix Border Color option when generating classes.
3172    
3173    2003-07-30  Jonathan Coles   <[email protected]>
3174    
3175            * Thuban/Model/classgen.py: Add docstrings. Rename specific
3176            Ramp instances to use lower_case_style.
3177    
3178            * Thuban/UI/classgen.py: Use renamed Ramp instances.
3179            
3180            * Thuban/UI/classifier.py: Add docstrings.
3181    
3182            * Thuban/UI/dock.py: Add docstrings.
3183    
3184            * test/test_classgen.py: Use renamed Ramp instances.
3185    
3186    2003-07-30  Bernhard Herzog  <[email protected]>
3187    
3188            * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
3189            was never used in Thuban.
3190    
3191    2003-07-30  Bernhard Herzog  <[email protected]>
3192    
3193            * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
3194            method directly instead of going through the transient_table
3195            method. This faster because transient_table may force the copy of
3196            a DBF file into the transient database and setting a table's title
3197            doesnm't affect the title of the associated transient table, so
3198            this fixes RT #2042
3199    
3200            * Thuban/UI/main.py (__version__): Don't import the already
3201            removed show_exception_dialog.
3202    
3203    2003-07-29  Jonathan Coles   <[email protected]>
3204    
3205            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3206            Put back this method and remove the equivalent function since we
3207            are setting the exception hook from within this class (OnInit).
3208    
3209    2003-07-29  Jonathan Coles   <[email protected]>
3210    
3211            * Doc/manual/images/5_2_custom_ramp.png,
3212            Doc/manual/images/5_2_quantiles.png,
3213            Doc/manual/images/5_2_uniform_dist.png,
3214            Doc/manual/images/5_2_unique_values.png,
3215            Doc/manual/images/8_int_error.png: New screen shots.
3216    
3217            * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
3218            some points, and added more screen shots.
3219    
3220    2003-07-29  Bernhard Herzog  <[email protected]>
3221    
3222            * Thuban/Model/data.py: Remove the now unused import of warnings
3223    
3224    2003-07-29  Bernhard Herzog  <[email protected]>
3225    
3226            * Thuban/Model/data.py (SimpleStore): Removed. This class has been
3227            deprecated since before the 0.8 release and isn't used in Thuban
3228            itself anymore.
3229    
3230            * Thuban/Model/transientdb.py: Remove some unnecessary imports
3231    
3232    2003-07-29  Jonathan Coles   <[email protected]>
3233    
3234            * Thuban/UI/application.py (ThubanApplication.OnInit): set the
3235            python exception hook here so that we are sure to catch any
3236            Thuban exception that happen during initialization.
3237    
3238            * Thuban/UI/main.py (main): Don't set the exception hook here,
3239            it will get set in ThubanApplication.OnInit.
3240    
3241    2003-07-29  Jonathan Coles   <[email protected]>
3242                                                                                
3243            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3244            Removed and called it show_exception_dialog() so that the exception
3245            handler can be set before the class is created.
3246                                                                                
3247            * Thuban/UI/main.py (main): Install the exception handler before
3248            a ThubanApplication is created.
3249                                                                                    
3250    2003-07-29  Bernhard Herzog  <[email protected]>
3251    
3252            * po/it.po: New. Italian translation by Maurizio Napolitano
3253    
3254            * po/ru.po: New. Russian translation by Alex Shevlakov
3255    
3256    2003-07-29  Frank Koormann   <[email protected]>
3257    
3258            * Doc/manual/thuban-manual.xml: Extended section on supported
3259            projections.
3260            
3261    2003-07-29  Frank Koormann   <[email protected]>
3262    
3263            * Doc/manual/thuban-manual.xml: gaspell-checked.
3264    
3265    2003-07-29  Jonathan Coles   <[email protected]>
3266    
3267            * Doc/manual/images/3_5_legend.png: Added border to improve look
3268            on white background.
3269    
3270    2003-07-29  Jonathan Coles   <[email protected]>
3271    
3272            * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
3273            descriptions for the legend toolbar.
3274    
3275            * Doc/manual/images/4_2_raster_layer_properties.png: Removed
3276            cursor from dialog box.
3277    
3278    2003-07-28  Jonathan Coles   <[email protected]>
3279    
3280            * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
3281    
3282            * Doc/manual/images/2_4_session_tree.png,
3283            Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
3284            Doc/manual/images/4_2_layer_properties.png,
3285            Doc/manual/images/4_2_raster_layer_properties.png,
3286            Doc/manual/images/5_3_genclass.png,
3287            Doc/manual/images/5_classification.png,
3288            Doc/manual/images/6_projection.png,
3289            Doc/manual/images/7_1_table_view.png,
3290            Doc/manual/images/7_2_5_join.png: New screenshots.
3291    
3292    2003-07-24  Jonathan Coles   <[email protected]>
3293    
3294            * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
3295    
3296    2003-07-24  Jonathan Coles   <[email protected]>
3297    
3298            * Doc/manual/thuban-manual.xml: Added EPS images and wrote
3299            chapter on Layer Management.
3300    
3301            * Doc/manual/Makefile: New. Makefile to generate all formats for the
3302            manual and images.
3303    
3304    2003-07-24  Bernhard Herzog  <[email protected]>
3305    
3306            * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
3307            it annoys lintian which warns about these files not being
3308            executable. The #! isn't necessary here since if you absolutely
3309            must execute them you can always say "python <filename>".
3310    
3311            * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
3312            superfluous code to set brush and pen for point shapes
3313    
3314            * Thuban/UI/viewport.py: Remove commented out code that wouldn't
3315            belong in viewport anyway
3316    
3317    2003-07-24  Frank Koormann   <[email protected]>
3318    
3319            * Doc/manual/thuban-manual.xml: Added section on table management.
3320    
3321    2003-07-24  Bernhard Herzog  <[email protected]>
3322    
3323            * test/runtests.py (main): Recognize the long "verbose" option
3324            correctly.
3325    
3326    2003-07-22  Jonathan Coles   <[email protected]>
3327    
3328            * Doc/manual/thuban-manual.xml: Continue to write first revision
3329            of the manual.
3330    
3331            * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
3332            with Begin/EndDrawing() calls to ensure we aren't doing to
3333            many updates to the dc during rendering.
3334            (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
3335            a pen and brush argument so they need to be passed to the function.
3336    
3337            * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
3338            Calculates the minimum and maximum scale values. Factored out
3339            of set_view_transform so that it could be used to zoom all the
3340            way into a single point.
3341            (ViewPort.set_view_transform): Call calc_min_max_scales().
3342            (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
3343            if only a single point is selected.
3344    
3345            * Doc/manual/images/1_2_legend_close.png,
3346            Doc/manual/images/1_2_legend_dock.png,
3347            Doc/manual/images/1_2_mainwindow.png,
3348            Doc/manual/images/1_2_mainwindow.ps,
3349            Doc/manual/images/1_2_mainwindow.sk,
3350            Doc/manual/images/3_2_fullextent.png,
3351            Doc/manual/images/3_2_fulllayerextent.png,
3352            Doc/manual/images/3_2_fullshapeextent.png,
3353            Doc/manual/images/3_2_pan.png,
3354            Doc/manual/images/3_2_zoomin.png,
3355            Doc/manual/images/3_2_zoomout.png,
3356            Doc/manual/images/3_3_identify.png,
3357            Doc/manual/images/3_3_label.png,
3358            Doc/manual/images/3_5_invisible.png,
3359            Doc/manual/images/3_5_movedown.png,
3360            Doc/manual/images/3_5_moveup.png,
3361            Doc/manual/images/3_5_props.png,
3362            Doc/manual/images/3_5_tobottom.png,
3363            Doc/manual/images/3_5_totop.png,
3364            Doc/manual/images/3_5_visible.png: New. Images for the documentation.
3365    
3366    2003-07-18  Bernhard Herzog  <[email protected]>
3367    
3368            * Thuban/UI/messages.py (MAP_REPLACED): New message.
3369    
3370            * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
3371            after the new map has been assigned
3372    
3373            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
3374            Delegate MAP_REPLACED to the canvas too
3375            (MainWindow.prepare_new_session): Removed. Thanks to the new
3376            MAP_REPLACED message it's no longer needed
3377            (MainWindow.OpenSession, MainWindow.NewSession):
3378            prepare_new_session has been removed.
3379    
3380            * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
3381            MAP_REPLACED so that we can close the dialog if a new map is set.
3382            (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
3383            (Classifier.map_replaced): Handle MAP_REPLACED by closing the
3384            dialog
3385    
3386            * test/test_viewport.py (SimpleViewPortTest)
3387            (SimpleViewPortTest.test_default_size): Add doc-strings
3388            (ViewPortTest.setUp): Bind map to self.map so we can use it in
3389            tests. Subscribe to MAP_REPLACED messages too.
3390            (ViewPortTest.tearDown): No need to explicitly unsubscribe
3391            (ViewPortTest.test_set_map): New test for the SetMap method.
3392    
3393    2003-07-18  Bernhard Herzog  <[email protected]>
3394    
3395            * test/test_viewport.py (SimpleViewPortTest.test_default_size):
3396            Move this test from ViewPortTest.setUp to this new separate test
3397            case. setUp is not the place for the actual tests.
3398            (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
3399            more of the test from setUp to the new test test_inital_settings.
3400            (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
3401            (ViewPortTest.test_proj_conv): Split test_proj_conv into
3402            test_win_to_proj and test_proj_to_win and make the tests easier to
3403            understand
3404            (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
3405            (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
3406            (ViewPortTest.test_unprojected_rect_around_point)
3407            (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
3408            Reformat to increase readability.
3409    
3410    2003-07-18  Bernhard Herzog  <[email protected]>
3411    
3412            * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
3413    
3414    2003-07-18  Bernhard Herzog  <[email protected]>
3415    
3416            * test/runtests.py: The test suite can now be run without an X
3417            connection. To make sure this remains true, remove the DISPLAY
3418            environment variable so that an error occurs if the wxGTK is
3419            imported accidentally
3420    
3421    2003-07-18  Bernhard Herzog  <[email protected]>
3422    
3423            * Thuban/UI/viewport.py: Remove unused imports
3424    
3425            * Thuban/UI/view.py: Remove unused imports
3426    
3427    2003-07-18  Bernhard Herzog  <[email protected]>
3428    
3429            * test/test_export.py Remove unused imports. The OutputTransform
3430            function is now in viewport.py and is called output_transform
3431            (TestScalebar.test_output_transform)
3432            (TestScalebar.test_OutputTransform): Renamed to
3433            test_output_transform and updated to use output_transform instead
3434            of OutputTransform
3435    
3436            * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
3437            renamed.
3438            (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
3439            renamed to output_transform
3440    
3441            * Thuban/UI/viewport.py (OutputTransform, output_transform):
3442            Rename to output_transform
3443    
3444    2003-07-18  Bernhard Herzog  <[email protected]>
3445    
3446            * Thuban/Model/layer.py (Layer.__init__): Rename
3447            classificationField to classificatin_column and init it here so
3448            that it can be used in SetClassificationColumn
3449            (Layer.GetClassificationColumn, Layer.GetClassificationField):
3450            Rename to GetClassificationColumn.
3451            (Layer.SetClassificationColumn, Layer.SetClassificationField):
3452            Rename to SetClassificationColumn and issue a LAYER_CHANGED
3453            message if the column changes.
3454            (Layer._classification_changed, Layer.ClassChanged): Rename to
3455            _classification_changed. Update the callers.
3456            (Layer.SetShapeStore): Further field->column renames.
3457    
3458            * Thuban/Model/load.py (SessionLoader.start_classification)
3459            (SessionLoader.start_clpoint): Updates because of
3460            field->column method name changes in the Layer class
3461    
3462            * Thuban/Model/save.py (SessionSaver.write_classification): Updates
3463            because of field->column method name changes in the Layer class
3464    
3465            * Thuban/UI/classifier.py (Classifier.__init__)
3466            (Classifier._OnTry, Classifier._OnRevert): Updates because of
3467            field->column method name changes in the Layer class
3468    
3469            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
3470            because of field->column method name changes in the Layer class
3471    
3472            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
3473            of field->column method name changes in the Layer class
3474    
3475            * test/test_save.py (SaveSessionTest.testClassifiedLayer)
3476            (SaveSessionTest.testClassifiedLayer): Update because of
3477            field->column method name changes in the Layer class
3478    
3479            * test/test_layer.py (SetShapeStoreTests.setUp)
3480            (SetShapeStoreTests.test_sanity): Update because of field->column
3481            method name changes in the Layer class
3482            (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
3483            (TestLayerModification.test_sanity)
3484            (TestLayerModification.test_initial_settings): remove unsued code
3485            and rename to test_sanity.
3486            (TestLayerModification.test_set_classification): New test for
3487            SetClassification and SetClassificationField.
3488    
3489    2003-07-18  Bernhard Herzog  <[email protected]>
3490    
3491            * test/test_classgen.py (TestFixedRamp.test): Extend test to check
3492            the non-fixed values as well. The old test would have accepted a
3493            fixed ramp that only returnes the fixed properties
3494    
3495    2003-07-17  Jonathan Coles   <[email protected]>
3496    
3497            * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
3498            shots for the manual. The XCF file is the source image and
3499            has additional layers to support changes.
3500    
3501            * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
3502    
3503            * Thuban/UI/classifier.py (Classifier.__BuildClassification):
3504            Return both the new class and the field name.
3505    
3506            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
3507            fit the map to the window as this changes any zoom level that
3508            the user may have set.
3509    
3510    2003-07-16  Jonathan Coles   <[email protected]>
3511    
3512            * Thuban/Model/classgen.py (generate_singletons,
3513            generate_uniform_distribution, generate_quantiles): Remove
3514            fixes parameter, but maintain the same functionality by having
3515            the calling function pass a FixedRamp object for the ramp.
3516            (FixedRamp): New. Adapts a ramp to have fixed property values.
3517    
3518            * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
3519            (Classification): Inherit from Publisher.
3520            (Classification.__init__): Remove the layer parameter.
3521            Classifications no longer need to have a parent layer.
3522            (Classification.GetField, Classification.GetFieldType,
3523            Classification.SetFieldInfo): Removed. The field name is stored
3524            in the layer, and the type can be retreived by calling
3525            Layer.GetFieldType().
3526            (Classification._set_layer, Classification.GetLayer): Removed.
3527            Classifications no longer have a parent layer.
3528    
3529            * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
3530            classification.
3531            (Layer.SetShapeStore): Reset the classification first while
3532            we still have the old shape store to work with.
3533            (Layer.GetClassificationField, Layer.SetClassificationField):
3534            New. Method for getting/setting the field to classify on.
3535            (Layer.SetClassification): Simplified now that the layer
3536            simply has to hold a reference to the classification and not
3537            tell the classification who owns it.
3538            Fixes RTbug #2023.
3539    
3540            * Thuban/Model/load.py (SessionLoader.start_classification):
3541            Set the field name on the layer, not the classification.
3542    
3543            * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
3544            classification is modified.
3545    
3546            * Thuban/Model/save.py (SessionSaver.write_classification):
3547            Get the field name and type from the layer.
3548    
3549            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
3550            parameter records to rows and add docstring. Fixes RTbug #1997.
3551    
3552            * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
3553            ramp when we need to fix certain values of a ramp rather than
3554            using the old fixes parameter. Fixes RTbug #2024.
3555    
3556            * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
3557            parameter.
3558            (ClassTable.Reset): Add fieldType parameter and use it, rather
3559            than asking the classification.
3560            (Classifier.__init__): Remember the original class's field
3561            and ask the layer for the field type, rather than the classification.
3562            (Classifier.__SetGridTable): Retrieve the field and field type
3563            for the table because they are not in the classification.
3564            (Classifier._OnTry, Classifier._OnRevert): Set the classification
3565            field on the layer in addition to the classification itself.
3566    
3567            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
3568            classification field from layer.
3569    
3570            * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
3571            classification field from layer. Split up tests and remove
3572            *-imports. Fixes RTbug #1992.
3573    
3574            * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
3575    
3576            * test/test_classification.py
3577            (TestClassification.test_classification): Remove tests for methods
3578            that no longer exist.
3579    
3580            * test/test_layer.py (SetShapeStoreTests.setUp): Classification
3581            __init__ no longer has a field parameter, use SetClassificationField.
3582            (SetShapeStoreTests.test_sanity): Use layer object to get class
3583            field info.
3584    
3585            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
3586            SetClassificationField on layer to set class field info.
3587    
3588            * test/test_viewport.py: Renamed from test/test_view.py.
3589    
3590    2003-07-16  Jan-Oliver Wagner <[email protected]>
3591    
3592            * Doc/manual/thuban-manual.xml: Added authors and an initial
3593            coarse structure.
3594    
3595    2003-07-15  Bernhard Herzog  <[email protected]>
3596    
3597            * test/support.py (FloatComparisonMixin): This is a mix-in class
3598            and therefore should not be derived from any other class.
3599    
3600            * test/test_range.py (RangeTest): FloatComparisonMixin is a
3601            mix-in, so derive from TestCase as well.
3602    
3603    2003-07-15  Bernhard Herzog  <[email protected]>
3604    
3605            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
3606            draw_func handling a bit to remove one layer of indirection. This
3607            makes the renderer about 10% faster in the non-classifying case
3608            and the code a bit cleaner
3609            (MapRenderer.draw_point_shape): Add the pen and brush parameters
3610            and set them in the dc. Now the draw_point_shape method and
3611            wxproj's draw_polygon_shape function have basically the same
3612            signature so that both can be directly used as draw_func
3613    
3614    2003-07-15  Bernhard Herzog  <[email protected]>
3615    
3616            * Thuban/Model/save.py (SessionSaver.write_classification): Encode
3617            string values (in addition to the labels) as UTF 8
3618    
3619            * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
3620            values if the field type is string
3621    
3622            * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
3623            saving a session with non-ascii string classification values.
3624    
3625            * test/test_load.py (TestClassification.file_contents)
3626            (TestClassification.test): Check for non-ascii values in string
3627            classifications
3628    
3629    2003-07-14  Jonathan Coles   <[email protected]>
3630    
3631            * test/test_view.py: New. Tests for ViewPort.
3632    
3633    2003-07-14  Frank Koormann   <[email protected]>
3634    
3635            * Thuban/Model/load.py (SessionLoader.start_map): Encode map
3636            title to latin1.  Fixes https://intevation.de/rt/webrt?serial_num=2013
3637    
3638            * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
3639            unicode strings from session file: session title, map title and
3640            projection name.
3641            
3642    2003-07-10  Jonathan Coles   <[email protected]>
3643    
3644            * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
3645            drag_stop, not drag_move when the mouse is released.
3646    
3647    2003-07-10  Jonathan Coles   <[email protected]>
3648    
3649            The most important part of this is the seperation of view.py into
3650            two pieces. viewport.py now has a class called ViewPort which
3651            contains all the non-wx parts of view.py and can therefore be
3652            tested. view.py contains only the wx-specific parts and is fairly
3653            simple.
3654    
3655            * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
3656            RTTbug #1992.
3657            * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
3658            RTTbug #1992.
3659    
3660            * Thuban/Model/classgen.py (generate_singletons,
3661            generate_uniform_distribution, generate_quantiles):
3662            Added 'fixes' parameter so that property attributes can
3663            be held constant over the generated classification groups.
3664            (CustomRamp.GetProperties): Remove unused variables.
3665    
3666            * Thuban/Model/map.py (Map.SetProjection): Send the old
3667            projection as an argument to listeners of the MAP_PROJECTION_CHANGED
3668            event.
3669    
3670            * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
3671            parameter which is a list of records that restricts which
3672            records are saved. Fixes RTbug #1997.
3673    
3674            * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3675            Port exception dialog from GREAT-ER. Fixes RTbug #1993.
3676    
3677            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
3678            to allow the user to fix line color/width on generated groups.
3679            (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
3680            functions to optionally fix group properties.
3681    
3682            * Thuban/UI/main.py (main): Set exception hook to the
3683            ShowExceptionDialog. Fixes RTbug #1993.
3684    
3685            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
3686            the table window when it is selectd to be shown.
3687    
3688            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
3689            Export Selection button and move the export buttons underneath
3690            the table.
3691            (QueryTableFrame.UpdateStatusText): Added event argument so
3692            that it can respond to grid selection events. The status text
3693            is now updated even when the table is not associated with a
3694            layer as was previously assumed.
3695            (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
3696            UpdateStatusText responds to these events.
3697            (QueryTableFrame.OnSaveAs): Renamed to doExport.
3698            (QueryTableFrame.doExport): Helper function that saves the
3699            entire table, or selected rows, to a file.
3700            (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
3701            Respond to export button events and call doExport.
3702    
3703            * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
3704            the function doesn't return NULL without first setting a Python
3705            Error.
3706    
3707            * test/runtests.py (main): Only print "Unknown option" for
3708            unsupported options.
3709    
3710            * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
3711            optional epsilon argument to specify floating point accuracy.
3712            (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
3713            for each item test.
3714    
3715            * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
3716            tests for saving selected records.
3717    
3718            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
3719            tests for saving selected records.
3720    
3721            * test/test_map.py (TestMapWithContents.test_set_projection):
3722            MAP_PROJECTION_CHANGED events send the old projection.
3723    
3724            * test/test_session.py
3725            (TestSessionWithContent.test_forward_map_projection):
3726            MAP_PROJECTION_CHANGED events send the old projection.
3727    
3728            * test/test_table.py (TableTest): Update tests to use non-deprecated
3729            functions.
3730    
3731    2003-07-08  Bernhard Herzog  <[email protected]>
3732    
3733            * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
3734            constants in the column objects are the standard ones defined in
3735            the table module.
3736    
3737            * test/test_transientdb.py
3738            (TestTransientTable.test_transienttable_to_dbf): New. Test whether
3739            exporting transient tables as DBF works. This should catch the bug
3740            just fixed in TransientTableBase.Width.
3741    
3742    2003-07-08  Bernhard Herzog  <[email protected]>
3743    
3744            * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
3745            interpolated colors correctly.
3746    
3747            * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
3748            New. Test case for the fix in classgen.py
3749    
3750    2003-07-08  Bernhard Herzog  <[email protected]>
3751    
3752            * test/runtests.py (main): Make the default output less verbose
3753            and add a verbosity option (-v) to get the old output
3754    
3755    2003-07-08  Bernhard Herzog  <[email protected]>
3756    
3757            * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
3758            0.9.
3759    
3760            * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
3761            New. Return the join type
3762    
3763            * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
3764            DTD
3765            (SessionSaver.write_data_containers): Save the join type for
3766            joined tables
3767    
3768            * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
3769            namespace
3770            (SessionLoader.start_jointable): Handle the jointype attribute
3771    
3772            * test/test_load_0_8.py: New. Effectively a copy of test_load.py
3773            as of Thuban 0.8. These are now tests to determine whether Thuban
3774            can still read files generated by Thuban 0.8
3775    
3776            * test/test_load.py (LoadSessionTest.dtd)
3777            (TestSingleLayer.file_contents)
3778            (TestLayerVisibility.file_contents, TestLabels.file_contents)
3779            (TestLayerProjection.file_contents)
3780            (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3781            (TestJoinedTable.file_contents)
3782            (TestLoadError.file_contents): Update for new DTD
3783            (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
3784            for new join type attribute
3785    
3786            * test/test_save.py (SaveSessionTest.dtd)
3787            (SaveSessionTest.testEmptySession)
3788            (SaveSessionTest.testSingleLayer)
3789            (SaveSessionTest.testLayerProjection)
3790            (SaveSessionTest.testRasterLayer)
3791            (SaveSessionTest.testClassifiedLayer)
3792            (SaveSessionTest.test_dbf_table)
3793            (SaveSessionTest.test_joined_table): Update for new DTD
3794            (SaveSessionTest.test_joined_table): Add test for new join type
3795            attribute
3796    
3797    2003-07-04  Bernhard Herzog  <[email protected]>
3798    
3799            * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
3800            function for table_to_dbf
3801            (table_to_dbf): Deal with names longer than the 10 character limit
3802    
3803            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
3804            doc-string
3805            (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
3806            long column names
3807    
3808    2003-07-03  Bernhard Herzog  <[email protected]>
3809    
3810            * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
3811    
3812    2003-07-03  Bernhard Herzog  <[email protected]>
3813    
3814            * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
3815            for the Thuban manual and README with some basic information about
3816            the manual
3817    
3818    2003-07-03  Bernhard Herzog  <[email protected]>
3819    
3820            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
3821            Update doc-string
3822            (TransientJoinedTable.create): Do not modify the column objects of
3823            the input tables in place and copy all columns of the input tables
3824            into the joined table after all.
3825    
3826            * test/test_transientdb.py
3827            (TestTransientTable.test_transient_joined_table_same_column_name):
3828            Update to reflect the new behavior
3829            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
3830            Update to reflect the new behavior
3831            (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
3832            New test case for a bug which modified the column objects in place
3833    
3834    2003-07-02  Jonathan Coles   <[email protected]>
3835    
3836            * Thuban/Model/classgen.py (generate_singletons,
3837            generate_uniform_distribution, generate_quantiles,
3838            GenQuantiles0): Make sure maxValue isn't less than
3839            one, otherwise we could divide by zero.
3840    
3841            * test/test_classgen.py (ClassGenTest.doClassRangeTest,
3842            ClassGenTest.doClassSingleTest): Call doBoundsTest to
3843            check the end classification groups against the
3844            proper property values.
3845            (ClassGenTest.doBoundsTest): New. Checks the first and
3846            last classification groups to make sure their properties
3847            are the correct upper and lower bounds for a color ramp.
3848    
3849    2003-07-02  Jonathan Coles   <[email protected]>
3850    
3851            * Thuban/Model/classgen.py (generate_singletons,
3852            generate_uniform_distribution, generate_quantiles,
3853            GenQuantiles0): The denominator was one to high when
3854            calculating the index for the ramp causing the index
3855            to never to reach one.
3856    
3857    2003-07-02  Jonathan Coles   <[email protected]>
3858    
3859            Changed the singature of ClassGroupRange.__init__ and
3860            ClassGroupRange.SetRange() so that the min/max values are
3861            passed as a tuple. This makes a better calling scheme for
3862            when a Range object is passed instead.
3863    
3864            * Thuban/Model/classgen.py: Fixed parameters to
3865            ClassGroupRange constructor.
3866    
3867            * Thuban/Model/classification.py (ClassGroupRange.__init__):
3868            Consolidate the min/max parameters into a single _range which
3869            can either be a tuple or a Range object.
3870            (ClassGroupRange.SetRange): Consolidate the min/max parameters
3871            into a single _range which can either be a tuple or a Range object.
3872    
3873            * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
3874            call to ClassGroupRange constructor to use a tuple.
3875    
3876            * Thuban/Model/layer.py (Layer.SetClassification): Switch
3877            the classification instance variable to the new class
3878            before calling _set_layer otherwise subscribers to a
3879            LAYER_CHANGED event will not see any difference.
3880    
3881            * test/test_classification.py: Fix tests of ClassGroupRange
3882            so that they use the new signature.
3883    
3884            * test/test_load.py: Fix use of ClassGroupRange so that it
3885            uses the new signature.
3886    
3887            * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
3888            uses the new signature.
3889    
3890            * test/test_save.py: Fix use of ClassGroupRange so that it
3891            uses the new signature.
3892    
3893    
3894    2003-07-01  Jonathan Coles   <[email protected]>
3895    
3896            * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
3897            Import used objects/class from color.
3898            (generate_singletons): We don't
3899            need the numGroups parameter anymore because we are using
3900            the new ramps with GetProperties().
3901            (generate_uniform_distribution): Use new ramp method
3902            GetProperties().
3903            (generate_quantiles, GenQuantiles0): Use new ramp method
3904            GetProperties().
3905            (CustomRamp.SetNumGroups): Removed. The ramps now map
3906            a value from 0 to 1 to class properties so the number
3907            of groups is not needed ahead of time.
3908            (CustomRamp.next): Removed. CustomRamp does not support
3909            interation anymore.
3910            (CustomRamp.GetProperties): Returns a ClassGroupProperties
3911            object based on the index value from 0 to 1 that is
3912            passed to it.
3913            (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
3914            Made into instances of Monochromatic class instread of
3915            deriving from it.
3916            (HotToCold.SetNumGroups): Removed. See CustomRamp.
3917            (HotToCold.next): Removed. See CustomRamp.
3918    
3919            * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
3920            (Classification.SetField, Classification.SetFieldType):
3921            Replaced with SetFieldInfo.
3922            (Classification.SetFieldInfo): New. Does a better job of
3923            what SetField and SetFieldType used to do by combining
3924            their function since they should really always be done
3925            at the same time.
3926            (Classification.SetLayer): Renamed to _set_layer.
3927            (Classification._set_layer): Should only be called from
3928            Layer's SetClassification. This does not cause a recursive
3929            call as SetLayer did because we know that Layer knows about
3930            the classification.
3931    
3932            * Thuban/Model/color.py: Fixes RTbug #1971.
3933            (_Transparent): Renamed from Transparent so it doesn't
3934            conflict with the module variable.
3935            (Transparent, Black): Renamed from Color.Transparent,
3936            Color.Black so they are not class variables.
3937    
3938            * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
3939            (Layer.Destroy): We don't need to call SetClassification
3940            anymore to clear out the back reference in the classifcation
3941            to the layer. It's better to set it to None using _set_layer,
3942            and we won't be creating another clas object too.
3943            (Layer.SetClassification): Classification._set_layer is not
3944            recursive so remove all the locking variables. Also clean
3945            up the code so that it remains unchanged if something fails.
3946    
3947            * Thuban/Model/load.py: Fixes RTbug #1971.
3948            (SessionLoader.start_classification): Call
3949            Classification.SetFieldInfo().
3950    
3951            * Thuban/Model/save.py: Removed import of Color which wasn't
3952            being used.
3953    
3954            * Thuban/UI/classgen.py: Fixes RTbug #1972.
3955            (ClassGenDialog.__init__): Color ramps are now instances
3956            already so we don't need to create any new objects.
3957            (ClassGenDialog.OnOK): Check for numGroups is no longer
3958            necessary because we never use it.
3959    
3960            * Thuban/UI/classifier.py: Fixes RTbug #1971.
3961            (Classifier.__BuildClassification, Classifier.__SetGridTable):
3962            Call Classification.SetFieldInfo() instead of SetFieldType.
3963    
3964            * Thuban/UI/renderer.py: Fixes RTbug #1971.
3965    
3966            * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
3967            (MapCanvas.__init__): Subscribe to the idle time event. Set
3968            background color to white.
3969            (MapCanvas.OnPaint): Set a flag indicating that we should
3970            render the map during idle time. If we already have a bitmap
3971            just draw it now.
3972            (MapCanvas.OnIdle): New. Render the map only during idle time.
3973            This also fixes a problem with the busy cursor under gtk.
3974    
3975            * test/test_classgen.py (ClassGenTest.test_generate_singletons):
3976            Fix calls to generate_singletons because the signature changed.
3977    
3978            * test/test_classification.py: Fix color references and
3979            change calls to Classification.[SetField|SetFieldType] to
3980            SetFieldInfo.
3981    
3982            * test/test_load.py: Fix color references.
3983    
3984            * test/test_load_0_2.py: Fix color references.
3985    
3986            * test/test_save.py (SaveSessionTest.testClassifiedLayer):
3987            Change calls to Classification.[SetField|SetFieldType] to
3988            SetFieldInfo.
3989    
3990    2003-07-01  Frank Koormann   <[email protected]>
3991    
3992            MERGE from the greater-ms3 branch.
3993    
3994            * test/test_transientdb.py
3995            (TestTransientTable.test_transient_joined_table_with_equal_column_names):
3996            New. Test join of two tables with partly equal column names.
3997    
3998            * Thuban/Model/transientdb.py (TransientJoinedTable.create):
3999            If duplicates in left and right tables column names are found,
4000            append '_' (underscores) to the name until it is unique.
4001            Create always new internal names for the resulting table and reference
4002            columns in the join statement with <table>.<column>
4003    
4004    2003-07-01  Bernhard Herzog  <[email protected]>
4005    
4006            * test/test_transientdb.py
4007            (TestTransientTable.test_transient_joined_table_same_column_name):
4008            New. Test whether joining on columns with the same names in both
4009            tables works.
4010            
4011            * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
4012            sure to use the right internal names even when joining on field
4013            with the same names in both tables. Also, detect duplicate names
4014            in the joined table correctly.
4015    
4016    2003-07-01  Frank Koormann   <[email protected]>
4017    
4018            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
4019            Reverse List of layers to render in same order as in desktop legend.
4020    
4021    2003-06-30  Jonathan Coles   <[email protected]>
4022    
4023            * Thuban/version.py (make_tuple): Takes a version string
4024            and splits it into a tuple of at most three integers.
4025            Used make_tuple() to make tuple versions of the version
4026            numbers.
4027    
4028            * Thuban/UI/about.py: Add Thuban email addresses.
4029    
4030    2003-06-30  Jonathan Coles   <[email protected]>
4031    
4032            * Thuban/version.py: SQLite/PySQLite version dependencies
4033            were too high.
4034    
4035    2003-06-30  Jonathan Coles   <[email protected]>
4036    
4037            * Thuban/version.py: Update version to 0.8.1
4038            
4039            * MANIFEST.in: Added Projections so that default.proj is
4040            included.
4041    
4042    2003-06-26  Jonathan Coles   <[email protected]>
4043    
4044            New About box with lots more information including library
4045            versions and credits. More/better version checking before
4046            Thuban starts.
4047    
4048            * Thuban/UI/about.py: New. New About box that displays
4049            library version information and credits.
4050    
4051            * Thuban/version.py: Added new 'versions' dictionary which
4052            contains the verions of various libraries which are checked
4053            when the module loads.
4054            (verify_versions): Check all version numbers and returns
4055            a list of errors.
4056    
4057            * Thuban/UI/classifier.py (Classifier.__EnableButtons):
4058            Reset the status of the buttons as the situation warrants,
4059            but in a better more reliable way by not relying on the
4060            current status to determine what needs to change.
4061    
4062            * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
4063            (verify_versions): Remove most of the code since it is
4064            now in Thuban.version.verify_versions.o
4065    
4066            * Thuban/UI/mainwindow.py (MainWindow.About): Call new
4067            About box in Thuban.UI.about.
4068    
4069            * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
4070            Returns the version of gdal library being used as a string.
4071    
4072            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
4073            Removed.
4074            (get_proj_version): Return the version of PROJ that the file
4075            was compiled with.
4076            (get_gtk_version): Return th version of GTK that the file
4077            was compiled with.
4078    
4079    2003-06-25  Jonathan Coles   <[email protected]>
4080    
4081            * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
4082            of the SelectPropertiesDialog should be self so the window
4083            appears on top.
4084            (ClassGroupPropertiesCtrl.DoEdit): The parent
4085            of the SelectPropertiesDialog should be self so the window
4086            appears on top.
4087    
4088            * Thuban/UI/resource.py: Cleaned up how we determine file
4089            extensions.
4090            (GetImageResource): Return an wxImage from our Resources.
4091    
4092    2003-06-24  Jonathan Coles   <[email protected]>
4093    
4094            * Thuban/UI/renderer.py (ExportRenderer.render_legend):
4095            Check that a layer has a classification before trying
4096            to get it. Raster layers don't have classifications.
4097    
4098    2003-06-23  Jonathan Coles   <[email protected]>
4099            
4100            * setup.py: Add Resources/XML to resource list.
4101        
4102    2003-06-23  Jonathan Coles   <[email protected]>
4103    
4104            * setup.cfg: Fix copyright dates
4105        
4106    2003-06-23  Jonathan Coles   <[email protected]>
4107    
4108            * MANIFEST.in: Update with Resources/XML
4109    
4110            * setup.py: Don't include Locale resources yet as we don't
4111            have any and it causes problems building the distribution
4112            for Windows. Update version to 0.8.0.
4113    
4114            * Doc/thuban.dtd: Removed since it is now in Resources/XML.
4115    
4116            * Thuban/UI/mainwindow.py: Add blank line at the end because
4117            file was not being read correctly building the Windows
4118            distribution.
4119    
4120    2003-06-23  Jonathan Coles   <[email protected]>
4121    
4122            * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
4123    
4124            * Thuban/version.py: Temporarily update longversion for
4125            the 0.8 release so that it doesn't have the cvs revision.
4126    
4127    2003-06-23  Jonathan Coles   <[email protected]>
4128    
4129            * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
4130            to make sure that we don't create reentrant possibilities with
4131            wxYield.
4132    
4133            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
4134            directly to avoid the wxSafeYield() call which generates an
4135            OnPaint event causing infinite recursion. Don't try to catch
4136            exception anymore. This was for before there were limits on map
4137            scaling.
4138    
4139    2003-06-23  Bernhard Herzog  <[email protected]>
4140    
4141            Bug fix for RT #1961:
4142    
4143            * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
4144            Register DerivedShapestores with the session
4145    
4146            * Thuban/Model/session.py (Session.Tables): Make sure each table
4147            is only listed once.
4148    
4149            * test/test_load.py (TestJoinedTable.test): Add check_format call.
4150            Update file contents to match the one written out.
4151    
4152    2003-06-20  Bernhard Herzog  <[email protected]>
4153    
4154            * test/xmlsupport.py (SaxEventLister.startElementNS)
4155            (SaxEventLister.endElementNS): Do not include the qname. Python
4156            2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
4157            is (presumably incorrectly) None, whereas it's a string with the
4158            element name in the later versions.
4159    
4160            * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
4161            (TestEventList.test_even_list_namespace): Update tests to reflect
4162            the new behaviour
4163            (TestEventList.test_even_list_id_normalization): Fix doc-string
4164    
4165    2003-06-20  Jonathan Coles   <[email protected]>
4166    
4167            * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
4168            by deriving classes to determine if that layer supports shapes.
4169            (Layer): Override HasShapes and return true.
4170    
4171            * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
4172            instead of a direct call to wx[Begin|End]CusyCursor().
4173            (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
4174            table data.
4175    
4176            * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
4177            New. Wrappers around the wxWindows functions that allow us to
4178            make additional calls such as wxYield which gives the native
4179            system a chance to update the cursor correctly.
4180    
4181            * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
4182            instead of a direct call to wx[Begin|End]CusyCursor().
4183    
4184            * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
4185            instead of a direct call to wx[Begin|End]CusyCursor().
4186            (MapCanvas.find_shape_at): Check if the current search layer
4187            support shapes, otherwise go on to the next layer.
4188    
4189            * test/test_layer.py: Add tests in each type of layer for
4190            HasClassification() and HasShapes()
4191    
4192    2003-06-20  Jonathan Coles   <[email protected]>
4193    
4194            * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
4195            turning on the busy cursor to allow the system to change the
4196            cursor before we begin painting. This fixes a problem that
4197            was occuring only under GTK. Fixes RTbug #1840.
4198    
4199    2003-06-20  Bernhard Herzog  <[email protected]>
4200    
4201            * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
4202            version.
4203    
4204            * Thuban/Model/save.py (sort_data_stores): New. Make topological
4205            sort of the data sources so they can be written with sources that
4206            data sources that depend on other data sources come after the
4207            sources they depend on.
4208            (SessionSaver.__init__): Add idmap instance variable to map from
4209            objects to the ids used in the file.
4210            (SessionSaver.get_id, SessionSaver.define_id)
4211            (SessionSaver.has_id): New. Methods to manage the idmap
4212            (SessionSaver.write): Use thuban-0.8.dtd
4213            (SessionSaver.write_session): Add a namespace on the session and
4214            write out the data sources before the maps.
4215            (SessionSaver.write_data_containers): New. Write the data
4216            containers.
4217            (SessionSaver.write_layer): Layer elements now refer to a
4218            shapestore and don't contain filenames anymore.
4219    
4220            * Thuban/Model/load.py (LoadError): Exception class to raise when
4221            errors in the files are discovered
4222            (SessionLoader.__init__): Define dispatchers for elements with a
4223            thuban-0.8 namespace too.
4224            (SessionLoader.check_attrs): New helper method to check and
4225            convert attributes
4226            (AttrDesc): New. Helper class for SessionLoader.check_attrs
4227            (SessionLoader.start_fileshapesource)
4228            (SessionLoader.start_derivedshapesource)
4229            (SessionLoader.start_filetable, SessionLoader.start_jointable):
4230            Handlers for the new elements in the new fileformat
4231            (SessionLoader.start_layer): Handle the shapestore attribute in
4232            addition to filename.
4233            (SessionLoader.start_table, SessionLoader.end_table): Removed.
4234            They were never used in the old formats and aren't needed for the
4235            new.
4236    
4237            * Thuban/Model/session.py (Session.DataContainers): New method to
4238            return all "data containers", i.e. shapestores and tables
4239    
4240            * test/xmlsupport.py (SaxEventLister.__init__)
4241            (SaxEventLister.startElementNS, sax_eventlist): Add support to
4242            normalize IDs.
4243    
4244            * test/test_xmlsupport.py
4245            (TestEventList.test_even_list_id_normalization): New test case for
4246            id normalization
4247    
4248            * test/test_load.py (LoadSessionTest.check_format): Use ID
4249            normalization
4250            (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
4251            class atrributes used for ID normalization
4252            (TestSingleLayer, TestLayerVisibility, TestLabels.test)
4253            (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
4254            file format
4255            (TestJoinedTable): New test for loading sessions with joined
4256            tables.
4257            (TestLoadError): New. Test whether missing required attributes
4258            cause a LoadError.
4259    
4260            * test/test_save.py (SaveSessionTest.thubanids)
4261            (SaveSessionTest.thubanidrefs): New class attributes for ID
4262            normalization in .thuban files.
4263            (SaveSessionTest.compare_xml): Use id-normalization.
4264            (SaveSessionTest.testEmptySession)
4265            (SaveSessionTest.testLayerProjection)
4266            (SaveSessionTest.testRasterLayer)
4267            (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
4268            (SaveSessionTest.testLayerProjection): The filename used was the
4269            same as for testSingleLayer. Use a different one.
4270            (SaveSessionTest.test_dbf_table)
4271            (SaveSessionTest.test_joined_table): New test cases for saving the
4272            new data sources structures.
4273            (TestStoreSort, MockDataStore): Classes to test the sorting of the
4274            data stores for writing.
4275    
4276            * test/runtests.py: Add CVS keywords
4277    
4278    2003-06-20  Jonathan Coles   <[email protected]>
4279    
4280            * test/test_session.py
4281            (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
4282            Use the cultural_landmark-point.dbf file for the store so that
4283            the table rows and shape count match.
4284    
4285    2003-06-20  Jonathan Coles   <[email protected]>
4286    
4287            * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
4288            an exception if the number of shapes is different from the
4289            number of rows in the table. Address RTbug #1933.
4290    
4291            * test/test_layer.py (TestLayer.test_derived_store): Add
4292            a test for the new exception in DerivedShapeStore.__init__.
4293    
4294            * test/support.py (FloatTestCase): Removed since there is
4295            already FloatComparisonMixin. Fixes RTbug #1954.
4296            (FloatComparisonMixin.assertFloatEqual): Include test for
4297            infinity that was part of FloatTestCase.
4298    
4299            * test/test_range.py (RangeTest): Inherit from
4300            support.FloatComparisonMixin now that we don't have
4301            support.FloatTestCase.
4302    
4303    2003-06-20  Bernhard Herzog  <[email protected]>
4304    
4305            * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
4306            the implementation in xmlsupport instead.
4307            (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
4308    
4309            * test/test_proj.py: Import sax_eventlist from xmlsupport instead
4310            of test_save
4311    
4312    2003-06-20  Bernhard Herzog  <[email protected]>
4313    
4314            * test/test_load.py (LoadSessionTest.check_format): New helper
4315            method to make sure the test files we load might have been written
4316            by the current thuban version.
4317            (ClassificationTest.TestLayers, TestSingleLayer.test)
4318            (TestLayerVisibility.test, TestClassification.test)
4319            (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
4320            Add check_format() calls and fix the thuban data to match the data
4321            that would be written by saving the session loaded from it.
4322    
4323            * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
4324            the same class and function in test_save.
4325    
4326            * test/test_xmlsupport.py (TestEventList): New. test cases for
4327            sax_eventlist
4328    
4329    2003-06-20  Bernhard Herzog  <[email protected]>
4330    
4331            * Resources/XML/thuban.dtd: Add comment about which versions of
4332            Thuban are covered by this DTD
4333            (map): Fix content model for layers and raster layers. There can
4334            be any number or layers and raster layers in any order.
4335    
4336    2003-06-20  Jonathan Coles   <[email protected]>
4337    
4338            This is mainly about fixing RTbug #1949.
4339    
4340            * Thuban/Model/classification.py: Remove "from __future__"
4341            import statement since python 2.2 is the earliest supported
4342            version.
4343    
4344            * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
4345            Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
4346            depending on the units this projection *forwards* into.
4347    
4348            * Thuban/Model/save.py (SessionSaver.write_classification):
4349            Remove unnecessary use of lambdas and nested functions.
4350    
4351            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
4352            adjustment here if the map projection uses degrees.
4353    
4354            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
4355            scale adjust code since it is now done before calling
4356            this method. Don't do anything if the map projection
4357            is None.
4358    
4359    2003-06-19  Bernhard Herzog  <[email protected]>
4360    
4361            Move version specific load tests to their own file.
4362    
4363            * test/test_load.py: Expand the doc-string to explain a bit how to
4364            handle file format changes.
4365            (TestClassification.test): Update the docstring as this test is
4366            not about Thuban 0.2 anymore.
4367    
4368            * test/test_load_0_2.py: New file with the load tests for thuban
4369            files created with Thuban 0.2 and earlier.
4370    
4371    2003-06-19  Bernhard Herzog  <[email protected]>
4372    
4373            Add XML validation to some of the tests. Validation will only be
4374            done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
4375            To make the DTD available to the test cases it's moved into
4376            Resources/XML
4377    
4378            * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
4379            for versions up to and including 0.2. Two slight changes: added an
4380            encoding specification and fixed the comment which refered to
4381            GRASS, not Thuban
4382    
4383            * test/xmlsupport.py: New support module for tests involving XML.
4384            Currently there's a mix-in class for XML validation.
4385    
4386            * test/test_xmlsupport.py: New. Tests for the xmlsupport module
4387    
4388            * test/test_save.py (SaveSessionTest): Derive from ValidationTest
4389            so that we can validate the
4390            (SaveSessionTest.testEmptySession)
4391            (SaveSessionTest.testSingleLayer)
4392            (SaveSessionTest.testSingleLayer)
4393            (SaveSessionTest.testLayerProjection)
4394            (SaveSessionTest.testRasterLayer)
4395            (SaveSessionTest.testClassifiedLayer): Validate the generated XML
4396    
4397            * test/runtests.py (main): Call print_additional_summary instead
4398            of print_garbage_information
4399    
4400            * test/support.py (resource_dir): New function to return the
4401            "Resource" subdirectory
4402            (print_additional_summary): New function to combine several
4403            summary functions
4404            (run_tests): Use print_additional_summary instead of calling
4405            print_garbage_information directly
4406    
4407    2003-06-19  Bernhard Herzog  <[email protected]>
4408    
4409            * Doc/thuban.dtd (classification): Correct the content model of
4410            the classification element.
4411            (projection): Add the "name" attribute
4412    
4413    2003-06-19  Frank Koormann   <[email protected]>
4414    
4415            MERGE from the greater-ms3 branch.
4416    
4417            * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
4418            scale if projection is latlong to get better estimate.
4419    
4420            Fix problem of hidden properties dialog under windows after double
4421            click on layer tree:
4422            The tree control always gets an Expanded / Collapsed event after
4423            the ItemActivated  on double click, which raises the main window again.         We add a second ItemActivated event to the queue, which simply
4424            raises the already displayed window.
4425    
4426            * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
4427            raiseProperties initialized to prevent endless loops
4428            (LegendTree._OnItemActivated): Depending on self.raiseProperties
4429            simply raise the properties or open the dialog and issue a second
4430            event.
4431    
4432    2003-06-18  Jonathan Coles   <[email protected]>
4433    
4434            * setup.py: Fix a few problems that occured under Windows.
4435    
4436    2003-06-18  Jonathan Coles   <[email protected]>
4437    
4438            When Thuban loaded the map was redrawn twice because the
4439            legend was being opened after the mainwindow was created
4440            and not during its creation. This meant the map was drawn
4441            initially and then had to be redrawn when the legend
4442            caused the display to change. Now the legend is opened
4443            in the mainwindow constructor which resolves this issue.
4444    
4445            Also, although we were checking for the existence of
4446            gdal and gdalwarp modules, the gdalwarp extension was
4447            still being compiled (which may fail if the system doesn't
4448            have gdal installed). the build_ext command to setup.py
4449            now accepts the flags --with-gdal and --without-gdal.
4450            If --without-gdal is specified setup.py will try to
4451            use the gdal parameters specified by gdal-config. Under
4452            windows, those parameters have to be set in setup.py
4453            as with proj4 an wxWindows.
4454    
4455            * setup.py: Use a list instead of seperate variables for
4456            extension parameters so we can create a generic function
4457            that runs an appropriate *-config script.
4458            (run_cs_script): Renamed from run_wx_script and modified
4459            to accept a second argument which is a list of lists to
4460            be filled in by the values returned from running the command.
4461            (thuban_build_ext): New. Extends the build_ext command and
4462            provides the options --with-gdal/--without-gdal which then
4463            optionally includes the gdalwarp extension.
4464    
4465            * Thuban/Model/resource.py: First check if we can import
4466            the gdalwarp Thuban extension before checking for gdal.
4467            Also added some comments.
4468            
4469            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
4470            the map is None which may be the case if none has been loaded
4471            yet.
4472    
4473            * Thuban/UI/main.py (main): Remove call to ShowLegend.
4474    
4475            * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
4476    
4477            * Thuban/UI/renderer.py: Check for gdal support before importing
4478            gdalwarp.
4479            (MapRenderer.render_map): Only try to optimize if we have gdal
4480            support otherwise nothing will get drawn.
4481    
4482            * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
4483            during startup before a map has been created. Check if map is None
4484            before using it and do nothing if it is.
4485    
4486    2003-06-17  Jonathan Coles   <[email protected]>
4487    
4488            Fix the problem with raster layers under Windows that caused
4489            Thuban to crash. The view should respond to layer projection
4490            changed events to update the display. Changes to a projection
4491            should not cause the map to be set to full extent.
4492            
4493            * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4494            current_map_proj to remember the current map projection so that
4495            when the projection changes we know what the previous projection
4496            was.
4497            (MapCanvas.SetMap): Unsubscribe and subscribe to
4498            LAYER_PROJECTION_CHANGED events.
4499            (MapCanvas.projection_changed): Split into two methods that respond
4500            to map and layer projection changes.
4501            (MapCanvas.map_projection_changed): New. Takes the current view and
4502            projects it using the new projection. This does not cause the
4503            map to be redrawn at full extent.
4504            (MapCanvas.layer_projection_changed): New. Cause a redraw which
4505            will draw each layer in its new projection.
4506            
4507            * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
4508            VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
4509            under Windows.
4510            
4511            * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
4512            to twice sizeof(void*) because there are two digits for each
4513            hex byte.
4514    
4515    2003-06-16  Bernhard Herzog  <[email protected]>
4516    
4517            Update to the layer interface: Direct access to the table,
4518            shapetable, shapefile and filename attributes is now actively
4519            deprecated by issuing deprecation warnings for all places where
4520            this happens.
4521    
4522            * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
4523            to the instance variables table, shapetable, shapefile and
4524            filename via __getattr__ so that we can issue a deprecation
4525            warning.
4526            (Layer.SetShapeStore): Don't set the deprecated instance variables
4527            any more
4528            (Layer.SetShapeStore): Don't use deprecated layer instance
4529            variables
4530            (Layer.Destroy): No need to explicitly remove the instance
4531            variables any more
4532            (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
4533            instance variables
4534    
4535            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
4536            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
4537            (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
4538            use deprecated layer instance variables
4539    
4540            * Thuban/UI/classifier.py (Classifier.__init__): Don't use
4541            deprecated layer instance variables
4542    
4543            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
4544            (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
4545            instance variables
4546    
4547            * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
4548            deprecated layer instance variables
4549    
4550            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
4551            deprecated layer instance variables
4552    
4553            * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
4554            deprecated layer instance variables
4555    
4556            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
4557            (MapRenderer.polygon_render_param): Don't use deprecated layer instance
4558            variables
4559    
4560            * test/runtests.py (main): Turn Thuban's deprecation warnings into
4561            errors so that they're cought by the tests
4562    
4563            * test/test_load.py (TestSingleLayer.test): Don't use deprecated
4564            layer instance variables
4565    
4566    2003-06-16  Jonathan Coles   <[email protected]>
4567    
4568            Fix a problem under Windows whereby if the user double-clicks on a
4569            layer in the legend that tree item will expand or collapse as well
4570            as open the layer properties dialog. The state of the tree item
4571            should not be affected.
4572    
4573            * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
4574            preventExpandCollapse and subscribe to expanding and collapsing
4575            events.
4576            (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
4577            collapsing events and will veto the event if it has been triggered
4578            by the user double clicking on a layer.
4579            (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
4580            that an expanding/collapsing event should be vetoed.
4581    
4582    2003-06-13  Bernhard Herzog  <[email protected]>
4583    
4584            * Thuban/UI/classifier.py (Classifier.OnClose)
4585            (Classifier.map_layers_removed)
4586            (Classifier.layer_shapestore_replaced): Unsubscribe the messages
4587            in OnClose and not in map_layers_removed or
4588            layer_shapestore_replaced to make sure it always happens when the
4589            dialog is closed
4590    
4591    2003-06-13  Jonathan Coles   <[email protected]>
4592    
4593            This puts back a fix for Windows where a panel is needed so that
4594            the background of the table view appears correctly.
4595    
4596            * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
4597            object that can be used by derived classes to place any
4598            controls (including the grid) onto.
4599            (QueryTableFrame.__init__): Use the panel as the parent window
4600            for all the controls. Reparent the grid so that the panel is
4601            the parent. Call UpdateStatusText() to correctly initialize
4602            the status bar.
4603    
4604    2003-06-13  Jonathan Coles   <[email protected]>
4605    
4606            * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
4607            from wxFrame (as opposed to wxDialog like the other classes)
4608            but otherwise behaves like the other classes. This is needed
4609            for the TableView which isn't really a dialog and needs to
4610            have a status bar and control buttons.
4611    
4612            * Thuban/UI/tableview.py (TableGrid.__init__): Create an
4613            instance variable to keep track of how many rows are selected.
4614            Subscribe once to the the events we are interested in.
4615            (ThubanGrid.OnRangeSelect): Only handle event if event handling
4616            hasn't been turned off.
4617            (ThubanGrid.OnSelectCell): Only handle event if event handling
4618            hasn't been turned off.
4619            (ThubanGrid.ToggleEventListeners): Rather than subscribe None
4620            as an event listener (which changes the event handler stack)
4621            simply set an instance variable to False. This is checked in
4622            the event handlers.
4623            (ThubanGrid.GetNumberSelected): Return the number of currently
4624            selected rows.
4625            (TableFrame): Inherit from ThubanFrame so we can have a
4626            status bar and control buttons.
4627            (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
4628            Explicitly set which items are selected in the operator choice and
4629            action choice so there is always a valid selection. Fixes RTbug #1941.
4630            Subscribe to grid cell selection events so we can update the
4631            status bar.
4632            (QueryTableFrame.UpdateStatusText): Update the status bar with
4633            how many rows are in the grid, how many columns, and how many
4634            rows are selected.
4635            (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
4636            Call UpdateStatusText when cells are (de)selected.
4637            (QueryTableFrame.OnQuery): Use the string value in the value
4638            combo if either the selected item index is 0 or if the string
4639            cannot be found in the predefined list (this happens if the
4640            user changes the text). Fixes RTbug #1940.
4641            Only turn off the grid event listeners if there a query comes
4642            back with a none empty list of ids. in the case that the list
4643            is empty this causes a grid.ClearSelection() call to actually
4644            clear the grid selection which causes the selected items in
4645            the map to be deselected. Fixes RTbug #1939.
4646    
4647            * test/test_save.py (XMLWriterTest.Encode): Check return values.
4648            Fixes RTbug #1851.
4649    
4650    2003-06-13  Bernhard Herzog  <[email protected]>
4651    
4652            * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
4653            self.selected_shape with the current selection to make sure the
4654            contents of the dialog are up to date when it's shown for the
4655            first time.
4656            The dialog used to work without this by luck. The recent fix to
4657            the connector module 'broke' a 'feature' the identify view was
4658            relying on, i.e that subscribing to a message in response to
4659            receiving a message of that type would mean that the new
4660            subscriber would also be called for the same message.
4661            
4662    2003-06-12  Jonathan Coles   <[email protected]>
4663    
4664            * extensions/thuban/gdalwarp.cpp: Removed debug printing as
4665            the image is rendered. Fixes RTbug #1937.
4666    
4667    2003-06-12  Jonathan Coles   <[email protected]>
4668    
4669            * Thuban/Lib/fileutil.py: As is done under Windows, create the
4670            user directory if it doesn't exist on a posix system.
4671            Fixes RTbug #1815.
4672    
4673            * Thuban/Model/resource.py (get_user_proj_files): Moved the
4674            called to get_application_dir here, so that the directory
4675            will only be called if this method is invoked.
4676    
4677            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
4678            the projfilepath if no projection is selected.
4679    
4680    2003-06-12  Jonathan Coles   <[email protected]>
4681    
4682            * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
4683            the scalebar if the current map has no projection set.
4684    
4685            * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
4686            projfilepath label to just the basename of the projection file
4687            rather than include the entire path.
4688    
4689            * Thuban/Model/resource.py: Fix missed proj functions that
4690            needed to be renamed.
4691    
4692    2003-06-12  Jonathan Coles   <[email protected]>
4693    
4694            * Thuban/Model/classification.py: Removed assert statements that
4695            tested if the variable was an instance of Color.
4696    
4697            * Thuban/Model/color.py (Color): Remove commented code that isn't
4698            used.
4699            (Transparent): Renamed from NoColor. Doesn't inherit from Color.
4700            Fixes RTbug #1835.
4701            (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
4702            Needed now that the class doesn't inherit from Color.
4703    
4704    2003-06-12  Jonathan Coles   <[email protected]>
4705    
4706            * test/test_save.py (XMLWriterTest.testEncode): Explicitly
4707            check unicode strings.
4708    
4709            * test/test_layer.py: Check for existence of gdal.
4710    
4711    2003-06-12  Jonathan Coles   <[email protected]>
4712        
4713            * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
4714            that was in load.py
4715    
4716            * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
4717            that was in save.py
4718    
4719    2003-06-12  Jonathan Coles   <[email protected]>
4720    
4721            This is largely a collection of bug fixes. We also handle the
4722            case where gdal is not on the system. The XMLReader and XMLWriter
4723            classes were moved into there own files to resolve some circular
4724            import references and because they shouldn't really be in the
4725            file that is dediciated to reading/writing session files since
4726            they are also used elsewhere.
4727    
4728            * Thuban/Model/classgen.py: Renamed functions to follow the
4729            function_names_with_underscores style. Fixes RTbug #1903.
4730            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
4731    
4732            * Thuban/Model/layer.py: Import gdal only if it available.
4733            (RasterLayer): Handle the case where the gdal library is unavailable.
4734            Addresses RTbug #1877.
4735    
4736            * Thuban/Model/load.py (XMLReader): Moved into seperate file
4737            xmlreader.py.
4738    
4739    2003-06-12  Jonathan Coles   <[email protected]>
4740    
4741            This is largely a collection of bug fixes. We also handle the
4742            case where gdal is not on the system. The XMLReader and XMLWriter
4743            classes were moved into there own files to resolve some circular
4744            import references and because they shouldn't really be in the
4745            file that is dediciated to reading/writing session files since
4746            they are also used elsewhere.
4747    
4748            * Thuban/Model/classgen.py: Renamed functions to follow the
4749            function_names_with_underscores style. Fixes RTbug #1903.
4750            (calculate_quantiles): Raise ValueError if 'percents' is invalid.
4751    
4752            * Thuban/Model/layer.py: Import gdal only if it available.
4753            (RasterLayer): Handle the case where the gdal library is unavailable.
4754            Addresses RTbug #1877.
4755    
4756            * Thuban/Model/load.py (XMLReader): Moved into seperate file
4757            xmlreader.py.
4758    
4759            * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
4760            file xmlwriter.py.
4761    
4762            * Thuban/Model/resource.py: Renamed functions to following the
4763            function_names_with_underscores style.
4764            (has_gdal_support): New function that returns true if the gdal
4765            library is available. Addresses RTbug #1877.
4766    
4767            * Thuban/UI/application.py (ThubanApplication.OpenSession):
4768            Display a message box if the gdal library is not available, but
4769            only if there are any layers that would use it. Addresses RTbug #1877.
4770    
4771            * Thuban/UI/classgen.py: Use renamed projection resource functions.
4772            (GenUniformPanel.__CalcStepping): Fix a slight discrepency
4773            when using integers versus floats.
4774    
4775            * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
4776            determine if the "Add Image Layer" menu option should be
4777            greyed out or not. Addresses RTbug #1877.
4778    
4779            * Thuban/UI/projdialog.py: Use renamed projection resource functions.
4780    
4781            * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
4782            optimize if a raster layer is visible. Fixes RTbug #1931.
4783            Only draw the raster layer if the gdal library is available.
4784            Addresses RTbug #1877.
4785    
4786            * test/test_classgen.py: Add tests for generate_singletons,
4787            generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
4788            (test_calculate_quantiles): Fix some tests to catch the new
4789            ValueError that is raised.
4790    
4791            * test/test_proj.py: Use renamed projection resource functions.
4792    
4793            * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
4794            test for saving classified layers. Fixes RTbug #1902.
4795            (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
4796    
4797    2003-06-12  Jan-Oliver Wagner <[email protected]>
4798    
4799            Fix for http://intevation.de/rt/webrt?serial_num=1900.
4800    
4801            * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
4802    
4803            * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
4804            multiplechoicedialog.py rather than from the wxPython library.
4805    
4806    2003-06-11  Frank Koormann  <[email protected]>
4807    
4808            * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
4809            update.
4810    
4811    2003-06-11  Frank Koormann  <[email protected]>
4812    
4813            * Thuban/Lib/fileutil.py (get_application_dir): New function to
4814            determine the absolute .thuban/thuban directory under
4815            "posix" (os.expanduser) and "nt" (read AppData registry key).
4816    
4817            * Thuban/Model/resource.py: Use get_application_dir
4818    
4819            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4820            Use get_application_dir.
4821    
4822    2003-06-10  Bernhard Herzog  <[email protected]>
4823    
4824            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
4825            the messages MAP_LAYERS_REMOVED messages
4826            (LayerTableFrame.OnClose): Unsubscribe from it.
4827            (LayerTableFrame.map_layers_removed): New. Receiver for
4828            MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
4829            dialog is showing is removed.
4830    
4831    2003-06-10  Bernhard Herzog  <[email protected]>
4832    
4833            * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
4834            of the receivers list so that unsubscribing in a receiver doesn't
4835            modify it while iterating over it.
4836    
4837            * test/test_connector.py
4838            (ConnectorTest.test_disconnect_in_receiver): New. Test whether
4839            unsubscribing in a receiver works correctly. See docstring for
4840            details
4841    
4842    2003-06-10  Bernhard Herzog  <[email protected]>
4843    
4844            * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
4845            message.
4846    
4847            * Thuban/Model/layer.py (Layer.SetShapeStore): Send
4848            LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
4849            LAYER_CHANGED will still be sent if the classification changes.
4850    
4851            * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
4852            parameter so we can subscribe to some of its messages
4853            (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
4854            and the layer's LAYER_SHAPESTORE_REPLACED
4855            (Classifier.unsubscribe_messages): New. Unsubscribe from message
4856            subscribed to in __init__
4857            (Classifier.map_layers_removed)
4858            (Classifier.layer_shapestore_replaced): receivers for the messages
4859            subscribed to in __init__. Unsubscribe and close the dialog
4860    
4861            * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
4862            the map to the Classifier dialog
4863    
4864            * test/test_layer.py (SetShapeStoreTests): Derive from
4865            SubscriberMixin as well so we can test messages
4866            (SetShapeStoreTests.setUp): Subscribe to some of the layer's
4867            messages
4868            (SetShapeStoreTests.tearDown): Clear the messages again
4869            (SetShapeStoreTests.test_sanity): Expand the doc-string and check
4870            for the modified flag too
4871            (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
4872            to check whether SetShapeStore sets the modified flag
4873            (SetShapeStoreTests.test_set_shape_store_different_field_name)
4874            (SetShapeStoreTests.test_set_shape_store_same_field)
4875            (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
4876            Add tests for the messages. This checks both the new
4877            LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
4878    
4879    2003-06-06  Jan-Oliver Wagner <[email protected]>
4880    
4881            * Thuban/UI/mainwindow.py: Improved and partly added help texts for
4882            the menu items.
4883    
4884    2003-06-05  Frank Koormann  <[email protected]>
4885    
4886            * Thuban/UI/identifyview.py (IdentifyView.__init__):
4887            Layout reimplemented without panel. Make life easier to fit the list
4888            in the dialog.
4889    
4890    2003-06-05  Frank Koormann  <[email protected]>
4891    
4892            * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
4893            once on initialisation (Former implementation resulted in multiple
4894            entries for each projection).
4895            (ProjFrame.__FillAvailList): selectProj as second optional parameter,
4896            if set, select the projection found under the specified name. This
4897            overwrites any other selection estimate.
4898            Removed projchoice filling from this method.
4899            (ProjFrame._OnSave, ProjFrame._OnAddToList):
4900            Updated call of ProjFrame.__FillAvailList
4901            (LCCPanel._DoLayout): Moved parameter controls in more common order.
4902    
4903            * Resources/Projections/defaults.proj: Extended defaults representing
4904            various common European projections.
4905    
4906    2003-06-05  Frank Koormann  <[email protected]>
4907    
4908            * Thuban/UI/identifyview.py (IdentifyView.__init__):
4909            Use ListCtrl instead of GridCtrl
4910    
4911            * Thuban/Model/resource.py:
4912            Guess location of .thuban directory from tempdir parent directory.
4913    
4914            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4915            Guess location of .thuban directory from tempdir parent directory.
4916    
4917    2003-06-04  Bernhard Herzog  <[email protected]>
4918    
4919            Do not cache the values returned by the tree widget's
4920            GetFirstChild and GetNextChild methods because it led to lots of
4921            segfaults. The new way requires more brute force but is more
4922            reliable.
4923    
4924            * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
4925            variable layer2id
4926            (LegendTree.find_layer): New method to do with brute force what
4927            layer2id tried to accomplish
4928            (LegendTree._OnMsgLayerChanged)
4929            (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
4930            Use find_layer instead of layer2id
4931            (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
4932            update layer2id anymore
4933            (LegendTree._OnMsgMapLayersRemoved)
4934            (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
4935    
4936    2003-06-03  Thomas Koester  <[email protected]>
4937    
4938            * Thuban/Model/classgen.py (GenQuantiles0): New function.
4939    
4940    2003-06-02  Bernhard Herzog  <[email protected]>
4941    
4942            * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
4943            New commands.
4944            (main_menu): Add the new commands.
4945            (MainWindow.TableRename): New. Implementation of the table_rename
4946            command.
4947            (MainWindow.RenameLayer): New. Implementation of the layer_rename
4948            command.
4949    
4950            * Thuban/Model/session.py (Session.AddTable): call self.changed to
4951            set the modified flag
4952    
4953            * test/test_session.py (TestSessionSimple.test_add_table): Test
4954            whether the modified flag is set properly
4955    
4956            * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
4957            instead of issue so that the modified flags get updated.
4958    
4959            * test/test_base.py (SomeTitledObject): Derive from Modifiable
4960            instead of Publisher to reflect reality better and to accomodate
4961            the fact that SetTitle now calls changed instead of issue
4962    
4963    2003-06-02  Bernhard Herzog  <[email protected]>
4964    
4965            * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
4966            acquisition has to happen before the try in a try-finally.
4967    
4968    2003-06-02  Bernhard Herzog  <[email protected]>
4969    
4970            * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
4971            possible that a layer is removed that is not currently selected in
4972            the legend so don't check for this.
4973    
4974    2003-05-30  Bernhard Herzog  <[email protected]>
4975    
4976            * Thuban/Model/layer.py (Layer.Destroy): Set all instance
4977            variables to None that have direct or indirect references to
4978            shapefiles or dbf files to make sure that they do go away and the
4979            files are closed.
4980    
4981    2003-05-30  Bernhard Herzog  <[email protected]>
4982    
4983            * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
4984            availImgListIndices when a new image list is created
4985            
4986    2003-05-30  Bernhard Herzog  <[email protected]>
4987    
4988            * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
4989            changing_selection to indicate whether the LegendTree code itself
4990            is currently changing the selection
4991            (LegendTree.normalize_selection): New method to normalize the
4992            selection by selecting the layer item even if the user clicked on
4993            the classification.
4994            (LegendTree._OnSelChanged): normalize the selection. This works
4995            around a bug in wx which doesn't keep track of the selection
4996            properly when subtrees are deleted.
4997    
4998    2003-05-30  Bernhard Herzog  <[email protected]>
4999    
5000            * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
5001            maximum and minimum scale factors.
5002    
5003            * test/test_classgen.py (ClassGenTest.test): Update to reflect the
5004            changes in classgen.py
5005    
5006    2003-05-30  Jonathan Coles   <[email protected]>
5007    
5008            * Thuban/Model/classgen.py: Remove ClassGenerator class but make
5009            all the methods functions. Fixes RTBug #1903.
5010    
5011            * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
5012            to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
5013            RTBug #1907.
5014    
5015            * Thuban/UI/classgen.py: Use classgen functions that were part
5016            of the ClassGenerator class. Put try/finally blocks around
5017            code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
5018            RTBug #1904.
5019    
5020            * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
5021    
5022            * Thuban/UI/legend.py: The legend was cleared and repopulated any
5023            time something changed which caused some state to be lost such
5024            as which children were expanded or collapsed. Fixes RTBug #1901.
5025            (LegendTree._OnMsgMapLayersAdded): Add only new layers.
5026            (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
5027            the legend but not in the map.
5028            (LegendTree.__FillTree): Move main functionality out into smaller
5029            methods that can be used by other methods.
5030            (LegendTree.__FillTreeLayer): Reuse old slots in the image list
5031            if they are available.
5032            (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
5033            that we override the wxTreeCtrl method. Iterate over children
5034            and call __RemoveLayer.
5035            (LegendTree.__AddLayer): New. Add a new layer to the legend.
5036            (LegendTree.__RemoveLayer): Remove a layer from the legend.
5037            (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
5038            Should only be called with the id of a layer branch.
5039            (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
5040            Returns the root item or creates one if necessary.
5041    
5042            * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
5043            ProjectRasterFile with tuple arguments instead of strings.
5044    
5045            * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
5046            with try/finally. Fixes RTBug #1904.
5047    
5048            * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
5049            with try/finally. Fixes RTBug #1904.
5050            (MapCanvas.FitSelectedToWindow): If a single point is selected
5051            simply center it on the display. Fixes RTBug #1849.
5052    
5053            * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
5054            to be compiled as a standalone app. Now the code can only be
5055            called from Python which simplifies the parameter passing.
5056            (ProjectRasterFile): Handle Python arguments. Remove code that
5057            checks for a destination dataset. Add more clean up code.
5058    
5059            * test/test_map.py (TestMapWithContents.test_raise_layer_top,
5060            TestMapWithContents.test_lower_layer_bottom):
5061            Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
5062            Fixes RTBug #1907.
5063    
5064            * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
5065            extent to the map when the legend is toggled. Fixes RTBug #1881.
5066    
5067    2003-05-29  Jan-Oliver Wagner <[email protected]>
5068    
5069            * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
5070            unsubscribes all that is subcribed in __init__.
5071    
5072    2003-05-28  Bernhard Herzog  <[email protected]>
5073    
5074            * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
5075            (MainWindow.CanDuplicateLayer): New methods to implement the
5076            Layer/Duplicate command.
5077            (layer_duplicate command): New.
5078            (main_menu): Add layer_duplicate to the Layer menu.
5079    
5080    2003-05-28  Bernhard Herzog  <[email protected]>
5081    
5082            * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
5083            renderer so that NULL/None values get displayed differently (by a
5084            gray rectangle).
5085            (TableGrid.__init__): Override the default renderers
5086    
5087    2003-05-28  Bernhard Herzog  <[email protected]>
5088    
5089            * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
5090            classification to "None" if the type of the field has changed.
5091    
5092            * test/test_layer.py (SetShapeStoreTests): New. Class with a few
5093            test for the Layer.SetShapeStore method
5094    
5095    2003-05-28  Jan-Oliver Wagner <[email protected]>
5096    
5097            * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
5098            does not necessarily have a filename).
5099    
5100    2003-05-28  Jan-Oliver Wagner <[email protected]>
5101    
5102            * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
5103            sort the selection list for the dialog.
5104    
5105    2003-05-28  Frank Koormann  <[email protected]>
5106    
5107            * extensions/thuban/wxproj.cpp
5108            (project_point): Removed cast to int for projected point coordinates.
5109            (shape_centroid): Return last point if all polygon vertices fall
5110            to one point.
5111    
5112    2003-05-28  Bernhard Herzog  <[email protected]>
5113    
5114            * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
5115            with layers that don't have shapestores, i.e. raster layers.
5116    
5117    2003-05-28  Bernhard Herzog  <[email protected]>
5118    
5119            * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
5120            when determining the title from the filename.
5121    
5122            * test/test_dbf_table.py (TestDBFTable.test_title): Update to
5123            reflect changes in the way the title is derived from the filename
5124    
5125    2003-05-28  Frank Koormann  <[email protected]>
5126    
5127            * Thuban/UI/mainwindow.py (MainWindow.TableShow):
5128            Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
5129    
5130    2003-05-27  Bernhard Herzog  <[email protected]>
5131    
5132            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
5133            delegate SelectedLayer.
5134            (MainWindow.LayerUnjoinTable): Implement.
5135            (_can_unjoin): New. Helper function for the sensitivity of the
5136            layer/unjoin command.
5137    
5138            * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
5139            (DerivedShapeStore.OrigShapeStore): New. Return the original
5140            shapestore. Used to figure out how to unjoin.
5141            (DerivedShapeStore.Shapefile): Fix a typo.
5142    
5143    2003-05-27  Bernhard Herzog  <[email protected]>
5144    
5145            * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
5146            well
5147            (JoinDialog.__init__): Use the layer parameter and only build the
5148            left choice when a layer is given
5149            (JoinDialog.OnJoin): Handle layer joins as well
5150            (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
5151            that the user selects the "Select..." item. The sensitivitly
5152            updating is now in update_sensitivity
5153            (JoinDialog.y): New method to refactor the sensitivity update of
5154            the join button into its own method.
5155    
5156            * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
5157    
5158    2003-05-27  Bernhard Herzog  <[email protected]>
5159    
5160            * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
5161            iff there are unreferenced tables in the session
5162    
5163    2003-05-27  Bernhard Herzog  <[email protected]>
5164    
5165            * Thuban/Model/messages.py (TABLE_REMOVED): New message.
5166    
5167            * Thuban/Model/session.py (Session.UnreferencedTables): New method
5168            to return tables that are not referenced by other tables or shape
5169            stores and can be removed.
5170            (Session.RemoveTable): Issue a TABLE_REMOVED message after
5171            removing the table
5172    
5173            * Thuban/UI/mainwindow.py: Remove unused imports
5174            (MainWindow.TableClose): Implement.
5175    
5176            * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
5177            messages so that the frame will be automatically closed when a new
5178            session is opened or the table is removed.
5179            (TableFrame.OnClose): Unsubscribe the Subscriptions made in
5180            __init__
5181            (TableFrame.close_on_session_replaced)
5182            (TableFrame.close_on_table_removed): New. Subscribers that close
5183            the window
5184    
5185            * test/test_session.py (TestSessionMessages.test_remove_table)
5186            (TestSessionSimple.test_remove_table): Move the test to
5187            TestSessionSimple and add test for the TABLE_REMOVED message
5188            (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
5189            (TestSessionSimple.test_unreferenced_tables) New. Test for the
5190            UnreferencedTables method.
5191            (UnreferencedTablesTests): New. Class with some more sophisticated
5192            tests for UnreferencedTables.
5193    
5194    2003-05-27  Frank Koormann  <[email protected]>
5195    
5196            * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
5197            display has some unwanted side effects. Removed again.
5198    
5199    2003-05-27  Frank Koormann  <[email protected]>
5200    
5201            * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
5202    
5203            * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
5204    
5205    2003-05-27  Jan-Oliver Wagner <[email protected]>
5206    
5207            * test/test_menu.py (MenuTest.test): Added test for
5208            Menu.RemoveItem().
5209    
5210            * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
5211            the menu.
5212    
5213    2003-05-27  Frank Koormann  <[email protected]>
5214            
5215            Nonmodal dialogs without parent (i.e. they can fall behind the main
5216            window)
5217    
5218            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
5219            all dialogs in the dialogs dictionary and the canvas.
5220    
5221            * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
5222            parent, i.e. can fall behind other windows.
5223            (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
5224            dictionary before removing it.
5225    
5226            * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
5227    
5228            * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
5229            * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
5230            * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
5231    
5232    2003-05-27  Bernhard Herzog  <[email protected]>
5233    
5234            * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
5235            tableview dialog
5236            (MainWindow.TableShow): Use ShowTableView to open the dialogs.
5237            Also, don't use the table's titles as the dialog names. The titles
5238            aren't guaranteed to be unique.
5239            (MainWindow.TableOpen): Open a table view dialog after opening the
5240            table
5241    
5242    2003-05-27  Bernhard Herzog  <[email protected]>
5243    
5244            * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
5245            effect can be achieved by simply closing the window showing the
5246            table.
5247            (MainWindow.TableHide): Removed.
5248            (main_menu): Removed "table_hide"
5249    
5250    2003-05-27  Frank Koormann  <[email protected]>
5251    
5252            Fix legend tree display problems under Win32
5253    
5254            * Thuban/UI/legend.py:  BMP_SIZE_W = 15
5255            (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
5256            (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
5257    
5258            * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
5259    
5260    2003-05-27  Jan-Oliver Wagner <[email protected]>
5261    
5262            * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
5263            'after' now allows to insert separators almost anywhere in the menu.
5264    
5265    2003-05-27  Frank Koormann  <[email protected]>
5266    
5267            * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
5268            "S" of selection box label to hint on hot key (Alt-S). Works under
5269            Win32 but is ignored under GTK.
5270    
5271    2003-05-26  Frank Koormann  <[email protected]>
5272    
5273            * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
5274            Center Choices.
5275    
5276    2003-05-26  Bernhard Herzog  <[email protected]>
5277    
5278            Remove the Precision methods again. They're too DBF specific to be
5279            part of the table interface and they're only used in table_to_dbf
5280            anyway.
5281            
5282            * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
5283            fixed precision of 12 for doubles.
5284            (TransientTableBase.Precision): Removed
5285            (AutoTransientTable.Width): Delegate to self.table.
5286    
5287            * Thuban/Model/table.py (DBFTable.Precision)
5288            (MemoryTable.Precision): Removed.
5289            (MemoryTable.Width): Use a fixed precision of 12 for doubles.
5290            (table_to_dbf): Use a fixed precision of 12 for floats unless the
5291            column object specifies something else.
5292    
5293            * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
5294            test for table_to_dbf
5295    
5296    2003-05-26  Bernhard Herzog  <[email protected]>
5297    
5298            * test/test_transientdb.py
5299            (TestTransientTable.run_iceland_political_tests): Fix a comment.
5300    
5301    2003-05-26  Bernhard Herzog  <[email protected]>
5302    
5303            * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
5304            implementation. Mark parts of the file format strings for
5305            localization.
5306    
5307            * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
5308            file and add the table to the tables managed by the session
5309    
5310            * test/test_session.py (TestSessionSimple.test_open_table_file):
5311            New. test case for OpenTableFile
5312    
5313    2003-05-26  Jan-Oliver Wagner <[email protected]>
5314    
5315            * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
5316            Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
5317            Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
5318            Replace the true/false of wxWindows by True/False of Python 2.2.1.
5319    
5320    2003-05-26  Jan-Oliver Wagner <[email protected]>
5321    
5322            * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
5323            already a selection present, update the grid accordingly.
5324    
5325            * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
5326            resizeable and increase its initial size.
5327    
5328    2003-05-26  Frank Koormann  <[email protected]>
5329    
5330            Table export functionality
5331    
5332            * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
5333            Return width (in characters) for a column.
5334            (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
5335            (table_to_dbf): Write table to dbf file.
5336            (table_to_csv): Write table to csv file.
5337    
5338            * Thuban/Model/transientdb.py (TransientTableBase.Width,
5339            TransientTableBase.Precision): Return column width and precision.
5340    
5341            * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
5342            or table_to_csv depending on file selection.
5343    
5344            * test/test_dbf_table.py:
5345            Test table_to_dbf (extension of former part of test).
5346    
5347            * test/test_csv_table.py:
5348            Test table_to_csv.
5349    
5350    2003-05-23  Jan-Oliver Wagner <[email protected]>
5351    
5352            * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
5353            Use QueryTableFrame instead of TableFrame.
5354    
5355            * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
5356            table window with 'Layer Table:' instead of 'Table:'.
5357    
5358    2003-05-23  Jan-Oliver Wagner <[email protected]>
5359    
5360            Give all tables a title via mix-in TitledObject.LayerShowTable
5361    
5362            * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
5363            only if it exists.
5364    
5365            * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
5366            and call its init-method with a default title. Remove Title() method.
5367    
5368            * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
5369            AutoTransientTable): mix-in TitledObject and call its init-method with
5370            a default title. Remove Title() method.
5371    
5372    2003-05-23  Bernhard Herzog  <[email protected]>
5373    
5374            * Thuban/Model/session.py (Session.AddShapeStore): Define
5375            AddShapeStore analogously to AddTable.
5376    
5377            * test/test_session.py (TestSessionSimple.test_add_shapestore):
5378            New. Test for AddShapeStore
5379    
5380    2003-05-23  Jan-Oliver Wagner <[email protected]>
5381    
5382            Introducing QueryTableFrame and a very coarse ShowTable implementation.
5383    
5384            * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
5385            class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
5386            The latter implements the selection GUI without dependency on a layer.
5387            LayerTableFrame now is derived from QueryTableFrame and connects
5388            to a layer.
5389    
5390            * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
5391            implementation that still needs work.
5392    
5393            * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
5394    
5395    2003-05-22  Frank Koormann  <[email protected]>
5396    
5397            * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5398            Added "outer_join = False" as optional parameter.
5399            (TransientJoinedTable.create): If outer join is true, perform a
5400            "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
5401            the left table. Records not matching are filled with 0 / None.
5402    
5403            * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
5404            (JoinDialog.OnJoin): Consider outer join check box.
5405    
5406    2003-05-22  Bernhard Herzog  <[email protected]>
5407    
5408            * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
5409            somewhat safer way. Storing the traceback in a local variable can
5410            lead to memory leaks
5411    
5412    2003-05-22  Bernhard Herzog  <[email protected]>
5413    
5414            * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
5415            the wxMessageDialog's Destroy() method.
5416    
5417    2003-05-22  Frank Koormann  <[email protected]>
5418    
5419            * Thuban/UI/join.py (JoinDialog.__init__): Make use of
5420            TransientTable.Title()
5421    
5422    2003-05-22  Frank Koormann  <[email protected]>
5423    
5424            Join Dialog, initial version.
5425    
5426            * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
5427    
5428            * Thuban/UI/join.py (JoinDialog): Functional implementation of
5429            former framework. Renamed Table1/Table2 to LeftTable/RightTable
5430            in all occurences.
5431    
5432            * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
5433            Typo fixed.
5434    
5435    2003-05-22  Bernhard Herzog  <[email protected]>
5436    
5437            Give the tables titles so that the GUI can display more meaningful
5438            names. For now the titles are fixed but depend on e.g. filenames
5439            or the titles of the joined tables.
5440    
5441            * Thuban/Model/transientdb.py (TransientTable.Title)
5442            (TransientJoinedTable.Title, AutoTransientTable.Title): New.
5443    
5444            * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
5445    
5446            * test/test_transientdb.py
5447            (TestTransientTable.test_auto_transient_table_title): New. Test
5448            for the Title method
5449            (TestTransientTable.test_transient_joined_table)
5450            (TestTransientTable.test_transient_table): Add test for the Title
5451            methods
5452    
5453            * test/test_memory_table.py (TestMemoryTable.test_title): New.
5454            Test for the Title method
5455    
5456            * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
5457            the Title method
5458    
5459    2003-05-22  Bernhard Herzog  <[email protected]>
5460    
5461            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
5462            Provide a better way to destroy the layers
5463            (TestLayer.test_base_layer, TestLayer.test_arc_layer)
5464            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
5465            (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
5466            the new way to destroy the layers.
5467            (TestLayer.test_derived_store): New. Test for using a layer with a
5468            DerivedShapeStore
5469    
5470            * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
5471            filename if the shape store actually has one.
5472    
5473    2003-05-22  Bernhard Herzog  <[email protected]>
5474    
5475            * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
5476            for the filename
5477    
5478            * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
5479            for the FileName method
5480            (TestDBFTableWriting.test_write): Fix spelling of filename
5481    
5482    2003-05-22  Thomas Koester  <[email protected]>
5483    
5484            * Thuban/Model/range.py, test/test_range.py: Brought over new Range
5485            from SciParam that now really is immutable.
5486    
5487    2003-05-22  Frank Koormann  <[email protected]>
5488    
5489            Layer Top/Bottom placement added to legend.
5490    
5491            * Thuban/UI/legend.py
5492            (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
5493            bound to tool events.
5494            (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
5495            New, methods binding the event methods with the map methods.
5496    
5497            * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
5498            layer at top/bottom of layer stack.
5499    
5500            * Resources/Bitmaps/top_layer.xpm: New button icon.
5501    
5502            * Resources/Bitmaps/bottom_layer.xpm: New button icon.
5503    
5504    2003-05-22  Bernhard Herzog  <[email protected]>
5505    
5506            * Thuban/Model/session.py (Session.RemoveTable): New method to
5507            remove tables
5508    
5509            * test/test_session.py (TestSessionSimple.test_remove_table): New.
5510            Test for RemoveTable
5511    
5512    2003-05-22  Thomas Koester  <[email protected]>
5513    
5514            * Thuban/Model/classgen.py: Added short module doc string and CVS id.
5515            (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
5516    
5517    2003-05-22  Bernhard Herzog  <[email protected]>
5518    
5519            Implement a way to discover dependencies between tables and
5520            shapestores.
5521    
5522            * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
5523            (TransientJoinedTable.Dependencies)
5524            (AutoTransientTable.SimpleQuery): New. Implement the dependencies
5525            interface
5526            (TransientJoinedTable.__init__): Keep tack of the original table
5527            objects in addition to the corresponding transient tables.
5528    
5529            * Thuban/Model/table.py (DBFTable.Dependencies)
5530            (MemoryTable.Dependencies): New. Implement the dependencies
5531            interface
5532    
5533            * Thuban/Model/data.py (ShapeTable): New. Helper class for
5534            ShapefileStore
5535            (ShapefileStore.__init__): Use ShapeTable instead of
5536            AutoTransientTable
5537            (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
5538            (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
5539            methods for filename and type
5540            (ShapefileStore.Dependencies): New. Implement the dependencies
5541            interface
5542            (DerivedShapeStore): New class to replace SimpleStore. The main
5543            difference to SimpleStore is that it depends not on a shapefile
5544            but another shapestore which expresses the dependencies a bit
5545            better
5546            (SimpleStore.__init__): Add deprecation warning.
5547    
5548            * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
5549            Test for the Dependencies method.
5550    
5551            * test/test_memory_table.py (TestMemoryTable.test_dependencies):
5552            New. Test for the Dependencies method.
5553    
5554            * test/test_transientdb.py
5555            (TestTransientTable.test_auto_transient_table_dependencies): New.
5556            Test for the Dependencies method.
5557            (TestTransientTable.test_transient_joined_table): Add test for the
5558            Dependencies method.
5559    
5560            * test/test_session.py (TestSessionSimple.setUp)
5561            (TestSessionSimple.tearDown): New. Implement a better way to
5562            destroy the sessions.
5563            (TestSessionSimple.test_initial_state)
5564            (TestSessionSimple.test_add_table): Bind session to self.session
5565            so that it's destroyed by tearDown
5566            (TestSessionSimple.test_open_shapefile): New. Test for
5567            OpenShapefile and the object it returns
5568    
5569    2003-05-22  Bernhard Herzog  <[email protected]>
5570    
5571            * Thuban/Model/session.py (Session.AddTable): New method to
5572            register tables with the session.
5573            (Session.Tables): Return the tables registered with AddTable too.
5574    
5575            * test/test_session.py (TestSessionSimple.test_add_table): New.
5576            Test case for the AddTable method
5577    
5578    2003-05-22  Frank Koormann  <[email protected]>
5579    
5580            UI polishing updates: Place main buttons (OK, Cancel, etc) in the
5581            lower right corner, center labels for selections, initialize controls
5582            in reasonable order for keyboard navigation.
5583    
5584            * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
5585            (ProjFrame.__DoOnProjAvail): Determine position of current projection
5586            using the wxListBox.FindString() method. Still a problem (#1886)
5587    
5588            * Thuban/UI/classifier.py
5589            (Classifier.__init__, SelectPropertiesDialog.__init__)
5590    
5591            * Thuban/UI/classgen.py (ClassGenDialog.__init__,
5592            (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
5593            different classification types from here to __init__.
5594            (GenUniquePanel.__init__): Set the column width of the first field
5595            in the Field ListCtrl to the full width.
5596    
5597            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
5598            Button to 'Export'. Center Buttons in Selection Box, set Focus to
5599            Grid.
5600            (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
5601            changes focus to the Selection when pressing "Alt-S".
5602    
5603            * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
5604            the text if not visible. The italic font sometimes exceeds the
5605            rendering area.
5606    
5607    2003-05-21  Jonathan Coles   <[email protected]>
5608    
5609            * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
5610            to OnClose so that Thuban closes correctly.
5611    
5612            * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
5613            DockFrame.OnClose, not DockFrame._OnClose.
5614    
5615    2003-05-21  Jonathan Coles   <[email protected]>
5616    
5617            * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
5618            references to 'inf' and use new Range __init__ to pass floats
5619            directly rather than converting them to strings first.
5620            Fixes RTBug #1876.
5621    
5622            * Thuban/Model/classification.py (ClassGroupRange.SetRange):
5623            Use new Range ___init__ to pass floats.
5624    
5625            * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
5626            filename is a valid image file. Throw IOError otherwise.
5627    
5628            * Thuban/Model/range.py: Brought over new Range from SciParam that
5629            is immutable and has an __init__ which can accept floats.
5630    
5631            * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
5632            into try block. AddLayer doesn't throw any exceptions anymore.
5633            (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
5634            try block.
5635    
5636            * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
5637            the first item in choices. Fixes RTBug #1882.
5638    
5639            * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
5640            has gone to 0 which is a serious problem. abort.
5641            (MapRenderer.draw_raster_layer): Catch IOError seperately and
5642            print the error from GDAL.
5643    
5644            * Thuban/UI/tableview.py (TableGrid.__init__): Call
5645            ToggleEventListeners to turn on listening.
5646            (TableGrid.ToggleEventListeners): New. Turns event listening on
5647            and off so as to prevent excessive messages.
5648            (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
5649            to suppress excessive messages when selecting many rows.
5650            Fixes RTBug #1880.
5651    
5652            * Thuban/UI/view.py: Added checks against if scale == 0. This
5653            is a serious problem that can occur when an image without
5654            geo data is loading and causes the map projection bounds to
5655            go to infinity. Right now, the solution is to simply try
5656            to recover.
5657    
5658            * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
5659            to set the MFILEReceiver attributes even if the data is NULL.
5660    
5661            * extensions/thuban/gdalwarp.cpp: Improved the error handling
5662            and passed GDAL messages back up to the Python layer. Also
5663            tried to fix some memory leaks that were present in the original
5664            utility but didn't matter because the program aborted.
5665    
5666            * test/test_range.py: Copied over tests from SciParam. Removed
5667            tests against importing. Fixes RTBug #1867.
5668    
5669    2003-05-21  Bernhard Herzog  <[email protected]>
5670    
5671            * test/test_load.py: Remove unused imports and restructure the
5672            test code
5673            (LoadSessionTest): Split into one class for each test and turn
5674            LoadSessionTest itself into the base class for all such session
5675            tests.
5676            (ClassificationTest): New base class for load tests that test
5677            classifications
5678            (TestSingleLayer, TestLayerVisibility, TestClassification)
5679            (TestLabels, TestLayerProjection, TestRasterLayer): New classes
5680            for the individual tests
5681    
5682            * test/support.py (FileLoadTestCase.filename): New base class for
5683            file loading tests
5684    
5685    2003-05-21  Jan-Oliver Wagner <[email protected]>
5686    
5687            * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
5688            Mercator' to 'UTM Zone 32' as a more convenient example.
5689            Added 'Gauss Krueger Zone 6'.
5690    
5691            * Data/iceland_sample_raster.thuban: political polygon now
5692            filled transparent to have the raster image visible at once.
5693    
5694    2003-05-21  Frank Koormann  <[email protected]>
5695    
5696            * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
5697            OnClose() to keep in sync with extensions. Internally Thuban
5698            still uses "underscored" names.
5699    
5700    2003-05-20  Jonathan Coles   <[email protected]>
5701    
5702            This puts back Raster layer support. These layers support projections
5703            through the GDAL library. Currently, the CVS version is being used.
5704            There are no Debian packages available although this may change soon.
5705            A GDAL driver was extended to support writing to memory rather to
5706            files.
5707    
5708            There is still some work that needs to be done, such as some error
5709            handling when loading invalid images or when there is a problem
5710            projecting the image. This putback simply checks in the majority
5711            of the work.
5712    
5713            * setup.py: Add gdalwarp library extension.
5714    
5715            * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
5716            Defaults to False, but can be overridden by subclasses if they
5717            support classification.
5718            (RasterLayer): New. Defines a new layer that represents an
5719            image.
5720    
5721            * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
5722            tag handler.
5723            (SessionLoader.start_layer): Encode the filename.
5724            (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
5725            New. Supports reading a rasterlayer tag.
5726    
5727            * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
5728    
5729            * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
5730            get a string in Latin1. If we get such as string convert it to
5731            unicode first, otherwise leave if alone before encoding.
5732            (SessionSaver.write_layer): Add support for writing both Layers
5733            and RasterLayers.
5734    
5735            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
5736            The right argument may not be a string, it could also be a Column.
5737    
5738            * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
5739            Make initial window size 600x400. Fixes RTBug #1872.
5740    
5741            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
5742            the dialog is constructed so that we can support layers that
5743            do not have classifications.
5744            (Classifier._OnTry): Only build a classification if the layer
5745            supports one.
5746    
5747            * Thuban/UI/legend.py: Change all checks that a layer is an
5748            instance of Layer into checks against BaseLayer.
5749            (LegendTree.__FillTreeLayer): Only add children to a branch if
5750            the layer supports classification.
5751    
5752            * Thuban/UI/mainwindow.py (MainWindow.NewSession,
5753            MainWindow.OpenSession): Don't proceed with an action if the
5754            user chooses Cancel when they are asked to save changes.
5755            (MainWindow.AddRasterLayer): New. Open a dialog to allow the
5756            user to select an image file. Create a new RasterLayer and add
5757            it to the map.
5758    
5759            * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
5760            for rendering RasterLayer layers.
5761            (MapRenderer.draw_raster_layer): Actually method that calls
5762            the GDALWarp python wrapper and constructs an image from the
5763            data returned.
5764    
5765            * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
5766            Choices symbols to match those used in the table query method.
5767            Replace deprecated method calls on table with new method names.
5768    
5769            * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
5770            how small the scale can get. This still needs more testing.
5771    
5772            * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
5773            Provides a driver to output in .bmp format.
5774    
5775            * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
5776            New. Provides IO routines which write to memory, rather than a file.
5777    
5778            * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
5779            of the gdalwarp utility provided in GDAL. Added function calls
5780            that can be accessed from python.
5781    
5782            * Data/iceland_sample_raster.thuban: New. Sample file that uses
5783            a raster layer.
5784    
5785            * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
5786            layer image data.
5787    
5788            * Doc/thuban.dtd: Added rasterlayer attribute definition.
5789    
5790            * test/test_layer.py, test/test_load.py, test/test_save.py: Added
5791            tests associated with the raster layer code.
5792    
5793            * test/test_transientdb.py
5794            (TestTransientTable.test_auto_transient_table_query): Added a test
5795            for using a Column object as the "right" parameter to a query.
5796    
5797    2003-05-19  Frank Koormann  <[email protected]>
5798    
5799            * Thuban/version.py (get_changelog_date):
5800            Catch exceptions if ChangeLog does not exist.
5801    
5802            * Thuban/UI/view.py (MapCanvas.Export): Bugfix
5803    
5804  2003-05-19  Frank Koormann  <[email protected]>  2003-05-19  Frank Koormann  <[email protected]>
5805    
5806          Extended version information for Thuban          Extended version information for Thuban

Legend:
Removed from v.924  
changed lines
  Added in v.2111

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26