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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2138 - (hide annotations)
Thu Mar 25 05:31:38 2004 UTC (20 years, 11 months ago) by joey
Original Path: trunk/thuban/ChangeLog
File size: 362314 byte(s)
Missing update for the ChangeLog

1 joey 2138 2004-03-24 Martin Schulze <[email protected]>
2 joey 2120
3 joey 2138 * 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 joey 2120 * 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 joey 2115 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 joey 2111 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 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
74    
75 bh 2107 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 bh 2105 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 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
134    
135 bh 2103 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 bh 2100 * 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 silke 2095 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 bh 2094 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 bh 2089 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 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
277    
278 bh 2087 * 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 bh 2085 * 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 bh 2083 * 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 bh 2080 * 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 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
311    
312 bh 2077 * 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 bh 2075 * 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 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
324    
325 bh 2073 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 bh 2070 * 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 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
349    
350 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
351     line
352    
353     2004-02-16 Bernhard Herzog <[email protected]>
354    
355 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
356    
357 mrechtie 2064 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 bh 2062 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 bh 2060 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 bh 2058 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 frank 2055 2004-02-06 Frank Koormann <[email protected]>
437    
438     * po/pt_BR.po: Fixed charset
439    
440 frank 2054 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 frank 2053 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 frank 2052 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 frank 2051 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 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
482    
483 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
484    
485     2004-01-05 Bernhard Herzog <[email protected]>
486    
487 bh 2048 * po/Makefile, po/README: Move the description of how to generate
488     the translation statistics to the README.
489    
490 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
491    
492 bh 2045 * 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 bh 2042 * 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 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
512    
513 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
514     updated
515    
516     2003-12-22 Bernhard Herzog <[email protected]>
517    
518 bh 2037 * 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 bh 2035 * 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 bh 2033 * 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 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
569    
570     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
571    
572 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
573 silke 2029
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 bh 2028
579 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
580    
581 bh 2028 * 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 frank 2026 2003-12-09 Frank Koormann <[email protected]>
586    
587     * Resources/Projections/defaults.proj:
588     French projection sample with correct accents (UNICODE).
589    
590 bh 2025 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 frank 2022 2003-12-05 Frank Koormann <[email protected]>
598    
599 frank 2023 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 frank 2022 * 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 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
626    
627 bh 2021 Fix for RT #2243
628    
629 bh 2020 * 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 bh 2018 * 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 bh 2016 * po/ru.po: Updates from Alex Shevlakov
645    
646 silke 2013 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 bh 2012 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 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
665    
666 bh 2010 * MANIFEST.in: Add debian files
667    
668 bh 2008 * 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 bh 2005 * 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 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
707    
708 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
709     nt to better match Intevation's current w32 setup
710    
711 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
712    
713     * MANIFEST.in: Add the Extensions
714    
715 bh 1998 * NEWS: Update for 1.0rc1
716    
717     2003-12-01 Bernhard Herzog <[email protected]>
718    
719 bh 1996 * 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 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
724    
725 bh 1996 * 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 bh 1992 * po/de.po: Update german translation.
734    
735     2003-11-28 Bernhard Herzog <[email protected]>
736    
737 bh 1990 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 bh 1988 * 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 bh 1984 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 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
794     InverseBBox to unproject bboxes
795    
796 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
797    
798 bh 1981 * 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 bh 1979 * 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 bh 1977 * 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 bh 1975 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 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
829    
830 bh 1973 * 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 bh 1971 * 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 bh 1969 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 bh 1967 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 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
871    
872 bh 1965 * 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 bh 1963 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 bh 1960 * 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 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
908    
909 bh 1958 * 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 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
928 bh 1954 _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 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
939    
940     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
941     typo in doc-string
942    
943 bh 1949 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 jan 1945 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 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
989    
990 bh 1942 * 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 bh 1939 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 bh 1934 * 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 bh 1932 * 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 bh 1929 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 bh 1925 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 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
1127    
1128 bh 1922 * 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 bh 1920 * 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 bh 1916 * 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 bh 1913 * 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 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
1169    
1170 bh 1911 * 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 bh 1908 * 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 bh 1906 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 bh 1904 * 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 jan 1902 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 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
1239 jan 1902 of printing it to stdout.
1240    
1241 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
1242    
1243 bh 1899 * 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 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
1253     Thuban performance
1254    
1255 frank 1895 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 bh 1894 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 frank 1890 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 jan 1889 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 bh 1880 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 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
1322    
1323 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
1324    
1325 bh 1876 * 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 bh 1873 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 bh 1870 * 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 bh 1868 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 bh 1865 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 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
1438    
1439 jan 1862 * 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 jan 1859 * 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 jan 1857 * 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 bh 1855 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 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
1485    
1486 bh 1852 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 bh 1849 * 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 bh 1847 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 bh 1840 * 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 frank 1837 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 bh 1836 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 bh 1834 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 bh 1832 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 silke 1829 2003-10-16 Silke Reimer <[email protected]>
1630    
1631     * debian/*: New directory with configuration files for building a thuban
1632     deb-package.
1633    
1634 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
1635    
1636 bh 1828 * 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 bh 1826 * 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 bh 1822 * 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 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
1674    
1675 bh 1820 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 bh 1814 * 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 bh 1812 * 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 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
1735    
1736 bh 1810 * 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 bh 1807 * 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 bh 1805 * README: Fix typo.
1768    
1769 bh 1803 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 jan 1801 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 bh 1799 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 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
1796    
1797 bh 1796 * 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 bh 1794 * 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 jan 1792 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 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
1812    
1813 bh 1790 * 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 bh 1788 * 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 bh 1785 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 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
1863    
1864 bh 1783 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 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
1908     doc-string
1909    
1910     2003-10-06 Bernhard Herzog <[email protected]>
1911    
1912 bh 1775 * 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 bh 1773 * 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 bh 1770 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 jan 1767 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 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
1947    
1948 bh 1760 * 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 bh 1757 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 bh 1751 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 jan 1745 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 bh 1743 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 bh 1737 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 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
2010    
2011 jan 1735 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 jan 1730 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 jan 1720 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 bh 1718 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 jan 1716 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 jan 1714 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 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
2090    
2091 jan 1707 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 jan 1705 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 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
2112    
2113 bh 1701 * 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 bh 1699 * 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 bh 1696 * 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 bh 1694 * 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 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
2151    
2152     * HOWTO-Release: Tweak item about running the tests.
2153    
2154 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
2155    
2156     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
2157    
2158 bh 1688 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 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
2189    
2190 bh 1685 * 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 bh 1672 * 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 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
2262    
2263 bh 1665 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 bh 1663 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 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
2385    
2386 bh 1661 * 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 bh 1659 * 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 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
2402    
2403 bh 1657 * 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 bh 1655 * 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 bh 1653 * 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 bh 1651 * 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 bh 1649 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 bh 1647 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 bh 1645 * 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 bh 1643 * 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 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
2512 bh 1641
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 bh 1639 Implement saving a session with a postgis connection
2519 bh 1632
2520 bh 1639 * 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 bh 1637 * 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 bh 1635 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 bh 1632 * 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 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
2609     removed because it's still in use.
2610 bh 1632
2611 jan 1629 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 bh 1627 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 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
2635    
2636 jan 1626 * 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 jan 1623 * 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 bh 1621 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 jan 1619 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 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
2722    
2723 bh 1609 * 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 bh 1606 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 jan 1604 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 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
2783    
2784 bh 1602 * 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 bh 1600 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 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
2814    
2815     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
2816    
2817 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
2818    
2819 bh 1594 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 bh 1592 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 bh 1590 * 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 bh 1588 * 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 bh 1586 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 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
2943    
2944     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
2945    
2946 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
2947    
2948 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
2949    
2950     2003-08-12 Bernhard Herzog <[email protected]>
2951    
2952 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
2953     strings have to be one string literal.
2954    
2955 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
2956    
2957 bh 1578 * 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 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
2975     error message
2976    
2977 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
2978    
2979 jan 1571 * 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 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
2986     the list corresponds to the "About" web page.
2987    
2988 bh 1567 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 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
3003    
3004 bh 1565 * 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 bh 1561 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 bh 1560 * 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 bh 1561 used inside of Thuban and the generic Shape class has gone away.
3036 bh 1560
3037 bh 1563 * 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 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
3042    
3043 bh 1559 * 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 bh 1556 * 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 bh 1553 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 jan 1550 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 bh 1548 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 jan 1545 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 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
3160    
3161 bh 1543 * 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 bh 1540 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 jonathan 1534 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 frank 1532 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 jonathan 1531 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 jonathan 1529 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 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
3248    
3249 bh 1524 * 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 bh 1522 * 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 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
3265    
3266 jonathan 1519 * 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 jonathan 1517 * 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 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
3282    
3283 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
3284    
3285     2003-07-29 Bernhard Herzog <[email protected]>
3286    
3287 bh 1514 * 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 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
3292    
3293 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
3294 jonathan 1506
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 jonathan 1503
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 bh 1500 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 frank 1497 2003-07-29 Frank Koormann <[email protected]>
3318    
3319 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
3320     projections.
3321    
3322     2003-07-29 Frank Koormann <[email protected]>
3323    
3324 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
3325    
3326 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
3327    
3328 jonathan 1495 * 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 jonathan 1493 * 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 bh 1483 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 jan 1767 executable. The #! isn't necessary here since if you absolutely
3370 bh 1483 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 frank 1479 2003-07-24 Frank Koormann <[email protected]>
3379    
3380     * Doc/manual/thuban-manual.xml: Added section on table management.
3381    
3382 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
3383    
3384     * test/runtests.py (main): Recognize the long "verbose" option
3385     correctly.
3386    
3387 jonathan 1470 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 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
3428    
3429 bh 1465 * 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 bh 1463 * 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 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
3474    
3475     2003-07-18 Bernhard Herzog <[email protected]>
3476    
3477 bh 1459 * 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 bh 1457 * 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 bh 1455 * 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 bh 1453 * 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 bh 1451 * 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 jonathan 1449 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 jonathan 1442 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 jan 1424 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 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
3657    
3658 bh 1422 * 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 bh 1420 * 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 bh 1418 * 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 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
3691    
3692     * test/test_view.py: New. Tests for ViewPort.
3693    
3694 frank 1409 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 frank 1411 * 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 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
3704    
3705 jonathan 1406 * 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 jonathan 1403 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 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
3793    
3794 bh 1382 * 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 bh 1380 * 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 bh 1378 * 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 bh 1376 * 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 bh 1372 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 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
3870    
3871 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
3872    
3873     2003-07-03 Bernhard Herzog <[email protected]>
3874    
3875 bh 1368 * 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 bh 1365 * 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 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
3896 jonathan 1349
3897 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
3898     generate_uniform_distribution, generate_quantiles,
3899 jonathan 1363 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 jonathan 1360 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 jonathan 1358 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 jonathan 1349 * 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 frank 1334 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 bh 1329 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 frank 1334
4072 bh 1329 * 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 frank 1325 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 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
4083    
4084 jonathan 1349 * 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 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
4094     were too high.
4095    
4096     2003-06-30 Jonathan Coles <[email protected]>
4097    
4098 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
4099    
4100     * MANIFEST.in: Added Projections so that default.proj is
4101     included.
4102    
4103 jonathan 1312 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 jonathan 1304 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 jonathan 1299 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 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
4160 jonathan 1297
4161     * setup.py: Add Resources/XML to resource list.
4162    
4163     2003-06-23 Jonathan Coles <[email protected]>
4164 jonathan 1286
4165 jonathan 1297 * setup.cfg: Fix copyright dates
4166    
4167     2003-06-23 Jonathan Coles <[email protected]>
4168    
4169 jonathan 1294 * 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 jonathan 1289 * 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 jonathan 1286 * 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 bh 1283 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 bh 1281 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 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
4227    
4228 jonathan 1279 * 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 jonathan 1272 * 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 bh 1270 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 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
4340    
4341 jonathan 1267 * 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 jonathan 1265 * 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 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
4365    
4366 bh 1260 * 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 bh 1258 * 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 bh 1256 * 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 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
4398    
4399 jonathan 1265 This is mainly about fixing RTbug #1949.
4400    
4401 jonathan 1254 * 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 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
4421    
4422 bh 1248 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 bh 1246 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 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
4471     the classification element.
4472     (projection): Add the "name" attribute
4473    
4474 frank 1242 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 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
4494    
4495 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
4496    
4497     2003-06-18 Jonathan Coles <[email protected]>
4498    
4499 jonathan 1235 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 jonathan 1237 * 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 jonathan 1224 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 bh 1220 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 jonathan 1212 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 bh 1208 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 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
4653    
4654 jonathan 1203 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 jonathan 1201 * 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 bh 1195 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 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
4724 jonathan 1175
4725 jonathan 1193 * 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 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
4731 jonathan 1193 user directory if it doesn't exist on a posix system.
4732     Fixes RTbug #1815.
4733 jonathan 1191
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 jonathan 1182 * 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 jonathan 1178 * 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 jonathan 1175 * 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 jonathan 1172
4774     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
4775     that was in load.py
4776 jonathan 1169
4777 jonathan 1172 * 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 jonathan 1169 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 jonathan 1172 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 jonathan 1169 * 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 jan 1156 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 frank 1151 2003-06-11 Frank Koormann <[email protected]>
4868    
4869 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
4870     update.
4871    
4872     2003-06-11 Frank Koormann <[email protected]>
4873    
4874 frank 1151 * 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 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
4884    
4885 bh 1147 * 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 bh 1145 * 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 bh 1143 * 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 jan 1141 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 frank 1134 2003-06-05 Frank Koormann <[email protected]>
4946    
4947 frank 1139 * 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 frank 1137 * 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 frank 1134 * 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 bh 1130 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 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
4998    
4999     * Thuban/Model/classgen.py (GenQuantiles0): New function.
5000    
5001 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
5002    
5003 bh 1127 * 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 bh 1120 * 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 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
5036    
5037 bh 1118 * 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 bh 1116 * 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 bh 1114 * 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 bh 1112 * 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 jonathan 1109 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 jan 1097 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 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
5134    
5135 bh 1095 * 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 bh 1093 * 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 bh 1089 * 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 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
5157 jan 1085
5158 jan 1087 * 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 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
5164     sort the selection list for the dialog.
5165    
5166 frank 1083 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 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
5174    
5175 bh 1081 * 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 bh 1079 * 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 frank 1077 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 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
5192    
5193 bh 1075 * 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 bh 1073 * 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 bh 1071 * 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 bh 1069 * 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 frank 1065 2003-05-27 Frank Koormann <[email protected]>
5256    
5257 frank 1067 * 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 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
5263    
5264     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
5265    
5266 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
5267    
5268 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
5269     Menu.RemoveItem().
5270 jan 1062
5271 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
5272     the menu.
5273 jan 1062
5274 frank 1059 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 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
5294    
5295 bh 1055 * 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 bh 1053 * 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 frank 1051 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 jan 1048 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 frank 1046 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 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
5338    
5339 bh 1044 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 bh 1038 * 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 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
5372     New. test case for OpenTableFile
5373    
5374 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
5375    
5376 jan 1035 * 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 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
5384     already a selection present, update the grid accordingly.
5385 jan 1033
5386     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
5387     resizeable and increase its initial size.
5388    
5389 frank 1030 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 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
5412    
5413 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
5414     Use QueryTableFrame instead of TableFrame.
5415 jan 1021
5416 jan 1024 * 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 jan 1021 * 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 bh 1017 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 jan 1015 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 frank 1011 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 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
5468    
5469 bh 1008 * 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 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
5476     the wxMessageDialog's Destroy() method.
5477    
5478 frank 1004 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 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
5497    
5498 bh 999 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 bh 997 * 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 bh 995 * 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 tkoester 993 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 frank 992 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 bh 988 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 tkoester 986 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 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
5579    
5580 bh 985 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 bh 983 * 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 frank 981 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 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
5669 jonathan 971
5670 jonathan 975 * 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 jonathan 971 * 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 bh 958 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 jan 955 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 frank 952 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 jonathan 949 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 frank 924 2003-05-19 Frank Koormann <[email protected]>
5859    
5860 frank 927 * 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 frank 924 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 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
5876    
5877 bh 921 * 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 bh 919 * 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 frank 917 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 bh 908 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 jonathan 906 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 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
5955    
5956 jonathan 899 * 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 jonathan 897 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 frank 893 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 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
5984    
5985 jonathan 897 * 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 jonathan 889 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 frank 872 2003-05-09 Frank Koormann <[email protected]>
6079    
6080     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
6081    
6082 frank 860 2003-05-08 Frank Koormann <[email protected]>
6083    
6084 frank 870 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 frank 867 * Thuban/UI/scalebar.py
6093     (ScaleBar.DrawScalebar): Format string bug fixed.
6094    
6095     2003-05-08 Frank Koormann <[email protected]>
6096    
6097 frank 865 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 frank 860 * 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 frank 857 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 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
6135    
6136 bh 852 * 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 bh 850 * 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 frank 848 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 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
6171    
6172 bh 846 * 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 bh 843 * 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 bh 840 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 jonathan 833 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 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
6295    
6296     * Resources/Projections/defaults.proj: Fix spelling of Mercator
6297    
6298 jonathan 823 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 bh 819 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 jonathan 817 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 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
6397    
6398 bh 811 * 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 bh 809 * 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 jan 807 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 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
6427    
6428 jonathan 803 * 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 jonathan 793 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 jan 792 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 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
6485    
6486 bh 790 * Thuban/UI/view.py: Fix some typos.
6487    
6488 bh 788 * 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 bh 786 * 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 jonathan 793 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 bh 779 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 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
6526    
6527 jonathan 769 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 jonathan 776 "true". Addresses RTbug #1025.
6530 jonathan 769
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 jonathan 767 * 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 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
6558    
6559 bh 766 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 bh 764 * 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 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
6611 jonathan 735
6612 jonathan 762 * 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 jonathan 756 * 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 jonathan 753 * 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 jonathan 748 * 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 jonathan 743 * 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 jonathan 735 * 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 bh 734 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 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
6734 jonathan 724
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 bh 723 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 jonathan 721 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 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
6844    
6845 jonathan 720 * 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 jonathan 716 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 jonathan 715 * 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 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
6923    
6924 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
6925     constants
6926    
6927 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6928     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
6929    
6930 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
6931    
6932 bh 701 * 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 bh 700 * 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 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
6944    
6945 jonathan 693 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 jonathan 688 * 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 bh 687 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 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
7007    
7008 jonathan 680 * 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 jonathan 673 * 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 jonathan 674 drawing initialization call to draw_polygon_init()
7034     (MapRenderer.draw_polygon_shape): Use new signature of
7035     draw_polygon_shape.
7036 jonathan 673
7037 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
7038     weirdness by setting the range to (1, maxint).
7039 jonathan 673
7040 jonathan 674 * 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 jonathan 673
7046 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
7047    
7048 bh 672 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 jonathan 669 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 frank 664 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 jonathan 662 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 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
7112    
7113 jonathan 662 * 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 jonathan 647 * 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 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
7152 jonathan 647 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 jonathan 646
7161 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
7162    
7163 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
7164     Should pass group to ClassGroup constructor.
7165    
7166     2003-04-10 Jonathan Coles <[email protected]>
7167    
7168 jonathan 636 * 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 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
7196    
7197 jonathan 634 * 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 jonathan 626 * 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 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
7244    
7245 bh 625 * 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 bh 623 * 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 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
7271    
7272 jonathan 619 * 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 jonathan 612 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 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
7324 jonathan 608
7325 jonathan 612 * 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 jonathan 608 * 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 jonathan 603
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 jonathan 601
7351 jonathan 603 * 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 jonathan 601
7387 bh 600 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 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
7412    
7413 bh 595 * 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 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
7418     sure the filename is absolute to avoid problems when saving the
7419     session again
7420    
7421 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
7422    
7423 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
7424    
7425 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
7426 jonathan 587 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 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
7431    
7432     * test/test_map.py: Don't use from <module> import *
7433    
7434 jonathan 581 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 jonathan 575 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 jonathan 569 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 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
7492    
7493 jonathan 567 * 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 jonathan 557 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 jonathan 554 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 jonathan 552 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 jonathan 541 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 bh 538 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 jonathan 527 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 jan 523 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 jonathan 514 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 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
7752    
7753 jonathan 505 * 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 jonathan 499 * 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 jonathan 497 * 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 jonathan 495 * 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 jonathan 490 * 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 jonathan 483 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 jonathan 478 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 bh 477 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 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
7864    
7865 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
7866 jonathan 471
7867 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
7868 jonathan 471
7869 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
7870 jonathan 471
7871 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
7872 jonathan 471
7873     2003-03-05 Jonathan Coles <[email protected]>
7874    
7875 jonathan 459 * 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 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
7914    
7915 bh 458 * 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 bh 456 * 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 jonathan 448 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 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
7955 jonathan 434
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 jonathan 445 functions. Fix to create a tuple with a single value instead of
7978     simply returning the value.
7979 jonathan 434
7980     * Thuban/UI/renderer.py: Use new Classification and Group functions.
7981     Use common.py functions.
7982    
7983 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
7984 jonathan 447
7985     * test/test_classification.py: Use new Classification and Group
7986     classes.
7987 jonathan 434
7988 jonathan 426 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 bh 425 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 frank 423 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 jonathan 408 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 bh 405 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 bh 402 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 jonathan 399 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 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
8117    
8118 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
8119 jonathan 396 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 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
8132 jonathan 396 SetDefault*() methods on the layer's classification object.
8133 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
8134 jonathan 396 Classification class.
8135    
8136     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
8137     object instead of a dictionary.
8138    
8139 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
8140 jonathan 396 draw the classifications in the dialog box's table.
8141     (Classifier): Modified to use the ClassRenderer class.
8142    
8143 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
8144     methods of the Classification class.
8145 jonathan 396
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 jonathan 387 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 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
8165    
8166 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
8167 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
8168 jonathan 380 classification data.
8169    
8170 jonathan 384 * 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 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
8181 jan 375
8182 tkoester 403 * Thuban/__init__.py (_): New.
8183 jan 375
8184     * Thuban/Model/classification.py, Thuban/Model/extension.py,
8185     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
8186 tkoester 403 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 jan 375
8193 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
8194    
8195 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
8196 jonathan 370
8197 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
8198     a layer classification. Supports specific data points and
8199     ranges.
8200 jonathan 370
8201 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
8202     information.
8203 jonathan 370
8204 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
8205     information.
8206 jonathan 370
8207 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
8208     specifying classification information.
8209 jonathan 370
8210 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
8211     dialog.
8212 jonathan 370
8213 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
8214     classification information.
8215 jonathan 370
8216 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
8217     classification data.
8218 jonathan 370
8219 tkoester 403 * test/test_classification: Tests for the Classification class.
8220 jonathan 370
8221 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
8222    
8223 bh 361 * test/test_command.py: New. Tests for the command classes.
8224    
8225 bh 359 * 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 bh 354 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 frank 352 2002-11-06 Frank Koormann <[email protected]>
8251    
8252 bh 354 * 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 tkoester 403
8256 bh 349 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 bh 344 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 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
8280    
8281 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
8282    
8283     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
8284    
8285 bh 338 * 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 bh 326 * 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 bh 335 * 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 bh 322 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 bh 317 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 bh 313 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 bh 315 (MainWindow.build_menu): remove an incorrect comment.
8351 bh 313
8352 bh 311 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 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
8362    
8363     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
8364     VIEW_POSITION
8365    
8366 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
8367 frank 306
8368     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
8369    
8370 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
8371    
8372 bh 304 * 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 bh 302 * 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 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
8388    
8389 bh 300 * 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 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
8398     (MapCanvas.do_redraw): Get rid of the unused update_region
8399     instance variable
8400    
8401 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
8402    
8403 bh 292 * 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 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
8410    
8411 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
8412     arcs with multiple parts.
8413    
8414 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
8415     Handle degenrate rectangles.
8416    
8417 bh 287 * 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 bh 285 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 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
8429    
8430 bh 282 * 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 bh 278 * 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 bh 280 (LayerTableGrid.select_shape): Remove a debug print
8440 bh 278
8441     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
8442     LayerTableFrame
8443    
8444 bh 277 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 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
8450    
8451 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
8452     records.
8453 tkoester 403 (Table.__init__): Open the DBF file for writing too.
8454 bh 275
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 bh 271 * 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 bh 269 * 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 bh 266 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 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
8492 jan 265
8493     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
8494     tree window already open
8495    
8496 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
8497    
8498 bh 263 * 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 bh 259 * 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 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
8510    
8511 bh 256 * 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 bh 254 * 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 bh 252 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 bh 247 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 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
8570    
8571 bh 243 * 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 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
8590     window size into a parameter.
8591    
8592 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
8593    
8594 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
8595     just commands.
8596    
8597 bh 235 * 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 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
8607    
8608 bh 234 * 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 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
8620 bh 234 Only have to (un)subscribe CHANGED
8621    
8622     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
8623    
8624 bh 230 * 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 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
8629    
8630 bh 228 * 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 bh 225 * 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 bh 217 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 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
8681 bh 217 Add TreeInfo methods to implement the new tree view update scheme
8682    
8683 bh 216 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 bh 213 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 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
8708    
8709 bh 210 * setup.py: In the setup call, use the thuban homepage as the
8710     value of the url parameter.
8711    
8712 bh 208 * 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 bh 207 * 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 bh 205 * 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 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
8740    
8741 bh 205 * 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 bh 202 * 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 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
8762 jan 199
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 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
8772    
8773     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
8774 bh 202 the events for a command.
8775 bh 194 (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 bh 190 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 bh 192 * 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 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
8803    
8804 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
8805     layer_outline_color. Fix it in the definition of the command too.
8806    
8807 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
8808    
8809 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
8810    
8811     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
8812     in the docstring
8813    
8814 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
8815    
8816 bh 180 * 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 bh 175 * 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 bh 172 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 bh 165 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 bh 163 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 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
8866    
8867 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
8868     the file to have a .thuban extension.
8869    
8870 bh 152 * 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 bh 146 * 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 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
8934    
8935 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
8936     MainWindow.OpenSession): Change the file extension of the session
8937     files to .thuban
8938    
8939 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
8940     Move the map channels to be forwarded by the session into the
8941 bh 146 class constant with forwarded_channels. Also add
8942     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
8943     forwarded_channels
8944 bh 129
8945     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
8946     typo and some rewording).
8947    
8948 bh 126 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 bh 124 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 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
8991 frank 120
8992     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
8993    
8994 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
8995    
8996 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
8997    
8998     * Resources/Bitmaps/fullextent.xpm: new
8999 jan 116
9000 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
9001 jan 116
9002 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
9003     box
9004 jan 114
9005 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
9006    
9007 jan 114 * 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 tkoester 403 icon; added map_full_extend as tool
9013 jan 114
9014 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
9015 jan 107
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 bh 100 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 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
9047    
9048 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
9049     initialize_options to create the scripts for the rpm.
9050    
9051 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
9052    
9053 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
9054    
9055 bh 87 * setup.py: Increment version to 0.1.1
9056    
9057 bh 85 * 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 bh 83 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 bh 81 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 bh 72 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 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
9104    
9105     * setup.py (data_dist.make_distribution): Fix some typos
9106    
9107 bh 70 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 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
9118    
9119 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
9120     Handle the case of no layer (i.e. layer is None) properly.
9121    
9122 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
9123 bh 70 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 bh 64 * 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 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
9135    
9136 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
9137     deselect the layer if no layer is selected
9138    
9139 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
9140     idle time when there actually is something to draw. If there's
9141     nothing to draw simply clear the window
9142     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
9143     (MapCanvas.SetMap): force a redraw in all cases because
9144     FitMapToWindow doesn't always do it.
9145     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
9146     specify the point to move into the center of the window
9147     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
9148     dragged, zoon in/out by a factor of 2
9149 bh 64 (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 bh 59
9154     * Thuban/Model/session.py (create_empty_session): Unset the
9155     modified bit before returning it
9156    
9157     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
9158     create_empty_session session to create the new, empty session.
9159    
9160     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
9161     the tool bitmaps.
9162     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
9163     the code that asks whether the session should be saved into the
9164     new method save_modified_session.
9165     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
9166     method to save modified session here too.
9167    
9168 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
9169    
9170     * setup.py (InnoIconItem): fix typo
9171    
9172     (thuban_bdist_inno.run):
9173     (bdist_inno.run): Move the decision not to create symlinks on
9174     non-nt platforms to thuban_bdist_inno and do it unconditinally
9175     since we never want to create the symlinks here
9176    
9177 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
9178    
9179 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
9180     identify view immediately
9181    
9182     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
9183     and SelectableRecordListCtrl that implement the code shared by the
9184     identify view and the label dialog
9185    
9186     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
9187     new class RecordListCtrl
9188    
9189     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
9190     return value of GetValue is None instead of using it as a boolean
9191     directly so that Zero numbers are handled properly.
9192     (LabelListCtrl): Derive from the new class
9193     SelectableRecordListCtrl
9194    
9195 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
9196     (Proj4Dialog.dialogLayout): Make the window resizable and set the
9197     size of the text control explicitly to make the sizers work on
9198     both Windows and X.
9199    
9200 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
9201    
9202     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
9203     that can limit the search to the currently selected layer.
9204     (MapCanvas.SelectShapeAt): Make sure that the currently selected
9205     layer stays selected even when no shape is found
9206 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
9207     height do nothing (avoids zero division errors)
9208 bh 44
9209 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
9210    
9211 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
9212     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
9213     convenient :-)
9214     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
9215     a new instvar layer_to_item to map layers to tree items
9216     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
9217     to match the current selection in the interactor
9218    
9219 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
9220     (Interactor.HasSelectedLayer): New methods to query the current
9221     selection
9222    
9223     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
9224     (MainWindow.has_selected_layer): Simply call the appropriate
9225     interactor method
9226    
9227     * Thuban/UI/mainwindow.py (MainWindow.__init__):
9228     (MainWindow.LayerShowTable):
9229     (MainWindow.identify_view_on_demand): Store the interactor in an
9230     instvar and use that reference instead of going through main.app
9231    
9232 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
9233     * Thuban/UI/application.py (ThubanApplication.OnInit):
9234 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
9235     with the new mainwindow method ShowSessionTree and not directly
9236     the application's OnInit method
9237    
9238     * Thuban/UI/tree.py (myTreeCtrlPanel):
9239     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
9240     TreeCtrl isntead of a panel. This affects most method since we now
9241     refer to self instead of self.tree
9242     (SessionTreeView): New class implementing a non-modal dialog
9243     showing the session tree.
9244    
9245 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
9246     layer to the tableview dialog.
9247    
9248     * Thuban/UI/tableview.py: Add some doc-strings
9249 tkoester 403 (TableGrid):
9250 bh 35 (TableGrid.OnRangeSelect):
9251     (TableGrid.OnSelectCell):
9252     (TableFrame.__init__):
9253     (TableFrame.row_selected):
9254     Selecting rows in the grid view now updates the selected shapes
9255     through the TableFrame. To achieve this we derive TableGrid from
9256     Publisher and introduce the message type ROW_SELECTED which the
9257     TableFrame subscribes to and which is issued by OnRangeSelect and
9258     OnSelectCell
9259    
9260     (DataTable.SelectRow): Removed because it's no longer needed in
9261     the row/shape selection scheme
9262    
9263 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
9264     dialogs
9265    
9266     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
9267     the SELECTED_SHAPE message anymore. This is now handled by the
9268     parent.
9269     (TableGrid.select_shape): Only update the selection if the shape
9270     is not None.
9271     (TableFrame): Inherit from the new NonModalDialog class.
9272     (TableFrame.__init__, TableFrame.select_shape): Handle the
9273     SELECT_SHAPE message.
9274     (TableFrame.OnClose): Extend the inherited method to unsubscribe
9275     SELECT_SHAPE
9276    
9277     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
9278     (MainWindow.add_dialog):
9279     (MainWindow.dialog_open):
9280     (MainWindow.remove_dialog):
9281     (MainWindow.get_open_dialog): New methods to maintain a dictionary
9282     of opened non-modal dialogs.
9283    
9284     (MainWindow.__init__): Initialize the new non-modal dictionary
9285     management code
9286     (MainWindow.LayerShowTable): maintain separate dialogs for each
9287     table using the non-modal dialog management code to only open a
9288     view once for each table.
9289    
9290     (MainWindow.IdentifyTool):
9291     (MainWindow.__init__):
9292     (MainWindow.identify_view_on_demand): Don't open the identify view
9293     in IdentifyTool anymore. This will be done automatically by the
9294     new method identify_view_on_demand which handles the
9295     SELECTED_SHAPE message so that the identify view will be opened on
9296     demand
9297    
9298     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
9299     the interactor argument. The SELECTED_SHAPE message is now handled
9300     by the parent.
9301     (IdentifyView.__init__): Add the interactor argument so that we
9302     can handle the SELECTED_SHAPE message here
9303     (IdentifyView.selected_shape): New method to handle the
9304     SELECTED_SHAPE messages
9305    
9306     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
9307     NonModalDialog class
9308     (IdentifyView.OnClose): Extend the inherited version to
9309     unsubscribe SELECT_SHAPE
9310    
9311     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
9312    
9313 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
9314    
9315     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
9316 tkoester 403
9317 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
9318     interactor to pass through to the MapCanvas
9319 tkoester 403
9320 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
9321     argument to the MainWindow constructor to get rid of the ugly hack
9322     that made main.app available early just so that the mapcanvas
9323     could access the interactor object.
9324    
9325 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
9326    
9327 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
9328     that runs a modal message box
9329     (MainWindow.OnClose): Use the new method
9330     (MainWindow.RemoveLayer): Just do nothing in case no layer is
9331     selected. The command should be grayed out anyway, so there's no
9332     need to pop up a message box.
9333     (MainWindow.AddLayer): Pop up a message box with an error message
9334     if the shape file can't be opened
9335    
9336     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
9337     immediately. This will cause an exception in case the file can't
9338     be opened and we can display an appropriate message.
9339    
9340 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
9341    
9342     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
9343     specific bdist_rpm command.
9344    
9345     * Thuban/UI/main.py: Catch ImportError exceptions when importing
9346     the locale module because it may not be available on some
9347     installations.
9348    
9349     * extensions/pyprojection/LICENSE: Copy of the license text in
9350     Projection.i. Having it in a separate file makes it easier to
9351     refer to license text in e.g. RPMs
9352    
9353 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
9354    
9355 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
9356     more generic
9357    
9358     * setup.py (ThubanInstall.get_outputs): Add the symlink in
9359     <prefix>/bin to the outputs
9360     (ThubanInstall.link_file): New method to link files. We need this
9361     because the standard copy_files refuses to link non-existing
9362     files.
9363     (ThubanInstall.run): Remove the leading install root from the
9364     script filename if an install root was specified and use the new
9365     link_file method
9366 tkoester 403
9367 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
9368     the window when the first layer is added to the map.
9369    
9370     * setup.py (ThubanInstall.run): Honor the build root (self.root)
9371     when linking thuban.py to <prefix>/bin
9372    
9373 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
9374    
9375     * setup.py: In the setup call, the install parameters shouldn't
9376     have trailing slashes because distutils on non-posix platforms
9377     doesn't like that. The same applies to other directories like
9378     "Resources/Bitmaps"
9379    
9380     In the configuration section for nt, move the wxWindows directory
9381     optins into the part clearly marked as editable.
9382    
9383     (InstallLocal.initialize_options):
9384     (InstallLocal.user_options): remove the currently unused debug
9385     flag
9386     (thuban_build_py.find_all_modules): Add this method so that it
9387     works for our case of having packages and modules in one
9388     distribution as well.
9389     (ThubanInstall.initialize_options):
9390     (ThubanInstall.finalize_options):
9391     (ThubanInstall.user_options):
9392     (ThubanInstall.boolean_options): Add new options, do-symlink and
9393     extra files. Since these are the first ThubanInstall specific
9394     options, override user_options and boolean_options
9395     (ThubanInstall.run): Honor the new do-symlink and extra-files
9396     options.
9397     (ThubanInstall.get_outputs): Add to override the base-class's
9398     version and add the extra-files to the outputs
9399     (bdist_inno): New class for windows distributions with Inno Setup
9400     (InnoIconItem): Helper class for bdist_inno
9401     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
9402     this together with the appropriate parameters, to the setup call.
9403 tkoester 403
9404 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
9405     installer
9406    
9407     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
9408     changing_selection to avoid recursive selection events when
9409     modifying the selection in response to a selection event.
9410     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
9411     changing the tree's selection.
9412     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
9413     we're not being called indirectly from normalize_selection.
9414    
9415     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
9416     event.Check only if the command is actuall checkable.
9417     (MainWindow.__init__): Call the toolbar's Realize method to make
9418     sure that the items are actually shown
9419    
9420 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
9421    
9422 bh 9 * setup.py: Fix some doc strings
9423    
9424 bh 7 * ChangeLog: started
9425    

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26