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

Legend:
Removed from v.59  
changed lines
  Added in v.2138

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26