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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2717 - (hide annotations)
Mon Jan 1 21:44:05 2007 UTC (18 years, 2 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 476363 byte(s)
Adding an explicit WITH OIDS to the create table commands. This fixes tests
that rely on an oid column to be present for postgresql >=8.0.

1 bernhard 2717 2007-01-01 Bernhard Reiter <[email protected]>
2     * test/postgissupport.py, test/test_postgis_db.py: adding an
3     explicit WITH OIDS to the create table commands. This fixes tests
4     that rely on an oid column to be present for postgresql >=8.0.
5     Thanks for Frank Koormann for the hint.
6    
7 dpinte 2716 2006-11-06 Didrik Pinte <[email protected]>
8    
9     * libraries/thuban/wxproj.cpp: bugfix - allow compilation with
10     msvc++ toolkit 2003
11    
12 bernhard 2714 2006-11-06 Bernhard Reiter <[email protected]>
13    
14 bernhard 2715 Made it easier to run PostGIS test on Debian Etch. Improving
15     https://wald.intevation.org/tracker/index.php?func=detail&aid=173 .
16 bernhard 2714
17     * test/postgissupport.py: Taking pg_ctl and initdb commands
18     from internal variables now. Adding deactivated example values
19     for Debian Etch.
20     find_postgis_sql(): Added special line for Debian Etch postgresql-8.1.
21     Added copyright year 2006.
22    
23 bernhard 2713 2006-10-25 Bernhard Reiter <[email protected]>
24    
25     Moved ogr Extension to Extension menu.
26    
27     * Extensions/ogr/
28     __init__.py, ogrstart.py, ogrshapes.py, ogrdialog.py
29     test/test_OGRShapestore.py, test/__init__.py:
30     adding encoding information and made sure Autor's names
31     with an umlaut are actually written with an umlaut.
32    
33     * Extensions/ogr/ogrstrat.py: now registering in menu "Extensions",
34     having a "(testing)" string before the submenu to prepare for 1.2.0
35     release. Bumped copyright year to 2006.
36    
37 bernhard 2712 2006-10-15 Bernhard Reiter <[email protected]>
38    
39     * Thuban/UI/renderer.py: Added module variable verbose and
40     added verbose output before doing a raster projection.
41     Minor: Added (c) year 2006.
42    
43     * test/test_baserenderer.py: Added new function
44     test_projected_raster_decimalcommalocale()
45     Added new author Bernhard Reiter and new copyright year 2006.
46    
47     * libraries/thuban/gdalwarp.cpp(ProjectRasterFile): Adding
48     switching to LC_NUMERIC "C" and back before calling GDAL functions -
49     only #if python >=2.4 .
50    
51 dpinte 2710 2006-10-10 Didrik Pinte <[email protected]>
52 dpinte 2711
53     Win32 build updates
54    
55     * setup.py :
56     - update to the latest libs for win32 setup tasks
57     - added gdal and Lib content to the inno setup build task
58     - added stable and experimental extensions to setup packages
59    
60     * thuban.py :
61     - gdal support for win32 inno installation
62    
63     2006-10-10 Didrik Pinte <[email protected]>
64    
65 dpinte 2710 * Thuban/Model/layer.py (Layer.GetLabelPosFromShape): new method
66     extracted from Thuban/UI/viewport.py
67     * Thuban/UI/viewport.py (Viewport.LabelShapeAt): uses new method
68    
69 dpinte 2709 2006-09-28 Didrik Pinte <[email protected]>
70    
71     * Thuban/UI/classgen.py: bugfix due to wx2.6 update
72    
73     * Thuban/UI/view.py: removed non needed declaration
74    
75     * Thuban/UI/selection.py : typo correction
76    
77 bernhard 2705 2006-09-24 Bernhard Reiter <[email protected]>
78    
79 bernhard 2708 * Thuban/Model/proj.py(_do_we_have_to_work_around_broken_proj):
80     Making the test more robust for observed python 2.3 problems
81     with setlocale().
82    
83 bernhard 2705 * test/runtests.py: Added new option ---setdecimalcommalocale
84 bernhard 2712 to run all tests with an LC_NUMERIC that uses comma as decimal_point.
85 bernhard 2705 Minor: Added (c) year 2006. Fixed typo in a docstring.
86    
87     * test/test_transientdb.py: Minor: Added (c) year 2006. Fixed typo in
88     a docstring.
89    
90 bernhard 2702 2006-09-23 Bernhard Reiter <[email protected]>
91    
92     * Extensions/ogr/test/test_OGRShapestore.py: fixed skip_if_no_ogr()
93     and added it to TestOGRTable.setUp() so that all tests get skipped
94     if ogr cannot be imported. Added (c) year 2006.
95    
96 dpinte 2701 2006-09-18 Didrik Pinte <[email protected]>
97    
98     * wxPython 2.6 update : wx 2.4 syntax has been updated to 2.6
99    
100 bernhard 2696 2006-09-18 Bernhard Reiter <[email protected]>
101    
102 bernhard 2698 Fixed proj behaviour with python >=2.4 when decimal_point != '.'.
103    
104 bernhard 2697 * Thuban/UI/application.py: Fixed warning dialog when gdal is missing.
105    
106     * test/test_proj.py: new test_lc_numeric_robustness(). Added author
107     Bernhard Reiter and new copyright year 2006.
108    
109 bernhard 2698 * Thuban/Model/proj.py: New _do_we_have_to_work_around_broken_proj()
110     and Projection.assuregoodlocale(), Projection.assureinitlocale().
111     Added author Bernhard Reiter and (c) 2006.
112    
113 bernhard 2694 2006-09-15 Bernhard Reiter <[email protected]>
114 bernhard 2692
115     * README: added RXP and pyRXP as optional for tests.
116 bernhard 2697
117 bernhard 2694 * test/localessupport.py: New. Contains a helper function
118     to find a locale with comma used as decimal_point.
119 bernhard 2692
120 bernhard 2690 2006-08-31 Bernhard Reiter <[email protected]>
121 bernhard 2691
122 bernhard 2690 * README: fixed URLs to sqlite and pysqlite.
123 bernhard 2697
124 bernhard 2691 * Thuban/UI/about.py: Added Didrik Pinte as contributor. Extended
125     copyright range to include 2006.
126 bernhard 2690
127 dpinte 2689 2006-06-29 Didrik Pinte <[email protected]>
128    
129     * Thuban/UI/main.py: circular import fix.
130    
131 frank 2688 2006-06-27 Frank Koormann <[email protected]>
132    
133     New Classification "Pattern": Classify text attributes by regexp.
134    
135     * Thuban/Model/classification.py (class ClassGroupPattern):
136     New, group is associated with a regular expression.
137     (Classification._compile_classification): Store compiled regexp and
138     original group for pattern.
139     (Classification.FindGroup): Added pattern.
140    
141     * Thuban/UI/classifier.py
142     (ClassGrid._OnLabelRightClicked, ClassGrid.labelPopup):
143     New, add popup to select singleton/pattern.
144     (ClassTable.GetRowLabelValue, ClassTable.GetValueAsCustom,
145     ClassTable.SetValueAsCustom): Added pattern.
146     (ClassTable.__ParseInput): Autodetect singleton/pattern.
147    
148     * Thuban/Model/save.py (SessionSaver.write_classification):
149     Added pattern.
150    
151     * Thuban/Model/load.py (SessionLoader.start_clpattern,
152     SessionLoader.end_clpattern): New, process pattern elements.
153    
154     * test/test_classification.py (class TestClassGroupPattern): New.
155     (TestClassification.test_add_pattern,
156     TestClassification.test_multiple_groups_textual,
157     TestClassification.test_deepcopy_textual): New.
158     (TestClassification.test_multiple_groups_numerical):
159     Renamed test_multiple_groups.
160     (TestClassification.test_deepcopy_numerical): Renamed test_deepcopy.
161    
162     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
163     Added pattern.
164    
165     * test/test_load.py (ClassificationTest.TestLayers, TestClassification):
166     Added pattern.
167    
168     * test/test_layer.py
169     (TestLayerModification.test_set_classification_textual): New
170     (TestLayerModification.test_set_classification_numerical):
171     Renamed test_set_classification.
172    
173     * Doc/manual/thuban-manual.xml: Added pattern to layer classification
174     description.
175    
176     * Resources/XML/thuban-1.1.dtd: Added clpattern element and attribs.
177    
178 dpinte 2687 2006-06-29 Didrik Pinte <[email protected]>
179    
180     * Thuban/version.py: Bugfix determination of SQLite, the wright one !
181    
182 dpinte 2685 2006-06-28 Didrik Pinte <[email protected]>
183    
184 dpinte 2686 * packaging/windows/thubanstart.py: sample file loading all the stable
185     extensions
186    
187     2006-06-28 Didrik Pinte <[email protected]>
188    
189 dpinte 2685 * Thuban/version.py: Bugfix determination of SQLite on old and recent
190     systems (support pysqlite1 and pysqlite2)
191    
192 frank 2684 2006-06-27 Frank Koormann <[email protected]>
193    
194     * Thuban/version.py: Bugfix determination of SQLite on old systems.
195    
196 dpinte 2683 2006-05-17 Didrik Pinte <[email protected]>
197     * Extensions/ogr/__init__.py : updated test for win32 and correct
198     imports
199    
200 dpinte 2680 2006-05-15 Didrik Pinte <[email protected]>
201 dpinte 2682 Ashamed ... still some tabs in the files
202    
203     * Thuban/version.py : tabs removed
204     * Thuban/Model/transientdb.py : tabs removed
205    
206     2006-05-15 Didrik Pinte <[email protected]>
207    
208 dpinte 2681 * Thuban/version.py : coding style correction
209 dpinte 2682 * Thuban/Model/transientdb.py : coding style correction
210 dpinte 2681
211     2006-05-15 Didrik Pinte <[email protected]>
212 dpinte 2682
213 dpinte 2680 * Thuban/version.py : Updated imports to support pysqlite2
214 dpinte 2682
215     * Thuban/Model/transientdb.py : Updated imports to support pysqlite2
216 dpinte 2680 Patched the querying system to support the param style of pysqlite2
217    
218 dpinte 2679 2006-04-24 Didrik Pinte <[email protected]>
219 bernhard 2690 * Extensions/svgexport/__init__.py: The extension now works on win32
220 dpinte 2679 architecture. Bug #87 corrected.
221    
222 bernhard 2678 2006-04-20 Bernhard Reiter <[email protected]>
223     * Doc/technotes/coding_guidelines.txt: Changed text from CVS to SVN.
224     Removed emacs specific hint and replaced it with a general hint
225     that editors might support writing changelogs.
226    
227 bernhard 2677 2006-04-12 Bernhard Reiter <[email protected]>
228 bernhard 2678
229 bernhard 2677 * Thuban/version.py: Changed thuban_release mechanism to use "svn"
230     instead of "cvs".
231    
232 bernhard 2676 2006-03-31 Bernhard Reiter <[email protected]>
233    
234     * libraries/thuban/wxproj.cpp: including proj_api.h instead of
235     projects.h now. According the Frank Warmerdam and man pj_init
236     this is the public interface to proj. Thus I have changed PJ to projPJ.
237     And I could remove the hack to avoid clashes with typedef PVALUE
238     and #define LP in projects.h clashing with symbols when trying to
239     build on windows. The file is cleaner and nicer now.
240    
241 bernhard 2675 2006-03-29 Bernhard Reiter <[email protected]>
242 bernhard 2678
243 bernhard 2675 * libraries/thuban/wxproj.cpp: undef LP to avoid clash when
244     trying to build with mingw.
245    
246 bernhard 2673 2005-10-18 Bernhard Reiter <[email protected]>
247    
248 bernhard 2674 * Thuban/UI/about.py: remove unused import of getdefaultlocale.
249     Added display of internal encoding to the about dialog text.
250    
251     * Extensions/svgexport/__init__.py: changed version to "1.0.0+cvs".
252    
253     2005-10-18 Bernhard Reiter <[email protected]>
254    
255 bernhard 2673 Startup improved: We fail right away if the internal encoding could
256     not be determined.
257    
258     * Thuban/__init__.py (get_internal_encoding): new.
259    
260     * test/test_stringrepresentation.py (class TestInternalEncoding):
261     Preserve the internal encoding for the tests in this class.
262    
263 bernhard 2671 2005-10-17 Bernhard Reiter <[email protected]>
264    
265 bernhard 2672 * test/test_stringrepresentation.py: New file, for now testing
266     that set_internal_coding() is throwing an exception for bad exceptions.
267    
268     * Thuban/__init__.py (set_internal_encoding): added a forwards
269     and backward translation, so that we fail early if the
270     internal_encoding is bad.
271    
272     2005-10-17 Bernhard Reiter <[email protected]>
273    
274 bernhard 2671 svgexport 1.0.0cvs: Fixed ARC layer writing: No filling is done.
275     You could actually get polylines with filling in between,
276     when the classification for the lines had a fill color.
277     E.g. this happens when you generate a classification from a ramp.
278    
279     * Extensions/svgexport/test/test_svgmapwriter.py:
280     New test_export_arc_no_fill(). Extend copyright notice to 2005.
281    
282     * Extensions/svgexport/svgmapwriter.py
283     (SVGRenderer.draw_shape_layer_incrementally()):
284     Setting TRANSPARENT_BRUSH for shaptype ARC.
285     Extend copyright notice to 2005.
286    
287     * Extensions/svgexport/__init__.py: Extend copyright notice to 2005.
288    
289 frank 2670 2005-09-08 Frank Koormann <[email protected]>
290    
291     * Doc/manual/thuban-manual.xml (Map Management): Fixed typo reported
292     by Erik (sigra.at.home.se)
293    
294 jan 2669 2005-08-18 Jan-Oliver Wagner <[email protected]>
295    
296     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
297     Call the right method for the default size.
298    
299 jan 2667 2005-08-11 Jan-Oliver Wagner <[email protected]>
300    
301     * Extensions/export_shapefile: New.
302    
303     * Extensions/export_shapefile/__init__.py: New. Initialize
304     the export_shapefile extension.
305    
306     * Extensions/export_shapefile/export_shapefile.py: New.
307     Exports a layer as a Shapefile.
308    
309 jan 2664 2005-08-08 Jan-Oliver Wagner <[email protected]>
310    
311     * po/de.po: String fixes. This fixes Debian bug #313843.
312    
313 jan 2660 2005-07-27 Jan-Oliver Wagner <[email protected]>
314    
315     Remove the attributes from the layer element in
316     .thuban files for the save routine.
317     This also solves RT bug #3149,
318     https://intevation.de/rt/webrt?serial_num=3149
319    
320     * test/test_load.py: (TestSingleLayer, TestNonAsciiColumnName,
321     TestLayerVisibility, TestSymbolSize, TestClassification, TestLabels,
322     TestLayerProjection, TestJoinedTable, TestLabelLayer): Removed
323     attributes from layer element to classification clnull element.
324    
325     * test/test_save.py (SaveSessionTest.testSingleLayer,
326     SaveSessionTest.testLayerProjection,
327     SaveSessionTest.testClassifiedLayer,
328     SaveSessionTest.test_joined_table, SaveSessionTest.test_save_postgis):
329     Removed attributes from layer element to classification clnull element.
330     (test_save_postgis.NonConnectionStore._fetch_table_information):
331     added pretending to have a shape_type.
332    
333     * Resources/XML/thuban-1.1.dtd: Make the attributes field
334     and field_type of classification optional.
335    
336     * Thuban/Model/classification.py (Classification.TreeItem.build_info):
337     Added output of size.
338    
339     * Thuban/Model/load.py (SessionLoader.start_classification):
340     Change attribute 'field' and 'field_type' from obligatory to
341     optional to allow empty classes (ie. only with a default=clnull).
342    
343     * Thuban/Model/save.py (SessionSaver.write_layer): Don't write
344     any attributes anymore for the layer element.
345     (SessionSaver.write_classification): Even if there is no
346     classification field, still write the classification because
347     the clnull (default) symbol will not be defined anymore as
348     part of the layer element.
349    
350 bh 2643 2005-07-05 Bernhard Herzog <[email protected]>
351    
352 bh 2652 * setup.py (setup call): Version 1.1.0
353    
354     * NEWS: Update for 1.1.0
355    
356     * MANIFEST.in: Add *.txt to files taken from Doc. Otherwise the
357     technores won't be included
358    
359     * Thuban/UI/about.py (About.__init__): Extend copyright notice to
360     2005
361    
362     * po/de.po: Updated.
363    
364     2005-07-05 Bernhard Herzog <[email protected]>
365    
366 bh 2645 * README: gdal 1.1.8 is too old. 1.2.5 works.
367    
368     2005-07-05 Bernhard Herzog <[email protected]>
369    
370 bh 2650 * Resources/XML/thuban-1.1.dtd (rasterlayer): Add the opacity and
371     masktype attributes.
372    
373     2005-07-05 Bernhard Herzog <[email protected]>
374    
375 bh 2644 * Thuban/Model/layer.py (Layer.__mangle_bounding_box)
376     (Layer.ClipBoundingBox): Rename ClipBoundingBox to
377     __mangle_bounding_box. See the comments in the code and RT #2845
378    
379     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
380     Remove the explicit test of ClipBoundingBox. The method isn't
381     public anymore and the direct call in the test wasn't necessary in
382     the first place. If ClipBoundingBox (now __mangle_bounding_box)
383     isn't called, the return value of ShapesInRegion will be
384     different.
385    
386     2005-07-05 Bernhard Herzog <[email protected]>
387    
388 bh 2643 * Thuban/UI/viewport.py (ViewPort.set_view_transform): Handle
389     ZeroDivisionError exceptions. I don't know when they happen
390     exactly. It probably happens when the projections aren't set
391     properly.
392    
393 bh 2642 2005-07-01 Bernhard Herzog <[email protected]>
394    
395     First step towards unicode. With this roughly we're at step 1
396     string_representation.txt
397    
398     * Doc/technotes/string_representation.txt: New. Document how
399     strings are represented in Thuban and how to get to a Unicode
400     Thuban.
401    
402     * Thuban/__init__.py (set_internal_encoding)
403     (unicode_from_internal, internal_from_unicode): New. The first few
404     functions for the internal string representation
405    
406     * Thuban/UI/about.py (unicodeToLocale): Removed. Use
407     internal_from_unicode instead.
408    
409     * Thuban/UI/__init__.py (install_wx_translation): Determine the
410     encoding to use for the internal string representation. Also,
411     change the translation function to return strings in internal
412     representation even on unicode builds of wxPython
413    
414     * Thuban/Model/load.py (SessionLoader.check_attrs): Decode
415     filenames too.
416     (SessionLoader.start_clrange): Use check_attrs to decode and check
417     the attributes.
418    
419     * Thuban/Model/xmlreader.py (XMLReader.encode): Use
420     internal_from_unicode to convert unicode strings.
421    
422     * Thuban/Model/xmlwriter.py (XMLWriter.encode): Use
423     unicode_from_internal when applicable
424    
425     * test/runtests.py (main): New command line option:
426     internal-encoding to specify the internal string encoding to use
427     in the tests.
428    
429     * test/support.py (initthuban): Set the internal encoding to
430     latin-1
431    
432     * test/test_load.py (TestSingleLayer.test, TestClassification.test)
433     (TestLabelLayer.test): Use the internal string representation when
434     dealing with non-ascii characters
435    
436     * test/test_load_1_0.py (TestSingleLayer.test)
437     (TestClassification.test, TestLabelLayer.test): Use the internal
438     string representation when dealing with non-ascii characters
439    
440     * test/test_load_0_9.py (TestSingleLayer.test)
441     (TestClassification.test): Use the internal string representation
442     when dealing with non-ascii characters
443    
444     * test/test_load_0_8.py (TestUnicodeStrings.test): Use the
445     internal string representation when dealing with non-ascii
446     characters
447    
448     * test/test_save.py (XMLWriterTest.testEncode)
449     (SaveSessionTest.testClassifiedLayer): Use the internal string
450     representation when dealing with non-ascii characters where
451     applicable
452    
453 bh 2638 2005-06-30 Bernhard Herzog <[email protected]>
454    
455 bh 2641 * test/runtests.py: Untabify.
456    
457     2005-06-30 Bernhard Herzog <[email protected]>
458    
459 bh 2639 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
460     untabify.
461    
462     2005-06-30 Bernhard Herzog <[email protected]>
463    
464 bh 2638 * Extensions/ogr/test/__init__.py: Add missing coding directive
465    
466 jan 2631 2005-06-28 Jan-Oliver Wagner <[email protected]>
467    
468 jan 2636 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
469     Use the default size for rendering selected items of default type.
470     Fixes part 2 of https://intevation.de/rt/webrt?serial_num=3149
471    
472     2005-06-28 Jan-Oliver Wagner <[email protected]>
473    
474 jan 2631 * Extensions/importAPR/apr.py (APR_BShSym): Extend by 'Stripple'.
475     (APR_TClr.GetThubanColor): Fix bug in color interpretation.
476     Thanks to Frank Koormann who identified this problem.
477    
478     * Extensions/importAPR/importAPR.py (APR_VShSym): New. Just
479     another symbol identified.
480    
481 jan 2628 2005-06-27 Jan-Oliver Wagner <[email protected]>
482    
483     * Doc/manual/thuban-manual-de.xml: More translations.
484    
485 jonathan 2626 2005-05-12 Jonathan Coles <[email protected]>
486    
487     * Thuban/UI/projdialog.py: Add missing import, which led to an
488     exception when opening a layer's projection.
489    
490 bh 2623 2005-05-09 Bernhard Herzog <[email protected]>
491    
492 bh 2624 * test/support.py (FileLoadTestCase.filename): Fix doc-string.
493    
494     2005-05-09 Bernhard Herzog <[email protected]>
495    
496 bh 2623 * Thuban/Model/postgisdb.py (PostGISConnection.connect): Set the
497     connection to autoconnect. Fixes RT#3148.
498    
499     * test/test_postgis_db.py
500     (TestPostGISSpecialCases.test_simple_error_handling): New test
501     that attempts to reproduce RT#3148.
502    
503 jonathan 2622 2005-05-06 Jonathan Coles <[email protected]>
504    
505     Add support for saving and loading the opacity and mask type
506     properties of RasterLayers. Also add support for proper use
507     of alpha information while drawing images not in 'RAW' format.
508     If transparency in an image format (e.g, PNG) is supported by
509     wxWidgets then the image would previously have been draw with
510     transparent regions, but the opaque regions would have been
511     unaffected by a change in the layer's opacity. This patch
512     corrects the problem.
513    
514     * Thuban/Model/layer.py (RasterLayer): Added opacity and
515     masktype parameters to the constructor, and set the
516     appropriate variables to those values.
517    
518     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Added
519     code to read the opacity and mask type of the layer and construct
520     a new layer with the additional parameters.
521    
522     * Thuban/Model/save.py (SessionSaver.write_layer): Added code
523     to save the opacity and mask type of a layer.
524    
525     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
526     the opacity of the layer to draw_raster_data rather than the layer.
527     (BaseRenderer.draw_raster_data): Remove the layer parameter because
528     the function doesn't need to know about the layer. Add the optional
529     opacity parameter whose default is 1.0. Add 'PNG' as a supported
530     graphics format.
531    
532     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Fixed
533     signature to match that in BaseRenderer. Use the new opacity argument
534     in place of calling layer.Opacity(). In the case where the
535     format is not 'RAW', alpha_data is None and the loaded image has
536     alpha information, use the file's alpha information. This is
537     still subject to the layer's opacity setting.
538    
539     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
540     Fixed signature to match that in BaseRenderer.
541    
542     * test/test_load.py (TestRasterLayer): Change file_contents to
543     include opacity and masktype variables.
544     (TestRasterLayer.test): Include tests for opacity and masktype
545     changes.
546    
547     * test/test_save.py (SaveSessionTest.testRasterLayer): Restructure
548     test to cover a variety of combinations of masktype and opacity
549     settings.
550    
551 jan 2612 2005-05-02 Jan-Oliver Wagner <[email protected]>
552    
553     * debian/rules: add --use-wx-python-swig-hack
554     to the build command.
555     Thanks to Moritz Lennert for pointing this out.
556    
557 jan 2610 2005-04-28 Jan-Oliver Wagner <[email protected]>
558    
559     Introduce OGRFileShapeStore in ogr extension.
560     This allows at least that loaded shapefile shape stores
561     can be saved correctly in the thuban session file
562     and reloaded again (reload is via core shapefile
563     routine, not OGR). For other types, .thuban files
564     can not be reloaded for the time being.
565    
566     * Extensions/ogr/ogrshapes.py (OGRFileShapeStore): New. This
567     class ist to be used for any file-based shape stores
568     accessed through OGR.
569    
570     * Extensions/ogr/ogrstart.py (open_with_ogr): Added
571     forgotten _ for i18n. Adapted call OpenFileShapestore
572     regarding new parameter.
573     (OpenFileShapestore): Use OGRFileShapeStore instead of
574     OGRShapeStore. Fix return value (None instead of null).
575     Add new parameter "mainwindow" to avoid accessing global
576     context.
577    
578 jan 2607 2005-04-27 Jan-Oliver Wagner <[email protected]>
579    
580     Introduce FileShapeStore as generalization for
581     file-based shape stores. In a first instance
582     this allows additional modules to handle shapefile
583     format as well, namely the OGR extension.
584    
585     * Thuban/Model/data.py: Various small fixes in doc-strings.
586     (FileShapeStore): New class.
587     (ShapefileStore): Derive from FileShapeStore.
588     (ShapefileStore.__init__): Call __init__ of FileShapeStore,
589     rename self.table to self._table, initialize self._bbox
590     (ShapefileStore._open_shapefile): Use self._bbox instead of self.bbox
591     and self.FileName() instead of self.filename.
592     (ShapefileStore.Table): Use self._table instead of self.table.
593     (ShapefileStore.FileName): Removed (moved to FileShapeStore).
594     (ShapefileStore.BoundingBox): Use self._bbox instead of self.bbox.
595    
596     * Thuban/Model/save.py: Replace ShapefileStore by FileShapeStore.
597     (SessionSaver.write_data_containers): Only use methods of the
598     base class FileShapeStore.
599    
600 joey 2604 2005-04-26 Martin Schulze <[email protected]>
601    
602     * Extensions/wms/wms.py (render_wms_layer): Adjusted the render
603     function to the modified render engine
604    
605     2005-04-25 Martin Schulze <[email protected]>
606    
607     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
608     Added a description according to the CVS log message
609    
610     2005-04-23 Martin Schulze <[email protected]>
611    
612     * Thuban/UI/renderer.py: Added a missing import
613    
614 russell 2600 2005-04-23 Russell Nelson <[email protected]>
615    
616 russell 2613 * Thuban/UI/view.py (MapCanvas.OnMiddle{Up,Down}): Changed the
617     way the previous tool is remembered, so that middle-button
618     panning works even if you haven't selected a tool.
619 russell 2600
620 bh 2598 2005-04-11 Bernhard Herzog <[email protected]>
621    
622     * libraries/thuban/wxproj.cpp: Move the compatibility code that
623     deals with the wxPython 2.4 version of wxPython.h into the #ifdef
624     branch that includes wxPython.h because it's only needed when
625     wxPython.h is used. Also, it won't compile when
626     USE_WX_PYTHON_SWIG_HACK is set otherwise.
627    
628 bh 2597 2005-04-07 Bernhard Herzog <[email protected]>
629    
630     * Thuban/UI/classifier.py (ClassGrid.__init__): Use -1 as the ID.
631     (ID_CLASS_TABLE): Removed. It wasn't used anywhere except in
632     ClassGrid.__init__ and it's value is outside of the valid
633     range (must be < 32768). wxPython 2.5 complains about it with an
634     exception.
635    
636 jan 2596 2005-04-05 Jan-Oliver Wagner <[email protected]>
637    
638     * Doc/manual/thuban-manual-de.xml: More translations.
639    
640 bh 2590 2005-04-05 Bernhard Herzog <[email protected]>
641    
642 bh 2591 * libraries/thuban/wxproj.cpp: Make it work with a wxPython.h from
643     wxPython 2.4 as well. Also, remove a now obsolete comment.
644    
645     2005-04-05 Bernhard Herzog <[email protected]>
646    
647 bh 2590 Use wxPython.h by default but provide a workaround when it isn't
648     available.
649    
650     * setup.py (wxproj_extension): New variable. Assign the Extension
651     instance for Lib.wxproj to this variable instead of putting it
652     directly into the listso that it can be accessed by other code
653     later.
654     (thuban_build_ext.user_options): Added boolean option
655     --use-wx-python-swig-hack.
656     (thuban_build_ext.initialize_options): Initialize the new option
657     to False.
658     (thuban_build_ext.finalize_options): If the new option was given,
659     define the preprocesser macro USE_WX_PYTHON_SWIG_HACK.
660     (thuban_build_ext): Update the doc-string
661    
662     * libraries/thuban/wxproj.cpp: Normally we use
663     wx/wxPython/wxPython.h now. Only if USE_WX_PYTHON_SWIG_HACK is
664     defined, use swigPtrConvertHack.h instead.
665    
666     * libraries/thuban/swigPtrConvertHack.h: Remove the code that was
667     copied over from wxPython.h.
668     (decode_pointer_new): New. Equivalent of decode_pointer for
669     wxPython 2.5.
670     (wxPyConvertSwigPtr): Modified to cope with wxPython 2.5 as well.
671    
672     * README: Add section on potential build problems which explains
673     how the work-around for a missing wxPython.h is activated.
674    
675 bh 2588 2005-03-29 Bernhard Herzog <[email protected]>
676    
677 bh 2589 * test/postgissupport.py (find_postgis_sql): Added yet another
678     potential location for (lw)postgis.sql because the file has moved
679     again in postgis 1.0.0 rc4.
680    
681     2005-03-29 Bernhard Herzog <[email protected]>
682    
683 bh 2588 * Thuban/UI/legend.py (BMP_SIZE_W, BMP_SIZE_H): Set both to 16 to
684     match the site of the legend_icon_layer icon. Otherwise wxpython
685     2.5 complains when the legend is created with the error:
686    
687     PyAssertionError: C++ assertion "(bitmap.GetWidth() == m_width &&
688     bitmap.GetHeight() == m_height) || (m_width == 0 && m_height ==
689     0)" failed in ./src/generic/imaglist.cpp(81): invalid bitmap size
690     in wxImageList: this might work on this platform but definitely
691     won't under Windows.
692    
693 jonathan 2587 2005-03-23 Jonathan Coles <[email protected]>
694    
695     These changes add support for adjusting the opacity of a raster layer.
696    
697     * Thuban/Model/layer.py (RasterLayer.Opacity): Replaces AlphaOpacity.
698     (RasterLayer.SetOpacity): Replaces SetAlphaOpacity. Also triggers
699     a LAYER_CHANGED event if the opacity actually changes.
700    
701     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_data): Added
702     layer parameter needed in the implementation of this method in
703     renderer.py.
704    
705     * Thuban/UI/layerproperties.py (LayerProperties.dialog_layout): Fixed
706     typo 00 -> 0.
707    
708     * Thuban/UI/rasterlayerproperties.py (RasterLayerProperties): Added
709     control to adjust opacity.
710    
711     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Scale the
712     alpha data based on the opacity level of the layer.
713    
714     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Now
715     accepts a layer parameter.
716    
717     * test/test_layer.py (TestLayerModification.test_raster_layer):
718     Rename opacity method calls and add test for LAYER_CHANGED.
719    
720 bh 2586 2005-03-16 Bernhard Herzog <[email protected]>
721    
722     * test/test_connector.py (DeletionTestMixin.check_deletions)
723     (DeletionTestMixin.check_deletetions): renamed to check_deletions.
724     update the callers.
725    
726 jan 2585 2005-03-14 Jan-Oliver Wagner <[email protected]>
727    
728     * Doc/manual/thuban-manual-de.xml: More translations.
729    
730 jan 2584 2005-03-10 Jan-Oliver Wagner <[email protected]>
731    
732     Introducing initialization callbacks for extensions.
733    
734     * Thuban/UI/extensionregistry.py (ExtensionDesc.__init__): Added
735     optional parameter init_callback.
736     (ExtensionDesc.init_ext): New. Executes the callback and sets
737     a status.
738    
739     * Thuban/UI/application.py (ThubanApplication.OnInit): Add the
740     initialization of the extensions.
741     (ThubanApplication.init_extensions): Init all extensions.
742    
743     * Thuban/UI/about.py (About.__init__): Added status of the extensions
744     to the about text.
745    
746     * Extensions/gns2shp/__init__.py: Added init method for Extension
747     description.
748     (init): New. Contains the initialization of the module.
749    
750 nhueffme 2577 2005-03-04 Nina Hüffmeyer <[email protected]>
751    
752     * Extensions/ogr/ogrdialog.py: Added a dialog, which asks for
753     OGRConnection to open a datasource. Removed dialog to display all
754     available drivers. Added some doc strings.
755    
756     * Extensions/ogr/ogrstart.py: Added menu entry for opening an
757     OGRDatasource with a string. Added two opening methods which return an
758     OGRDatasource (either data from file or from DB).
759    
760     * Extensions/ogr/ogrshapes.py: Added class OGRGeometry, which
761     represents a geometry reference of an OGRFeature. OGRShape now has a
762     list of referenced geometry objects (important for geometry
763     collections).
764     For OGRShapeStores loaded from a DB an ID column can be specified now.
765    
766 jan 2576 2005-02-22 Jan-Oliver Wagner <[email protected]>
767    
768     * test/test_map.py (TestMapWithContents.test_tree_info):
769     Added label layer for comparison.
770    
771 jonathan 2574 2005-02-18 Jonathan Coles <[email protected]>
772    
773     * libraries/thuban/gdalwarp.cpp (GetImageData): Optimize the loop
774     which builds a mask. Handle the majority of an image in a loop,
775     creating 8 bits at a time. Later, handle the edge case where less
776     than 8 bits are packed.
777    
778 bh 2573 2005-02-18 Bernhard Herzog <[email protected]>
779    
780     * test/test_baserenderer.py (TestBaseRenderer.setUp): Fix
781     doc-string
782    
783 jonathan 2571 2005-02-18 Jonathan Coles <[email protected]>
784    
785 jonathan 2572 * setup.py: Remove wx_cs_params from gdal compile options.
786    
787     2005-02-18 Jonathan Coles <[email protected]>
788    
789 jonathan 2571 Refactored baserenderer.py and renderer.py to remove baserenderer.py's
790     dependencies on wxPython. Added a new method projected_raster_layer()
791     that returns a raster layer image in projected space. This must be
792     implemented in classes derived from BaseRenderer. This also eliminates
793     the dependency on gdal in baserenderer.py.
794    
795     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
796     new projected_raster_layer() to get projected raster image instead
797     of directly calling ProjectRasterFile().
798     (BaseRenderer.projected_raster_layer): New. This must be implemented
799     by derived classes. It takes almost the same arguments as ProjectRasterFile
800     did and returns a projected image with mask and alpha data (if requested).
801     (BaseRenderer.render_map_incrementally): Remove the check for gdal since
802     that check will be done in MapRenderer.projected_raster_layer(). This
803     also allows other implementations to use different projection code.
804    
805     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
806     Implementation of BaseRenderer.projected_raster_layer. Checks for
807     gdal support and wxPython version. Also handles exceptions from
808     ProjectRasterFile.
809    
810     * libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
811     and added a variable which can be set through the options argument
812     of ProjectRasterFile.
813    
814     * test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
815     Calls ProjectRasterFile and returns the result.
816     (TestBaseRenderer.test_projected_raster_layer): New. Tests the results
817     of calling projected_raster_layer() with different options.
818     (TestBaseRenderer.test_raster_no_projection): Removed tests based on
819     wxPython version and all tests of masks and alpha channels. These are
820     now in test_projected_raster_layer().
821    
822 jan 2565 2005-02-17 Jan-Oliver Wagner <[email protected]>
823    
824 jan 2570 * Thuban/Model/map.py, Thuban/Model/label.py: Fixed
825     doc-strings to comply with coding_guidelines.
826    
827     2005-02-17 Jan-Oliver Wagner <[email protected]>
828    
829 jan 2565 Docstring improvements and minor fixes for labellayer.
830    
831     * Thuban/Model/map.py:
832     (Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
833     Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
834     Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
835     Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
836     doc string.
837     (Map.BoundingBox): Removed superfluous test for label_layer
838     and improved doc string.
839     (Map.TreeInfo): Added label_layer and improved sdo string.
840    
841     * Thuban/Model/label.py: Added import of _.
842     (Label, Label.__init__): Improved/added doc string.
843     (LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
844     LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
845     Improved/added doc string.
846     (LabelLayer.AddLabel): Use already defined names for
847     align strings and improved doc string.
848     (LabelLayer.TreeInfo): New. Return the object data for
849     the tree view.
850    
851 jonathan 2562 2005-02-16 Jonathan Coles <[email protected]>
852    
853     Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
854     so that that wxproj doesn't crash. Added GUI support for selecting
855     alpha channel (opacity can't be selected yet).
856    
857     NOTE: If wxPython.h is including in future distribution packages
858     then it will not be necessary to have the files swigPtrConvertHack.h
859     and wxPython_int.h included with Thuban. This is hopefully
860     a temporary workaround.
861    
862     * setup.py (thuban_build_ext.finalize_options): gdalwarp needs
863     access to the macro wxCHECK_VERSION so that it will properly
864     generate a bit mask. There was a problem between wx2.4 and wx2.5
865     that this works around.
866    
867     * Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
868     of RasterLayer.MaskType.
869     (RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
870     (RasterLayer.MaskType): New. Returns the type of mask to use. Can
871     specify none, a bitmap, or an alpha channel.
872     (RasterLayer.SetMaskType): New. Set what kind of mask to use.
873    
874     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
875     Set the raster warping options for the mask based on the value
876     of RasterLayer.MaskType.
877    
878     * Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
879     deprecated calls to SetItemSelectedImage in favor of SetItemImage
880     with wxTreeItemIcon_Selected.
881    
882     * Thuban/UI/rasterlayerproperties.py: Support selecting to use
883     an alpha channel for the mask.
884    
885     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
886     data if it is available and an alpha channel is supported under
887     the current version of wxPython.
888    
889     * libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
890     to select whether 1's or 0's select the desired portion of an image
891     in the bit mask. wx2.4 has a bug where the documentation is the opposite
892     from behavior.
893     (ProjectRasterFile): Only generate an alpha channel if the version
894     of wxPython is >= 2.5.3.
895    
896     * libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
897     When wxPython >= 2.5.3 use the special swig functions to decode an
898     object's address.
899    
900     * libraries/thuban/swigPtrConvertHack.h: Includes conditional code
901     based on the version of wxPython. If >= 2.5.3 use the special swig
902     functions from wxPython to decode wxPython objects, otherwise use
903     the old method of retrieving the address from the object __repr__ string.
904    
905     * libraries/thuban/wxPython_int.h: Copied from wxPython source.
906     Unnecessary code was removed to make it smaller.
907    
908     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
909     Add tests for returning an alpha channel.
910    
911     * test/test_layer.py (TestLayerModification.test_raster_layer): Fix
912     tests that used removed functions UseMask and SetUseMask
913    
914    
915 bh 2560 2005-02-08 Bernhard Herzog <[email protected]>
916    
917 bh 2561 More wxPython 2.5 changes. This time taken from a patch from
918     Daniel Calvelo Aros.
919    
920     * Thuban/UI/tableview.py (QueryTableFrame.__init__)
921     (QueryTableFrame.__init__): Pass the size of a spacer as a single
922     item.
923    
924     * Thuban/UI/projdialog.py (ProjFrame.build_dialog)
925     (ProjFrame.build_dialog): Pass the size of a spacer as a single
926     item.
927    
928     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
929     size of a spacer as a single item.
930    
931     * Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
932     size of a spacer as a single item.
933    
934     2005-02-08 Bernhard Herzog <[email protected]>
935    
936 bh 2560 Compatibility with wxPython 2.5. The changes should make it work
937     better with 2.5 while still keeping compatibility with 2.4. There
938     are still problems with 2.5, though.
939    
940     * Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
941     of a spacer as a single item.
942    
943     * Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
944     from wxControl
945    
946     * Thuban/UI/legend.py (LegendTree): When running with wxPython <
947     2.5, add an implementation of the GetFirstChild method that does
948     not require the second parameter.
949     (LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
950     (LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
951     (LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
952     pass the second parameter to GetFirstChild
953    
954 nhueffme 2559 2005-02-08 Nina Hüffmeyer <[email protected]>
955    
956     * Extensions/ogr/ogrshapes.py: Removed some print commands.
957    
958     * Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
959     additional menu but appears as a possibility in the menu Map.
960    
961 jonathan 2558 2005-02-07 Jonathan Coles <[email protected]>
962     * libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
963     and PYTHON_ERRF since they were no longer necessary.
964    
965 bernhard 2556 2005-02-07 Bernhard Reiter <[email protected]>
966     * Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
967     Enable translation for message string.
968    
969 joey 2555 2005-02-06 Martin Schulze <[email protected]>
970    
971     * Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
972     the arguments of the contstructor to fit the global scheme
973    
974 nhueffme 2554 2005-01-31 Nina Hüffmeyer <[email protected]>
975    
976     * Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
977     some dialogs needed to start ogr.
978    
979     * Extensions/ogr/__init__.py: Changed comments to avoid encoding
980     warnings.
981    
982     * Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
983     encoding warnings.
984    
985 jonathan 2552 2005-01-28 Jonathan Coles <[email protected]>
986    
987 jonathan 2553 * libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
988     mask is packed into a bit array. It's now slightly faster.
989    
990     2005-01-28 Jonathan Coles <[email protected]>
991    
992 jonathan 2552 * Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
993     default to true.
994    
995     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
996     code that loads the state of the layer's use_mask flag. Its
997     usefulness is still being debated.
998    
999     * Thuban/Model/save.py (SessionSaver.write_layer): Remove
1000     code that saves the state of the layer's use_mask flag. Its
1001     usefulness is still being debated.
1002    
1003     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
1004     options to ProjectRasterFile based on the state of layer.UseMask().
1005     Catch more exceptions from ProjectRasterFile so that Thuban doesn't
1006     quit is there is a problem projecting.
1007     (BaseRenderer.draw_raster_data): Change the documentation to
1008     describe the new format (XBM) that the mask data will be in.
1009    
1010     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
1011     data is in XBM format when format='RAW' which means it doesn't
1012     need to be converted to a wxImage before being used as a mask
1013     for a wxBitmap. Assume that if format != 'RAW' that the image
1014     data and mask data are in the same format.
1015    
1016     * libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
1017     and a mask is requested, convert the alpha band to a bit array in
1018     XBM format. if an alpha channel is requested, simply return the
1019     data in the alpha band. Provide better error handling by returning
1020     python error messages (also fixes RT #2947).
1021     (ProjectRasterFile): Support multiple mask options, rather than simply
1022     a flag indicating that a mask should or should not be used. Provide
1023     better error handling by returning python error messages.
1024    
1025     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1026     Add mask data to test.
1027    
1028     * test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
1029     should use the mask by default.
1030     (TestLayerModificaton.test_raster_layer): Test that a layer should use
1031     the mask by default.
1032    
1033     * test/test_load.py (TestRasterLayer.test): Remove testing for
1034     use_mask flag in file.
1035    
1036     * test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
1037     for use_mask in file.
1038    
1039     * test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
1040    
1041 jonathan 2551 2005-01-26 Jonathan Coles <[email protected]>
1042    
1043     Add a new dialog box for raster layers. The dialog box allows
1044     the user to toggle a mask that is generated by ProjectRasterFile
1045     and is used to only draw the real parts of the projected image.
1046    
1047     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
1048     Instruct the warping code to generate a mask if the raster layer
1049     requests one.
1050     (BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
1051    
1052     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
1053     obsolete optional mask argument.
1054    
1055     * Thuban/UI/classifier.py (Classifier): Change the parent class
1056     to LayerProperties and rework the code to support layout calls
1057     from the parent.
1058     (Classifier.dialog_layout): New. Layout the dialog box.
1059     (Classifier.map_layers_removed): Removed. Moved to parent class.
1060     (Classifier.map_replaced): Removed. Moved to parent class.
1061     (Classifier._OnTry): Renamed to OnTry to support parent class.
1062     (Classifier.OnClose): Removed. Supplied in parent class.
1063     (Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
1064     (Classifier._OnOK): Renamed to OnOK to support parent class.
1065     (Classifier._OnRevert): Renamed to OnRevert to support parent class.
1066    
1067     * Thuban/UI/layerproperties.py: New. Base class for layer properties
1068     dialog boxes.
1069    
1070     * Thuban/UI/rasterlayerproperties.py: New. Class for displaying
1071     raster layer properties.
1072    
1073     * libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
1074     with the non-simple version supplied with gdal. This allows added
1075     features such as creating an alpha band.
1076     (GetImageData): Generate a mask array from the alpha band that is
1077     generated by gdal if the user has selected it. Try to support images
1078     that have more than three bands, such as images with RGB plus an
1079     alpha band.
1080     (ProjectRasterFile): Convert python argument for mask and tell
1081     gdal to enable or disable an alpha band.
1082    
1083     * Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
1084     describing what kind of layer the class is. Defaults to "Unknown",
1085     but should be overridden by subclasses.
1086     (Layer.Type): New. Override base class method.
1087     (RasterLayer.__init__): Create a flag for using a mask. Record extra
1088     data from gdal for display in the properties dialog.
1089     (RasterLayer.Type): New. Override base class method.
1090     (RasterLayer.UseMask): New. Returns True if the mask should be used.
1091     (RasterLayer.SetUseMask): New. Set if the mask should be used.
1092     (RasterLayer.ImageInfo): New. Return extra information about the image.
1093    
1094     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
1095     the mask information.
1096    
1097     * Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
1098    
1099     * Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
1100     Classifier classes as dialogs to use with the proper layer types.
1101    
1102     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1103     Fix test.
1104    
1105     * test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
1106     (TestLayerModification.build_path): New. Support function.
1107     (TestLayerModification.test_raster_layer): New. Test new methods.
1108    
1109     * test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
1110    
1111     * test/test_load.py (TestRasterLayer): Add tests for mask.
1112    
1113     * test/test_load_1_0_1.py: New. Copied from test_load.py.
1114    
1115     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
1116     obsolete optional mask argument.
1117    
1118 nhueffme 2549 2005-01-26 Nina Hüffmeyer <[email protected]>
1119    
1120     * Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
1121     which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
1122     RowOrdinalToId() and ReadRowAsDict().
1123    
1124     * Extensions/ogr/ogrstart.py: Added menu item which opens database
1125     layers for existing database connections.
1126    
1127     * Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
1128    
1129    
1130 jan 2548 2005-01-26 Jan-Oliver Wagner <[email protected]>
1131    
1132     * Doc/manual/thuban-manual-de.xml: More translations.
1133    
1134 bh 2544 2005-01-24 Bernhard Herzog <[email protected]>
1135    
1136     Rework the status bar updates a bit to make sure the message about
1137     the projections is produced at the right times.
1138    
1139     * Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
1140     New class variable with messages that may require a status bar
1141     update.
1142     (MainWindow.view_position_changed)
1143     (MainWindow.update_status_bar): Rename from view_position_changed
1144     to update_status_bar. It's meaning has changed now that it may
1145     also generate messages about problems with projection settings.
1146     (MainWindow.__init__): Use the new update_status_bar_messages
1147     class variable to subscribe update_status_bar
1148     (MainWindow.set_position_text): Update doc-string. This method
1149     has to be renamed at some point. See doc-string and comments.
1150     (MainWindow.OnClose): Unsubscribe update_status_bar from all
1151     messages in update_status_bar_messages
1152    
1153     * Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
1154     class attribute. map messages to be forwarded by the viewport.
1155     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
1156     the messages in forwarded_map_messages
1157    
1158 bh 2543 2005-01-21 Bernhard Herzog <[email protected]>
1159    
1160     * test/postgissupport.py (PostGISDatabase.__init__): Tweak
1161     doc-string
1162     (find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
1163     different name for the initialization SQL file.
1164    
1165 jonathan 2537 2005-01-21 Jonathan Coles <[email protected]>
1166 jan 2542
1167     * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
1168     a projection and returns a formatted string representing the
1169     parameters to feed to gdalwarp. This function eliminates
1170     redundancy in draw_raster_layer().
1171     (BaseRenderer.render_map_incrementally): Removed the optimization which
1172     drew the top most raster layer first and then only those vector-
1173     based layers that are above it. With the support for transparency
1174     this optimization breaks correct behaviour.
1175     (BaseRenderer.draw_raster_layer): Reorganize code to support possible
1176     future enhancements to raster layer bounding box. The old behaviour has
1177     not changed. Also, change calling parameters to draw_raster_data()
1178     to specify new RAW data format and mask.
1179     (BaseRenderer.draw_raster_data): Change signature to include an optional
1180     parameter for mask information. Change documentation to mention
1181     support for new parameter and added option for RAW data format.
1182     The data argument is now a list of [width, height, data].
1183    
1184     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
1185     mask parameter. Add new condition for RAW format, which
1186     significantly reduces rendering time. Add condition for
1187     mask parameter.
1188    
1189     * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
1190 jonathan 2537 data array of RGB values from the projected image returned from
1191     the gdal warping functions. In the case of palette based images, it
1192 jan 2542 converts the NO_DATA index to the mask color.
1193     (ProjectRasterFile): Removed all custom memory driver references
1194     and replaced it with the standard in-memory dataset provided
1195     by gdal. The return data is no longer a BMP file, but an array
1196     of RGB values, one set triple per pixel.
1197 jonathan 2537
1198     * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
1199     * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
1200     * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
1201    
1202 jan 2542 * setup.py (thuban_build_ext.finalize_options): Removed mention
1203     of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
1204     files. These are obsolete with the new version of gdalwarp.cpp
1205    
1206     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
1207     Updated signature.
1208     (TestBaseRenderer.test_raster_no_projection): Changed the test
1209     data to be data in the uncompressed RAW format returned from
1210     ProjectRasterFile.
1211    
1212 jan 2535 2005-01-21 Jan-Oliver Wagner <[email protected]>
1213    
1214 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
1215     string available for i18n.
1216 jan 2535
1217 russell 2532 2005-01-20 Russell Nelson <[email protected]>
1218    
1219     * Resources/Projections/defaults.proj: Ruin the speling of the
1220 russell 2533 Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
1221     It's the wrong thing to do in the long run, but it's necessary for
1222     those users until that bug is fixed. Otherwise the projection
1223     dialog segfaults. Better to annoy some Lambert-93 users with a
1224     spelling mistake than every Fedora Core 3 user of Thuban-CVS.
1225 russell 2532
1226 bernhard 2531 2005-01-20 Bernhard Reiter <[email protected]>
1227    
1228 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
1229     docstring and comment that the warning code here is a hack.
1230 bernhard 2531
1231 russell 2529 2005-01-20 Russell Nelson <[email protected]>
1232    
1233 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
1234     user about misprojected layers when their lat/lon bounding
1235 russell 2529 box exceeds rational lat/lon values.
1236    
1237 bernhard 2525 2005-01-20 Bernhard Reiter <[email protected]>
1238    
1239 jan 2542 * Thuban/UI/about.py (unicodeToLocale): Improved:
1240 bernhard 2528 Use 'ascii' and then 'replace' for other characters
1241     when getdefaultlocale returns None. Thanks to Bernhard H. .
1242 jan 2542
1243 bernhard 2528 2005-01-20 Bernhard Reiter <[email protected]>
1244    
1245 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
1246 bernhard 2527 that OnRangeText might be called twice and using None as argument.
1247 jan 2542
1248 bernhard 2527 2005-01-20 Bernhard Reiter <[email protected]>
1249    
1250 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
1251     OnRangeText(0) to work around a different in wx Behaviour noticed
1252     on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
1253    
1254 bernhard 2526 2005-01-20 Bernhard Reiter <[email protected]>
1255    
1256     * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
1257 bernhard 2525 None. (Fixes rt#2910.)
1258    
1259 frank 2524 2005-01-18 Frank Koormann <[email protected]>
1260    
1261     New Extension: mouseposition
1262     Tool to collect mouse click positions (map coordinates) in a dialog.
1263    
1264     * Extensions/mouseposition/__init__.py: New, extension registration
1265    
1266     * Extensions/mouseposition/mouseposition.py: New, implements the
1267     dialog and adds a tool to Thuban mainwindow.
1268    
1269     * Extensions/mouseposition/position.xpm: New, icon for tool.
1270    
1271 jan 2522 2005-01-14 Jan-Oliver Wagner <[email protected]>
1272    
1273     * Doc/manual/thuban-manual-de.xml: More translations.
1274    
1275 frank 2520 2005-01-11 Frank Koormann <[email protected]>
1276    
1277     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1278     Fix indention bug.
1279    
1280 frank 2517 2005-01-09 Frank Koormann <[email protected]>
1281    
1282     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1283 frank 2520 BugFix 2901: Explicitly copy layers ClassificationColumn since it
1284 frank 2517 is not part of the layers Classification.
1285    
1286 frank 2515 2005-01-03 Frank Koormann <[email protected]>
1287    
1288 frank 2517 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
1289     BugFix 2883: Former implementation only worked on classified point
1290     layers: KeyError was raised, now use the default size if field is None.
1291 frank 2515
1292 bernhard 2513 2004-12-27 Bernhard Reiter <[email protected]>
1293    
1294     svgexport 1.0.0cvs: Fixed label export.
1295    
1296     * Extensions/svgexport/test/test_svgmapwriter.py:
1297     class TestSVGRenderer(): New class; new test test_label_font().
1298    
1299     * Extensions/svgexport/svgmapwriter.py
1300     (SVGRenderer.label_font()): initialised Font size with self.factor now,
1301     makes test_label_font happy.
1302    
1303     * Extensions/svgexport/TODO: crossed out fixed label export item.
1304     Added item for options.
1305    
1306     * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
1307    
1308 russell 2511 2004-12-27 Russell Nelson <[email protected]>
1309    
1310 jan 2512 Middle mouse button pans.
1311 russell 2511
1312 jan 2512 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
1313     OnMiddleDown and OnMiddleUp events.
1314     (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
1315     previously used tool.
1316     (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
1317     pressing the middle mouse button.
1318    
1319 jan 2509 2004-12-27 Jan-Oliver Wagner <[email protected]>
1320    
1321     * Doc/manual/thuban-manual-de.xml: More translations.
1322    
1323 jan 2506 2004-12-23 Jan-Oliver Wagner <[email protected]>
1324    
1325     * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
1326     \n to stderr after the warnings. Thanks to Russell Nelson.
1327    
1328 nhueffme 2493 2004-12-20 Nina Hueffmeyer <[email protected]>
1329    
1330     * Extensions/ogr/ogrshapes.py: Fixed some issues from
1331     Bernhard (coding guidelines etc.). Additionally it is now possible to
1332     display shapefiles containing feature collections (e.g.polygons
1333     with holes). Works with gdal 1.2.1 now.
1334    
1335     * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
1336     from Bernhard (coding guidelines etc.). If ogr can't be imported,
1337     tests are skipped now.
1338    
1339     * Extensions/ogr/ogrstart.py: Fixed some typings.
1340    
1341 bernhard 2490 2004-12-20 Bernhard Reiter <[email protected]>
1342    
1343     * Extensions/svgexport/TODO: updated to add support for
1344     raster layers and labels for 1.0.1.
1345    
1346     * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
1347     Issue a warning now.
1348    
1349 bernhard 2488 2004-12-19 Bernhard Reiter <[email protected]>
1350    
1351 bernhard 2489 * Extensions/svgexport/TODO: Added idea to support triggering
1352     the application down the pipe.
1353    
1354     2004-12-19 Bernhard Reiter <[email protected]>
1355    
1356 bernhard 2488 svgexport: Improved code quality, mainly by better naming.
1357    
1358     * Extensions/svgexport/svgmapwriter.py:
1359     DrawPath() renamed to DrawPolygonPath(),
1360     added documentation, improved comments and variable names.
1361    
1362     * Extensions/svgexport/svgmapwriter.py,
1363     Extensions/svgexport/test/test_svgmapwriter.py:
1364     All using DrawPolygonPath() now, the default parameter closed=True
1365     omitted.
1366    
1367     * Extensions/svgexport/test/test_svgmapwriter.py:
1368     renamed test_polygon_opened() to test_polyline()
1369     renamed test_transparent_polygon() to test_transparent_polyline()
1370    
1371 jan 2487 2004-12-18 Jan-Oliver Wagner <[email protected]>
1372    
1373     Some fixes of gns2shp extension.
1374    
1375     * Extensions/gns2shp/test/__init__.py: New. Make this directory a
1376     package.
1377    
1378     * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
1379     dynamically.
1380    
1381     * Extensions/gns2shp/test/README: Simplified description how to test.
1382    
1383     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
1384     fixed some dimensions of fields according to the GNS documentation
1385     which seems to change undocumented.
1386     Now killing trailing \n and/or \r from MODIFY_DATE.
1387     This fixes RT#2453.
1388    
1389 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
1390 bernhard 2480
1391 bernhard 2482 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
1392    
1393     * Extensions/svgexport/test/test_svgmapwriter.py:
1394     Added new tests: test_export_polygon_with_hole()
1395     and test_polygon_with_hole().
1396    
1397     * Extensions/svgexport/svgmapwriter.py
1398     (draw_polygon_shape()): Uses DrawPath correctly now.
1399    
1400     * Doc/manual/thuban-manual.xml: Added documentation for stable
1401     extention svgexport.
1402     * Doc/manual/thuban-manual-de.xml: Copied English section about
1403     svexport over.
1404    
1405 jan 2509 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
1406 bernhard 2482
1407     * Extensions/svgexport/svgsaver.py,maplegend.py:
1408     Moved from experimental to stable extension menu.
1409    
1410     * Extensions/svgexport/TODO: updated.
1411    
1412    
1413     2004-12-18 Bernhard Reiter <[email protected]>
1414    
1415 bernhard 2481 Added Extensions/svgexport/TODO
1416    
1417     2004-12-18 Bernhard Reiter <[email protected]>
1418    
1419 bernhard 2480 Refactored in svgexport:
1420     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
1421    
1422     * Extensions/svgexport/svgmapwriter.py
1423     Added verbosity level 3 to print out polygon points.
1424     (class Point): added __repr__
1425     (class Brush, __str__()): Added space after ,.
1426     (DrawPolygon): Renamed to DrawPath()
1427     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
1428     (DrawLines): Using DrawPath now.
1429    
1430     * Extensions/svgexport/test/test_svgmapwriter.py:
1431     Replaced DrawPolygon() calls with DrawPath() and put the first argument
1432     inside another list. Adapted test data with a newline before "M".
1433    
1434     2004-12-18 Bernhard Reiter <[email protected]>
1435 bernhard 2479
1436     Refactored svgexport tests: 9 double tests runs eliminated;
1437     code size reduced by 8 lines.
1438    
1439     * Extensions/svgexport/test/test_svgmapwriter.py:
1440     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
1441     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
1442     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
1443     this fixed the double running of the nine tests of TestVirtualDC.
1444     (class TestVirtualDC): Using self.dc and self.file from setUp().
1445    
1446 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
1447    
1448     Two windows specific fixes ported from thuban-1­0-branch:
1449    
1450     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
1451     instead of getlocale because getlocale doesn't return a usable
1452     encoding name on a german windows 2000
1453    
1454     * setup.py: windows build: Removed the absolute path names and
1455     made all prfixes relative to the directory containing setup.py.
1456     Makes it a little easier to adapt to a different system.
1457    
1458 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
1459    
1460 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
1461 bh 2472 Fixes RT#2299
1462    
1463     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
1464    
1465     * test/postgissupport.py
1466     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
1467     table to "roads-multi" because it now uses MULTILINESTRING
1468     geometries and introduce a new "roads" table that uses LINESTRING
1469     (coords_to_multilinestring): Make the doc string more precise
1470     (coords_to_linestring): New. Create a LINESTRING WKT
1471     representatin
1472     (wkt_converter): Add coords_to_linestring
1473     (upload_shapefile): Rephrase the doc-string a bit.
1474    
1475     * test/test_postgis_db.py (TestPostGISShapestoreArc)
1476     (LineStringTests)
1477     (TestPostGISShapestoreLineString)
1478     (TestPostGISShapestoreMultiLineString): Split
1479     TestPostGISShapestoreArc into a base class LineStringTests and two
1480     derived classes TestPostGISShapestoreLineString for LINESTRING
1481     geometries and TestPostGISShapestoreMultiLineString for
1482     MULTILINESTRING geometries. Most test methods are in the base
1483     class with the exception of tests that explicitly check the raw
1484     format.
1485    
1486     2004-12-16 Bernhard Herzog <[email protected]>
1487    
1488 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
1489    
1490     * test/postgissupport.py (find_postgis_sql): Different postgis
1491     versions put the postgis.sql file into slightly different places
1492     so we have to look in both. The updated doc string describes this
1493     is more detail.
1494    
1495     * test/test_postgis_db.py
1496     (TestPostGISSpecialCases.test_column_name_quoting): The return
1497     value of UniqueValues is unsorted, so it has to be sorted for
1498     comparison.
1499    
1500     2004-12-16 Bernhard Herzog <[email protected]>
1501    
1502 bh 2470 Fix for RT#2237
1503    
1504     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
1505     panel to be shown is the UnknownProjPanel disable the OK and Try
1506     buttons. Otherwise enable them.
1507     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
1508     the parameters. In that case __GetProjection also returns None
1509     now.
1510    
1511 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
1512    
1513 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
1514     minimum number of classes to 2. The calculate_quantiles needs at
1515     least two and raises an exception otherwise.
1516     Fixes RT#2549
1517    
1518     2004-12-15 Bernhard Herzog <[email protected]>
1519    
1520 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
1521     so that it returns a result for select statements.
1522     (PostgreSQLServer.server_version): New. Return the version of the
1523     server software.
1524     (PostgreSQLServer.require_authentication): The format of
1525     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
1526     server version and generate the file in the correct format
1527    
1528     2004-12-15 Bernhard Herzog <[email protected]>
1529    
1530 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
1531     in the doc string and rephrase it a little.
1532    
1533 frank 2457 2004-12-15 Frank Koormann <[email protected]>
1534    
1535     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
1536     session has been loaded successfully. The check is called by the relevant
1537     tests after executing load_session().
1538    
1539 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
1540    
1541 bh 2454 Make sure the region used to determine which shapes are visible
1542     actually matches the region on the printed page. If this isn't
1543     done properly some shapes might not be printed.
1544     Fixes RT #2692
1545    
1546     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
1547     renderer has to be at the same position as the mapregion
1548    
1549     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
1550     has to be moved by (self.shiftx, self.shifty) too.
1551    
1552     2004-12-13 Bernhard Herzog <[email protected]>
1553    
1554 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
1555     generated python code which leads to exception in the __del__
1556     method when the constructor fails. See the comments in the code
1557     for more details.
1558    
1559     * libraries/pyprojection/Projection.py: Updated from Projection.i
1560     with SWIG.
1561    
1562     2004-12-13 Bernhard Herzog <[email protected]>
1563    
1564 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
1565     (TestAltPath.test_02_path_error_fix_from_list)
1566     (TestAltPath.test_05_path_error_fix_from_list_changed)
1567     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
1568     is destroyed in tearDown, so there's no need to do it in a test
1569     case.
1570    
1571     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
1572     debug print
1573    
1574     2004-12-13 Bernhard Herzog <[email protected]>
1575    
1576 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
1577     (TestDrawSplines.setUp): Do not use super with the unittest
1578     classes because in Python 2.2 they're still old-style classes.
1579    
1580 frank 2448 2004-12-13 Frank Koormann <[email protected]>
1581    
1582     Alternative Path feature: When loading a (moved) session where
1583     shapefiles cannot be found, ask the user. Use the specified path
1584     if further shapefiles are missing. However, ask the usr for confirmation
1585     in such cases.
1586    
1587     * test/test_load.py (TestAltPath): New, tests for alternative path feature
1588     in load_session()
1589     (Shapefile_CallBack): Helper, implements controllable callback.
1590    
1591     * Thuban/UI/application.py (ThubanApplication.OnInit):
1592     Added "alt_path" to self.path
1593     (ThubanApplication.OpenSession): Added shapefile_callback as second
1594     callback similar to db_connection_callback.
1595     (ThubanApplication.run_alt_path_dialog): New, implementaion of
1596     shapefile_callback. In addition to raising the dialog the control of
1597     self.path('alt_path') is implemented here.
1598    
1599     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
1600     (SessionLoader.open_shapefile): Open shapefile, eventually with
1601     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
1602     formerly used in start_fileshapesource()/start_layer().
1603     (SessionLoader.start_fileshapesource): Call open_shapefile().
1604     (SessionLoader.start_layer): Call open_shapefile().
1605     (load_session): Added shapefile_callback.
1606    
1607     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
1608     feature (search / check).
1609    
1610     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
1611    
1612 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
1613    
1614 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
1615    
1616     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
1617     (def draw_point_shape): new parameter size defaults to 2 as before.
1618     (draw_shape_layer_incrementally): Moved draw_func log line higher.
1619     Added draw_func call with size when dealing with a point layer.
1620    
1621     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
1622    
1623     2004-12-11 Bernhard Reiter <[email protected]>
1624    
1625 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
1626     to raise the chance that the line length will be below 255 characters,
1627     as recommended by REC SVG 1.1 in section 8.3.1.
1628    
1629     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
1630     Adding \n before L's and changed whitespace handling.
1631    
1632     * Extensions/svgexport/test/test_svgmapwriter.py:
1633     Adapted tests to new whitespace handling of DrawPolygon.
1634    
1635     2004-12-11 Bernhard Reiter <[email protected]>
1636    
1637 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
1638    
1639     * Extensions/svgexport/test/test_svgmapwriter.py:
1640     Removed test_drawbezier in favour of new test_drawspline3 and
1641     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
1642     All only to test DrawSpline.
1643    
1644     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1645     New implementation now really using the strange algorithm of
1646     xfig 3.1's approximated splines and its conversion to postscript
1647     with one twist: SVG can do quadratic beziers, so skipped translation
1648     to cubic beziers.
1649     (TestWithDC): Typo in comment fixed.
1650    
1651 joey 2442 2004-12-09 Martin Schulze <[email protected]>
1652    
1653     * Thuban/Model/classgen.py: Added missing character encoding
1654    
1655     * Extensions/wms/properties.py (OpenWMSProperties): removed
1656    
1657     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
1658     support for get_srs_discrepancies() since there are no
1659     discrepancies anymore (was a thinko)
1660    
1661     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
1662     format priority now that more formats are supported globally by
1663     the render engine.
1664    
1665 silke 2437 2004-12-08 Silke Reimer <[email protected]>
1666     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
1667     because it is not available in all versions of ogr
1668    
1669 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
1670     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
1671     global tests until a real one is commited.
1672    
1673 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
1674    
1675     * /Extensions/ogr/: Adding a new extension to read shapefiles with
1676     ogr. It is planned to add other vector formats.
1677    
1678     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
1679    
1680 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
1681    
1682     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
1683     part of a (non-)fix to renable that the tests are always
1684     executed.
1685    
1686 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
1687    
1688     * Extensions/svgexport/test/test_svgmapwriter.py:
1689     Added test_drawbezier() to test DrawSpline().
1690    
1691     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1692     Really implemented bezier drawing.
1693    
1694     * Extensions/svgexport/__init__.py: Bumped version of svgexport
1695     to 0.9.1 because now the legend examples lines styles
1696     will be drawing with beziers.
1697    
1698 joey 2431 2004-12-05 Martin Schulze <[email protected]>
1699    
1700     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
1701     GIF as supported bitmap image formats (helpful for the WMS extension)
1702    
1703 joey 2430 2004-11-30 Martin Schulze <[email protected]>
1704    
1705     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
1706     Improved the test for the internal compare method
1707    
1708 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
1709    
1710     * Thuban/UI/about.py (About.__init__): Added
1711     Norbert Solymosi for hungarian translation and Ole Rahn
1712     as contrbutor. Moved Bernhard Reiter from Contributor
1713     to Developer.
1714    
1715 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
1716    
1717     * Extensions/svgexport/test/test_svgmapwriter.py:
1718     Removed Jan from author list as he did not change enough significant
1719     lines yet.
1720    
1721     * Extensions/svgexport/__init__.py: Added Bernhard as author
1722     of the Extension.
1723    
1724 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
1725    
1726     * po/hu.po: New. Hungarian translation. Contributed
1727     by Norbert Solymosi.
1728    
1729 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
1730    
1731     * Extensions/svgexport/test/test_svgmapwriter.py
1732     (Testobjectexport.test_transparent_polygon): Commented out some
1733     debug prints
1734    
1735 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
1736    
1737     Fix broken tests for svg extension and added svg legend
1738     to Experimental menu.
1739    
1740     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
1741     the test run correctly even if the extension is a package.
1742     Also removed the "import Thuban" which makes no sense.
1743    
1744     * Extensions/svgexport/__init__.py: Fix to have the extensions'
1745     test module also be executed from the global test routine.
1746     This is done by looking for the absense of the DISPLAY variable.
1747    
1748     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
1749     to Experimental menu since this module has yet not reached a stable
1750     status (ie. 1.0).
1751    
1752 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
1753    
1754     * Extensions/svgexport/svgmapwriter.py:
1755     Added verbose variable and some logging depending on it.
1756     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
1757     because counting i is not necessary.
1758     (class Pen, class Brush): Added simple __str__ methods.
1759     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
1760     not exported to svg file) Note: holes still unhandled.
1761    
1762     * Extensions/svgexport/test/test_svgmapwriter.py:
1763     Made a baseclass TestWithDC for test needed a DC.
1764     Added tests for bug #2698 (transparent polygons are not
1765     exported to svg file):
1766     Testobjectexport.test_transparent_polygon()
1767    
1768     * Thuban/Model/base.py (UnsetModified):
1769     Fixed some typos in docstring.
1770    
1771     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
1772     Added hints on the used algorithm for handling holes.
1773    
1774 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
1775    
1776 jan 2412 Some face lifting for the examples.
1777    
1778     * Examples/__init__.py: Make this directory a package.
1779    
1780     * Examples/simple_extensions/__init__.py: Make this directory a package.
1781    
1782     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
1783     menu to Examples menu.
1784    
1785     * Examples/simple_extensions/simple_command.py: Some more comments,
1786     minor changes.
1787    
1788     * Examples/simple_extensions/simple_tool.py: Minor changes.
1789    
1790     2004-11-20 Jan-Oliver Wagner <[email protected]>
1791    
1792 jan 2407 Changed way of extension registry for wms and added extension
1793     registry for umn_mapserver extension.
1794    
1795     * Extensions/wms/__init__.py: Added registry entry and the importing
1796     of the actual wms module. Included a test for the required PyOGCLib.
1797    
1798     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
1799    
1800     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
1801     importing of the actual umn mapserver management modules.
1802     Included a test for the required Python MapScript.
1803    
1804     2004-11-20 Jan-Oliver Wagner <[email protected]>
1805    
1806 jan 2403 Changed way of extension registry for importAPR, bboxdump
1807     and added extension registry for svgexport.extension registry for
1808     svgexport.
1809    
1810     * Extensions/importAPR/__init__.py: Added registry entry and the importing
1811     of the actual importAPR module.
1812    
1813     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
1814     __init__.py).
1815    
1816     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
1817     »···of the actual bboxdump module.
1818    
1819     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
1820     »···__init__.py).
1821    
1822     * Extensions/svgexport/__init__.py: Added registry entry and the importing
1823     of the svgsaver module.
1824    
1825     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
1826     to Experimental menu since this module has yet not reached a stable
1827     status (ie. 1.0).
1828    
1829 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
1830    
1831     Now the hit test considers the size of point symbols.
1832    
1833     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
1834     'size' defaulting to the previously fixed value 5.
1835     Extended doc-string.
1836     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
1837     for symbols.
1838     Now the size of the largest point symbol is determined to find out
1839     about whether the point has been hit.
1840     This fixes the problem that only clicks inside a fixed distance of
1841     5 where found.
1842    
1843 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
1844    
1845 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
1846 jan 2395 selected symbols.
1847    
1848     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
1849     Added consideration of the specific size of point symbols.
1850     The property for each point symbol is retrieved and the size applied
1851     for the rendering method.
1852     Added doc-string.
1853    
1854 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
1855    
1856     Changed way of Extension Registry for gns2shp and profiling.
1857    
1858     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
1859     __init__.py).
1860    
1861     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
1862     of the actual gns2shp module.
1863    
1864     * Extensions/profiling/profiling.py: Removed registry entry (moved to
1865     __init__.py).
1866    
1867     * Extensions/profiling/__init__.py: Added registry entry and the importing
1868     of the actual profiling module.
1869    
1870 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
1871    
1872     * Extensions/svgexport/: Minor improvements to doc strings.
1873    
1874 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
1875    
1876     Further elements for sizable point objects now
1877     making this feature usable though not yet complete.
1878    
1879     * Thuban/Model/save.py (SessionSaver.write_classification): Write
1880     attribute 'size' for cldata when the shape layer is of point type.
1881     This also now make the test_load.py tests happy.
1882    
1883     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
1884     gradient.
1885    
1886     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
1887     ID_SELPROP_SPINCTRL_LINEWIDTH.
1888     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
1889     (ID_SELPROP_SPINCTRL_SIZE): New Id.
1890     (SelectPropertiesDialog.__init__): Added a second spin control
1891     for the size in case the corresponding layer is of point type.
1892     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
1893     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
1894     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
1895     and refresh preview.
1896    
1897    
1898    
1899 joey 2381 2004-10-04 Martin Schulze <[email protected]>
1900    
1901     * Extensions/wms/test/test_parser.py
1902     (TestWMSCapabilitiesParser.test_compareLists): Added missing
1903     self-test for compareLists()
1904     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
1905     self-test for compareDicts()
1906 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
1907     to verify the test routine fails with non-equal arguments
1908     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
1909     to verify the test routine fails with non-equal arguments
1910 joey 2381
1911 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
1912    
1913 jan 2380 First elements for sizeable point objects.
1914    
1915     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
1916    
1917     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
1918    
1919     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
1920     of a corresponding argument is given.
1921     (TestSymbolSize): New. Test the size attribute of cldata.
1922    
1923     * Thuban/Model/classification.py: Removed some trailing whitespaces.
1924     (ClassGroupProperties.__init__): Set default size.
1925     (ClassGroupProperties.SetProperties): Set the size.
1926     (ClassGroupProperties.GetSize): New. Return the size.
1927     (ClassGroupProperties.SetSize): New. Set the size.
1928     (ClassGroupProperties__eq__): Compare also size.
1929     (ClassGroupProperties__repr__): Print also size.
1930    
1931     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
1932     the size attribute.
1933    
1934     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
1935     Also, now there is a return value that indicates whether the drawing
1936     size exceeded the given rect extent and if so the new extent.
1937     Finally, point objects are drawn depending on the size. If either
1938     the width or height is exceeded, the new extent is returned.
1939     (ClassRenderer.Draw): Now when calling the previewer drawing function,
1940     evaluate the return value and, if not None, adapt the grid widget size
1941     accordingly and redraw again.
1942    
1943     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
1944     If the draw function is for points, call it with the size as additional
1945     parameter.
1946     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
1947     the size. Compute the radius using the size.
1948    
1949     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
1950     that Thuban supports size, apply this correctly.
1951    
1952     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
1953    
1954     2004-10-03 Jan-Oliver Wagner <[email protected]>
1955    
1956 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
1957     Map chapter.
1958    
1959 joey 2368 2004-10-01 Martin Schulze <[email protected]>
1960    
1961     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
1962     argument for general use through properties-dialog selector
1963    
1964     * Thuban/UI/classifier.py: Register properties dialog classes for
1965     both provided layer classes/types.
1966    
1967     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
1968     map can be retrieved through the parent which is passed to the
1969     constructor anyway and doesn't require an argument of its own,
1970     required for the unification of arguments for general use through
1971     properties-dialog selector.
1972     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
1973     whether a dialog is already opened (and raising it to the users
1974     attention) and creating a new dialog into a function of its own
1975     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
1976     method
1977     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
1978     global registration of properties dialog classes (which are indeed
1979     layer-specific).
1980    
1981     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
1982     for general use through properties-dialog selector, the map can be
1983     retrieved through the parent and doesn't require an argument of
1984     its own.
1985    
1986     * Extensions/wms/wms.py: Register the properties dialog class for
1987     the provided WMS layer
1988    
1989 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
1990    
1991     New feature: Registry for Extensions.
1992    
1993     * Thuban/UI/extensionregistry.py: This module defines a registry for
1994     Extensions.
1995    
1996     * Thuban/UI/about.py (About.__init__): Added description
1997     of the registered extensions with all of the information.
1998    
1999     * Thuban/Model/extension.py (Extension): Improved doc-string.
2000    
2001     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
2002     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
2003     Extensions/wms/wms.py: Added registration of the extension.
2004    
2005 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
2006    
2007     More fixes to svgexport to make used ids unique and
2008     conforming to XML's Name production.
2009    
2010     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
2011     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
2012     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
2013     Added Bernhard R. as author.
2014     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
2015     concatenation char now (makes test_make_ide_nosetbaseid() valid).
2016     Also transform second id part with "%d" and catch the TypeError
2017     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
2018     Corrected typo inBernhard's author line.
2019     (SetBaseID): Return the transformed base id. Transform characters
2020     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
2021     import binascii. If to be set string starts with "xml" or so, add "t".
2022     (draw_shape_layer_incrementally): use the returned value of SetBaseID
2023     for used_baseids checks.
2024    
2025 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
2026    
2027     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2028     Remove a debug print and some tab characters.
2029    
2030 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
2031    
2032     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
2033     (SetBaseID, SetID, make_id): Improved docstring comments to explain
2034     the interaction of the three functions and the XML id contrains.
2035    
2036 bernhard 2352
2037 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
2038    
2039 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
2040     Module.
2041    
2042     * Doc/README: Added info on ThubanModel.xmi.
2043    
2044     2004-09-23 Jan-Oliver Wagner <[email protected]>
2045    
2046 jan 2346 * Doc/README: New. Some info about how to generate technical
2047     documentation from the source code.
2048     This text was send to the Thuban developer mailing list on
2049     September 21st 2004 by Bernhard Reiter.
2050    
2051 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
2052    
2053     Improved the svgexport to only use unique ids. Will issues
2054     an error message dialoge when two layer names are the same.
2055     ShapeIDs are now added with a dash within the svg ids.
2056    
2057     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
2058     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
2059     (TestSVGRenderer): New test class with test_make_in() and
2060     test_check_for_layer_name_clash()
2061     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
2062     and draw_shape_layer_incrementally() to not use a baseid twice,
2063     satisfying test_check_for_layer_name_clash()
2064     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
2065     test_make_in().
2066     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
2067     and wxICON_HAND.
2068     (write_to_svg): Put dc and rendering in a try statement and on
2069     catching SVGmapWriterError notify the user and delete the target file.
2070    
2071 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
2072    
2073     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
2074    
2075 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
2076    
2077     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
2078     small bug with the line color. Now the line color will now only set
2079     if it is set in Thuban an not Transparent.
2080    
2081     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
2082     deleting the layers from mapfile. Now all layers will delete backwards
2083     from the last.
2084    
2085 silke 2339 2004-08-20 Silke Reimer <[email protected]>
2086 silke 2338
2087 silke 2339 * Thuban/Model/layer.py:
2088     Fixes bug in projection handling: Otherwise very large region might not
2089     have valid values in the layer's projection.
2090    
2091     2004-08-20 Silke Reimer <[email protected]>
2092    
2093 silke 2338 * Thuban/UI/about.py:
2094     small changes to be consistent with coding style.
2095    
2096 joey 2337 2004-08-13 Martin Schulze <[email protected]>
2097    
2098     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
2099     Adjusted a comment
2100    
2101 silke 2335 2004-08-11 Silke Reimer <[email protected]>
2102 silke 2334
2103 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
2104     too many and too enhanced imports of locale
2105    
2106 silke 2334 2004-08-10 Silke Reimer <[email protected]>
2107    
2108     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
2109 silke 2339 function unicodeToLocale() to convert special characters to users
2110     locale encoding
2111 silke 2334
2112 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
2113    
2114     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
2115     lower case letter'
2116    
2117 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
2118    
2119     * ChangeLog: Rewrite the last ChangeLog entry to follow
2120     the standard way.
2121    
2122     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
2123     the function where it is needed, because it don't works if it stands
2124     at the beginning.
2125     (MF_Layer.__init__): Removed the extra numclassed variable. Now
2126     numclasses from the mapscript will be used.
2127     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
2128     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
2129     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
2130     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
2131     (MF_Map.create_new_layer): New. A new Layer is created and associated
2132     with the mapscript object.
2133     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
2134     the mapscript.
2135     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
2136     linked to the layer in thuban, else the layerobject linked to the
2137     thubanlayer will be used.
2138     AnnotationLayer will now store the filename of the shapefile.
2139     (MF_Map.remove_layer): If a layer is removed the associated object
2140     must be set new.
2141    
2142     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
2143     layers which are exists in thuban to the mapobj. All removed Layers
2144     will be removed from the mapobj.
2145     Added comments to all functions.
2146     (thuban_to_map): No layer will be removed here.
2147    
2148     * Extensions/umn_mapserver/mf_handle.py
2149     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
2150     Layersettings for the mapserver kann be edited.
2151    
2152     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
2153     imported, will be linked with the associated MF_Layer.
2154     (import_mapfile): All layers, which are not selected, will be removed.
2155     Disable the "import layer from mapfile" menu option.
2156    
2157     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
2158     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
2159     layer on permanently.
2160    
2161 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
2162    
2163 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
2164     New. This function removes all metadata
2165     (MF_Layer.set_group): New. Set the group setting.
2166     (MF_Layer.get_group): New. Get the group setting.
2167     (MF_Map): Removed the extra numlayers variable, used the mapscript
2168     parameter instead.
2169     (MF_Map.get_numlayers): New. This get numlayers.
2170     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
2171 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
2172     if the object is an instance. Also added the annotation layer here to
2173     export, but only the layer is created in the mapfile.
2174    
2175 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
2176     the check if a mapobj exist, because its not needed anymore. The
2177     export function is only available if a mapobj exist.
2178     Use the new function to remove all layers.
2179 jschuengel 2323
2180 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
2181     option and the metadata button. The layer dialog is temporary disabled.
2182     (Metadata_CustomDataTable): Added some functions to show the grid
2183 jschuengel 2323 correct.
2184    
2185 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
2186     the number of layer from import_mapfile to this function.
2187     (AnnotationLayer): New. This Class shows the Annotation layer in
2188     thuban. The layer don't do anything. It's only to show the layer
2189     and to save the layer order.
2190     (add_annotationlayer): New. Import an annotation layer to thuban.
2191     (select_layer2import): New. Import only layers to thuban and not
2192     the other settings like projection or scalebar.
2193     (create_new_mapfile): Moved the _has_umn_mapobj function and the
2194     create_new_mapfile functions from mf_handle.py to mf_import.py.
2195 jschuengel 2323
2196     * Extensions/umn_mapserver/sample/iceland.map: Added the group
2197     parameter to the roads and cultural layers. Also added a new
2198     Annotation Layer for the cultural points.
2199    
2200     * Extensions/umn_mapserver/sample/iceland.html: Added the select
2201     option for the annotation layer.
2202    
2203     * Extensions/umn_mapserver/sample/index.html: Added the start
2204     parameter for the annotation layer.
2205    
2206 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
2207    
2208     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
2209     translation completed.
2210    
2211     * Doc/manual/thuban-manual.xml (Chapter Session Management):
2212     Fixed unprecise description for Save Session.
2213    
2214 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
2215    
2216     Started translation of Users Manual into german.
2217    
2218     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
2219    
2220     * Doc/manual/Makefile: Added build instructions for german
2221     users manual.
2222    
2223     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
2224    
2225 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
2226    
2227     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
2228     functions. Now all metadata will handle by the function and its not
2229     needed to initialize it from outside. Therefor the associated mapobj
2230     will be stored in the Metadata Object. So we can use the special
2231     functions from the associated mapobj to get the Metadata.
2232     Therefor all initialization code for the metadata is removed from the
2233     other classes.
2234     (MF_Layer): Added a function to get the metadata object.
2235     (MF_Map): Added a function to set the mappath, the path where
2236     the mapfile ist stored.
2237    
2238     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
2239     to set the extent in the mapfile. Now the code is set by the displayed
2240     data in the Thuban-view.
2241     (export_mapfile): The shapepath is now set empty, until relative
2242     pathnames are supported.
2243    
2244     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
2245     metadata. Yet only mapfile metadata are supported. Layer and class
2246     supported are not implemented.
2247     Added a dialog to handle layer informations. The dialog only shows the
2248     selected layer at the moment.
2249    
2250     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
2251     code for setting the extent in thuban. Now the extent is set to the
2252     given extent from the mapfile.
2253     Fixed a logical mistake. Now the extent is set when realy a layer is
2254     loaded, and not if one is selected to load.
2255    
2256     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
2257     move the shown map in the browser.
2258    
2259     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
2260     line to the mapobj and added metadata to the political layer.
2261    
2262     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
2263     for Metadata.
2264    
2265 joey 2300 2004-07-26 Martin Schulze <[email protected]>
2266    
2267     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
2268     ClassMapper
2269    
2270     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
2271     case for the new ClassMapper
2272    
2273    
2274 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
2275    
2276 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
2277     visible extent of the map in projected coordinates
2278    
2279     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
2280     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
2281     tests.
2282     (SimpleViewPortTest.test_visible_extent): New. The real test for
2283     VisibleExtent()
2284    
2285     2004-07-22 Bernhard Herzog <[email protected]>
2286    
2287 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
2288     function when running asa script.
2289    
2290 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
2291    
2292     * Extensions/umn_mapserver/mf_export.py: Added "import os"
2293     Removed the old "import Thuban.UI.mainwindow" code.
2294     (tbextent_to_map): Removed the extra function and at the code direct
2295     to "thuban_to_map" function.
2296     (write_creatorcomment): Added. Now a short comment is added to the
2297     beginning of an generated mapfile.
2298     (export_mapfile): Now the Path and filename are saved in to variables,
2299     and not together in one variable. This is needed for the new
2300     write_creatorcomment function.
2301    
2302     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
2303     import module "re". Also added Range and the ClassGroupRange import
2304     from Thuban. Both are needed for the new range expression import.
2305     (create_rangeexpression): Added. Creates a Range Expression in Thuban
2306     style from a given mapfile expression.
2307     (added_rasterlayer): Make some small code changes. The shapepath is
2308     now stored in an extra variable and the clazz_name is set empty if no
2309     class name set in the mapfile.
2310     Changed the Error message for Range Expressions, becaus the new
2311     function create a error string which will be shown in the dialog.
2312    
2313     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
2314     range expression import.
2315 jan 2312
2316 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
2317    
2318     * Extensions/umn_mapserver/README: Added hint that
2319     installation as root can be avoided. Removed all tabs.
2320    
2321 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
2322    
2323     * test/test_viewport.py
2324     (ViewPortTest.test_changing_map_projection): Check that changing
2325     the projection of an empty map shown in a viewport doesn't lead to
2326     exceptions in the viewport's handler for the
2327     MAP_PROJECTION_CHANGED messages
2328    
2329     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
2330     try to keep the same region visible when the map actually contains
2331     something
2332    
2333 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
2334    
2335     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
2336     mappath directly from the mapobj. Is needed because of the changes
2337     in mf_import.py.
2338     (MF_Layer.add_thubanclass): Added a new comment.
2339     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
2340     mapobj is empty there is no extent get from thuban an so no one can
2341     set to th mapobj.
2342    
2343     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
2344     the discription.
2345     Split the funktion in to three smaller ones. The new functions are
2346     add_rasterlayer, add_polygonlayer and select_layer2import.
2347     Removed the mapfilepath and filepath initialisation, because its know
2348     include in the new functions.
2349     Now nothing will be imported if cancel is pressed in the
2350     layer choice dialog.
2351    
2352 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
2353    
2354     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
2355     import.
2356     (MF_Symbolset): Removed the extra variable for numsymbols.
2357     (MF_Class.__init__): Added a comment to the exception clause.
2358     Removed the extent init, because it was not needed anymore.
2359     (MF_Layer.add_thubanclass): Added the code to set the class name to
2360     the expression value from thuban if no label is defined.
2361     Added the code to export Range expressions from thuban to the mapfile.
2362     (MF_Map.set_extent): Removed the exception and replace it by some if
2363     code. If the size of a map is not defined the size will be set to 1,1.
2364     This is necessary because if the extent is set, mapscript checks if
2365     the size is greater than zero.
2366     (MF_Web): Added the get and set function for the template.
2367    
2368     * Extensions/umn_mapserver/mf_export.py: Added the function to check
2369     if a mapobject exists and used it to set the status of the menu items.
2370     If no mapfile exists the settings could not be edditied.
2371     Define after which menuitem the exportitem will include.
2372    
2373     * Extensions/umn_mapserver/mf_handle.py: Removed the import
2374     Thuban.UI.mainwindow clause, because it is not needed.
2375     Added the command Refresh() to all "OnChangeColor()" functions,
2376     because the color preview window was not updated on a color change.
2377     Added the function to check if a mapobject exists and used it to set the
2378     status of the menu items. If no mapobject exists the settings could not
2379     be edditied.
2380     (Map_Dialog): Moved the imagetype selector from the
2381     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
2382     (Web_Dialog): Removed the name label and added the template textbox.
2383    
2384     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
2385     the exception handling on loading the layers by an if statement. It
2386     is not necessary to us the exception there.
2387     The Filepath creation now use os.path.join to build the path.
2388    
2389     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
2390     definition from global to the setUp function. Now the testMap will
2391     initialize new on each test.
2392    
2393     * Extensions/umn_mapserver/sample/iceland.map: Include three new
2394     classes in the Line Layer, to test logical Expressions.
2395     Set the status of the class "Point9" in the Point Layer to off
2396    
2397 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
2398    
2399     * Thuban/UI/baserenderer.py
2400     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
2401     optimization that tries not to draw layers under a raster layer.
2402     The bug was harmless. All it effectively did was to produce The a
2403     strange messages about not being able to draw Layer instances for
2404     all vector layers below a raster layer which would be invisible
2405     anyway because the raster layer currently always covers the entire
2406     window
2407    
2408 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
2409    
2410     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
2411     a list of supported outputformats. This formats are not alle supported
2412     because there is no possibility to get the outputformat without the
2413     name known. Make some formal changes to the code.
2414     (MF_Map.set_name()): Fixed a bug if the name is None.
2415    
2416     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
2417     statement, because its not needed anymore. The Outputformat is now
2418     given as string from the object. Make some formal changes to the code.
2419    
2420     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
2421     most of the new setting which were added during the last changes.
2422     Removed the MF_Size Test.
2423    
2424     * Extensions/umn_mapserver/test/test.map: Added a new class to the
2425     cultural Layer to test expressions and the the status of that layer
2426     from on to default.
2427     Changed the data path the the correct Thuban Data
2428     Added the Outputformat Object and Symbol Object
2429    
2430 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
2431    
2432     * Extensions/umn_mapserver/mapfile.py: Added some new
2433     settings to edit (outputformat, label, imagetype)
2434    
2435     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
2436     the Label Dialog and add the OutputDialog.
2437     Make some changes to the code order.
2438    
2439 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
2440    
2441     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
2442     and line Obj and add the scalebar_status_type, scalebar_style_type and
2443     scalebar_position_type.
2444     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
2445     are only used to create a Symbol like the circle in Thuban.
2446     Added the scalebarObject (MF_Scalebar)
2447     (MF_Class): Added set_status and get_status.
2448     (MF_Layer.add_thubanclass): Added code to set the class status
2449     (MF_Map): Added code to handle the symbols and scalebar
2450     (MF_Label): Added the set_partials and get_partials functions
2451    
2452     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
2453     from mapfile. Added a function to create a circle object like the one
2454     from thuban if no one exists.
2455    
2456     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
2457     press ok in the assosiated dialog and not at the end of the
2458     colordialog.
2459     Added the Dialog for the Scalebar.
2460     (Label_Dialog): Added the offset option
2461    
2462     * Extensions/umn_mapserver/mf_import.py: Added code to import the
2463     status of the Classes.
2464     Fixed a bug with the projection. Now the to_meter parameter will be
2465     added to the Projection only if it doesn't exists.
2466    
2467 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
2468    
2469     Added the functionality to handle the content thuban is not
2470     able to handle directly.
2471    
2472     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
2473     Thuban with the possibility to edit the mapfile content.
2474    
2475     * Extensions/umn_mapserver/mf_import.py: Added the possibility
2476     to import mapfiles without any layer selected. So it is possible
2477     to edit the other settings in a mapfile.
2478     (import_mapfile): Added code to use the editing functions.
2479     Added the possibility to import the projection to a layer if one
2480     is defined.
2481     Status settings (On,Off) will now set in thuban (visible, invisible).
2482     fixed a bug with with classnames. If no classname is set in mapfile
2483     the value in Thuban will set to the expression.
2484    
2485     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
2486     possibility to save a new mapfile or use the old one which is
2487     imported or new created.
2488     Added code to use the editing functions.
2489     Remove some not needed import statements
2490    
2491     * Extensions/umn_mapserver/mapfile.py: Added new types which are
2492     need for the editing functions.
2493     Added needed set-functions for the editing functions.
2494     Added the possibility to export rasterimages.
2495     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
2496     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
2497     moment.
2498     (MF_Class.set_thubanstyle): Now point layers will set to a default
2499     symbol to show a circle in mapserver and not only a 1px dot.
2500     (MF_Style.__init__): Fixed a bug with the color. Color was not set
2501     correct before.
2502     (MF_Size): Removed, because it is not needed.
2503    
2504     * Extensions/umn_mapserver/README: Added the hints to use the
2505     export and editing functions, too.
2506    
2507     * Extensions/umn_mapserver/sample/iceland.map: Added the
2508     new parameter "UNITS METERS".
2509     Change the political layer to status OFF.
2510    
2511     * Extensions/umn_mapserver/sample/README: Added some
2512     more details to setup the sample in the MapServer.
2513    
2514 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
2515    
2516     * Extensions/svgexport/test/test_svgmapwriter.py:
2517     Removed class VFile and used standard StringIO instead.
2518    
2519 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
2520    
2521     Add the export function to the umn_mapserver extension.
2522    
2523     * Extension/umn_mapserver/mf_export.py: New. This module extents
2524     Thuban with the possibility to export the Thuban content.
2525    
2526     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
2527     with the export module. Especially added the possibility to
2528     add thuban objects directly to the map objects.
2529    
2530     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
2531     because of the hint from Bernhard Herzog.
2532     Corrected the handling of absolute pathnames.
2533     Changed the Text of the Menu-Item, now the beginning is upper case.
2534    
2535     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
2536    
2537 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
2538 jschuengel 2242
2539 jschuengel 2250 Add a sample and make some changes.
2540    
2541     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
2542     import from * to explicit used statements. Changed the
2543     Thuban.UI.mainwindow import phrase, too.
2544     (import_mapfile):Corrected a clerical mistake.
2545     Added wxCHANGE_DIR in OpenFile Dialog.
2546     Added a MultipleChoiceDialog, to select the layers to load from
2547     mapfile into thuban. Thereby the projection is only set if one layer
2548     is selected.
2549     Added the possibility to handle relative pathnames which uses
2550     up-level references.
2551     Removed some doubled code.
2552     Corrected an error with integer values used as label in thuban
2553     ClassGroup.
2554    
2555     * Extensions/umn_mapserver/sample: New.
2556    
2557     * Extensions/umn_mapserver/sample/README: New. Describes the
2558     usage of the sample files.
2559    
2560     * Extensions/umn_mapserver/sample/iceland.map: New. This is
2561     a suitable .map-file for the iceland data.
2562    
2563     * Extensions/umn_mapserver/sample/index.html: New. The template
2564     for the mapfile.
2565    
2566     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
2567     file for the Iceland Application on web.
2568    
2569     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
2570     some details.
2571    
2572     * Extensions/umn_mapserver/test/test_mapserver
2573     (mapserver_import_Test_generalClasses.test_MF_Color):
2574     Corrected the thubancolor test.
2575    
2576     2004-06-15 Jan Schüngel <[email protected]>
2577    
2578 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
2579    
2580 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
2581    
2582     * libraries/thuban/cpl_mfile.h: Added copyright header.
2583    
2584     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
2585     Free Software License so that it is most useful with gdalwarp
2586     and bmpdataset.
2587    
2588 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
2589    
2590     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
2591     import of wxPython.wx itself (as opposed to the contents of
2592     wxPython.wx). For some reason wxPython.wx is available as
2593     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
2594     wrt. wxPython 2.4.
2595    
2596 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
2597    
2598     Initial version of new extension "umn_mapserver". This extension aims
2599     to manage configuration for the UMN MapServer application. This
2600     inital version just imports the .map-files and displays all, Thuban is
2601     capable of.
2602    
2603     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
2604    
2605     * Extensions/umn_mapserver/test/README: New. Describes how to run the
2606     tests.
2607    
2608     * Extensions/umn_mapserver/test/test.map: New. This is a test
2609     .map-file for automated tests of the umn_mapserver extension of
2610     Thuban.
2611    
2612     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
2613     UMN Mapserver classes.
2614    
2615     * Extensions/umn_mapserver/__init__.py: New. Init to make this
2616     directory a package.
2617    
2618     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
2619     '.map'-file objects.
2620    
2621     * Extensions/umn_mapserver/mf_import.py: New. This module extends
2622     Thuban with the possibility to handle UMN MapServer mapfiles.
2623    
2624 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
2625    
2626     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
2627     to a tuple before using it as arguments to the % operator. This
2628     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
2629     reported today on thuban-list by Jan Schüngel
2630    
2631     * test/test_layer.py (TestLayerModification.setUp): Save the
2632     filename as an instance variable so we can refer to it in tests
2633     (TestLayerModification.test_tree_info): Uncomment this method
2634     again and make it work. This tests for the formatting issue
2635     filed in RT#2239 on 2004-01-13
2636    
2637 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
2638    
2639     * Thuban/UI/baserenderer.py: Fix some typos.
2640    
2641 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
2642    
2643     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
2644     by increasing a field size.
2645    
2646 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
2647    
2648     Update to newest shapelib and get rid of Thuban specific
2649     extensions, i.e. use the new DBFUpdateHeader instead of our
2650     DBFCommit kludge
2651    
2652     * libraries/shapelib/shpopen.c: Update to version from current
2653     shapelib CVS.
2654    
2655     * libraries/shapelib/shapefil.h: Update to version from current
2656     shapelib CVS.
2657    
2658     * libraries/shapelib/dbfopen.c: Update to version from current
2659     shapelib CVS.
2660     (DBFCommit): Effectively removed since shapelib itself has
2661     DBFUpdateHeader now which is better for what DBFCommit wanted to
2662     achieve.
2663     We're now using an unmodified version of dbfopen.
2664    
2665     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
2666     value '1' to the Lib.dbflibc extension. This simply reflects the
2667     shapelib and pyshapelib updates
2668    
2669 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
2670    
2671     Finished introduction of Menu.FindOrInsertMenu.
2672    
2673     * Extensions/drawshape/drawshape.py: Add the command
2674     to the experimental menu additionally to the toolbar.
2675    
2676     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
2677     finding menu on its own.
2678    
2679     * Doc/manual/thuban-manual.xml: updated sample file
2680     to use FindOrInsertMenu().
2681    
2682     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
2683     instead of finding menu on its own.
2684    
2685 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
2686    
2687     * test/test_menu.py (MenuTest.test): Added testing
2688     of method Menu.FindOrInsertMenu.
2689    
2690 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
2691    
2692     Introduce and use Menu.FindOrInsertMenu.
2693    
2694     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
2695     given menu or, if not found, insert it.
2696    
2697     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
2698     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
2699     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
2700     menu on its own.
2701    
2702 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
2703    
2704     Introduce a abstract ColorDialog class and remove
2705     and outdated file.
2706    
2707     * Thuban/UI/proj4dialog.py: Removed. It is has been
2708     replaced by projdialog for quite a while and is not used
2709     anymore.
2710    
2711     * Thuban/UI/colordialog.py: New. Abstraction for color selection
2712     dialog(s).
2713    
2714     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
2715     Now calls the abstract ColorDialog instead of wxColourDialog.
2716     This also removed the dependency to Color class conversion
2717     from this function.
2718    
2719 frank 2197 2004-05-04 Frank Koormann <[email protected]>
2720    
2721     * Extensions/bboxdump/__init__.py: Fixed string left over from
2722     copying.
2723    
2724     * Extensions/bboxdump/bboxdump.py (bboxdump):
2725     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
2726     xrange(layer.NumShapes()). Compile the bboxmessage from a list
2727     of formatted outputs (string.join) instead of appending to the
2728     message. Two progress bar dialogs to report progress on the sometimes
2729     lenghty processing.
2730    
2731 frank 2196 2004-04-22 Frank Koormann <[email protected]>
2732    
2733     New Extension to dump bounding boxes of all shapes of the selected
2734     layer. An optional column can be specified to group the objects,
2735     in this case the bounding box is a union of the separate boxes.
2736     Dump can be displayed in a ScrolledMessageDialog or written to file.
2737     The Extension is simply a combination of available and well tested
2738     Thuban functionality.
2739    
2740     * Extensions/bboxdump/__init__.py: New: Init to make this
2741     directory a package.
2742    
2743     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
2744     all shapes of the selected layer.
2745    
2746 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
2747    
2748     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
2749     strings to be i18n now.
2750    
2751 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
2752    
2753     Changing popup menu of legend from direct building
2754     to using the Menu construction as used for the mainwindow.
2755    
2756     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
2757     layer_to_bottom, layer_visibility
2758     (MainWindow.LayerToTop): New. Put current layer to the top.
2759     (MainWindow.LayerToBottom): New. Put current layer to bottom.
2760     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
2761     Replace 1,0 by True, False.
2762     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
2763     current layer.
2764     (MainWindow.LayerShowTable): Removed raising of dialog.
2765     (_has_selected_layer_visible): New. Support function.
2766    
2767     * Thuban/UI/legend.py: ID_POP_xxx: removed.
2768     (LegendPanel.__init__): Removed EVT_MENU bindings.
2769     (LegendTree._OnRightClick): Replace direct creation of
2770     menu via wx Classes by applying the menu definition
2771     as of Menu class of menu.py.
2772    
2773 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
2774    
2775     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
2776     button string to stronger clearify that Thuban will be closed when hitting
2777     the button.
2778    
2779     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
2780     Now for layers without a ShapeStore a corresponding message is given
2781     to the user, that this layer has no table to show.
2782    
2783 joey 2182 2004-04-15 Martin Schulze <[email protected]>
2784    
2785     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
2786     recalculate the format for the internal render engine as well.
2787    
2788     * Extensions/wms/properties.py (wmsProperties): First start for a
2789     properties dialog. It's functional for a first selection of
2790     layers, but still has some weired wxWidgets/GTK problems but
2791     beautification can be done later.
2792    
2793     * Extensions/wms/layer.py: Added more documentation
2794     (WMSLayer.getFormats): New: Return list of supported image formats
2795     by the WMS server
2796     (WMSLayer.getLayers): New: Return the list of layer names
2797     supported by the WMS server
2798     (WMSLayer.getLayerTitle): New: Return the title of the named layer
2799     (WMSLayer.getWMSFormat): New: Return the image format that is used
2800     for WMS GetMap requests
2801     (WMSLayer.setWMSFormat): New: Set the image format that is used
2802     for WMS GetMap requests
2803     (WMSLayer.__init__): Move away from using only one layer to using
2804     a list of layers (unsorted at the moment, though).
2805     (WMSLayer.getVisibleLayers): New: Return the list of names for all
2806     visible layers
2807     (WMSLayer.setVisibleLayers): New: Set the list of names for all
2808     visible layers
2809    
2810     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
2811     order to establish a clean structure.
2812    
2813     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
2814     own in order to establish a clean structure.
2815    
2816 joey 2174 2004-04-13 Martin Schulze <[email protected]>
2817    
2818     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
2819     support for oldstyle (WMS 1.0 apparently) image format
2820     specification.
2821    
2822     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
2823     supported graphic formats back to JPEG and BMP, PNG and others are
2824     too *cough* experimental... Sorry, I meant to filter this out
2825     before I committed this part. This should make the WMS extension
2826     run from CVS again.
2827     (wms_dialog): Reset an empty URL to None so that the subsequent
2828     program can depend on this, since the dialog will indeed return an
2829     empty URL, causing another declaration of love by Python.
2830    
2831     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
2832     Whenever a native BoundingBox request cannot be fulfilled, check
2833     whether the requested SRS is EPSG:3426, in which case return the
2834     LatLonBoundingBox values.
2835    
2836     * Extensions/wms/test/test_parser.py
2837     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
2838     ignoring AUTO:* SRS.
2839     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
2840     Added another test method to test whether the LatLonBoundingBox
2841     values will be returned if BoundingBox values are requested with
2842     SRS set to EPSG:3426.
2843    
2844     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
2845     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
2846     the moment by placing them into a variable which is currently
2847     unused. Also test whether the EPSG SRS is numerical as it should
2848     be and add an error message if it is not.
2849    
2850     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
2851     appear in the real world as well. Since we cannot handle them yet
2852     (OGCLib can't either), we will ignore them for the moment.
2853    
2854     * Extensions/wms/parser.py: Use a variable for denoting the sample
2855     filename
2856     (WMSCapabilitiesParser.peekLayers): Added support for error
2857     messages during grok(). They will be aggregated in an array and
2858     may be displayed later. We may have to add a classification
2859     "Warning" and "Error" to this. That requires more experience,
2860     though, since not every error may be lethal.
2861    
2862     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
2863     ShowTable() dialog/frame when the user attempts to display it
2864     while it has been opened before already and not closed again.
2865    
2866 joey 2161 2004-04-11 Martin Schulze <[email protected]>
2867    
2868     * Extensions/wms/infodialog.py: Adjusted the class documentation
2869    
2870     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
2871     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
2872     wxWidgets variants.
2873     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
2874    
2875     * Extensions/wms/infodialog.py: Added an information dialog that
2876     will display various information about the WMS current resource,
2877     so that additional information such as the title, the abstract,
2878     fees and access constraints can be displayed for the user if they
2879     are documented in the WMS XML.
2880    
2881 joey 2156 2004-04-10 Martin Schulze <[email protected]>
2882    
2883     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
2884     string handling. It's "foo".lower() and not lower(foo) without
2885     lower imported from strings or something.
2886    
2887     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
2888     from capabilities.py and parser.py. Implement priority list for
2889     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
2890     and GIF are supported here, but not yet by main Thuban. Hence,
2891     support for them may be removed later. Special contribution to
2892     usability: get wxWidgets to change the cursor when we're waiting
2893     for data from the network so the user won't start to worry. This
2894     causes a redrawing error/warning, though.
2895    
2896     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
2897     the DOM object.
2898    
2899     2004-04-01 Martin Schulze <[email protected]>
2900    
2901     * Extensions/wms/capabilities.py: Adjusted documentation
2902     (WMSCapabilities.__init__): Improved documentation, fixed syntax
2903     (WMSCapabilities.saveCapabilities): Only catch IOError when
2904     handling files
2905     (WMSCapabilities.loadCapabilities): Only catch IOError when
2906     handling files
2907     __main__: corrected variable naming
2908     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
2909     class a specialisation of WMSCapabilitiesParser as well. Also
2910     execute grok() after loading or fetching capabilities, if that
2911     went well, so that subsequent calls can already access the data.
2912     (WMSCapabilities.getVersion): Export the used version of the
2913     GetCapabilities request, so we can use it for subsequent calls,
2914     i.e. for GetMap requests.
2915     (WMSCapabilities.fetchCapabilities): Added proper error handling
2916     when the GetCapabilities request failed, so that the surrounding
2917     program can act accordingly.
2918    
2919 joey 2146 2004-03-30 Martin Schulze <[email protected]>
2920    
2921     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
2922     Adjusted the getLayerSRS method to return the list of SRSes
2923     extracted from <SRS> elements instead of <BoundingBox> elements.
2924     Added a bit of documentation as well.
2925     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
2926     since it was only implemented due to a misunderstanding.
2927    
2928     * Extensions/wms/test/test_parser.py
2929     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
2930     reflect the corrected interpretation of the standard: i.e. a layer
2931     does not have to define a BoundingBox for all SRSes it supports.
2932     Hence the <SRS></SRS> specification is authoritative, not the list
2933     of BoundingBoxes.
2934     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
2935     to ensure None is returned for a non-existing SRS.
2936     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
2937     since it is not applicable anymore. Listing more SRSes in <SRS>
2938     elements is valid according to the specs.
2939    
2940 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
2941 joey 2146
2942 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
2943     Reflected wxWidgets name change.
2944    
2945     * Thuban/UI/about.py: Extended copyright to 2004 and added
2946     information about the thuban-devel mailinglist.
2947    
2948 joey 2138 2004-03-24 Martin Schulze <[email protected]>
2949 joey 2120
2950 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
2951     'WMS', also added a linebreak where required
2952    
2953     * Extensions/wms/parser.py: Finally added the XML parser for the
2954     GetCapabilities response.
2955    
2956     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
2957     <SRS> elements match the <BoundingBox> elements, except for the
2958     layer 'beschriftung'.
2959    
2960     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
2961     since Python uses unicode strings internally, otherwise
2962     comparisons will fail. Removed tests for getLayerBBoxSRS() since
2963     the SRS will be calculated anyway and this method is obsoleted by
2964     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
2965     Move loading the sample file into the setUp method. Added a test
2966     for finding the integrity problem in the sample response.
2967     Improved formatting.
2968    
2969     * Extensions/wms/domutils.py: Added convenience routines for
2970     handling of Document Object Model (DOM) nodes.
2971    
2972     * Extensions/wms/test/test_domutils.py: Added a test for the
2973     domutils module
2974    
2975     2004-03-19 Martin Schulze <[email protected]>
2976    
2977 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
2978     Moved path detection and adding into a module of its own,
2979     adjustpath, which exports thubandir as main Thuban directory.
2980    
2981     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
2982     detection and adding into a module of its own, adjustpath, which
2983     exports thubandir as main Thuban directory. Reorganised the
2984     module in order to support the SkipTest feature for Thuban test
2985     cases.
2986    
2987     * Extensions/wms/test/adjustpath.py: Moved path detection and
2988     adding into a module of its own.
2989    
2990 joey 2115 2004-03-18 Martin Schulze <[email protected]>
2991    
2992     * Extensions/wms/test/test_parser.py: Added another test for
2993     checking whether the WMS XML parser (to be implemented) returns
2994     the information we expect. This requires a sample WMS WML file
2995     (sample.xml) which has been extracted from the frida server and
2996     "improved" manually.
2997    
2998     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
2999     main Thuban directory to the path in order to be able to import
3000     random modules. Adjusted the PyOGCLib detection to reuse the
3001     information gathered. Also added a note about the PYTHONPATH
3002     environment variable.
3003    
3004     * Extensions/wms/test/test_ogclib.py: The format specification is
3005     a mime-type, not a graphic format, hence image/jpeg wou ld be the
3006     proper format and not JPEG. We'll also have to take care of the
3007     encoding of / as %2F.
3008    
3009 joey 2111 2004-03-16 Martin Schulze <[email protected]>
3010    
3011     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
3012     comprehensive test for the getMapURL method, built compare URLs
3013     according to the documentation in OGC 01-068r3
3014    
3015     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
3016     class WMSCapabilities to manage capabilites, will incorporate
3017     parsing the capabilities response and provide details for other
3018     classes.
3019    
3020 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
3021    
3022 bh 2107 Support views in addition to normal tables in the postgis
3023     shapestore
3024    
3025     * Thuban/Model/postgisdb.py
3026     (PostGISShapeStore._fetch_table_information): Add a fallback for
3027     the case where the table name is not in the geometry_columns
3028     table. This is usually the case for views. Also, set
3029     self.shapestore here.
3030     (PostGISShapeStore.ShapeType): No need to query the database all
3031     the time. The shape type is now determined in
3032     _fetch_table_information
3033    
3034     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
3035     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
3036     New parameter to specify views.
3037     (PostGISDatabase.has_data): Also compare the views. New views
3038     parameter
3039     (PostGISDatabase.initdb): Create the views.
3040     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
3041     view
3042    
3043     * test/test_postgis_db.py
3044     (TestPostGISShapestorePointFromViews): New. Test a
3045     PostGISShapeStore with a view
3046     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
3047     the geometry_column explicitly to test whether that works
3048    
3049     2004-03-12 Bernhard Herzog <[email protected]>
3050    
3051 bh 2105 Final step for explicit id/geometry columns: Loading and saving
3052    
3053     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
3054     with the following changes:
3055     (dbshapesource): Two new attributes id_column and geometry_column
3056    
3057     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
3058     (SessionSaver.write_session): Use the new namespace
3059     (SessionSaver.write_data_containers): Write the new dbshapesource
3060     parameters
3061    
3062     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
3063     the new file format version
3064     (SessionLoader.start_dbshapesource): Handle the new db parameters
3065    
3066     * test/test_save.py: Update to the new dtd and namespace
3067     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
3068     mock object to provide a working IDColumn method.
3069    
3070     * test/test_load_1_0.py: New. Copy of the test_load.py before
3071     today's changes but with the round-trip tests removed.
3072    
3073     * test/test_load_0_9.py: Update doc-string.
3074    
3075     * test/test_load.py: Update all .thuban files to the new dtd and
3076     namespace.
3077     (TestPostGISLayer.file_contents): Add the new dbshapesource
3078     paramters
3079    
3080 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
3081    
3082 bh 2103 Next step for explicit id/geometry columns: User interaction
3083    
3084     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
3085     the dialog is constructed. Add combo boxes to select id and
3086     geometry column. Rename some instance variables.
3087     (ChooseDBTableDialog.GetTable): Return id and geometry column
3088     names
3089     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
3090     selections in the table list
3091    
3092     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
3093     and geometry_column
3094    
3095     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
3096     parameters for id_column and geometry column of PostGISShapeStore
3097     here as well.
3098    
3099     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
3100     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
3101     (PostGISConnection.GeometryTables): Use a better query to
3102     determine which relations in the database might be usable for
3103     shapestores. Now supports views as well but is more PostgreSQL
3104     specific
3105     (PostGISConnection.table_columns): New. Somewhat experimental
3106     method to let the db dialogs provide lists of columns to users so
3107     that they can select id and geometry columns.
3108     (PostGISTable.__init__): The default value of the id_column
3109     parameter is now None it still means "gid" effectively, though.
3110     (PostGISTable.IDColumn): New introspection method to return a
3111     column object for the id column
3112     (PostGISShapeStore.GeometryColumn): New introspection method to
3113     return a column object for the geometry column
3114    
3115     * test/test_postgis_db.py
3116     (TestPostGISConnection.test_gis_tables_non_empty):
3117     Removed. Subsumed by the new:
3118     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
3119     New. Tes the GeometryTables and table_columns methods with actual
3120     tables and views.
3121     (PointTests.test_id_column, PointTests.test_geometry_column):
3122     New. tests for the new methods.
3123     (TestPostGISShapestorePoint.setUp)
3124     (TestPostGISShapestorePointSRID.setUp)
3125     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
3126     instance variables needed by the new tests
3127    
3128     2004-03-11 Bernhard Herzog <[email protected]>
3129    
3130 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
3131     numbers given to ReadValue are ordinals.
3132    
3133     2004-03-11 Bernhard Herzog <[email protected]>
3134    
3135     Elimiate the requirement for PostGIS tables to have a column
3136     called "gid".
3137    
3138     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
3139     id_column to specify which column to use to identify rows. Also
3140     new instance variables id_column and quoted_id_column
3141     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
3142     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
3143     (PostGISTable.SimpleQuery): Use the id column name provided to the
3144     constructor instead of "gid"
3145     (PostGISShapeStore.__init__): New parameter id_column analogously
3146     to PostGISTable.__init__. This parameter is simply passed through
3147     to the base class constructor
3148     (PostGISShapeStore._create_col_from_description): Fix typo in
3149     doc-string
3150     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
3151     (PostGISShapeStore.ShapesInRegion): Use the id column name
3152     provided to the constructor instead of "gid"
3153    
3154     * test/postgissupport.py
3155     (PostgreSQLServer.get_default_static_data_db): New static table
3156     landmarks_point_id with an id column != "gid. Update the comments
3157     a bit.
3158     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
3159     doc-
3160     (upload_shapefile): New parameter gid_column to use a name other
3161     than "gid" for the column to store the shape ids
3162    
3163     * test/test_postgis_db.py (TableTests): New. Mixin-class
3164     containing all tests previously in TestPostGISTable. The actual
3165     tests are the same but the code is a bit more configurable to
3166     allow for different id columns etc.
3167     (TestPostGISTable): Derive from TableTests now for the actual
3168     tests.
3169     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
3170     except that it the landmarks_point_id table to test the id_column
3171     parameter
3172     (PointTests): Extend the doc-string
3173     (TestPostGISShapestorePointExplicitGIDColumn)
3174     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
3175     from PointTests to test the explicit id_column parameter. One
3176     tests with the name of the column holding the shape ids, the other
3177     uses PostgreSQL's OID column. For the latter a number of methods
3178     have to be overwritten to make them independent of the actual id
3179     values.
3180    
3181 silke 2095 2004-03-08 Silke Reimer <[email protected]>
3182    
3183     Update debian directory:
3184    
3185     * debian/changelog: Added new version.
3186     * deiban/rules: Updated management of patches (with cbds)
3187     * debian/control: Added cbds to dependencies
3188     * debian/patches/*: New. Adds better support for patches of thuban in
3189     debian
3190     * debian/menu: Syntax of menu changed slightly
3191     * debian/setup.py.patch: removed because it has been moved to
3192     debian/patechs/setup.py.patch
3193    
3194    
3195 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
3196    
3197     Create the Doc/technotes directory for text files with information
3198     for developers
3199    
3200     * Doc/technotes/README: New. README for the technotes
3201    
3202     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
3203     Thuban
3204    
3205     * Doc/technotes/release_process.txt: New. Used to be
3206     HOWTO-Release. Now slightly adapted to technote formatting style.
3207    
3208     * HOWTO-Release: Removed. It's contents are now in
3209     Doc/technotes/release_process.txt
3210    
3211 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
3212    
3213     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
3214     version of wxWindows the module was compiled with so we can check
3215     that against the wxPython version.
3216    
3217     * Thuban/version.py (thuban_branch, thuban_release): New variables
3218     controlling which and how Thuban versions are shown. See the
3219     comments for details.
3220     (verify_versions): Also check that the wx version that wxproj is
3221     compiled against matches that of the wxPython we use at runtime
3222    
3223 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
3224    
3225 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
3226     get_system_proj_file to read the epsg projections. The old way
3227     depended on the current directory being the top Thuban directory.
3228    
3229     2004-02-20 Bernhard Herzog <[email protected]>
3230    
3231 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
3232     (TestVirtualDC.test_clippath): Remove a debug print
3233    
3234     2004-02-20 Bernhard Herzog <[email protected]>
3235    
3236 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
3237     Extensions/svgexport into a package.
3238    
3239     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
3240     doc-string a bit. The doc-string must come first, otherwise it's
3241     not a doc-string. The __future__ import must be the first thing
3242     after the doc-string. Use only double quotes in doc-strings.
3243     Single quotes trip up emacs syntax highlighting if the text
3244     contains apostrophes.
3245    
3246     2004-02-20 Bernhard Herzog <[email protected]>
3247    
3248 bh 2080 * Extensions/svgexport/test/__init__.py,
3249     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
3250     suite for svgexport
3251    
3252     * test/runtests.py (find_test_modules): New. Function with the
3253     module finding code from main.
3254     (main): Use find_test_modules to figure out the default test
3255     modules and take modules from Extensions.svgexport.test too.
3256    
3257 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
3258    
3259 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
3260     the mainwindow has a reference to the map of the initial session.
3261     This fixes a bug introduced with the fix for RT#2245
3262    
3263     2004-02-19 Bernhard Herzog <[email protected]>
3264    
3265 bh 2075 * Extensions/svgexport/svgsaver.py,
3266     Extensions/svgexport/svgmapwriter.py,
3267     Extensions/svgexport/maplegend.py: Added again. This time in the
3268     correct place.
3269    
3270 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
3271    
3272 bh 2073 Fix for RT#2245
3273    
3274     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
3275     instance variables before trying to create any windows. Creating
3276     windows can start an event loop if e.g. message boxes are popped
3277     up for some reason, and event handlers, especially EVT_UPDATE_UI
3278     may want to access things from the application.
3279     (ThubanApplication.maps_changed): The mainwindow may not have been
3280     created yet, so check whether it has been created before calling
3281     its methods
3282    
3283     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
3284     have a map
3285    
3286     2004-02-17 Bernhard Herzog <[email protected]>
3287    
3288 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
3289     Extensions/svgmapwriter.py, Extensions/maplegend.py,
3290     extensions/svgexport/svgsaver.py,
3291     extensions/svgexport/svgmapwriter.py,
3292     extensions/svgexport/maplegend.py: Removed. These files were in
3293     the wrong places or didn't work at all.
3294    
3295 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
3296    
3297 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
3298     line
3299    
3300     2004-02-16 Bernhard Herzog <[email protected]>
3301    
3302 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
3303    
3304 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
3305    
3306     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
3307     to write a session to a file in SVG format.
3308     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
3309     to write a SVG map of a session.
3310     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
3311     in SVG format for the current session.
3312    
3313 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
3314    
3315     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
3316     can't be created, return immediately after displaying the error
3317     message.
3318    
3319 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
3320    
3321     Handle postgis tables with more than one geometry column.
3322    
3323     * Thuban/Model/postgisdb.py
3324     (PostGISTable._fetch_table_information): Delegate the creation of
3325     column objects to a different method so that we can extend that in
3326     derived classes
3327     (PostGISTable._create_col_from_description): New. Column object
3328     creation part of _fetch_table_information
3329     (PostGISShapeStore._create_col_from_description): New. Extend
3330     inherited method to handle geometry columns
3331     (PostGISShapeStore.__init__): New parameter geometry_column to
3332     specify which geometry column to use. Optional but mandatory for
3333     tables with more than one geometry column
3334     (PostGISShapeStore._fetch_table_information): Also use the name of
3335     the geometry column when looking for the srid
3336     (PostGISShapeStore.ShapeType): Also use the name of the geometry
3337     column when looking for the shape type
3338    
3339     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
3340     NonConnectionStore to changes in the PostGISShapeStore
3341    
3342     * test/test_postgis_db.py
3343     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
3344     PostGISShapeStore with tables having two geometry columns.
3345    
3346 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
3347    
3348     Fix some postgis problems. What remains to be done is real
3349     handling of SRIDs as they affect how reprojection is done
3350    
3351     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
3352     doc-string
3353     (PostGISShapeStore._fetch_table_information): New. Extend
3354     inherited method to retrieve srid
3355     (PostGISShapeStore.BoundingBox): Handle tables without data.
3356     extent yields NULL for those
3357     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
3358    
3359     * test/test_postgis_db.py
3360     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
3361     for the special case of a table without any data
3362     (TestPostGISShapestorePointSRID): New class with tests for a table
3363     that uses srids
3364     (PolygonTests): Fix a doc-string typo
3365    
3366     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
3367     reference_systems with a specification of spacial reference
3368     systems to create in the new db.
3369     (PostgreSQLServer.new_postgis_db)
3370     (PostgreSQLServer.get_static_data_db): New parameter
3371     reference_systems to be passed through ultimately to
3372     PostGISDatabase. In new_postgis_db also check whether an existing
3373     db already has the right srids
3374     (PostgreSQLServer.get_default_static_data_db): Add srids and a
3375     table that uses srids
3376     (PostGISDatabase.initdb): Create the entries for the reference
3377     systems
3378     (PostGISDatabase.has_data): Add reference_systems parameter to
3379     check for those too
3380     (upload_shapefile): New parameter srid to create tables with a
3381     specific srid
3382    
3383 frank 2055 2004-02-06 Frank Koormann <[email protected]>
3384    
3385     * po/pt_BR.po: Fixed charset
3386    
3387 frank 2054 2004-02-05 Frank Koormann <[email protected]>
3388    
3389     * po/pt_BR.po: Fixed format string for error message, missing %s
3390     added (Thuban/UI/application.py:273)
3391    
3392 frank 2053 2004-02-03 Frank Koormann <[email protected]>
3393    
3394     First version of Portuguese (Brazilian) translation
3395    
3396     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
3397     Brazilian Portuguese by Eduardo Patto Kanegae.
3398    
3399     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
3400     translators.
3401    
3402    
3403 frank 2052 2004-01-22 Frank Koormann <[email protected]>
3404    
3405     * Doc/manual/thuban-manual.xml: Added section on installation of
3406     Thuban under Win32 systems. Fixed image path references in the postgis
3407     section. Some minor source formattings.
3408    
3409 frank 2051 2004-01-21 Frank Koormann <[email protected]>
3410    
3411     Make Thuban remember path selections (at least for one application run).
3412    
3413     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
3414     attribute of application object. Path is a dictionary of
3415     strings, currently with the items "data" and "projection".
3416     (Application.SetPath): New, stores path for the specified item.
3417     (Application.Path): New, return path for the specified item.
3418    
3419     * Thuban/UI/mainwindow.py
3420     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
3421     MainWindow.AddLayer, MainWindow.AddRasterLayer,
3422     MainWindow.TableOpen): Access "data" path information of the
3423     application.
3424    
3425     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
3426     Access "projection" path information of the application.
3427    
3428 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
3429    
3430 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
3431    
3432     2004-01-05 Bernhard Herzog <[email protected]>
3433    
3434 bh 2048 * po/Makefile, po/README: Move the description of how to generate
3435     the translation statistics to the README.
3436    
3437 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
3438    
3439 bh 2045 * NEWS: Update for 1.0.0
3440    
3441     * po/it.po: Another update from Maurizio Napolitano
3442    
3443     2003-12-23 Bernhard Herzog <[email protected]>
3444    
3445 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
3446    
3447     2003-12-23 Bernhard Herzog <[email protected]>
3448    
3449     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
3450     for translation
3451    
3452     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
3453     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
3454     strings for translation
3455    
3456     * po/de.po: Update with the newly marked strings.
3457    
3458 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
3459    
3460 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
3461     updated
3462    
3463     2003-12-22 Bernhard Herzog <[email protected]>
3464    
3465 bh 2037 * setup.py (setup call): 1.0.0, yeah!
3466    
3467     * Thuban/version.py (longversion): 1.0.0, yeah!
3468    
3469     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3470     1.0.0 namespace too
3471    
3472     * Thuban/Model/save.py (SessionSaver.write_session): Save with
3473     1.0.0 namespace
3474    
3475     * test/test_load.py (LoadSessionTest.dtd)
3476     (TestSingleLayer.file_contents)
3477     (TestNonAsciiColumnName.file_contents)
3478     (TestLayerVisibility.file_contents)
3479     (TestClassification.file_contents, TestLabels.file_contents)
3480     (TestLayerProjection.file_contents)
3481     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3482     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
3483     (TestPostGISLayerPassword.file_contents)
3484     (TestLoadError.file_contents, TestLoadError.test): Update for
3485     1.0.0 namespace
3486    
3487     * test/test_save.py (SaveSessionTest.dtd)
3488     (SaveSessionTest.testEmptySession)
3489     (SaveSessionTest.testSingleLayer)
3490     (SaveSessionTest.testLayerProjection)
3491     (SaveSessionTest.testRasterLayer)
3492     (SaveSessionTest.testClassifiedLayer)
3493     (SaveSessionTest.test_dbf_table)
3494     (SaveSessionTest.test_joined_table)
3495     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
3496    
3497     2003-12-22 Bernhard Herzog <[email protected]>
3498    
3499 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
3500     alignment flags are byte strings not unicode and that they have
3501     valid values
3502    
3503     * test/test_load.py (TestLabelLayer): New. Test loading (and
3504     indirectly saving) of maps with labels.
3505    
3506     2003-12-22 Bernhard Herzog <[email protected]>
3507    
3508 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
3509     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
3510     unsubscribe all subscribers.
3511     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
3512     self.grid since it may already have been destroyed.
3513     Fixes RT #2256
3514    
3515 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
3516    
3517     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3518    
3519 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
3520 silke 2029
3521     * debian/bitmappath.patch, debian/setup.py.patch:
3522     added to ensure compliance with FHS for debian
3523     * debian/rules, debian/changelog:
3524     added patches in rules to ensure compliance with FHS for debian
3525 bh 2028
3526 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
3527    
3528 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
3529     statistics about the translations. Add a comment how produce even
3530     nicer statistics with sed.
3531    
3532 frank 2026 2003-12-09 Frank Koormann <[email protected]>
3533    
3534     * Resources/Projections/defaults.proj:
3535     French projection sample with correct accents (UNICODE).
3536    
3537 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
3538    
3539     * MANIFEST.in: Add the devtools directory
3540    
3541     * setup.py (setup call): Use license instead of licence. This
3542     silences a deprecation warning on Python 2.3
3543    
3544 frank 2022 2003-12-05 Frank Koormann <[email protected]>
3545    
3546 frank 2023 Documentation synced with 1.0rc1
3547    
3548     * Doc/manual/thuban-manual.xml:
3549     Minor formatting changes and references to database layers .
3550     Introduction.Internationalization: New section on i18n.
3551     MapManagement.AddingandRemovingLayers: Added item on database layers.
3552     MapManagement.TheLegend: Added section and screenshot on popup menu.
3553     ProjectionManagement: Updated screenshot and sentence on EPSG.
3554     Appendix.SupportedDataSources: Added PostGIS.
3555     Appendix.WorkingwithPostGIS: New section.
3556    
3557     * Doc/manual/images/6_projection.png: Updated screenshot including
3558     EPSG checkboxes.
3559    
3560     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
3561    
3562     * Doc/manual/images/app_postgis_add_layer.png,
3563     Doc/manual/images/app_postgis_db_add.png,
3564     Doc/manual/images/app_postgis_db_management.png:
3565     New screenshots focussing on database layers
3566    
3567     2003-12-05 Frank Koormann <[email protected]>
3568    
3569 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
3570     write warning to stderr instead of rising a warning dialog
3571    
3572 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
3573    
3574 bh 2021 Fix for RT #2243
3575    
3576 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
3577     New. Like has_selected_layer but for shape layers only
3578     (_has_selected_shape_layer): New. Like _has_selected_layer but for
3579     shape layers only
3580     (layer_show_table command, layer_jointable command): Use these
3581     commands should only be available for shape layers
3582    
3583     2003-12-03 Bernhard Herzog <[email protected]>
3584    
3585 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
3586     publishers that are wx objects and may have been destroyed by wx
3587     already. Fixes RT #2242.
3588    
3589     2003-12-03 Bernhard Herzog <[email protected]>
3590    
3591 bh 2016 * po/ru.po: Updates from Alex Shevlakov
3592    
3593 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
3594    
3595     * debian/control, debian/changelog: Added gdal-support to
3596     debian package, updated to new thuban version
3597    
3598    
3599 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
3600    
3601     * Thuban/Lib/version.py: New. Module for version number
3602     manipulations. The version of make_tuple here also deals better
3603     with more unusual version number strings, such as e.g.
3604     "1.2+cvs20031111"
3605    
3606     * Thuban/version.py (make_tuple): Removed. It's now in
3607     Thuban.Lib.version. Use that implementation instead.
3608    
3609     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
3610    
3611 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
3612    
3613 bh 2010 * MANIFEST.in: Add debian files
3614    
3615 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
3616     they're installed too
3617     (data_files): Add READMEs and sample data from some Extensions
3618    
3619     * NEWS: Add note about the extensions in binary packages
3620    
3621     2003-12-02 Bernhard Herzog <[email protected]>
3622    
3623 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
3624     with the thuban-1.0rc1
3625    
3626     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
3627     thuban-1.0rc1 namespace too
3628    
3629     * test/test_save.py (SaveSessionTest.dtd)
3630     (SaveSessionTest.testEmptySession)
3631     (SaveSessionTest.testSingleLayer)
3632     (SaveSessionTest.testLayerProjection)
3633     (SaveSessionTest.testRasterLayer)
3634     (SaveSessionTest.testClassifiedLayer)
3635     (SaveSessionTest.test_dbf_table)
3636     (SaveSessionTest.test_joined_table)
3637     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
3638     namespace
3639    
3640     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
3641     namespace
3642     (TestSingleLayer.file_contents)
3643     (TestNonAsciiColumnName.file_contents)
3644     (TestLayerVisibility.file_contents)
3645     (TestClassification.file_contents, TestLabels.file_contents)
3646     (TestLayerProjection.file_contents)
3647     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3648     (TestPostGISLayer.file_contents)
3649     (TestPostGISLayerPassword.file_contents)
3650     (TestLoadError.file_contents, TestLoadError.test): Update to
3651     thuban-1.0rc1 namespace
3652    
3653 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
3654    
3655 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
3656     nt to better match Intevation's current w32 setup
3657    
3658 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
3659    
3660     * MANIFEST.in: Add the Extensions
3661    
3662 bh 1998 * NEWS: Update for 1.0rc1
3663    
3664     2003-12-01 Bernhard Herzog <[email protected]>
3665    
3666 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
3667     cards for the dialog so that shapefiles ending in all uppercase
3668     SHP are listed too
3669    
3670 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
3671    
3672 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
3673    
3674     * setup.py (setup call): Update version to 1.0rc1. Use the
3675     [email protected] email address as author email instead of my
3676     personal one.
3677    
3678     2003-11-28 Bernhard Herzog <[email protected]>
3679    
3680 bh 1992 * po/de.po: Update german translation.
3681    
3682     2003-11-28 Bernhard Herzog <[email protected]>
3683    
3684 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
3685     files are more platform independend
3686    
3687     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
3688     that they can be used on both windows and unix
3689     (SessionSaver.prepare_filename): New. Handle all filename
3690     transformations for filenames stored in the thuban file
3691     (SessionSaver.write_data_containers, SessionSaver.write_layer):
3692     Use prepare_filename
3693    
3694     * test/test_save.py (SaveSessionTest.testSingleLayer)
3695     (SaveSessionTest.testLayerProjection)
3696     (SaveSessionTest.testRasterLayer)
3697     (SaveSessionTest.testClassifiedLayer)
3698     (SaveSessionTest.test_dbf_table)
3699     (SaveSessionTest.test_joined_table): Filenames are always stored
3700     with slashes on all currently supported platforms so adapt all
3701     tests to this
3702    
3703     * test/test_load.py (LoadSessionTest.filenames): With the new
3704     filename scheme the filenames in the tests should be
3705     understandable on all currently supported platforms so we turn
3706     this into an empty list because we don't have to normalize them
3707     anymore
3708    
3709     2003-11-28 Bernhard Herzog <[email protected]>
3710    
3711 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
3712     Add the ellipsoid to the projection since some Proj versions
3713     complain if it's missing.
3714    
3715 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
3716    
3717     Corect some bounding box projection problems
3718    
3719     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
3720     version of ForwardBBox
3721     (Projection._transform_bbox): New. common implementation of
3722     ForwardBBox and InverseBBox
3723     (Projection.ForwardBBox): Use _transform_bbox.
3724    
3725     * test/test_proj.py (TestProjection.test): Add test for
3726     InverseBBox
3727    
3728     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
3729     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
3730     new InverseBBox method to determine the unprojected bounding box
3731     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
3732     bbox.
3733    
3734     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3735     Removed.
3736     (TestLayer.test_arc_layer_with_projection): New. This test is
3737     better able to test whether bounding boxes are projected correctly
3738     than test_point_layer_with_projection
3739    
3740 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
3741     InverseBBox to unproject bboxes
3742    
3743 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
3744    
3745 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
3746     source code.
3747    
3748     2003-11-25 Bernhard Herzog <[email protected]>
3749    
3750 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
3751     there for backwards compatibility and all code relying on that
3752     should have been updated by now.
3753    
3754     2003-11-25 Bernhard Herzog <[email protected]>
3755    
3756 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
3757     round trip test.
3758     (TestClassification.file_contents): Update to the newest file
3759     format
3760    
3761     2003-11-25 Bernhard Herzog <[email protected]>
3762    
3763 bh 1975 Add very experimental (and possibly dangerous) extension to draw
3764     polygons:
3765    
3766     * Extensions/drawshape/README: New. Brief installation
3767     instructions
3768    
3769     * Extensions/drawshape/drawshape.py: New. Implementation of the
3770     drawshape extensions
3771    
3772     * Extensions/drawshape/patch.diff: Patch to apply before the
3773     extension can be used.
3774    
3775 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
3776    
3777 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
3778     (ShapefileStore.__init__): Factor opening the shapefile into a
3779     separate method (the new _open_shapefile). This makes the code a
3780     bit more readable but the real reason is that it makes some evil
3781     hacks easier. :-)
3782    
3783     2003-11-24 Bernhard Herzog <[email protected]>
3784    
3785 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
3786     converter is specified for an attribute assume it's a string
3787     containing only Latin1 characters. Update doc-string accordingly.
3788     This change should fix many places where unicode objects might
3789     accidentally enter Thuban.
3790    
3791     * test/test_load.py (TestNonAsciiColumnName): New test to check
3792     what happens with column names in DBF files that contain non-ascii
3793     characters
3794    
3795 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
3796    
3797     Enable the experimental attribute editing again and introduce a
3798     command line switch to actually activate it
3799    
3800     * Thuban/UI/main.py (options): New. Container for options set on
3801     the commmand line
3802     (main): Add the --enable-attribute-editing flag.
3803    
3804     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
3805     editing is enabled use the grid ctrl which allows editing of the
3806     values
3807    
3808     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
3809     New. Just delegate this to the underlying table.
3810    
3811 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
3812    
3813     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
3814     Skip this test if run under non-posix systems since it only works
3815     there
3816    
3817 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
3818    
3819 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
3820     determined so that we can give a reason in the about why gdal is
3821     not supported.
3822     (gdal_support_status): New. Variable holding a string with the
3823     reason for no gdal support
3824    
3825     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
3826     not supported to the message
3827    
3828     2003-11-19 Bernhard Herzog <[email protected]>
3829    
3830 bh 1963 Remove the old table interface and its test cases
3831    
3832     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
3833     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
3834     anymore
3835    
3836     * Thuban/Model/transientdb.py (TransientTableBase)
3837     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
3838     anymore
3839    
3840     * test/test_table.py: Removed since the old interface it tests is
3841     gone.
3842    
3843     * test/runtests.py (main): The old table interface is gone and
3844     with it the deprecation warnings so remove the code that turns
3845     these warnings into errors
3846    
3847     2003-11-19 Bernhard Herzog <[email protected]>
3848    
3849 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
3850     tests to use the new table interface is completely wrong since the
3851     whole purpose of the tests in this module is to test the old
3852     interface.
3853    
3854 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
3855    
3856 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
3857     New. Test whether the connection matches a set of connection
3858     parameters
3859    
3860     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
3861     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
3862     for existing connections with the same parameters and break out of
3863     the loop correctly.
3864    
3865     * test/test_postgis_db.py (TestBriefDescription)
3866     (TestPostGISSimple.test_brief_description): Rename
3867     TestBriefDescription to TestPostGISSimple and the test method to
3868     test_brief_description so that we can add more test methods.
3869     (TestPostGISSimple.test_matches_parameters): New. Test the new
3870     MatchesParameters method
3871    
3872     2003-11-18 Bernhard Herzog <[email protected]>
3873    
3874 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
3875 bh 1954 _was_destroyed, to indicate whether an publisher instance has
3876     already been destroyed.
3877     (Publisher.Unsubscribe): Only disconnect if the publisher has not
3878     been destroyed yet.
3879     (Publisher.Destroy): Set the _was_destroyed flag to true.
3880    
3881     * test/test_connector.py
3882     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
3883     calling Unsubscribe after Destroy doesn't raise an exception
3884    
3885 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
3886    
3887     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
3888     typo in doc-string
3889    
3890 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
3891    
3892     Quote table and column names properly for postgis.
3893    
3894     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
3895     quote an identifier for use in an sql statement
3896     (PostGISColumn.__init__): Add the quoted_name attribute
3897     (PostGISTable.__init__): New instance variable quoted_tablename
3898     (PostGISTable._fetch_table_information): Use the quoted table
3899     name. New isntance variable quoted_geo_col with a quoted version
3900     of geometry_column
3901     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
3902     (PostGISTable.RowOrdinalToId): Use the quoted table name
3903     (PostGISTable.ReadValue, PostGISTable.ValueRange)
3904     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
3905     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
3906     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
3907     Use quoted table and column names
3908    
3909     * test/test_postgis_db.py (TestPostGISSpecialCases)
3910     (TestPostGISIgnoredColumns): Rename the class to
3911     TestPostGISSpecialCases because that better describes the new
3912     cases
3913     (TestPostGISSpecialCases.test_unsupported_types)
3914     (TestPostGISSpecialCases.test): Rename the method to
3915     test_unsupported_types because we need a more descriptive name now
3916     that there are more methods
3917     (TestPostGISSpecialCases.test_table_name_quoting)
3918     (TestPostGISSpecialCases.test_column_name_quoting)
3919     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
3920     cases to test quoting of table and column names in PostGISTable
3921     and PostGISShapeStore
3922    
3923     * test/postgissupport.py
3924     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
3925     AddGeometryColumn desn't support table or column names with sapces
3926     or double quotes
3927    
3928 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
3929    
3930     * Extensions/wms/__init__.py: New: Init to make this
3931     directory a package.
3932    
3933     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
3934    
3935 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
3936    
3937 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
3938     Constant for the file woth deprecated epsg projections
3939     (get_system_proj_file): Update doc-string
3940    
3941     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
3942     above the EPS widgets, introduce a check box for the deprecated
3943     eps projections and a label for the epsg widgets
3944     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
3945     too
3946    
3947     2003-11-11 Bernhard Herzog <[email protected]>
3948    
3949 bh 1939 Avoid warnings when run under Python 2.3
3950    
3951     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
3952     (BaseRenderer.draw_label_layer): Coordinates must be ints.
3953    
3954     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
3955     real method so that we can convert to int.
3956     (MapRenderer.label_font): The font size mist be an int.
3957    
3958     * Thuban/UI/common.py (Color2wxColour): The color values must be
3959     ints. Also, remove the unnecessary asserts.
3960    
3961     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
3962     (TestUnicodeStrings.test): Python source code should not contain
3963     non-ascii characters unless an encoding is specified in the file.
3964     Therefore use \x escapes in the string literals for non-ascii
3965     characters.
3966    
3967     2003-11-11 Bernhard Herzog <[email protected]>
3968    
3969 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
3970     parameter so that this function can be used for all proj files in
3971     Resource/Projections
3972     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
3973     get_system_proj_file
3974    
3975     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
3976     ProjFile self.__sysProjFile use a dictionary of system ProjFile
3977     objects self._sys_proj_files
3978     (ProjFrame.build_dialog): Adapt to the new changes in the
3979     ProjectionList constructor. Add a check button to toggle whether
3980     EPSG projections are shown
3981     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
3982     events.
3983     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
3984     the busy cursor if the files have not yet been loaded by the
3985     dialog.
3986     (ProjFrame.load_system_proj): Add a parameter for the name of the
3987     proj file. Maintain the dictionary of system projections
3988     self._sys_proj_files
3989    
3990     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
3991     user_projs parameters into one parameter proj_files which is a
3992     list of proj files.
3993     (ProjectionList._subscribe_proj_files)
3994     (ProjectionList._unsubscribe_proj_files): New. Move
3995     subscription/unsubscription of projfile messages to separate
3996     methods
3997     (ProjectionList.Destroy): The unsubscribe is now done in
3998     _unsubscribe_proj_files
3999     (ProjectionList.update_projections): We now have a list of proj
4000     file objects
4001     (ProjectionList.SetProjFiles): New method to set a new list of
4002     proj file objects
4003    
4004     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
4005     Specify explicitly which system proj file to load.
4006    
4007     2003-11-11 Bernhard Herzog <[email protected]>
4008    
4009 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
4010     instance variables to cut cyclic references. The GC would have
4011     collected the loader eventually but it can happen that it doesn't
4012     run at all until thuban is closed (2.3 but not 2.2 tries a bit
4013     harder and forces a collection when the interpreter terminates)
4014     (load_session): Call the handler's Destroy method to make sure
4015     that it gets garbage collected early. Otherwise it will be
4016     collected very late if at all and it holds some references to e.g.
4017     shapestores and the session which can lead to leaks (of e.g. the
4018     temporary files)
4019    
4020     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
4021     resource leak in load_session
4022    
4023 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
4024    
4025     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
4026     extensions are to be rendered.
4027     (_renderer_extensions): New. List with renderer for layers in
4028     extensions
4029     (add_renderer_extension): New. Add a renderer extension
4030     (init_renderer_extensions): New. Init the renderer extensions
4031     (BaseRenderer.render_map_incrementally): Search
4032     _renderer_extensions for how to draw unknown layer types
4033     (BaseRenderer.draw_raster_data): Add format parameter so that
4034     formats other than BMP can be drawn
4035     (BaseRenderer.draw_raster_layer): Pass an explicit format to
4036     draw_raster_data
4037    
4038     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
4039     strings of the format parameter of draw_raster_data method to wx
4040     constants
4041     (MapRenderer.draw_raster_data): Add the format parameter and use
4042     raster_format_map to map it to the right wxwindows constant for
4043     wxImageFromStream
4044    
4045     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
4046     the format parameter and record it
4047     (TestBaseRenderer.test_raster_no_projection): check the format
4048     paramter of the draw_raster_data method
4049     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
4050     extension facility
4051    
4052 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
4053    
4054     Tweak the usage of the sqlite database to make common use cases
4055     more responsive. In most cases copying the data to the sqlite
4056     database takes so long that using sqlite doesn't have enough
4057     advantages.
4058    
4059     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
4060     comments about performance and query the min and max in separate
4061     statements because only that way will indexes be used.
4062     (TransientTableBase.UniqueValues): Add some comments about
4063     performance.
4064     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
4065     Do not copy the data to the transient DB but use the transient
4066     copy if it exists. See the new comments for the performance trade
4067     offs
4068    
4069     * test/test_transientdb.py
4070     (TestTransientTable.test_auto_transient_table): Make sure that the
4071     data is copied to the transient database at some point.
4072    
4073 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
4074    
4075 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
4076     globals to locals so that it's a bit faster
4077    
4078     2003-11-03 Bernhard Herzog <[email protected]>
4079    
4080 bh 1920 * Thuban/UI/baserenderer.py
4081     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
4082     method. ReadValue is faster than ReadRowAsDict since it only reads
4083     one cell especially now that the dbf file objects actually
4084     implement it.
4085    
4086     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
4087     read_attribute method of the dbf objects
4088    
4089     2003-11-03 Bernhard Herzog <[email protected]>
4090    
4091 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
4092     variable to indicate whether the result should be shown in a
4093     dialog box
4094     (profile_screen_renderer, time_screen_renderer): Only show a
4095     dialog box if popup_dialog_box is true.
4096     (profile_screen_renderer): Flush stdout after the printing the
4097     first part of the "profiling..." message
4098    
4099     * Thuban/UI/baserenderer.py
4100     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
4101     brushes for the groups so that they're not created over and over
4102     again
4103    
4104 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
4105     (Classification._compile_classification)
4106     (Classification._clear_compiled_classification): New. Methods to
4107     manage a 'compiled' representation of the classification groups
4108     which is created on demand
4109     (Classification.InsertGroup, Classification.RemoveGroup)
4110     (Classification.ReplaceGroup): reset the compiled representation
4111     (Classification.FindGroup): Use the compiled representation to
4112     find the matching group
4113     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
4114    
4115 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
4116    
4117 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
4118     Send a CLASS_CHANGED message
4119     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
4120     not return the removed group since it wasn't used.
4121    
4122     * test/test_classification.py
4123     (TestClassification.test_set_default_group): New. Test the
4124     SetDefaultGroup method
4125     (TestClassification.test_insert_group): New. Test the InsertGroup
4126     method
4127     (TestClassification.test_remove_group): New. Test the RemoveGroup
4128     method
4129     (TestClassification.test_replace_group): New. Test the
4130     ReplaceGroup method
4131    
4132     2003-10-31 Bernhard Herzog <[email protected]>
4133    
4134 bh 1908 * test/test_classification.py (TestClassification.setUp):
4135     Subscribe to the CLASS_CHANGED messages
4136     (TestClassification.tearDown): New. Destroy the classification
4137     properly
4138     (TestClassification.test_defaults): Add tests for the default line
4139     width and whether no messages were sent yet
4140     (TestClassification.test_set_default_properties): Add tests for
4141     messages and setting the default line width
4142     (TestClassification.test_add_singleton)
4143     (TestClassification.test_add_range)
4144     (TestClassification.test_multiple_groups): Add tests for messages
4145    
4146     2003-10-31 Bernhard Herzog <[email protected]>
4147    
4148 bh 1906 Some more refactoring in preparation for new tests:
4149    
4150     * test/test_classification.py (TestClassification.setUp): New.
4151     Instantiate the classification here. Update the test methods
4152     accordingly.
4153     (TestClassification.test_multiple_groups): Make sure that the two
4154     singletons matching 1 are considered different.
4155    
4156     2003-10-31 Bernhard Herzog <[email protected]>
4157    
4158 bh 1904 * test/test_classification.py (red, green, blue): New. These
4159     constants were used in several cases. Update the relevant methods.
4160     (TestClassification.test_defaults)
4161     (TestClassification.test_set_default_properties)
4162     (TestClassification.test_add_singleton)
4163     (TestClassification.test_add_range)
4164     (TestClassification.test_multiple_groups)
4165     (TestClassification.test_deepcopy): New. These were formerly all
4166     part of the single method test.
4167     (TestClassification.test_deepcopy): Removed.
4168     (TestClassIterator): Removed. The test case is now a method of
4169     TestClassification since it tests part of the public interface of
4170     Classification
4171     (TestClassification.test_iterator): New. Used to be
4172     TestClassIterator effectively
4173    
4174 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
4175    
4176     GUIfied the functions of the profiling extension.
4177    
4178     * /Extensions/profiling/__init__.py: New: Init to make this
4179     directory a package.
4180    
4181     * Extensions/profiling/profiling.py: Moved menu entries to
4182     the Extensions menu. Applied _() for strings.
4183     (profile_screen_renderer): Catch the detailed printout and present
4184     it in a dialog.
4185 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
4186 jan 1902 of printing it to stdout.
4187    
4188 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
4189    
4190 bh 1899 * test/test_classification.py (TestClassGroupProperties)
4191     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
4192     (TestClassGroupSingleton, TestClassIterator, TestClassification):
4193     Split TestClassification into several classes, one for each class
4194     being tested. TestClassification itself now only tests
4195     Classification. This split makes changes to the tests a bit easier
4196    
4197     2003-10-31 Bernhard Herzog <[email protected]>
4198    
4199 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
4200     Thuban performance
4201    
4202 frank 1895 2003-10-31 Frank Koormann <[email protected]>
4203    
4204     Added two items to legend popup menu: Remove Layer and Show Layer Table
4205    
4206     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
4207     LegendPanel._OnShowTable): New event handlers, call the corresponding
4208     mainwindow methods.
4209     (LegendTree._OnRightClick): Added items to popup menu.
4210    
4211 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
4212    
4213     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
4214     EVT_WINDOW_DESTROY
4215     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
4216     nothing but is convenient for the derived classes.
4217    
4218     * Thuban/UI/tableview.py
4219     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
4220     Unsubscribe the messages here not in OnClose because that might
4221     get called multiple times. Fixes RT #2196
4222     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
4223     anymore.
4224    
4225     * README: Update the minimum requirement for wxPython. Since we
4226     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
4227     the version in which that was introduced for all platforms
4228    
4229 frank 1890 2003-10-30 Frank Koormann <[email protected]>
4230    
4231     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
4232     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
4233     frame.
4234    
4235 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
4236    
4237     Improved APR import extension, added further EPSG definitions
4238     and some cleanup regarding string class.
4239    
4240     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
4241     Added test for alias 'longlat'.
4242    
4243     * Resources/Projections/epsg-deprecated.proj: New. Contains
4244     deprecated EPSG definitions.
4245    
4246     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
4247     the variable names for objects.
4248    
4249     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
4250     Copied from importAPR and provided with documentation.
4251    
4252     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
4253     Moved to apr.py.
4254     (APR_View): Added object ref 'ITheme'.
4255    
4256     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
4257     split function by corresponding use of the string class method.
4258    
4259     * Thuban/Model/xmlwriter.py: Replaced string replace function by
4260     corresponding string method.
4261    
4262 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
4263    
4264     * Thuban/UI/baserenderer.py
4265     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
4266     special case of a classification that only has the default group
4267    
4268 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
4269    
4270 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
4271    
4272 bh 1876 * po/de.po: Update.
4273    
4274     * Thuban/UI/application.py
4275     (ThubanApplication.ShowExceptionDialog): Handle translation of the
4276     dialog message properly
4277    
4278     2003-10-27 Bernhard Herzog <[email protected]>
4279    
4280 bh 1873 Rework how localization works so that we use wx's translation
4281     functions when running Thuban as a normal application but not when
4282     we don't need any UI, such as in the test suite. See the comment
4283     in Thuban/__init__.py for details
4284    
4285     * Thuban/__init__.py (_): Add one level of indirection to make the
4286     translation handling more flexible and to make it possible to use
4287     either wx's translation services or not.
4288     (gettext_identity, translation_function_installed)
4289     (install_translation_function): New function to help with this
4290    
4291     * Thuban/UI/__init__.py: Install the wx specific translation
4292     function if it's OK to do that
4293    
4294     * test/support.py (initthuban): Install a dummy translation
4295     function so that importing Thuban.UI doesn't install a wx specific
4296     one for which would need to import wxPython
4297    
4298     2003-10-27 Bernhard Herzog <[email protected]>
4299    
4300 bh 1870 * HOWTO-Release: Source archives should be created first and the
4301     binary packages should be created from the source archives.
4302     There's an official debian package now so there's no need to test
4303     the rpm on debian anymore
4304    
4305     2003-10-27 Bernhard Herzog <[email protected]>
4306    
4307 bh 1868 Several rendering changes:
4308    
4309     - Render the selection into a separate bitmap so that only that
4310     bitmap needs to be redrawn when the selection changes
4311    
4312     - Render incrementally showing previews and allowing interaction
4313     before rendering is complete
4314    
4315     - Update the renderer interface a bit. Most parameters of
4316     RenderMap are now parameters of the constructor
4317    
4318     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
4319     and the update region as parameters. Update the doc-string
4320     (BaseRenderer.render_map_incrementally): New. Generator function
4321     to renders the map incrementally
4322     (BaseRenderer.render_map): Remove the map argument (it's now in
4323     the constructor) and simply iterate over the
4324     render_map_incrementally generator to draw the map.
4325     (BaseRenderer.draw_shape_layer_incrementally)
4326     (BaseRenderer.draw_shape_layer): Renamed to
4327     draw_shape_layer_incrementally and changed into a generator that
4328     yields True every 500 shapes. Used by render_map_incrementally to
4329     render shape layers incrementally
4330    
4331     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
4332     map and region parameters which are now in the constructor
4333     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
4334     the inherited render_map_incrementally.
4335     (BaseRenderer.draw_shape_layer): Removed.
4336     (ScreenRenderer.draw_selection_incrementally): New. The selection
4337     drawing part of the removed draw_shape_layer as a generator
4338     (ScreenRenderer.layer_shapes): Update because of the region
4339     parameter change
4340     (ExportRenderer.__init__): New. Extend the inherited constructor
4341     with the destination region for the drawing
4342     (ExportRenderer.RenderMap): Removed the map and region parameters
4343     which are now in the constructor
4344    
4345     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
4346     bitmap suitable for a preview in a tool
4347     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
4348     bitmap
4349     (MapPrintout.draw_on_dc): Adapt to new renderer interface
4350     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
4351     exists
4352     (MapCanvas.OnIdle): Update the logic to deal with incremental
4353     rendering and the selection bitmap
4354     (MapCanvas._do_redraw): Handle the instantiation of the render
4355     iterator and the redraws during rendering
4356     (MapCanvas._render_iterator): New. Generator to incrementally
4357     redraw both bitmaps
4358     (MapCanvas.Export): Adapt to new renderer interface.
4359     (MapCanvas.full_redraw): Reset the selection bitmap and the
4360     renderer iterator too
4361     (MapCanvas.redraw_selection): New. Force a redraw of the selection
4362     bitmap
4363     (MapCanvas.shape_selected): Only redraw the selection bitmap
4364    
4365     * test/test_baserenderer.py
4366     (TestBaseRenderer.test_polygon_no_projection)
4367     (TestBaseRenderer.test_raster_no_projection)
4368     (TestBaseRenderer.test_point_map_projection)
4369     (TestBaseRenderer.test_point_layer_and_map_projection)
4370     (TestBaseRenderer.test_point_layer_projection)
4371     (TestBaseRenderer.test_point_with_classification): Adapt to new
4372     renderer interface
4373    
4374 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
4375    
4376     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
4377     (point_in_polygon_shape, shape_centroid): Raise an exception if
4378     the shape can't be read. Previously invalid shape ids would lead
4379     to a segfault.
4380    
4381     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
4382     New. test whether an exception is raised for invalid shape ids
4383    
4384 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
4385    
4386 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
4387     as alias for 'latlong'.
4388    
4389     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
4390     as alias for 'latlong'.
4391    
4392     2003-10-24 Jan-Oliver Wagner <[email protected]>
4393    
4394 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
4395     the projection even for the UnknownPanel.
4396     (UnknownProjPanel.__init__): Define the text and create the textctrl
4397     widget.
4398     (UnknownProjPanel._DoLayout): Replaced static text widget by the
4399     textctrl created in __init__.
4400     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
4401     including the parameters of the projection.
4402    
4403     2003-10-24 Jan-Oliver Wagner <[email protected]>
4404    
4405 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
4406     EPSG codes with parameters for proj. The list has been
4407     generated using devtools/create_epsg.py based on the
4408     file nad/epsg of the proj 4.4.7 package. Four projection
4409     definitions have been deleted as they are not accepted by proj:
4410     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
4411     and "HD72 / EOV".
4412    
4413 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
4414    
4415     Some more tweaks to the projection dialog which should fix RT
4416     #1886.
4417    
4418     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
4419     the ProjFile's messages and call the base class methods correctly
4420     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
4421     flag on the newly selected item too. Otherwise some other item is
4422     focused and the first time the focus is moved with the keyboard
4423     the selection moves in unexpected ways.
4424    
4425     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
4426     focus on the OK button, only on the projection list. That way the
4427     list really has the focus initially
4428     (ProjFrame.OnClose): Call the projection list's Destroy method to
4429     make it unsubscribe all messages
4430    
4431 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
4432    
4433 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
4434     and most of 2168
4435    
4436     * Thuban/UI/projlist.py: New. The class ProjectionList is a
4437     special wxListCtrl to show a list of projections in a more MVC
4438     fashion
4439    
4440     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
4441     throughout the class. The main change is to use the ProjectionList
4442     class instead of a normal wxListBox. Also, add an explicit
4443     "Unknown" projection to the projection choice control.
4444     (ProjPanel.__init__): Add an "unknown" ellipsoid
4445     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
4446     instantiation of the panel's controls to make the tab-order more
4447     natural
4448    
4449     2003-10-21 Bernhard Herzog <[email protected]>
4450    
4451 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
4452     (TestSingleLayer.test): Add non-ascii characters to the titles of
4453     session, map and layer. This is effectively a port of the
4454     TestUnicodeStrings test in test_load_0_8.py which for some reason
4455     was only added there.
4456    
4457     * test/test_load_0_9.py (TestSingleLayer.file_contents)
4458     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
4459     characters to the titles of session, map and layer,.
4460    
4461     2003-10-21 Bernhard Herzog <[email protected]>
4462    
4463 bh 1847 Add EPSG projection handling to .thuban files
4464    
4465     * test/test_save.py (SaveSessionTest.dtd)
4466     (SaveSessionTest.testEmptySession)
4467     (SaveSessionTest.testLayerProjection)
4468     (SaveSessionTest.testRasterLayer)
4469     (SaveSessionTest.testClassifiedLayer)
4470     (SaveSessionTest.test_dbf_table)
4471     (SaveSessionTest.test_joined_table)
4472     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
4473     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
4474     use a and epsg projection to test saving them
4475    
4476     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
4477     namespace
4478     (TestLayerVisibility.file_contents, TestLabels.file_contents)
4479     (TestLayerProjection.file_contents)
4480     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4481     (TestPostGISLayer.file_contents)
4482     (TestPostGISLayerPassword.file_contents)
4483     (TestLoadError.file_contents, TestLoadError.test): Update to use
4484     1.0-dev namespace
4485     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
4486     use 1.0-dev namespace and use an EPSG projection to test whether
4487     loading it works
4488    
4489     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
4490     as of Thuban 0.9. These are now tests to determine whether Thuban
4491     can still read files generated by Thuban 0.9
4492    
4493     * Thuban/Model/save.py (SessionSaver.write)
4494     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
4495     namespace
4496     (SessionSaver.write_projection): Write the projection's epsg
4497     attribute
4498    
4499     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
4500     thuban-1.0-dev.dtd namespace
4501     (SessionLoader.check_attrs): Allow a callable object as conversion
4502     too
4503     (SessionLoader.start_projection, SessionLoader.end_projection)
4504     (SessionLoader.start_parameter): Handle the epsg attribute and
4505     rename a few instance variables to lower case
4506    
4507     * Resources/XML/thuban-1.0.dtd: New. Only difference to
4508     thuban-0.9.dtd is the epsg attribute for projections.
4509    
4510     2003-10-21 Bernhard Herzog <[email protected]>
4511    
4512 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
4513     on the command line
4514    
4515     * test/support.py (ThubanTestResult.getDescription): Override to
4516     give a better short description. The description can be used as a
4517     parameter to run_tests to run that particular test in isolation.
4518    
4519 frank 1837 2003-10-21 Frank Koormann <[email protected]>
4520    
4521     Popup menu for legend. Scheduled for the 1.2 release this was too
4522     simple to implement: The popup menu is bound to the legend tree, while
4523     the events are hanlded by its anchestor, the legend panel. This
4524     allows reuse of all the event handlers already implemented for the
4525     legend toolbar buttons.
4526    
4527     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
4528     to add handlers for the events issued by the popup menu.
4529     (LegendPanel._OnToggleVisibility): Handler for toggling layer
4530     visibility event
4531     (LegendPanel._OnProjection): Handler for layer projection event.
4532     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
4533     (LegendTree._OnRightClick): Event handler for right click, select item
4534     and pop up menu.
4535     (LegendTree.ToggleVisibility): Toggle layer visibility
4536     (LegendTree.LayerProjection): Raise layer projection dialog for
4537     current layer.
4538    
4539 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
4540    
4541     * Resources/Projections/defaults.proj: Use correct DOCTYPE
4542     declaration. The top-level element is projectionlist not projfile
4543    
4544 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
4545    
4546     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
4547     method to write a projfile and display a busy cursor and error
4548     dialogs.
4549     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
4550     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
4551     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
4552     busy cursor while loading the user and system prj files.
4553    
4554 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
4555    
4556     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
4557     ProjFile objects
4558     (clear_proj_file_cache): New function to clear the cache. Mainly
4559     useful for use by the test suite
4560     (read_proj_file): Use the cache.
4561    
4562     * test/test_proj.py (TestProjFile): Clarify the doc-string
4563     (ProjFileReadTests): Update doc-string
4564     (ProjFileReadTests.test_get_system_proj_file): Check whether the
4565     system proj files is cached.
4566     (ProjFileLoadTestCase): New base class for the proj file tests
4567     derived from support.FileLoadTestCase to provide some common
4568     behavior.
4569     (TestLoadingProjFile)
4570     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
4571     (TestProjFileWithInvalidParameters.file_contents): Derive from
4572     ProjFileLoadTestCase
4573     (TestLoadingProjFile.test_caching): New. Test whether the cache
4574     works
4575    
4576 silke 1829 2003-10-16 Silke Reimer <[email protected]>
4577    
4578     * debian/*: New directory with configuration files for building a thuban
4579     deb-package.
4580    
4581 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
4582    
4583 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
4584     __main__ so that missing unsubscribes are detected
4585     (TestProjFile.tearDown): Destroy the proj_file properly
4586    
4587     2003-10-14 Bernhard Herzog <[email protected]>
4588    
4589 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
4590     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
4591     the ProjFile objects
4592    
4593     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
4594     easily send messages when the projections change
4595     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
4596     when the change was successful
4597    
4598     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
4599     proj file messages
4600     (TestProjFile.test_add_remove)
4601     (TestProjFile.test_remove_non_existing)
4602     (TestProjFile.test_replace)
4603     (TestProjFile.test_replace_non_existing): Test whether the right
4604     messages are sent
4605    
4606     2003-10-14 Bernhard Herzog <[email protected]>
4607    
4608 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
4609     tests
4610     (TestProjFile.test_add_remove)
4611     (TestProjFile.test_remove_non_existing)
4612     (TestProjFile.test_replace)
4613     (TestProjFile.test_replace_non_existing): Some of the new
4614     individual test cases
4615     (TestProjFileSimple): New class for the rest of the test cases
4616     that came out of the refactoring
4617     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
4618     derived classes don't have to
4619    
4620 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
4621    
4622 bh 1820 Add an optional EPSG code to the projection objects and extend the
4623     .proj file format accordingly.
4624    
4625     * Resources/XML/projfile.dtd (element projection): Add epsg
4626     attribute
4627    
4628     * Thuban/Model/proj.py (Projection.__init__): New parameter and
4629     instance variable epsg. Update doc-string
4630     (Projection.EPSGCode, Projection.Label): New methods to provide
4631     access to EPSG code and a label for use in dialogs
4632    
4633     * Thuban/Model/resource.py (ProjFileReader.start_projection)
4634     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
4635     Handle the epsg code attribute when reading or writing proj files
4636    
4637     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
4638     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
4639     (ProjFrame.__FillAvailList): Use the projection's Label method to
4640     get the string for the list box
4641    
4642     * test/test_proj.py (TestProjection.test_label)
4643     (TestProjection.test_label_epsg)
4644     (TestProjection.test_epsgcode_for_non_epsg_projection)
4645     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
4646     for the label and EPSGCode methods
4647     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
4648     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
4649     objects in the test cases and put the expected contents into the
4650     test case methods too. Update doTestWrite accordingly
4651     (TestLoadingProjFile)
4652     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
4653     read tests from TestProjFile.
4654     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
4655     tests are now in the new classes.
4656     (sample_projfile, sample_projfile_data)
4657     (sample_projfile2, sample_projfile_data2): Removed. Not used
4658     anymore.
4659     (TestProjFile.test_read_unreadable_file): No need to reset the
4660     permissions at the end anymore since we use a unique filename
4661    
4662     2003-10-13 Bernhard Herzog <[email protected]>
4663    
4664 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
4665     (ProjFileTest): New base class for the proj file tests.
4666     (TestProjFile): Derive from ProjFileTest
4667     (TestProjFile.test_read_unreadable_file)
4668     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
4669     the new filename method to get a unique filename
4670     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
4671     (WriteProjFileTests): New class for proj file write tests.
4672     Contains the write test that were in TestProjFile originally.
4673    
4674     2003-10-13 Bernhard Herzog <[email protected]>
4675    
4676 bh 1812 * test/test_proj.py (TestProjFile.testRead)
4677     (TestProjFile.test_read_non_existing_file)
4678     (TestProjFile.test_read_unreadable_file)
4679     (TestProjFile.test_read_empty_file): Split into several methods.
4680    
4681 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
4682    
4683 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
4684    
4685     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
4686     all projection type specific panels and put them into a
4687     NotebookLikeSizer. This way the dialog doesn't change its size
4688     when a different projection is selected
4689     (ProjFrame.__init__): Rename projection_panels
4690     projection_panel_defs and reuse projection_panels for a list of
4691     the instantiated panels.
4692     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
4693     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
4694     the panels
4695     (UnknownProjPanel._DoLayout): Place the newlines in the message
4696     differently to make the panel narrower.
4697     (TMPanel._DoLayout): Layout the parameters in one column.
4698    
4699     2003-10-10 Bernhard Herzog <[email protected]>
4700    
4701 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
4702     that contains all the setup for the dialog's widgets, layout and
4703     event handling.
4704     (__): Call build_dialog to build the dialog.
4705     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
4706     Their functionality is now in build_dialog
4707     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
4708     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
4709     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
4710     different widget names and hierarchy introduced with build_dialog.
4711    
4712     2003-10-10 Bernhard Herzog <[email protected]>
4713    
4714 bh 1805 * README: Fix typo.
4715    
4716 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
4717    
4718     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
4719     projection is already in the list. This is *a lot* faster when
4720     loading files with hundreds of projections since it saves a linear
4721     search. OTOH this will allow adding the same projection to the
4722     user.proj file multiple times in the projection dialog but we'll
4723     deal with that later
4724    
4725 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
4726    
4727     * devtools: New. Directory for developer tools that are not intended
4728     for the regular user.
4729    
4730     * devtools/create_epsg.py: New. Convert the epsg file of proj into
4731     a python .proj file.
4732    
4733 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
4734    
4735     * test/test_proj.py
4736     (TestProjection.test_get_parameter_without_equals_sign): New. Test
4737     whether GetParameter handles parameters without "=" sign correctly
4738    
4739     * Thuban/Model/proj.py (Projection.GetParameter): Handle
4740     parameters that do not contain a "=". Update the doc-string
4741    
4742 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
4743    
4744 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
4745     length limit on the projname text control
4746    
4747     2003-10-08 Bernhard Herzog <[email protected]>
4748    
4749 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
4750     (TestProjection.test_get_projection_units_normal): New. Tests for
4751     the Projection.GetProjectedUnits method
4752    
4753 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
4754    
4755     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
4756     Added missing 'val' parameter.
4757    
4758 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
4759    
4760 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
4761     projection type of the currently selected projection is not known,
4762     i.e. there's no panel for it, use the UnknownProjPanel
4763     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
4764     the actual replacing of the proj panel into the new method
4765     _show_proj_panel.
4766     (UnknownProjPanel): Add doc-string.
4767     (UnknownProjPanel._DoLayout): Insert a newline into the text so
4768     that the panel is not so wide.
4769    
4770     2003-10-08 Bernhard Herzog <[email protected]>
4771    
4772 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
4773     too. Update the doc-string
4774     (get_proj_files): Removed. It wasn't used anywhere
4775     (get_system_proj_files, get_system_proj_file): Rename to
4776     get_system_proj_file and return the ProjFile object and not a list
4777     of ProjFile objects. Update the callers.
4778     (get_user_proj_files, get_user_proj_file): Rename to
4779     get_user_proj_file return the ProjFile object and not a list of
4780     ProjFile objects. Update the callers.
4781     (ProjFileReader.__init__): New instance variable for the warnings.
4782     Rename the __pf ivar to projfile. Update the methods referring to
4783     __pf
4784     (ProjFileReader.end_projection): Catch any errors raised when
4785     instantiating the projection and record that as an error. The
4786     projection will not be in the final ProjFile object.
4787     (ProjFileReader.GetWarnings): New method to return the warnings.
4788    
4789     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
4790     show the warnings from the projfile reader
4791     (ProjFrame._OnImport): Deal with any warnings returned by
4792     read_proj_file
4793     (ProjFrame.__FillAvailList): Deal with any warnings returned by
4794     get_system_proj_file or get_user_proj_file.
4795    
4796     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
4797     (TestProjFileWithInvalidParameters.file_contents): New test cases
4798     to test whether read_proj_file handles invalid projection
4799     parameters correctly
4800     (TestProjFile.test_get_system_proj_file): New. Simple test for
4801     resource.get_system_proj_file
4802    
4803 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
4804    
4805     * test/test_derivedshapestore.py
4806     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
4807     properly so that the temporary directories get deleted correctly
4808    
4809 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
4810    
4811 bh 1783 Handle the title changes in a proper MVC way.
4812    
4813     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4814     canvas' TITLE_CHANGED messages
4815     (MainWindow.update_title): New. Update the main window's title
4816     (MainWindow.__SetTitle): Removed. Use update_title instead.
4817     (MainWindow.SetMap): Use update_title instead of __SetTitle
4818     (MainWindow.RenameMap): Do change the window title explicitly
4819     here. That's handled in a proper MVC way now.
4820     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
4821     messages
4822    
4823     * Thuban/Lib/connector.py (Conduit): New class to help classes
4824     that forward messages
4825    
4826     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
4827     (ViewPort): Derive from Conduit instead of Publisher
4828     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
4829     when calling the inherited versions
4830     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
4831     methods to subscribe and unsubscribe map messages
4832     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
4833     handle the map subscriptions
4834     (ViewPort.Map, ViewPort.map_projection_changed)
4835     (ViewPort.layer_projection_changed): Add or update doc-strings
4836    
4837     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
4838     typo
4839     (MyConduit): Helper class for the Conduit test.
4840     (TestConduit): Test cases for Conduit
4841    
4842     * test/test_connector.py: Use support.run_tests as main.
4843    
4844     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
4845     the TITLE_CHANGED messages
4846     (ViewPortTest.test_forwarding_title_changed): New test to check
4847     whether the viewport forwards the map's TITLE_CHANGED messages
4848     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
4849     after the port's because the latter may require a still functional
4850     map.
4851    
4852     2003-10-06 Bernhard Herzog <[email protected]>
4853    
4854 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
4855     doc-string
4856    
4857     2003-10-06 Bernhard Herzog <[email protected]>
4858    
4859 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
4860     (SimpleViewPortTest.test_init_with_size): Move the test for the
4861     initial size as a constructor parameter from ViewPortTest.setUp
4862     method to a new separate test in SimpleViewPortTest.
4863    
4864     2003-10-06 Bernhard Herzog <[email protected]>
4865    
4866 bh 1773 * test/test_viewport.py (MockView): New class derived from
4867     ViewPort with a mock implementation of GetTextExtent to be used in
4868     the test cases
4869     (ViewPortTest.setUp): Use MockView instead of ViewPort
4870    
4871     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
4872     into what would be a "pure virtual function" in C++: always raise
4873     NotImplementedError. Mock implementations for test cases don't
4874     belong into the real code
4875    
4876 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
4877    
4878     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
4879     close the dbf file we create so that it's contents have been
4880     written properly.
4881    
4882     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
4883     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
4884     Update to shapelib 1.2.10
4885    
4886 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
4887    
4888     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
4889     it annoys lintian which warns about these files not being
4890     executable. The #! isn't necessary here since if you absolutely
4891     must execute them you can always say "python <filename>".
4892    
4893 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
4894    
4895 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
4896     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
4897     is ported to a newer the import will fail, so it should be noticed
4898     immediately that this function is gone.
4899     Fixes RT#1919
4900    
4901     2003-09-26 Bernhard Herzog <[email protected]>
4902    
4903 bh 1757 Add a DTD for the projection files and make thuban write valid
4904     projection files
4905    
4906     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
4907     files
4908    
4909     * Thuban/Model/resource.py (ProjFileSaver.write): Use
4910     'projectionlist' as the name in the document type declaration so
4911     that it matches the element type of the root element.
4912    
4913     * test/test_proj.py (sample_projfile, sample_projfile2): Use
4914     'projectionlist' as the name in the document type declaration just
4915     as it is done now in the files thuban would write
4916     (sample_projfile, sample_projfile_data): Fix spelling of
4917     "Mercator"
4918     (TestProjFile.doTestWrite): Validate the written and the expected
4919     XML data
4920     (TestProjFile): Derive from ValidationTest so that we can run xml
4921     validation tests
4922    
4923 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
4924    
4925     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
4926     modify the list returned by map.Layers() in place since it is the
4927     actual list of layers used by the map.
4928    
4929 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
4930    
4931     * Doc/manual/thuban-manual.xml: Added subsection to chapter
4932     Extensions to describe the extensions coming with the Thuban
4933     standard package (gns2shp and importAPR).
4934    
4935 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
4936    
4937     * libraries/thuban/wxproj.cpp (project_point): if there's an
4938     inverse but no forward projection, convert to degrees after
4939     applying the inverse projection. Fixes RT#2096
4940    
4941     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
4942     implicitly tests for the fix to RT#2096
4943    
4944     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
4945     Check that the sequences have the same lengths
4946    
4947     * Resources/Projections/defaults.proj (Geographic projection): Use
4948     a much more precise value for the to_meter attribute.
4949    
4950 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
4951    
4952     * test/support.py (initthuban): Make sure to unset the LANG env.
4953     var. so that tests that compare translated strings work. Solves RT
4954     #2094
4955    
4956 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
4957    
4958 jan 1735 Small improvement of APR import.
4959    
4960     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
4961     Added tests for text-ranges.
4962    
4963     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
4964     returns a string object if the range is based on text.
4965    
4966     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
4967     range retrieval.
4968    
4969     2003-09-22 Jan-Oliver Wagner <[email protected]>
4970    
4971 jan 1730 Initial version of the importAPR extension which is in
4972     experimental state.
4973    
4974     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
4975     /Extensions/importAPR/test/: New directories.
4976    
4977     * /Extensions/importAPR/samples/README: New: Howto load the samples.
4978    
4979     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
4980     file which refers to the Thuban Iceland demo data.
4981    
4982     * /Extensions/importAPR/test/README: New: Howto execute the tests.
4983    
4984     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
4985    
4986     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
4987     as in '.apr'-files.
4988    
4989     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
4990     ODB Objects as in '.apr', '.avl' and other files.
4991    
4992     * /Extensions/importAPR/__init__.py: New: Init to make this
4993     directory a package.
4994    
4995     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
4996     project file (.apr) and convert it to Thuban.
4997    
4998     2003-09-22 Jan-Oliver Wagner <[email protected]>
4999    
5000     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
5001    
5002 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
5003    
5004     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
5005     with description on RPM installation and RPM binary package
5006     creation.
5007    
5008 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
5009    
5010     * setup.py (data_files): Only add the mo files if the Locales
5011     directory actually exists, so that setup.py works with a fresh CVS
5012     checkout
5013    
5014 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
5015    
5016     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
5017     in viewport, not anymore in view
5018    
5019 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
5020    
5021     Introducing first Extension (gns2shp).
5022    
5023     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
5024    
5025     * Extensions/__init__.py: New. init to make this dir a package.
5026    
5027     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
5028    
5029     * Extensions/gns2shp/test/README: New. some info on this test directory.
5030    
5031     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
5032    
5033     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
5034     of Shapefile from GNS text file format
5035    
5036 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
5037    
5038 jan 1707 Fix/workaround for bug #2019:
5039     https://intevation.de/rt/webrt?serial_num=2019
5040    
5041     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
5042     (IdentifyView.__init__): Added another button that allows to
5043     stop the identify mode.
5044     (IdentifyView.OnStop): New. Stops the identify mode.
5045    
5046     2003-09-03 Jan-Oliver Wagner <[email protected]>
5047    
5048 jan 1705 Introducing a new exception dialog that allows to exit the
5049     application immediately.
5050     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
5051    
5052     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
5053    
5054     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5055     Made strings available to translations. Exchanged the simple
5056     ScrolledMessageDialog by the new ExceptionDialog.
5057    
5058 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
5059    
5060 bh 1701 * NEWS: New. Summary of changes and release notes.
5061    
5062     * MANIFEST.in: Add NEWS
5063    
5064     2003-09-01 Bernhard Herzog <[email protected]>
5065    
5066 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
5067     include the documentation too.
5068    
5069     * setup.py (data_files): Add the .mo files
5070     (setup call): Up to version 0.9.0
5071    
5072     2003-09-01 Bernhard Herzog <[email protected]>
5073    
5074 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
5075     parameter list to just parent and session
5076     (ChooseDBTableDialog.__set_properties): Removed. Setting the
5077     selection of empty list boxes is not allowed (and produces C++
5078     assertion errors) and the rest of the setup is better done in
5079     __init__ anyway.
5080     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
5081     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
5082     builtins True/False for booleans to avoid warnings from wxPython
5083    
5084     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
5085     ChooseDBTableDialog constructor parameters.
5086    
5087     2003-09-01 Bernhard Herzog <[email protected]>
5088    
5089 bh 1694 * Thuban/Model/postgisdb.py
5090     (PostGISTable): Extend doc-string
5091     (PostGISTable._fetch_table_information): Set the column index
5092     correctly, pretending ignored columns don't exist.
5093    
5094     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
5095     for postgis tables with data types not yet supported by thuban.
5096    
5097 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
5098    
5099     * HOWTO-Release: Tweak item about running the tests.
5100    
5101 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
5102    
5103     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
5104    
5105 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
5106    
5107     Add some missing parameters to projections. Proj complains about
5108     them on windows but for some reason not on Linux.
5109    
5110     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
5111     missing required projection parameters
5112    
5113     * test/test_proj.py (TestProjFile.test): Add missing required
5114     projection parameters
5115    
5116     * test/test_load_0_8.py (TestLayerProjection.file_contents)
5117     (TestLayerProjection.test): Add missing required projection
5118     parameters and tests for them
5119    
5120     * test/test_load.py (TestLayerProjection.file_contents)
5121     (TestLayerProjection.test): Add missing required projection
5122     parameters and tests for them
5123    
5124     * test/test_layer.py (TestLayer.test_base_layer): Add missing
5125     required projection parameters
5126    
5127     2003-08-29 Bernhard Herzog <[email protected]>
5128    
5129     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
5130     access the pj_errno because directly accessing pj_errno doesn't
5131     work on windows if the proj library is in a DLL
5132    
5133     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
5134    
5135 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
5136    
5137 bh 1685 * test/test_proj.py: Import things from Thuban after calling
5138     initthuban
5139    
5140     * test/test_load.py (LoadSessionTest.filenames): New class
5141     variable with the filename attributes to normalize
5142     (LoadSessionTest.check_format): Pass self.filenames to
5143     sax_eventlist to normalize the filename attributes
5144    
5145     * test/xmlsupport.py: Add cvs keywords
5146     (SaxEventLister.__init__): New parameter filenames which indicates
5147     attributes that contain filenames
5148     (SaxEventLister.startElementNS): Normalize the filename attributes
5149     with os.path.normpath
5150     (sax_eventlist): New parameter filenames to pass through to
5151     SaxEventLister
5152    
5153     * test/test_derivedshapestore.py: Make this file callable as a
5154     program to execute the tests
5155     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
5156     the session to self.session so that it gets destroyed properly
5157    
5158     * test/test_layer.py (TestLayer.tearDown): Call the session's
5159     Destroy method
5160    
5161     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
5162     too if it exists
5163     (TestMapAddLayer.test_add_layer): Bind the session to self.session
5164     so that it gets destroyed properly
5165    
5166     * test/postgissupport.py (reason_for_not_running_tests): Add a
5167     test for the existence of popen2.Popen4.
5168    
5169     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
5170     reliable way to destroy the sessions created in the test cases
5171     (SaveSessionTest.test_dbf_table): Bind the session to self.session
5172     so that it gets destroyed properly
5173     (SaveSessionTest.testLayerProjection): Bind the session to
5174     self.session so that it gets destroyed properly
5175    
5176     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
5177     sure that the session is destroyed properly
5178    
5179     * test/test_shapefilestore.py: Make this callable as a program to
5180     execute the tests
5181    
5182     * test/test_scalebar.py: Remove unnecessary import of _ from
5183     Thuban
5184    
5185     * test/support.py (print_garbage_information): Call initthuban
5186     here because it may be called indirectly from test cases that test
5187     test support modules which do not use anything from thuban itself
5188     (ThubanTestProgram.runTests): Remove unnecessary debug print
5189    
5190     2003-08-28 Bernhard Herzog <[email protected]>
5191    
5192 bh 1672 * Thuban/version.py (longversion): Update to 0.9
5193    
5194     * Thuban/UI/mainwindow.py: Remove some unused imports
5195    
5196     * README: Add section about required additional software. Add date
5197     and revision CVS keywords
5198    
5199     * HOWTO-Release: Add item about the translations. Add date and
5200     revision CVs keywords and change formatting to match README a bit
5201     better
5202    
5203     * po/de.po: Update for 0.9
5204    
5205     * test/README: Tweak the wording a little because many tests are
5206     not really unittest.
5207    
5208 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
5209    
5210 bh 1665 As preparation for the 0.9 release, switch thuban files to a
5211     non-dev namespace
5212    
5213     * Thuban/Model/save.py (SessionSaver.write_session): Write files
5214     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
5215     namespace
5216    
5217     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
5218     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
5219    
5220     * test/test_save.py (SaveSessionTest.dtd)
5221     (SaveSessionTest.testEmptySession)
5222     (SaveSessionTest.testSingleLayer)
5223     (SaveSessionTest.testLayerProjection)
5224     (SaveSessionTest.testRasterLayer)
5225     (SaveSessionTest.testClassifiedLayer)
5226     (SaveSessionTest.test_dbf_table)
5227     (SaveSessionTest.test_joined_table)
5228     (SaveSessionTest.test_save_postgis): Update for new namespace
5229    
5230     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
5231     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5232     (TestLayerProjection.file_contents)
5233     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5234     (TestPostGISLayer.file_contents)
5235     (TestPostGISLayerPassword.file_contents)
5236     (TestLoadError.file_contents, TestLoadError.test): Update for new
5237     namespace
5238    
5239     2003-08-27 Bernhard Herzog <[email protected]>
5240    
5241 bh 1663 Make the table interface distinguish between row ids (an integer
5242     that uniquely identifies a row) and row ordinals (a simple row
5243     count from 0 to NumRows() - 1)
5244    
5245     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
5246     (PostGISTable.RowOrdinalToId): New methods to conver between row
5247     ids and row ordinals
5248     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
5249     parameter row_is_ordinal to indicate whether the row parameter is
5250     the row id or the ordinal
5251    
5252     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
5253     (TransientTableBase.RowOrdinalToId)
5254     (AutoTransientTable.RowIdToOrdinal)
5255     (AutoTransientTable.RowOrdinalToId): Same new methods as in
5256     PostGISTable.
5257     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
5258     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
5259     Same new parameter as in PostGISTable.
5260    
5261     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
5262     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
5263     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
5264     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
5265     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
5266     parameter as in PostGISTable.
5267    
5268     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
5269     (DataTable.RowOrdinalToId): New methods to convert between row ids
5270     and row ordinals.
5271     (TableGrid.SelectRowById): New method to select a row based on its
5272     ID as opposed to its ordinal
5273     (DataTable.GetValue, TableGrid.OnRangeSelect)
5274     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
5275     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
5276     (LayerTableFrame.__init__): Convert between row ids and row
5277     ordinals as appropriate
5278    
5279     * test/postgissupport.py (PostGISDatabase.__init__): Add
5280     doc-string.
5281     (PostGISDatabase.initdb): The optional third item in a tuple in
5282     tables is now a (key, value) list with additional arguments to
5283     pass to upload_shapefile
5284     (upload_shapefile): New parameter gid_offset to allow gids that
5285     are not the same as the shapeids in the shapefile
5286     (PostgreSQLServer.get_default_static_data_db): Use the new
5287     gid_offset to make the gids in landmarks 1000 higher than the
5288     shapeids in the shapefile
5289    
5290     * test/test_viewport.py
5291     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
5292     new shapeids in the landmarks table
5293    
5294     * test/test_transientdb.py
5295     (TestTransientTable.run_iceland_political_tests)
5296     (TestTransientTable.test_transient_joined_table): Add tests for
5297     the new table methods and new keywords arguments.
5298    
5299     * test/test_postgis_db.py
5300     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
5301     (TestPostGISTable.test_read_value_row_count_mode)
5302     (TestPostGISTable.test_row_id_to_ordinal)
5303     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
5304     table methods and the new arguments
5305     (TestPostGISShapestorePoint.test_shapes_in_region)
5306     (TestPostGISShapestorePoint.test_shape_raw_data)
5307     (TestPostGISShapestorePoint.test_shape_points)
5308     (TestPostGISShapestorePoint.test_shape_shapeid)
5309     (TestPostGISShapestorePoint.test_all_shapes)
5310     (TestPostGISTable.test_simple_query)
5311     (TestPostGISTable.test_simple_query)
5312     (TestPostGISTable.test_simple_query)
5313     (TestPostGISTable.test_read_value)
5314     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
5315     shapeids in the landmarks table
5316    
5317     * test/test_memory_table.py
5318     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
5319     (TestMemoryTable.test_read_value_row_count_mode)
5320     (TestMemoryTable.test_row_id_to_ordinal)
5321     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
5322     table methods and the new arguments
5323    
5324     * test/test_dbf_table.py
5325     (TestDBFTable.test_read_row_as_dict_row_count_mode)
5326     (TestDBFTable.test_read_value_row_count_mode)
5327     (TestDBFTable.test_row_id_to_ordinal)
5328     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
5329     methods and the new arguments
5330    
5331 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
5332    
5333 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
5334     more postgis specific but much faster method to get the bounding
5335     box
5336    
5337     2003-08-26 Bernhard Herzog <[email protected]>
5338    
5339 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
5340     (PostGISShapeStore.AllShapes): Add these missing methods.
5341     (PostGISShapeStore.ShapesInRegion): No need to raise
5342     StopIteration. We can simply return
5343    
5344     * test/test_postgis_db.py (TestPostGISTable.test_title)
5345     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
5346     new methods
5347    
5348 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
5349    
5350 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
5351    
5352     * test/test_postgis_db.py (PolygonTests): New class containing
5353     those tests from TestPostGISShapestorePolygon that can also be
5354     used to test MUTLIPOLYGON tables
5355     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
5356     so derive from that
5357     (TestPostGISShapestoreMultiPolygon): New class with tests for
5358     MUTLIPOLYGON tables
5359    
5360     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
5361     tables argument to have tuples with three items to override the
5362     WKT type used.
5363     (PostgreSQLServer.get_default_static_data_db): Use the above to
5364     create a polygon table with MUTLIPOLYGONs
5365     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
5366     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
5367     coords_to*
5368     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
5369     (wkt_converter): New. Map WKT types to converters
5370     (upload_shapefile): New parameter force_wkt_type to use a
5371     different WKT type than the default
5372    
5373     2003-08-25 Bernhard Herzog <[email protected]>
5374    
5375 bh 1655 * Thuban/UI/application.py
5376     (ThubanApplication.run_db_param_dialog): New. Suitable as a
5377     db_connection_callback. Main difference is that the dialog run
5378     from this method doesn't have a parent so it can be used even when
5379     there is no main window
5380     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
5381     no db_connection_callback was given. This way the dialog pops up
5382     even when the .thuban file was given as a command line parameter.
5383    
5384     2003-08-25 Bernhard Herzog <[email protected]>
5385    
5386 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
5387     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
5388     which leads to an effectively frozen X session because the user
5389     can only interact with the dialog but the mouse is still grabbed
5390     by the canvas.
5391     Also, call the tool's Hide method before MouseLeftUp because
5392     MouseLeftUp may change the tool's coordinates.
5393    
5394     2003-08-25 Bernhard Herzog <[email protected]>
5395    
5396 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
5397     LoadCancelled exceptions and handle them by returning immediately.
5398    
5399     2003-08-25 Bernhard Herzog <[email protected]>
5400    
5401 bh 1649 GUI part of loading sessions with postgis connections which may
5402     require user interaction to get passwords or updated parameters
5403    
5404     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
5405     bit nucer and be more generic.
5406     (DBFrame.OnAdd): Adapt to new DBDialog interface
5407    
5408     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
5409     optional parameter db_connection_callback which is passed to
5410     load_session.
5411    
5412     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
5413     Suitable as a db_connection_callback
5414     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
5415     db_connection_callback of the application's OpenSession method
5416    
5417    
5418     2003-08-25 Bernhard Herzog <[email protected]>
5419    
5420 bh 1647 Basic loading of sessions containing postgis connections:
5421    
5422     * Thuban/Model/load.py (LoadError): Add doc-string
5423     (LoadCancelled): New exception class to indicate a cancelled load
5424     (SessionLoader.__init__): Add the db_connection_callback parameter
5425     which will be used by the loader to get updated parameters and a
5426     password for a database connection
5427     (SessionLoader.__init__): Add the new XML elements to the
5428     dispatchers dictionary
5429     (SessionLoader.check_attrs): Two new conversions, ascii to convert
5430     to a byte-string object and idref as a generic id reference
5431     (SessionLoader.start_dbconnection)
5432     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
5433     elements
5434     (load_session): Add the db_connection_callback to pass through the
5435     SessionLoader
5436    
5437     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
5438     New classes to test loading of sessions with postgis database
5439     connections.
5440    
5441     2003-08-25 Bernhard Herzog <[email protected]>
5442    
5443 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
5444     replace it and the comment with __BuildDate__ by the Source: and
5445     Id: cvs keywords as used in the other files.
5446    
5447     2003-08-25 Bernhard Herzog <[email protected]>
5448    
5449 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
5450     LoadError when a required attribute is missing. The code used to
5451     be commented out for some reason, but probably should have been
5452     active.
5453    
5454     * test/test_load.py (TestLoadError.test): Test the message in the
5455     LoadError too to make sure it really is about the missing
5456     attribute
5457    
5458 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
5459 bh 1641
5460     * test/test_save.py (SaveSessionTest.test_dbf_table)
5461     (SaveSessionTest.test_joined_table): Add XML validation tests.
5462    
5463     2003-08-22 Bernhard Herzog <[email protected]>
5464    
5465 bh 1639 Implement saving a session with a postgis connection
5466 bh 1632
5467 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
5468     elements for database connections and shapestores using db
5469     connections
5470     (session): Add the dbconnections to the content model
5471    
5472     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
5473     Write the db connections
5474     (SessionSaver.write_session): Call write_db_connections to write
5475     the connection before the data sources
5476     (SessionSaver.write_data_containers): Handle postgis shapestores
5477    
5478     * test/test_save.py (SaveSessionTest.thubanids)
5479     (SaveSessionTest.thubanidrefs): Update for new DTD
5480     (SaveSessionTest.test_save_postgis): New. Test saving a session
5481     with postgis connections
5482    
5483     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
5484     (PostGISTable.TableName): New accessor methods for the connection
5485     and table name
5486    
5487     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
5488     (TestPostGISTable.test_dbname): New methods to test the new
5489     PostGISConnection methods
5490    
5491     2003-08-22 Bernhard Herzog <[email protected]>
5492    
5493 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
5494     for exceptions occurring when establishing a Database connection
5495     (PostGISConnection.connect): Catch psycopg.OperationalError during
5496     connects and raise ConnectionError.
5497    
5498     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
5499     tests for database exceptions
5500    
5501     2003-08-22 Bernhard Herzog <[email protected]>
5502    
5503 bh 1635 Prepare the test suite for tests with required authentication
5504    
5505     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
5506     variables with two predefined users/passwords, one for the admin
5507     and one for a non-privileged user.
5508     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
5509     the non-privileged user to the database and set the admin password
5510     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
5511     Better error reporting
5512     (PostgreSQLServer.connection_params)
5513     (PostgreSQLServer.connection_string): New methods to return
5514     information about how to connect to the server
5515     (PostgreSQLServer.execute_sql): New. Convenience method to execute
5516     SQL statements
5517     (PostgreSQLServer.require_authentication): Toggle whether the
5518     server requires authentication
5519     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
5520     Add or alter users
5521     (PostGISDatabase.initdb): Pass the admin name one the
5522     subprocesses' command lines. Grant select rights on
5523     geometry_columns to everybody.
5524     (upload_shapefile): Use the admin name and password when
5525     connecting. Grant select rights on the new table to everybody.
5526    
5527     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
5528     server's new methods to get the connection parameters.
5529    
5530     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
5531     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
5532     server's new methods to get the connection parameters.
5533    
5534     * test/test_postgis_db.py
5535     (TestPostGISConnection.test_gis_tables_empty)
5536     (TestPostGISConnection.test_gis_tables_non_empty)
5537     (PostGISStaticTests.setUp): Use the server's new methods to get
5538     the connection parameters.
5539    
5540     2003-08-22 Bernhard Herzog <[email protected]>
5541    
5542 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
5543    
5544     * Thuban/version.py: Add psycopg version
5545    
5546     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
5547     version of the psycopg module
5548    
5549     2003-08-22 Bernhard Herzog <[email protected]>
5550    
5551     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
5552     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
5553     at the moment. The functionality should probably be implemented
5554     some time, though.
5555 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
5556     removed because it's still in use.
5557 bh 1632
5558 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
5559    
5560     * Thuban/UI/about.py (About.__init__): split up the huge about
5561     text into elements/lists for easier translation. This fixes bug
5562     https://intevation.de/rt/webrt?serial_num=2058
5563     Also, made some forgotten string available for the i18n.
5564    
5565 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
5566    
5567     Make postgis support really optional including insensitive menu
5568     items.
5569    
5570     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
5571     whether the postgis is supported.
5572    
5573     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
5574     to make postgis support optional
5575    
5576     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
5577     version of Thuban.Model.postgisdb.has_postgis_support
5578     (database_management command): Make it only sensitive if postgis
5579     is supported.
5580    
5581 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
5582    
5583 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
5584     (section Adding and Removing Layers): Added text and described
5585     multi-selection.
5586     (chapter Extensions): New.
5587    
5588     2003-08-21 Jan-Oliver Wagner <[email protected]>
5589    
5590 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
5591     settings to allow multiple files to load into the map.
5592     Also reduced selection to *.shp as a default.
5593    
5594 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
5595    
5596     Add dialogs and commands to open database connections and add
5597     database layers.
5598    
5599     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
5600     method to open the database connection management dialog
5601     (MainWindow.AddDBLayer): New method to add a layer from a database
5602     (_has_dbconnections): New helper function to use for sensitivity
5603     (database_management command, layer_add_db command): New commands
5604     that call the above new methods.
5605     (main_menu): Add the new commands to the menu.
5606    
5607     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
5608     (PostGISConnection.connect): Establish the actual connection in a
5609     separate method and call it in __init__. This makes it easier to
5610     override the behavior in test cases
5611     (PostGISConnection.BriefDescription): New method to return a brief
5612     description for use in dialogs.
5613    
5614     * test/test_postgis_db.py (NonConnection): DB connection that
5615     doesn't actually connect
5616     (TestBriefDescription): New class with tests for the new
5617     BriefDescription method
5618    
5619 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
5620    
5621     Moved anything from extensions to libraries.
5622    
5623     * libraries: New.
5624    
5625     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
5626    
5627     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
5628     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
5629     been moved here from thuban/extensions/pyprojection/
5630     See there in the Attic for the older history.
5631    
5632     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
5633     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
5634     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
5635     have been moved here from thuban/extensions/pyshapelib/
5636     See there in the Attic for the older history.
5637    
5638     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
5639     files have been moved here from thuban/extensions/shapelib/
5640     See there in the Attic for the older history.
5641    
5642     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5643     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
5644     thuban/extensions/thuban/
5645     See there in the Attic for the older history.
5646    
5647     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
5648    
5649     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5650     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
5651    
5652     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
5653     Moved to libraries/shapelib.
5654    
5655     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
5656     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
5657     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
5658     Moved to libraries/pyshapelib.
5659    
5660     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
5661     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
5662     Moved to libraries/pyprojection.
5663    
5664     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
5665    
5666     * extensions: Removed.
5667    
5668 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
5669    
5670 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
5671     facilities of FileTestMixin so don't derive from it.
5672     (TestViewportWithPostGIS): New class with tests for using a
5673     viewport on a map with postgis layers.
5674    
5675     2003-08-19 Bernhard Herzog <[email protected]>
5676    
5677     Add the db connection management to the session.
5678    
5679     * Thuban/Model/session.py (Session.__init__): New instance
5680     variable db_connections
5681     (Session.AddDBConnection, Session.DBConnections)
5682     (Session.HasDBConnections, Session.CanRemoveDBConnection)
5683     (Session.RemoveDBConnection): New methods to manage and query the
5684     db connections managed by the session
5685     (Session.OpenDBShapeStore): New method to open a shapestore from a
5686     db connection
5687    
5688     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
5689     messages for the db connection handling in the session
5690    
5691     * test/test_postgis_session.py: New. test cases for the session's
5692     db connection handling with postgis connections
5693    
5694     2003-08-19 Bernhard Herzog <[email protected]>
5695    
5696 bh 1606 Add very basic postgis database support and the corresponding test
5697     cases. The test cases require a PostgreSQL + postgis installation
5698     but no existing database. The database will be created
5699     automatically by the test cases
5700    
5701     * test/README: Add note about skipped tests and the requirements
5702     of the postgis tests.
5703    
5704     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
5705    
5706     * test/test_postgis_db.py: New. Test cases for the postgis
5707     support.
5708    
5709     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
5710     format
5711    
5712     * test/test_wellknowntext.py: New. Test cases for the
5713     wellknowntext parser
5714    
5715     * test/postgissupport.py: New. Support module for tests involving
5716     a postgis database.
5717    
5718     * test/support.py (execute_as_testsuite): Shut down the postmaster
5719     if it's still running after the tests
5720    
5721     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
5722     well known text format
5723    
5724 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
5725    
5726     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
5727     message dialog.
5728    
5729 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
5730    
5731 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
5732     reason for the skips in the output to make it a bit more readable.
5733     (execute_as_testsuite): New helper function to run a test suite
5734     and print some more information.
5735     (run_tests): Use execute_as_testsuite to run the tests
5736    
5737     * test/runtests.py (main): Use execute_as_testsuite to run the
5738     tests
5739    
5740     2003-08-18 Bernhard Herzog <[email protected]>
5741    
5742 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
5743     changes introduced in Python 2.3:
5744    
5745     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
5746     filename is an absolute name
5747    
5748     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
5749     filename is an absolute name
5750    
5751     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
5752     unique filename to save to and use the correct relative filename
5753     in the expected output.
5754     (SaveSessionTest.test_dbf_table): Use the correct relative
5755     filename in the expected output.
5756    
5757     * test/test_layer.py (TestLayer.test_raster_layer): Update the
5758     test to check whether the filename is absolute.
5759    
5760 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
5761    
5762     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
5763    
5764 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
5765    
5766 bh 1594 Change the way shapes are returned by a shape store. The
5767     ShapesInRegion method returns an iterator over actual shape
5768     objects instead of a list of shape ids.
5769    
5770     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
5771     id.
5772     (ShapefileStore.ShapesInRegion): Return an iterator over the
5773     shapes which yields shape objects instead of returning a list of
5774     shape ids
5775     (ShapefileStore.AllShapes): New. Return an iterator over all
5776     shapes in the shape store
5777     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
5778    
5779     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
5780     doc-string.
5781    
5782     * Thuban/UI/baserenderer.py
5783     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
5784     layer_shapes and make it return an iterator containg shapes
5785     instead of a list of ids.
5786     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
5787     layer_shapes() change
5788    
5789     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
5790     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
5791    
5792     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
5793     changes in the ShapesInRegion return value.
5794     (ViewPort._get_hit_tester): Remove commented out code
5795    
5796     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
5797     new return value.
5798     (SimpleShapeStore.AllShapes): New. Implement this method too.
5799    
5800     * test/test_layer.py (TestLayer.test_arc_layer)
5801     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5802     (TestLayer.test_point_layer_with_projection)
5803     (TestLayer.test_derived_store): Adapt to changes in the
5804     ShapesInRegion return value.
5805    
5806     * test/test_shapefilestore.py
5807     (TestShapefileStoreArc.test_shapes_in_region)
5808     (TestShapefileStorePolygon.test_shapes_in_region)
5809     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
5810     in the ShapesInRegion return value.
5811     (TestShapefileStorePoint.test_all_shapes)
5812     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
5813     methods
5814    
5815     * test/test_derivedshapestore.py
5816     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
5817     the ShapesInRegion return value.
5818     (TestDerivedShapeStore.test_all_shapes)
5819     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
5820     methods
5821    
5822     2003-08-15 Bernhard Herzog <[email protected]>
5823    
5824 bh 1592 Make the renderers deal correctly with raw vs. python level
5825     representation of shape geometries
5826    
5827     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
5828     Return a flag useraw in addition to the callable and the parameter
5829     to indicate whether the callable can deal with the raw shape data
5830     or uses the higher level python lists of coordinates. The callable
5831     now should accept either the raw data or the return value of the
5832     shape's Points() method.
5833     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
5834     change
5835     (BaseRenderer.projected_points): Instead of the shape id use the
5836     points list as parameter.
5837     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
5838     (BaseRenderer.draw_point_shape): Adapt to projected_points()
5839     change and accept the points list as parameter instead of the
5840     shape id.
5841    
5842     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
5843     the useraw flag as required by the BaseRenderer
5844     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
5845     changes.
5846    
5847     * test/test_baserenderer.py
5848     (TestBaseRenderer.test_point_with_classification): New test for
5849     rendering a map with classifications.
5850    
5851     2003-08-15 Bernhard Herzog <[email protected]>
5852    
5853 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5854     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
5855     (ViewPort._get_hit_tester, ViewPort.projected_points)
5856     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
5857     (ViewPort._find_label_at): Split the find_shape_at method into
5858     several new methods and use the functions in the hit-test module.
5859    
5860     * Thuban/UI/hittest.py: New module with Python-level hit-testing
5861     functions
5862    
5863     * test/test_hittest.py: New. Test for the new hittest module
5864    
5865     2003-08-15 Bernhard Herzog <[email protected]>
5866    
5867 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
5868     projection to all corners of the bounding box to get a better
5869     approximation of the projected bounding box
5870    
5871     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
5872     New. Test coordinate handling of a layer with a projection.
5873     Catches the bug fixed in Layer.ShapesInRegion
5874    
5875     2003-08-15 Bernhard Herzog <[email protected]>
5876    
5877 bh 1586 Move some of the mock objects in test_baserenderer into their own
5878     module so they can easily be used from other tests
5879    
5880     * test/mockgeo.py: New test helper module with some mock objects
5881     for geometry related things like shapes, shapestores and
5882     projections.
5883    
5884     * test/test_mockgeo.py: New. Tests for the new helper module
5885    
5886     * test/test_baserenderer.py: Some of the mock-objects are in
5887     mockgeo now.
5888    
5889 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
5890    
5891     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
5892    
5893 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
5894    
5895 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
5896    
5897     2003-08-12 Bernhard Herzog <[email protected]>
5898    
5899 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
5900     strings have to be one string literal.
5901    
5902 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
5903    
5904 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
5905     New. This method was used in various derived classes, but it's
5906     better to have it here.
5907    
5908     * test/test_shapefilestore.py
5909     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
5910     FloatComparisonMixin
5911    
5912     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
5913     It's now in FloatComparisonMixin
5914    
5915     * test/test_derivedshapestore.py
5916     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
5917     in FloatComparisonMixin
5918    
5919     2003-08-11 Bernhard Herzog <[email protected]>
5920    
5921 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
5922     error message
5923    
5924 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
5925    
5926 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
5927     with version number.
5928     Changed title to reflect version number of Thuban.
5929    
5930     2003-08-08 Jan-Oliver Wagner <[email protected]>
5931    
5932 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
5933     the list corresponds to the "About" web page.
5934    
5935 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
5936    
5937     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
5938     Make sure translated strings are recognized as one string literal.
5939    
5940     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
5941     Make sure translated strings are recognized as one string literal.
5942    
5943     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
5944     translated strings are recognized as one string literal.
5945    
5946     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5947     sure translated strings are recognized as one string literal.
5948    
5949 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
5950    
5951 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
5952     Simply delegates to the original shapestore.
5953    
5954     * test/test_derivedshapestore.py
5955     (TestDerivedShapeStore.test_raw_format): New. Test case for
5956     DerivedShapeStore.RawShapeFormat
5957    
5958     2003-08-07 Bernhard Herzog <[email protected]>
5959    
5960 bh 1561 Add raw data interface to shape objects.
5961    
5962     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
5963     class to ShapefileShape which now holds shapefile specific
5964     information.
5965     (ShapefileShape.compute_bbox): Simplified to not cache any
5966     information. The way this method is used that shouldn't matter
5967     performance wise.
5968     (ShapefileShape.RawData): New. Return the shapeid which is the raw
5969     data format for shapes from shapefiles.
5970     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
5971     in the shape objects returned by a shapestore. For a
5972     ShapefileStore this is always RAW_SHAPEFILE.
5973     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
5974     method.
5975    
5976     * test/test_shapefilestore.py
5977     (TestShapefileStore.test_raw_format): New test to test the raw
5978     format feature of shapes.
5979    
5980 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
5981     data. It was only there for interface compatibility but it's not
5982 bh 1561 used inside of Thuban and the generic Shape class has gone away.
5983 bh 1560
5984 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
5985     the raw data format and only use an optimized version of its a
5986     shapefile.
5987    
5988 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
5989    
5990 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
5991     tests.
5992     (SimpleShapeStore.Shape): Use SimpleShape instead of
5993     Thuban.Model.data.Shape to make the tests independed of the coming
5994     changes.
5995    
5996     2003-08-07 Bernhard Herzog <[email protected]>
5997    
5998 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
5999     (ThubanTestProgram): New classes that extend the respective
6000     classes from unittest. These new version support skipping tests
6001     under certain expected conditions. In the Thuban test suite we
6002     uses this for tests that require the optional gdal support.
6003     (run_tests): Use ThubanTestProgram instead of the unittest.main()
6004    
6005     * test/runtests.py (main): Use the new ThubanTestRunner instead of
6006     the normal one from unittest
6007    
6008     * test/test_layer.py (TestLayer.test_raster_layer): If this test
6009     is not run because gdal support isn't available report this to the
6010     runner.
6011    
6012     * test/test_baserenderer.py
6013     (TestBaseRenderer.test_raster_no_projection): Do not run this test
6014     if gdal support isn't available and report this to the runner.
6015    
6016 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
6017    
6018     Rearrange the renderers a bit, partly in preparation for changes
6019     required for the postgis merge, partly to make it more testable.
6020     Also make the representation of coordinates in Shapes more
6021     consistent.
6022    
6023     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
6024     this class is now in BaseRenderer. This class is now practically
6025     only a specialization of BaseRenderer for rendering to an actual
6026     wx DC.
6027     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
6028     to get the shapetype specific rendering functions.
6029    
6030     * Thuban/UI/baserenderer.py: New file with the basic rendering
6031     logic. The code in this file is completely independend of wx.
6032     (BaseRenderer): Class with the basic rendering logic
6033    
6034     * test/test_baserenderer.py: New. Test cases for BaseRenderer
6035    
6036     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6037     error_on_redraw to guard agains endless loops and stack overflows
6038     when there's a bug in the rendering code that raises exceptions.
6039     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
6040     rendering into a separate method _do_redraw so that error handling
6041     is a bit easier. When an exception occurs, set error_on_redraw to
6042     true. When it's true on entry to OnIdle do nothing and return
6043     immediately.
6044    
6045     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
6046     Shape object will always have the coordinates as a list of list of
6047     coordinate pairs (tuples).
6048     (Shape.compute_bbox): Adapt to new representation.
6049    
6050     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
6051     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
6052     Shape objects.
6053    
6054     * test/test_shapefilestore.py
6055     (ShapefileStoreTests.assertFloatTuplesEqual)
6056     (ShapefileStoreTests.assertPointListEquals): Rename to
6057     assertPointListEquals and change purpose to checking equality of
6058     the lists returned by Shape.Points().
6059     (TestShapefileStoreArc.test_shape)
6060     (TestShapefileStorePolygon.test_shape)
6061     (TestShapefileStorePoint.test_shape): Use the new
6062     assertPointListEquals instead of assertFloatTuplesEqual
6063    
6064     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
6065     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
6066     and change purpose to checking equality of the lists returned by
6067     Shape.Points().
6068     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
6069     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
6070     (TestLayer.test_derived_store): Use the new assertPointListEquals
6071     instead of assertFloatTuplesEqual
6072    
6073     * test/test_derivedshapestore.py
6074     (TestDerivedShapeStore.assertFloatTuplesEqual)
6075     (TestDerivedShapeStore.assertPointListEquals): Rename to
6076     assertPointListEquals and change purpose to checking equality of
6077     the lists returned by Shape.Points().
6078     (TestDerivedShapeStore.test_shape): Use the new
6079     assertPointListEquals instead of assertFloatTuplesEqual
6080    
6081 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
6082    
6083     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
6084     a bounding box. A dialog is raised in case, no bounding box
6085     is found. This fixes bug #2043:
6086     https://intevation.de/rt/webrt?serial_num=2043
6087    
6088 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
6089    
6090     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
6091     object look like a Color instantiation. Formerly it looked like a
6092     tuple.
6093    
6094     * test/test_color.py (TestColor.test_repr)
6095     (TestColor.test_equality, TestColor.test_inequality): New. test
6096     some more apects of the Color class
6097     (TestTransparent.test_repr, TestTransparent.test_hex)
6098     (TestTransparent.test_equality): New. Test cases for the
6099     Transparent object.
6100    
6101 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
6102    
6103     * Doc/manual/thuban-manual.xml: a number of small improvements.
6104     The resulting file is the version submitted for GREAT-ER II.
6105    
6106 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
6107    
6108 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
6109     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
6110     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
6111    
6112     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
6113     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
6114     (ThubanEndBusyCursor): Add doc-strings
6115    
6116     2003-08-01 Bernhard Herzog <[email protected]>
6117    
6118 bh 1540 First step towards PostGIS integration. More abstraction by movin
6119     more code from the layer to the shapestore. More methods of the
6120     layer are now simply delegated to the equivalent method of the
6121     shapestore. The SHAPETYPE_* constants are now in data not in
6122     layer.
6123    
6124     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6125     (SHAPETYPE_POINT, Shape): Move these constants and classes from
6126     layer.py to data.py
6127     (ShapefileStore.__init__): More Initialization for the new methods
6128     and functionality.
6129     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
6130     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
6131     (ShapefileStore.Shape): New methods that were formerly implemented
6132     in the layer.
6133     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
6134     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
6135     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
6136     equivalents of the new shape methods. These versions are simply
6137     delegated to the original shapstore.
6138    
6139     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6140     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
6141     (Layer.SetShapeStore): Removed the initializatin of instance
6142     variables that were needed for the stuff that's now in
6143     ShapefileStore
6144     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
6145     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
6146     shapestore.
6147    
6148     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
6149     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
6150     instead of layer.
6151    
6152     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
6153    
6154     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
6155    
6156     * test/test_layer.py: Import the SHAPETYPE_* constants from data
6157     instead of layer.
6158     (TestLayer.test_derived_store): Remove the test for the exception
6159     when instantiating the DerivedShapeStore with an incompatible
6160     table which is now in test_derivedshapestore.py. Add some more
6161     tests of the layer methods to determine whether they work for a
6162     DerivedShapeStore as well.
6163    
6164 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
6165    
6166     * Doc/manual/thuban-manual.xml: Fix the list of required packages
6167     by just listing the name and where they can be found.
6168    
6169 frank 1532 2003-07-31 Frank Koormann <[email protected]>
6170    
6171     * Doc/manual/thuban-manual.xml:
6172     Changed the screenshot elements to figure.
6173     Changed some variablelist elements to itemizedlist.
6174     Added section on GDAL formats.
6175    
6176 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
6177    
6178     * Doc/manual/thuban-manual.xml: Added a few sentences about
6179     the Fix Border Color option when generating classes.
6180    
6181 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
6182    
6183     * Thuban/Model/classgen.py: Add docstrings. Rename specific
6184     Ramp instances to use lower_case_style.
6185    
6186     * Thuban/UI/classgen.py: Use renamed Ramp instances.
6187    
6188     * Thuban/UI/classifier.py: Add docstrings.
6189    
6190     * Thuban/UI/dock.py: Add docstrings.
6191    
6192     * test/test_classgen.py: Use renamed Ramp instances.
6193    
6194 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
6195    
6196 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
6197     was never used in Thuban.
6198    
6199     2003-07-30 Bernhard Herzog <[email protected]>
6200    
6201 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
6202     method directly instead of going through the transient_table
6203     method. This faster because transient_table may force the copy of
6204     a DBF file into the transient database and setting a table's title
6205     doesnm't affect the title of the associated transient table, so
6206     this fixes RT #2042
6207    
6208     * Thuban/UI/main.py (__version__): Don't import the already
6209     removed show_exception_dialog.
6210    
6211 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
6212    
6213 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6214     Put back this method and remove the equivalent function since we
6215     are setting the exception hook from within this class (OnInit).
6216    
6217     2003-07-29 Jonathan Coles <[email protected]>
6218    
6219 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
6220     Doc/manual/images/5_2_quantiles.png,
6221     Doc/manual/images/5_2_uniform_dist.png,
6222     Doc/manual/images/5_2_unique_values.png,
6223     Doc/manual/images/8_int_error.png: New screen shots.
6224    
6225     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
6226     some points, and added more screen shots.
6227    
6228 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
6229    
6230 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
6231    
6232     2003-07-29 Bernhard Herzog <[email protected]>
6233    
6234 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
6235     deprecated since before the 0.8 release and isn't used in Thuban
6236     itself anymore.
6237    
6238 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
6239    
6240 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
6241 jonathan 1506
6242     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
6243     python exception hook here so that we are sure to catch any
6244     Thuban exception that happen during initialization.
6245    
6246     * Thuban/UI/main.py (main): Don't set the exception hook here,
6247     it will get set in ThubanApplication.OnInit.
6248    
6249     2003-07-29 Jonathan Coles <[email protected]>
6250 jonathan 1503
6251     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6252     Removed and called it show_exception_dialog() so that the exception
6253     handler can be set before the class is created.
6254    
6255     * Thuban/UI/main.py (main): Install the exception handler before
6256     a ThubanApplication is created.
6257    
6258 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
6259    
6260     * po/it.po: New. Italian translation by Maurizio Napolitano
6261    
6262     * po/ru.po: New. Russian translation by Alex Shevlakov
6263    
6264 frank 1497 2003-07-29 Frank Koormann <[email protected]>
6265    
6266 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
6267     projections.
6268    
6269     2003-07-29 Frank Koormann <[email protected]>
6270    
6271 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
6272    
6273 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
6274    
6275 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
6276     on white background.
6277    
6278     2003-07-29 Jonathan Coles <[email protected]>
6279    
6280 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
6281     descriptions for the legend toolbar.
6282    
6283     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
6284     cursor from dialog box.
6285    
6286     2003-07-28 Jonathan Coles <[email protected]>
6287    
6288     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
6289    
6290     * Doc/manual/images/2_4_session_tree.png,
6291     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
6292     Doc/manual/images/4_2_layer_properties.png,
6293     Doc/manual/images/4_2_raster_layer_properties.png,
6294     Doc/manual/images/5_3_genclass.png,
6295     Doc/manual/images/5_classification.png,
6296     Doc/manual/images/6_projection.png,
6297     Doc/manual/images/7_1_table_view.png,
6298     Doc/manual/images/7_2_5_join.png: New screenshots.
6299    
6300     2003-07-24 Jonathan Coles <[email protected]>
6301    
6302     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
6303    
6304     2003-07-24 Jonathan Coles <[email protected]>
6305    
6306     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
6307     chapter on Layer Management.
6308    
6309     * Doc/manual/Makefile: New. Makefile to generate all formats for the
6310     manual and images.
6311    
6312 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
6313    
6314     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
6315     it annoys lintian which warns about these files not being
6316 jan 1767 executable. The #! isn't necessary here since if you absolutely
6317 bh 1483 must execute them you can always say "python <filename>".
6318    
6319     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
6320     superfluous code to set brush and pen for point shapes
6321    
6322     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
6323     belong in viewport anyway
6324    
6325 frank 1479 2003-07-24 Frank Koormann <[email protected]>
6326    
6327     * Doc/manual/thuban-manual.xml: Added section on table management.
6328    
6329 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
6330    
6331     * test/runtests.py (main): Recognize the long "verbose" option
6332     correctly.
6333    
6334 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
6335    
6336     * Doc/manual/thuban-manual.xml: Continue to write first revision
6337     of the manual.
6338    
6339     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
6340     with Begin/EndDrawing() calls to ensure we aren't doing to
6341     many updates to the dc during rendering.
6342     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
6343     a pen and brush argument so they need to be passed to the function.
6344    
6345     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
6346     Calculates the minimum and maximum scale values. Factored out
6347     of set_view_transform so that it could be used to zoom all the
6348     way into a single point.
6349     (ViewPort.set_view_transform): Call calc_min_max_scales().
6350     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
6351     if only a single point is selected.
6352    
6353     * Doc/manual/images/1_2_legend_close.png,
6354     Doc/manual/images/1_2_legend_dock.png,
6355     Doc/manual/images/1_2_mainwindow.png,
6356     Doc/manual/images/1_2_mainwindow.ps,
6357     Doc/manual/images/1_2_mainwindow.sk,
6358     Doc/manual/images/3_2_fullextent.png,
6359     Doc/manual/images/3_2_fulllayerextent.png,
6360     Doc/manual/images/3_2_fullshapeextent.png,
6361     Doc/manual/images/3_2_pan.png,
6362     Doc/manual/images/3_2_zoomin.png,
6363     Doc/manual/images/3_2_zoomout.png,
6364     Doc/manual/images/3_3_identify.png,
6365     Doc/manual/images/3_3_label.png,
6366     Doc/manual/images/3_5_invisible.png,
6367     Doc/manual/images/3_5_movedown.png,
6368     Doc/manual/images/3_5_moveup.png,
6369     Doc/manual/images/3_5_props.png,
6370     Doc/manual/images/3_5_tobottom.png,
6371     Doc/manual/images/3_5_totop.png,
6372     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
6373    
6374 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
6375    
6376 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
6377    
6378     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
6379     after the new map has been assigned
6380    
6381     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
6382     Delegate MAP_REPLACED to the canvas too
6383     (MainWindow.prepare_new_session): Removed. Thanks to the new
6384     MAP_REPLACED message it's no longer needed
6385     (MainWindow.OpenSession, MainWindow.NewSession):
6386     prepare_new_session has been removed.
6387    
6388     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
6389     MAP_REPLACED so that we can close the dialog if a new map is set.
6390     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
6391     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
6392     dialog
6393    
6394     * test/test_viewport.py (SimpleViewPortTest)
6395     (SimpleViewPortTest.test_default_size): Add doc-strings
6396     (ViewPortTest.setUp): Bind map to self.map so we can use it in
6397     tests. Subscribe to MAP_REPLACED messages too.
6398     (ViewPortTest.tearDown): No need to explicitly unsubscribe
6399     (ViewPortTest.test_set_map): New test for the SetMap method.
6400    
6401     2003-07-18 Bernhard Herzog <[email protected]>
6402    
6403 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
6404     Move this test from ViewPortTest.setUp to this new separate test
6405     case. setUp is not the place for the actual tests.
6406     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
6407     more of the test from setUp to the new test test_inital_settings.
6408     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
6409     (ViewPortTest.test_proj_conv): Split test_proj_conv into
6410     test_win_to_proj and test_proj_to_win and make the tests easier to
6411     understand
6412     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
6413     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
6414     (ViewPortTest.test_unprojected_rect_around_point)
6415     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
6416     Reformat to increase readability.
6417    
6418     2003-07-18 Bernhard Herzog <[email protected]>
6419    
6420 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
6421    
6422     2003-07-18 Bernhard Herzog <[email protected]>
6423    
6424 bh 1459 * test/runtests.py: The test suite can now be run without an X
6425     connection. To make sure this remains true, remove the DISPLAY
6426     environment variable so that an error occurs if the wxGTK is
6427     imported accidentally
6428    
6429     2003-07-18 Bernhard Herzog <[email protected]>
6430    
6431 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
6432    
6433     * Thuban/UI/view.py: Remove unused imports
6434    
6435     2003-07-18 Bernhard Herzog <[email protected]>
6436    
6437 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
6438     function is now in viewport.py and is called output_transform
6439     (TestScalebar.test_output_transform)
6440     (TestScalebar.test_OutputTransform): Renamed to
6441     test_output_transform and updated to use output_transform instead
6442     of OutputTransform
6443    
6444     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
6445     renamed.
6446     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
6447     renamed to output_transform
6448    
6449     * Thuban/UI/viewport.py (OutputTransform, output_transform):
6450     Rename to output_transform
6451    
6452     2003-07-18 Bernhard Herzog <[email protected]>
6453    
6454 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
6455     classificationField to classificatin_column and init it here so
6456     that it can be used in SetClassificationColumn
6457     (Layer.GetClassificationColumn, Layer.GetClassificationField):
6458     Rename to GetClassificationColumn.
6459     (Layer.SetClassificationColumn, Layer.SetClassificationField):
6460     Rename to SetClassificationColumn and issue a LAYER_CHANGED
6461     message if the column changes.
6462     (Layer._classification_changed, Layer.ClassChanged): Rename to
6463     _classification_changed. Update the callers.
6464     (Layer.SetShapeStore): Further field->column renames.
6465    
6466     * Thuban/Model/load.py (SessionLoader.start_classification)
6467     (SessionLoader.start_clpoint): Updates because of
6468     field->column method name changes in the Layer class
6469    
6470     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
6471     because of field->column method name changes in the Layer class
6472    
6473     * Thuban/UI/classifier.py (Classifier.__init__)
6474     (Classifier._OnTry, Classifier._OnRevert): Updates because of
6475     field->column method name changes in the Layer class
6476    
6477     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
6478     because of field->column method name changes in the Layer class
6479    
6480     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
6481     of field->column method name changes in the Layer class
6482    
6483     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
6484     (SaveSessionTest.testClassifiedLayer): Update because of
6485     field->column method name changes in the Layer class
6486    
6487     * test/test_layer.py (SetShapeStoreTests.setUp)
6488     (SetShapeStoreTests.test_sanity): Update because of field->column
6489     method name changes in the Layer class
6490     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
6491     (TestLayerModification.test_sanity)
6492     (TestLayerModification.test_initial_settings): remove unsued code
6493     and rename to test_sanity.
6494     (TestLayerModification.test_set_classification): New test for
6495     SetClassification and SetClassificationField.
6496    
6497     2003-07-18 Bernhard Herzog <[email protected]>
6498    
6499 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
6500     the non-fixed values as well. The old test would have accepted a
6501     fixed ramp that only returnes the fixed properties
6502    
6503 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
6504    
6505     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
6506     shots for the manual. The XCF file is the source image and
6507     has additional layers to support changes.
6508    
6509     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
6510    
6511     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
6512     Return both the new class and the field name.
6513    
6514     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
6515     fit the map to the window as this changes any zoom level that
6516     the user may have set.
6517    
6518 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
6519    
6520     * Thuban/Model/classgen.py (generate_singletons,
6521     generate_uniform_distribution, generate_quantiles): Remove
6522     fixes parameter, but maintain the same functionality by having
6523     the calling function pass a FixedRamp object for the ramp.
6524     (FixedRamp): New. Adapts a ramp to have fixed property values.
6525    
6526     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
6527     (Classification): Inherit from Publisher.
6528     (Classification.__init__): Remove the layer parameter.
6529     Classifications no longer need to have a parent layer.
6530     (Classification.GetField, Classification.GetFieldType,
6531     Classification.SetFieldInfo): Removed. The field name is stored
6532     in the layer, and the type can be retreived by calling
6533     Layer.GetFieldType().
6534     (Classification._set_layer, Classification.GetLayer): Removed.
6535     Classifications no longer have a parent layer.
6536    
6537     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
6538     classification.
6539     (Layer.SetShapeStore): Reset the classification first while
6540     we still have the old shape store to work with.
6541     (Layer.GetClassificationField, Layer.SetClassificationField):
6542     New. Method for getting/setting the field to classify on.
6543     (Layer.SetClassification): Simplified now that the layer
6544     simply has to hold a reference to the classification and not
6545     tell the classification who owns it.
6546     Fixes RTbug #2023.
6547    
6548     * Thuban/Model/load.py (SessionLoader.start_classification):
6549     Set the field name on the layer, not the classification.
6550    
6551     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
6552     classification is modified.
6553    
6554     * Thuban/Model/save.py (SessionSaver.write_classification):
6555     Get the field name and type from the layer.
6556    
6557     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
6558     parameter records to rows and add docstring. Fixes RTbug #1997.
6559    
6560     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
6561     ramp when we need to fix certain values of a ramp rather than
6562     using the old fixes parameter. Fixes RTbug #2024.
6563    
6564     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
6565     parameter.
6566     (ClassTable.Reset): Add fieldType parameter and use it, rather
6567     than asking the classification.
6568     (Classifier.__init__): Remember the original class's field
6569     and ask the layer for the field type, rather than the classification.
6570     (Classifier.__SetGridTable): Retrieve the field and field type
6571     for the table because they are not in the classification.
6572     (Classifier._OnTry, Classifier._OnRevert): Set the classification
6573     field on the layer in addition to the classification itself.
6574    
6575     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
6576     classification field from layer.
6577    
6578     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
6579     classification field from layer. Split up tests and remove
6580     *-imports. Fixes RTbug #1992.
6581    
6582     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
6583    
6584     * test/test_classification.py
6585     (TestClassification.test_classification): Remove tests for methods
6586     that no longer exist.
6587    
6588     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
6589     __init__ no longer has a field parameter, use SetClassificationField.
6590     (SetShapeStoreTests.test_sanity): Use layer object to get class
6591     field info.
6592    
6593     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
6594     SetClassificationField on layer to set class field info.
6595    
6596     * test/test_viewport.py: Renamed from test/test_view.py.
6597    
6598 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
6599    
6600     * Doc/manual/thuban-manual.xml: Added authors and an initial
6601     coarse structure.
6602    
6603 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
6604    
6605 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
6606     and therefore should not be derived from any other class.
6607    
6608     * test/test_range.py (RangeTest): FloatComparisonMixin is a
6609     mix-in, so derive from TestCase as well.
6610    
6611     2003-07-15 Bernhard Herzog <[email protected]>
6612    
6613 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
6614     draw_func handling a bit to remove one layer of indirection. This
6615     makes the renderer about 10% faster in the non-classifying case
6616     and the code a bit cleaner
6617     (MapRenderer.draw_point_shape): Add the pen and brush parameters
6618     and set them in the dc. Now the draw_point_shape method and
6619     wxproj's draw_polygon_shape function have basically the same
6620     signature so that both can be directly used as draw_func
6621    
6622     2003-07-15 Bernhard Herzog <[email protected]>
6623    
6624 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
6625     string values (in addition to the labels) as UTF 8
6626    
6627     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
6628     values if the field type is string
6629    
6630     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
6631     saving a session with non-ascii string classification values.
6632    
6633     * test/test_load.py (TestClassification.file_contents)
6634     (TestClassification.test): Check for non-ascii values in string
6635     classifications
6636    
6637 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
6638    
6639     * test/test_view.py: New. Tests for ViewPort.
6640    
6641 frank 1409 2003-07-14 Frank Koormann <[email protected]>
6642    
6643     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
6644     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
6645    
6646 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
6647     unicode strings from session file: session title, map title and
6648     projection name.
6649    
6650 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
6651    
6652 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
6653     drag_stop, not drag_move when the mouse is released.
6654    
6655     2003-07-10 Jonathan Coles <[email protected]>
6656    
6657 jonathan 1403 The most important part of this is the seperation of view.py into
6658     two pieces. viewport.py now has a class called ViewPort which
6659     contains all the non-wx parts of view.py and can therefore be
6660     tested. view.py contains only the wx-specific parts and is fairly
6661     simple.
6662    
6663     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
6664     RTTbug #1992.
6665     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
6666     RTTbug #1992.
6667    
6668     * Thuban/Model/classgen.py (generate_singletons,
6669     generate_uniform_distribution, generate_quantiles):
6670     Added 'fixes' parameter so that property attributes can
6671     be held constant over the generated classification groups.
6672     (CustomRamp.GetProperties): Remove unused variables.
6673    
6674     * Thuban/Model/map.py (Map.SetProjection): Send the old
6675     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
6676     event.
6677    
6678     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
6679     parameter which is a list of records that restricts which
6680     records are saved. Fixes RTbug #1997.
6681    
6682     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6683     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
6684    
6685     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
6686     to allow the user to fix line color/width on generated groups.
6687     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
6688     functions to optionally fix group properties.
6689    
6690     * Thuban/UI/main.py (main): Set exception hook to the
6691     ShowExceptionDialog. Fixes RTbug #1993.
6692    
6693     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
6694     the table window when it is selectd to be shown.
6695    
6696     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
6697     Export Selection button and move the export buttons underneath
6698     the table.
6699     (QueryTableFrame.UpdateStatusText): Added event argument so
6700     that it can respond to grid selection events. The status text
6701     is now updated even when the table is not associated with a
6702     layer as was previously assumed.
6703     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
6704     UpdateStatusText responds to these events.
6705     (QueryTableFrame.OnSaveAs): Renamed to doExport.
6706     (QueryTableFrame.doExport): Helper function that saves the
6707     entire table, or selected rows, to a file.
6708     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
6709     Respond to export button events and call doExport.
6710    
6711     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
6712     the function doesn't return NULL without first setting a Python
6713     Error.
6714    
6715     * test/runtests.py (main): Only print "Unknown option" for
6716     unsupported options.
6717    
6718     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
6719     optional epsilon argument to specify floating point accuracy.
6720     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
6721     for each item test.
6722    
6723     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
6724     tests for saving selected records.
6725    
6726     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6727     tests for saving selected records.
6728    
6729     * test/test_map.py (TestMapWithContents.test_set_projection):
6730     MAP_PROJECTION_CHANGED events send the old projection.
6731    
6732     * test/test_session.py
6733     (TestSessionWithContent.test_forward_map_projection):
6734     MAP_PROJECTION_CHANGED events send the old projection.
6735    
6736     * test/test_table.py (TableTest): Update tests to use non-deprecated
6737     functions.
6738    
6739 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
6740    
6741 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
6742     constants in the column objects are the standard ones defined in
6743     the table module.
6744    
6745     * test/test_transientdb.py
6746     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
6747     exporting transient tables as DBF works. This should catch the bug
6748     just fixed in TransientTableBase.Width.
6749    
6750     2003-07-08 Bernhard Herzog <[email protected]>
6751    
6752 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
6753     interpolated colors correctly.
6754    
6755     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
6756     New. Test case for the fix in classgen.py
6757    
6758     2003-07-08 Bernhard Herzog <[email protected]>
6759    
6760 bh 1378 * test/runtests.py (main): Make the default output less verbose
6761     and add a verbosity option (-v) to get the old output
6762    
6763     2003-07-08 Bernhard Herzog <[email protected]>
6764    
6765 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
6766     0.9.
6767    
6768     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
6769     New. Return the join type
6770    
6771     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
6772     DTD
6773     (SessionSaver.write_data_containers): Save the join type for
6774     joined tables
6775    
6776     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
6777     namespace
6778     (SessionLoader.start_jointable): Handle the jointype attribute
6779    
6780     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
6781     as of Thuban 0.8. These are now tests to determine whether Thuban
6782     can still read files generated by Thuban 0.8
6783    
6784     * test/test_load.py (LoadSessionTest.dtd)
6785     (TestSingleLayer.file_contents)
6786     (TestLayerVisibility.file_contents, TestLabels.file_contents)
6787     (TestLayerProjection.file_contents)
6788     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
6789     (TestJoinedTable.file_contents)
6790     (TestLoadError.file_contents): Update for new DTD
6791     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
6792     for new join type attribute
6793    
6794     * test/test_save.py (SaveSessionTest.dtd)
6795     (SaveSessionTest.testEmptySession)
6796     (SaveSessionTest.testSingleLayer)
6797     (SaveSessionTest.testLayerProjection)
6798     (SaveSessionTest.testRasterLayer)
6799     (SaveSessionTest.testClassifiedLayer)
6800     (SaveSessionTest.test_dbf_table)
6801     (SaveSessionTest.test_joined_table): Update for new DTD
6802     (SaveSessionTest.test_joined_table): Add test for new join type
6803     attribute
6804    
6805 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
6806    
6807     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
6808     function for table_to_dbf
6809     (table_to_dbf): Deal with names longer than the 10 character limit
6810    
6811     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6812     doc-string
6813     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
6814     long column names
6815    
6816 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
6817    
6818 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
6819    
6820     2003-07-03 Bernhard Herzog <[email protected]>
6821    
6822 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
6823     for the Thuban manual and README with some basic information about
6824     the manual
6825    
6826     2003-07-03 Bernhard Herzog <[email protected]>
6827    
6828 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6829     Update doc-string
6830     (TransientJoinedTable.create): Do not modify the column objects of
6831     the input tables in place and copy all columns of the input tables
6832     into the joined table after all.
6833    
6834     * test/test_transientdb.py
6835     (TestTransientTable.test_transient_joined_table_same_column_name):
6836     Update to reflect the new behavior
6837     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6838     Update to reflect the new behavior
6839     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
6840     New test case for a bug which modified the column objects in place
6841    
6842 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
6843 jonathan 1349
6844 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
6845     generate_uniform_distribution, generate_quantiles,
6846 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
6847     one, otherwise we could divide by zero.
6848    
6849     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
6850     ClassGenTest.doClassSingleTest): Call doBoundsTest to
6851     check the end classification groups against the
6852     proper property values.
6853     (ClassGenTest.doBoundsTest): New. Checks the first and
6854     last classification groups to make sure their properties
6855     are the correct upper and lower bounds for a color ramp.
6856    
6857     2003-07-02 Jonathan Coles <[email protected]>
6858    
6859     * Thuban/Model/classgen.py (generate_singletons,
6860     generate_uniform_distribution, generate_quantiles,
6861 jonathan 1360 GenQuantiles0): The denominator was one to high when
6862     calculating the index for the ramp causing the index
6863     to never to reach one.
6864    
6865     2003-07-02 Jonathan Coles <[email protected]>
6866    
6867 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
6868     ClassGroupRange.SetRange() so that the min/max values are
6869     passed as a tuple. This makes a better calling scheme for
6870     when a Range object is passed instead.
6871    
6872     * Thuban/Model/classgen.py: Fixed parameters to
6873     ClassGroupRange constructor.
6874    
6875     * Thuban/Model/classification.py (ClassGroupRange.__init__):
6876     Consolidate the min/max parameters into a single _range which
6877     can either be a tuple or a Range object.
6878     (ClassGroupRange.SetRange): Consolidate the min/max parameters
6879     into a single _range which can either be a tuple or a Range object.
6880    
6881     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
6882     call to ClassGroupRange constructor to use a tuple.
6883    
6884     * Thuban/Model/layer.py (Layer.SetClassification): Switch
6885     the classification instance variable to the new class
6886     before calling _set_layer otherwise subscribers to a
6887     LAYER_CHANGED event will not see any difference.
6888    
6889     * test/test_classification.py: Fix tests of ClassGroupRange
6890     so that they use the new signature.
6891    
6892     * test/test_load.py: Fix use of ClassGroupRange so that it
6893     uses the new signature.
6894    
6895     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
6896     uses the new signature.
6897    
6898     * test/test_save.py: Fix use of ClassGroupRange so that it
6899     uses the new signature.
6900    
6901    
6902     2003-07-01 Jonathan Coles <[email protected]>
6903    
6904 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
6905     Import used objects/class from color.
6906     (generate_singletons): We don't
6907     need the numGroups parameter anymore because we are using
6908     the new ramps with GetProperties().
6909     (generate_uniform_distribution): Use new ramp method
6910     GetProperties().
6911     (generate_quantiles, GenQuantiles0): Use new ramp method
6912     GetProperties().
6913     (CustomRamp.SetNumGroups): Removed. The ramps now map
6914     a value from 0 to 1 to class properties so the number
6915     of groups is not needed ahead of time.
6916     (CustomRamp.next): Removed. CustomRamp does not support
6917     interation anymore.
6918     (CustomRamp.GetProperties): Returns a ClassGroupProperties
6919     object based on the index value from 0 to 1 that is
6920     passed to it.
6921     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
6922     Made into instances of Monochromatic class instread of
6923     deriving from it.
6924     (HotToCold.SetNumGroups): Removed. See CustomRamp.
6925     (HotToCold.next): Removed. See CustomRamp.
6926    
6927     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
6928     (Classification.SetField, Classification.SetFieldType):
6929     Replaced with SetFieldInfo.
6930     (Classification.SetFieldInfo): New. Does a better job of
6931     what SetField and SetFieldType used to do by combining
6932     their function since they should really always be done
6933     at the same time.
6934     (Classification.SetLayer): Renamed to _set_layer.
6935     (Classification._set_layer): Should only be called from
6936     Layer's SetClassification. This does not cause a recursive
6937     call as SetLayer did because we know that Layer knows about
6938     the classification.
6939    
6940     * Thuban/Model/color.py: Fixes RTbug #1971.
6941     (_Transparent): Renamed from Transparent so it doesn't
6942     conflict with the module variable.
6943     (Transparent, Black): Renamed from Color.Transparent,
6944     Color.Black so they are not class variables.
6945    
6946     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
6947     (Layer.Destroy): We don't need to call SetClassification
6948     anymore to clear out the back reference in the classifcation
6949     to the layer. It's better to set it to None using _set_layer,
6950     and we won't be creating another clas object too.
6951     (Layer.SetClassification): Classification._set_layer is not
6952     recursive so remove all the locking variables. Also clean
6953     up the code so that it remains unchanged if something fails.
6954    
6955     * Thuban/Model/load.py: Fixes RTbug #1971.
6956     (SessionLoader.start_classification): Call
6957     Classification.SetFieldInfo().
6958    
6959     * Thuban/Model/save.py: Removed import of Color which wasn't
6960     being used.
6961    
6962     * Thuban/UI/classgen.py: Fixes RTbug #1972.
6963     (ClassGenDialog.__init__): Color ramps are now instances
6964     already so we don't need to create any new objects.
6965     (ClassGenDialog.OnOK): Check for numGroups is no longer
6966     necessary because we never use it.
6967    
6968     * Thuban/UI/classifier.py: Fixes RTbug #1971.
6969     (Classifier.__BuildClassification, Classifier.__SetGridTable):
6970     Call Classification.SetFieldInfo() instead of SetFieldType.
6971    
6972     * Thuban/UI/renderer.py: Fixes RTbug #1971.
6973    
6974     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
6975     (MapCanvas.__init__): Subscribe to the idle time event. Set
6976     background color to white.
6977     (MapCanvas.OnPaint): Set a flag indicating that we should
6978     render the map during idle time. If we already have a bitmap
6979     just draw it now.
6980     (MapCanvas.OnIdle): New. Render the map only during idle time.
6981     This also fixes a problem with the busy cursor under gtk.
6982    
6983     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
6984     Fix calls to generate_singletons because the signature changed.
6985    
6986     * test/test_classification.py: Fix color references and
6987     change calls to Classification.[SetField|SetFieldType] to
6988     SetFieldInfo.
6989    
6990     * test/test_load.py: Fix color references.
6991    
6992     * test/test_load_0_2.py: Fix color references.
6993    
6994     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
6995     Change calls to Classification.[SetField|SetFieldType] to
6996     SetFieldInfo.
6997    
6998 frank 1334 2003-07-01 Frank Koormann <[email protected]>
6999    
7000     MERGE from the greater-ms3 branch.
7001    
7002     * test/test_transientdb.py
7003     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
7004     New. Test join of two tables with partly equal column names.
7005    
7006     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
7007     If duplicates in left and right tables column names are found,
7008     append '_' (underscores) to the name until it is unique.
7009     Create always new internal names for the resulting table and reference
7010     columns in the join statement with <table>.<column>
7011    
7012 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
7013    
7014     * test/test_transientdb.py
7015     (TestTransientTable.test_transient_joined_table_same_column_name):
7016     New. Test whether joining on columns with the same names in both
7017     tables works.
7018 frank 1334
7019 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
7020     sure to use the right internal names even when joining on field
7021     with the same names in both tables. Also, detect duplicate names
7022     in the joined table correctly.
7023    
7024 frank 1325 2003-07-01 Frank Koormann <[email protected]>
7025    
7026     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
7027     Reverse List of layers to render in same order as in desktop legend.
7028    
7029 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
7030    
7031 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
7032     and splits it into a tuple of at most three integers.
7033     Used make_tuple() to make tuple versions of the version
7034     numbers.
7035    
7036     * Thuban/UI/about.py: Add Thuban email addresses.
7037    
7038     2003-06-30 Jonathan Coles <[email protected]>
7039    
7040 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
7041     were too high.
7042    
7043     2003-06-30 Jonathan Coles <[email protected]>
7044    
7045 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
7046    
7047     * MANIFEST.in: Added Projections so that default.proj is
7048     included.
7049    
7050 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
7051    
7052     New About box with lots more information including library
7053     versions and credits. More/better version checking before
7054     Thuban starts.
7055    
7056     * Thuban/UI/about.py: New. New About box that displays
7057     library version information and credits.
7058    
7059     * Thuban/version.py: Added new 'versions' dictionary which
7060     contains the verions of various libraries which are checked
7061     when the module loads.
7062     (verify_versions): Check all version numbers and returns
7063     a list of errors.
7064    
7065     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
7066     Reset the status of the buttons as the situation warrants,
7067     but in a better more reliable way by not relying on the
7068     current status to determine what needs to change.
7069    
7070     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
7071     (verify_versions): Remove most of the code since it is
7072     now in Thuban.version.verify_versions.o
7073    
7074     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
7075     About box in Thuban.UI.about.
7076    
7077     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
7078     Returns the version of gdal library being used as a string.
7079    
7080     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
7081     Removed.
7082     (get_proj_version): Return the version of PROJ that the file
7083     was compiled with.
7084     (get_gtk_version): Return th version of GTK that the file
7085     was compiled with.
7086    
7087 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
7088    
7089     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
7090     of the SelectPropertiesDialog should be self so the window
7091     appears on top.
7092     (ClassGroupPropertiesCtrl.DoEdit): The parent
7093     of the SelectPropertiesDialog should be self so the window
7094     appears on top.
7095    
7096     * Thuban/UI/resource.py: Cleaned up how we determine file
7097     extensions.
7098     (GetImageResource): Return an wxImage from our Resources.
7099    
7100 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
7101    
7102     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
7103     Check that a layer has a classification before trying
7104     to get it. Raster layers don't have classifications.
7105    
7106 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
7107 jonathan 1297
7108     * setup.py: Add Resources/XML to resource list.
7109    
7110     2003-06-23 Jonathan Coles <[email protected]>
7111 jonathan 1286
7112 jonathan 1297 * setup.cfg: Fix copyright dates
7113    
7114     2003-06-23 Jonathan Coles <[email protected]>
7115    
7116 jonathan 1294 * MANIFEST.in: Update with Resources/XML
7117    
7118     * setup.py: Don't include Locale resources yet as we don't
7119     have any and it causes problems building the distribution
7120     for Windows. Update version to 0.8.0.
7121    
7122     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
7123    
7124     * Thuban/UI/mainwindow.py: Add blank line at the end because
7125     file was not being read correctly building the Windows
7126     distribution.
7127    
7128     2003-06-23 Jonathan Coles <[email protected]>
7129    
7130 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
7131    
7132     * Thuban/version.py: Temporarily update longversion for
7133     the 0.8 release so that it doesn't have the cvs revision.
7134    
7135     2003-06-23 Jonathan Coles <[email protected]>
7136    
7137 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
7138     to make sure that we don't create reentrant possibilities with
7139     wxYield.
7140    
7141     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
7142     directly to avoid the wxSafeYield() call which generates an
7143     OnPaint event causing infinite recursion. Don't try to catch
7144     exception anymore. This was for before there were limits on map
7145     scaling.
7146    
7147 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
7148    
7149     Bug fix for RT #1961:
7150    
7151     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
7152     Register DerivedShapestores with the session
7153    
7154     * Thuban/Model/session.py (Session.Tables): Make sure each table
7155     is only listed once.
7156    
7157     * test/test_load.py (TestJoinedTable.test): Add check_format call.
7158     Update file contents to match the one written out.
7159    
7160 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
7161    
7162     * test/xmlsupport.py (SaxEventLister.startElementNS)
7163     (SaxEventLister.endElementNS): Do not include the qname. Python
7164     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
7165     is (presumably incorrectly) None, whereas it's a string with the
7166     element name in the later versions.
7167    
7168     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
7169     (TestEventList.test_even_list_namespace): Update tests to reflect
7170     the new behaviour
7171     (TestEventList.test_even_list_id_normalization): Fix doc-string
7172    
7173 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
7174    
7175 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
7176     by deriving classes to determine if that layer supports shapes.
7177     (Layer): Override HasShapes and return true.
7178    
7179     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
7180     instead of a direct call to wx[Begin|End]CusyCursor().
7181     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
7182     table data.
7183    
7184     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
7185     New. Wrappers around the wxWindows functions that allow us to
7186     make additional calls such as wxYield which gives the native
7187     system a chance to update the cursor correctly.
7188    
7189     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
7190     instead of a direct call to wx[Begin|End]CusyCursor().
7191    
7192     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
7193     instead of a direct call to wx[Begin|End]CusyCursor().
7194     (MapCanvas.find_shape_at): Check if the current search layer
7195     support shapes, otherwise go on to the next layer.
7196    
7197     * test/test_layer.py: Add tests in each type of layer for
7198     HasClassification() and HasShapes()
7199    
7200     2003-06-20 Jonathan Coles <[email protected]>
7201    
7202 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
7203     turning on the busy cursor to allow the system to change the
7204     cursor before we begin painting. This fixes a problem that
7205     was occuring only under GTK. Fixes RTbug #1840.
7206    
7207 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
7208    
7209     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
7210     version.
7211    
7212     * Thuban/Model/save.py (sort_data_stores): New. Make topological
7213     sort of the data sources so they can be written with sources that
7214     data sources that depend on other data sources come after the
7215     sources they depend on.
7216     (SessionSaver.__init__): Add idmap instance variable to map from
7217     objects to the ids used in the file.
7218     (SessionSaver.get_id, SessionSaver.define_id)
7219     (SessionSaver.has_id): New. Methods to manage the idmap
7220     (SessionSaver.write): Use thuban-0.8.dtd
7221     (SessionSaver.write_session): Add a namespace on the session and
7222     write out the data sources before the maps.
7223     (SessionSaver.write_data_containers): New. Write the data
7224     containers.
7225     (SessionSaver.write_layer): Layer elements now refer to a
7226     shapestore and don't contain filenames anymore.
7227    
7228     * Thuban/Model/load.py (LoadError): Exception class to raise when
7229     errors in the files are discovered
7230     (SessionLoader.__init__): Define dispatchers for elements with a
7231     thuban-0.8 namespace too.
7232     (SessionLoader.check_attrs): New helper method to check and
7233     convert attributes
7234     (AttrDesc): New. Helper class for SessionLoader.check_attrs
7235     (SessionLoader.start_fileshapesource)
7236     (SessionLoader.start_derivedshapesource)
7237     (SessionLoader.start_filetable, SessionLoader.start_jointable):
7238     Handlers for the new elements in the new fileformat
7239     (SessionLoader.start_layer): Handle the shapestore attribute in
7240     addition to filename.
7241     (SessionLoader.start_table, SessionLoader.end_table): Removed.
7242     They were never used in the old formats and aren't needed for the
7243     new.
7244    
7245     * Thuban/Model/session.py (Session.DataContainers): New method to
7246     return all "data containers", i.e. shapestores and tables
7247    
7248     * test/xmlsupport.py (SaxEventLister.__init__)
7249     (SaxEventLister.startElementNS, sax_eventlist): Add support to
7250     normalize IDs.
7251    
7252     * test/test_xmlsupport.py
7253     (TestEventList.test_even_list_id_normalization): New test case for
7254     id normalization
7255    
7256     * test/test_load.py (LoadSessionTest.check_format): Use ID
7257     normalization
7258     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
7259     class atrributes used for ID normalization
7260     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
7261     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
7262     file format
7263     (TestJoinedTable): New test for loading sessions with joined
7264     tables.
7265     (TestLoadError): New. Test whether missing required attributes
7266     cause a LoadError.
7267    
7268     * test/test_save.py (SaveSessionTest.thubanids)
7269     (SaveSessionTest.thubanidrefs): New class attributes for ID
7270     normalization in .thuban files.
7271     (SaveSessionTest.compare_xml): Use id-normalization.
7272     (SaveSessionTest.testEmptySession)
7273     (SaveSessionTest.testLayerProjection)
7274     (SaveSessionTest.testRasterLayer)
7275     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
7276     (SaveSessionTest.testLayerProjection): The filename used was the
7277     same as for testSingleLayer. Use a different one.
7278     (SaveSessionTest.test_dbf_table)
7279     (SaveSessionTest.test_joined_table): New test cases for saving the
7280     new data sources structures.
7281     (TestStoreSort, MockDataStore): Classes to test the sorting of the
7282     data stores for writing.
7283    
7284     * test/runtests.py: Add CVS keywords
7285    
7286 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
7287    
7288 jonathan 1267 * test/test_session.py
7289     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
7290     Use the cultural_landmark-point.dbf file for the store so that
7291     the table rows and shape count match.
7292    
7293     2003-06-20 Jonathan Coles <[email protected]>
7294    
7295 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
7296     an exception if the number of shapes is different from the
7297     number of rows in the table. Address RTbug #1933.
7298    
7299     * test/test_layer.py (TestLayer.test_derived_store): Add
7300     a test for the new exception in DerivedShapeStore.__init__.
7301    
7302     * test/support.py (FloatTestCase): Removed since there is
7303     already FloatComparisonMixin. Fixes RTbug #1954.
7304     (FloatComparisonMixin.assertFloatEqual): Include test for
7305     infinity that was part of FloatTestCase.
7306    
7307     * test/test_range.py (RangeTest): Inherit from
7308     support.FloatComparisonMixin now that we don't have
7309     support.FloatTestCase.
7310    
7311 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
7312    
7313 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
7314     the implementation in xmlsupport instead.
7315     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
7316    
7317     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
7318     of test_save
7319    
7320     2003-06-20 Bernhard Herzog <[email protected]>
7321    
7322 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
7323     method to make sure the test files we load might have been written
7324     by the current thuban version.
7325     (ClassificationTest.TestLayers, TestSingleLayer.test)
7326     (TestLayerVisibility.test, TestClassification.test)
7327     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
7328     Add check_format() calls and fix the thuban data to match the data
7329     that would be written by saving the session loaded from it.
7330    
7331     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
7332     the same class and function in test_save.
7333    
7334     * test/test_xmlsupport.py (TestEventList): New. test cases for
7335     sax_eventlist
7336    
7337     2003-06-20 Bernhard Herzog <[email protected]>
7338    
7339 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
7340     Thuban are covered by this DTD
7341     (map): Fix content model for layers and raster layers. There can
7342     be any number or layers and raster layers in any order.
7343    
7344 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
7345    
7346 jonathan 1265 This is mainly about fixing RTbug #1949.
7347    
7348 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
7349     import statement since python 2.2 is the earliest supported
7350     version.
7351    
7352     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
7353     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
7354     depending on the units this projection *forwards* into.
7355    
7356     * Thuban/Model/save.py (SessionSaver.write_classification):
7357     Remove unnecessary use of lambdas and nested functions.
7358    
7359     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
7360     adjustment here if the map projection uses degrees.
7361    
7362     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
7363     scale adjust code since it is now done before calling
7364     this method. Don't do anything if the map projection
7365     is None.
7366    
7367 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
7368    
7369 bh 1248 Move version specific load tests to their own file.
7370    
7371     * test/test_load.py: Expand the doc-string to explain a bit how to
7372     handle file format changes.
7373     (TestClassification.test): Update the docstring as this test is
7374     not about Thuban 0.2 anymore.
7375    
7376     * test/test_load_0_2.py: New file with the load tests for thuban
7377     files created with Thuban 0.2 and earlier.
7378    
7379     2003-06-19 Bernhard Herzog <[email protected]>
7380    
7381 bh 1246 Add XML validation to some of the tests. Validation will only be
7382     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
7383     To make the DTD available to the test cases it's moved into
7384     Resources/XML
7385    
7386     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
7387     for versions up to and including 0.2. Two slight changes: added an
7388     encoding specification and fixed the comment which refered to
7389     GRASS, not Thuban
7390    
7391     * test/xmlsupport.py: New support module for tests involving XML.
7392     Currently there's a mix-in class for XML validation.
7393    
7394     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
7395    
7396     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
7397     so that we can validate the
7398     (SaveSessionTest.testEmptySession)
7399     (SaveSessionTest.testSingleLayer)
7400     (SaveSessionTest.testSingleLayer)
7401     (SaveSessionTest.testLayerProjection)
7402     (SaveSessionTest.testRasterLayer)
7403     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
7404    
7405     * test/runtests.py (main): Call print_additional_summary instead
7406     of print_garbage_information
7407    
7408     * test/support.py (resource_dir): New function to return the
7409     "Resource" subdirectory
7410     (print_additional_summary): New function to combine several
7411     summary functions
7412     (run_tests): Use print_additional_summary instead of calling
7413     print_garbage_information directly
7414    
7415     2003-06-19 Bernhard Herzog <[email protected]>
7416    
7417 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
7418     the classification element.
7419     (projection): Add the "name" attribute
7420    
7421 frank 1242 2003-06-19 Frank Koormann <[email protected]>
7422    
7423     MERGE from the greater-ms3 branch.
7424    
7425     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
7426     scale if projection is latlong to get better estimate.
7427    
7428     Fix problem of hidden properties dialog under windows after double
7429     click on layer tree:
7430     The tree control always gets an Expanded / Collapsed event after
7431 joey 2162 the ItemActivated on double click, which raises the main window again.
7432     We add a second ItemActivated event to the queue, which simply
7433 frank 1242 raises the already displayed window.
7434    
7435     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
7436     raiseProperties initialized to prevent endless loops
7437     (LegendTree._OnItemActivated): Depending on self.raiseProperties
7438     simply raise the properties or open the dialog and issue a second
7439     event.
7440    
7441 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
7442    
7443 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
7444    
7445     2003-06-18 Jonathan Coles <[email protected]>
7446    
7447 jonathan 1235 When Thuban loaded the map was redrawn twice because the
7448     legend was being opened after the mainwindow was created
7449     and not during its creation. This meant the map was drawn
7450     initially and then had to be redrawn when the legend
7451     caused the display to change. Now the legend is opened
7452     in the mainwindow constructor which resolves this issue.
7453    
7454     Also, although we were checking for the existence of
7455     gdal and gdalwarp modules, the gdalwarp extension was
7456     still being compiled (which may fail if the system doesn't
7457     have gdal installed). the build_ext command to setup.py
7458     now accepts the flags --with-gdal and --without-gdal.
7459     If --without-gdal is specified setup.py will try to
7460     use the gdal parameters specified by gdal-config. Under
7461     windows, those parameters have to be set in setup.py
7462     as with proj4 an wxWindows.
7463    
7464     * setup.py: Use a list instead of seperate variables for
7465     extension parameters so we can create a generic function
7466     that runs an appropriate *-config script.
7467     (run_cs_script): Renamed from run_wx_script and modified
7468     to accept a second argument which is a list of lists to
7469     be filled in by the values returned from running the command.
7470     (thuban_build_ext): New. Extends the build_ext command and
7471     provides the options --with-gdal/--without-gdal which then
7472     optionally includes the gdalwarp extension.
7473    
7474     * Thuban/Model/resource.py: First check if we can import
7475     the gdalwarp Thuban extension before checking for gdal.
7476     Also added some comments.
7477    
7478     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
7479     the map is None which may be the case if none has been loaded
7480     yet.
7481    
7482     * Thuban/UI/main.py (main): Remove call to ShowLegend.
7483    
7484     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
7485    
7486     * Thuban/UI/renderer.py: Check for gdal support before importing
7487     gdalwarp.
7488     (MapRenderer.render_map): Only try to optimize if we have gdal
7489     support otherwise nothing will get drawn.
7490    
7491 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
7492     during startup before a map has been created. Check if map is None
7493     before using it and do nothing if it is.
7494    
7495 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
7496    
7497     Fix the problem with raster layers under Windows that caused
7498     Thuban to crash. The view should respond to layer projection
7499     changed events to update the display. Changes to a projection
7500     should not cause the map to be set to full extent.
7501    
7502     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7503     current_map_proj to remember the current map projection so that
7504     when the projection changes we know what the previous projection
7505     was.
7506     (MapCanvas.SetMap): Unsubscribe and subscribe to
7507     LAYER_PROJECTION_CHANGED events.
7508     (MapCanvas.projection_changed): Split into two methods that respond
7509     to map and layer projection changes.
7510     (MapCanvas.map_projection_changed): New. Takes the current view and
7511     projects it using the new projection. This does not cause the
7512     map to be redrawn at full extent.
7513     (MapCanvas.layer_projection_changed): New. Cause a redraw which
7514     will draw each layer in its new projection.
7515    
7516     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
7517     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
7518     under Windows.
7519    
7520     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
7521     to twice sizeof(void*) because there are two digits for each
7522     hex byte.
7523    
7524 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
7525    
7526     Update to the layer interface: Direct access to the table,
7527     shapetable, shapefile and filename attributes is now actively
7528     deprecated by issuing deprecation warnings for all places where
7529     this happens.
7530    
7531     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
7532     to the instance variables table, shapetable, shapefile and
7533     filename via __getattr__ so that we can issue a deprecation
7534     warning.
7535     (Layer.SetShapeStore): Don't set the deprecated instance variables
7536     any more
7537     (Layer.SetShapeStore): Don't use deprecated layer instance
7538     variables
7539     (Layer.Destroy): No need to explicitly remove the instance
7540     variables any more
7541     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
7542     instance variables
7543    
7544     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7545     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
7546     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
7547     use deprecated layer instance variables
7548    
7549     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
7550     deprecated layer instance variables
7551    
7552     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7553     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
7554     instance variables
7555    
7556     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
7557     deprecated layer instance variables
7558    
7559     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
7560     deprecated layer instance variables
7561    
7562     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
7563     deprecated layer instance variables
7564    
7565     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
7566     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
7567     variables
7568    
7569     * test/runtests.py (main): Turn Thuban's deprecation warnings into
7570     errors so that they're cought by the tests
7571    
7572     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
7573     layer instance variables
7574    
7575 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
7576    
7577     Fix a problem under Windows whereby if the user double-clicks on a
7578     layer in the legend that tree item will expand or collapse as well
7579     as open the layer properties dialog. The state of the tree item
7580     should not be affected.
7581    
7582     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
7583     preventExpandCollapse and subscribe to expanding and collapsing
7584     events.
7585     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
7586     collapsing events and will veto the event if it has been triggered
7587     by the user double clicking on a layer.
7588     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
7589     that an expanding/collapsing event should be vetoed.
7590    
7591 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
7592    
7593     * Thuban/UI/classifier.py (Classifier.OnClose)
7594     (Classifier.map_layers_removed)
7595     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
7596     in OnClose and not in map_layers_removed or
7597     layer_shapestore_replaced to make sure it always happens when the
7598     dialog is closed
7599    
7600 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
7601    
7602 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
7603     the background of the table view appears correctly.
7604    
7605     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
7606     object that can be used by derived classes to place any
7607     controls (including the grid) onto.
7608     (QueryTableFrame.__init__): Use the panel as the parent window
7609     for all the controls. Reparent the grid so that the panel is
7610     the parent. Call UpdateStatusText() to correctly initialize
7611     the status bar.
7612    
7613     2003-06-13 Jonathan Coles <[email protected]>
7614    
7615 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
7616     from wxFrame (as opposed to wxDialog like the other classes)
7617     but otherwise behaves like the other classes. This is needed
7618     for the TableView which isn't really a dialog and needs to
7619     have a status bar and control buttons.
7620    
7621     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
7622     instance variable to keep track of how many rows are selected.
7623     Subscribe once to the the events we are interested in.
7624     (ThubanGrid.OnRangeSelect): Only handle event if event handling
7625     hasn't been turned off.
7626     (ThubanGrid.OnSelectCell): Only handle event if event handling
7627     hasn't been turned off.
7628     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
7629     as an event listener (which changes the event handler stack)
7630     simply set an instance variable to False. This is checked in
7631     the event handlers.
7632     (ThubanGrid.GetNumberSelected): Return the number of currently
7633     selected rows.
7634     (TableFrame): Inherit from ThubanFrame so we can have a
7635     status bar and control buttons.
7636     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
7637     Explicitly set which items are selected in the operator choice and
7638     action choice so there is always a valid selection. Fixes RTbug #1941.
7639     Subscribe to grid cell selection events so we can update the
7640     status bar.
7641     (QueryTableFrame.UpdateStatusText): Update the status bar with
7642     how many rows are in the grid, how many columns, and how many
7643     rows are selected.
7644     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
7645     Call UpdateStatusText when cells are (de)selected.
7646     (QueryTableFrame.OnQuery): Use the string value in the value
7647     combo if either the selected item index is 0 or if the string
7648     cannot be found in the predefined list (this happens if the
7649     user changes the text). Fixes RTbug #1940.
7650     Only turn off the grid event listeners if there a query comes
7651     back with a none empty list of ids. in the case that the list
7652     is empty this causes a grid.ClearSelection() call to actually
7653     clear the grid selection which causes the selected items in
7654     the map to be deselected. Fixes RTbug #1939.
7655    
7656     * test/test_save.py (XMLWriterTest.Encode): Check return values.
7657     Fixes RTbug #1851.
7658    
7659 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
7660    
7661     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
7662     self.selected_shape with the current selection to make sure the
7663     contents of the dialog are up to date when it's shown for the
7664     first time.
7665     The dialog used to work without this by luck. The recent fix to
7666     the connector module 'broke' a 'feature' the identify view was
7667     relying on, i.e that subscribing to a message in response to
7668     receiving a message of that type would mean that the new
7669     subscriber would also be called for the same message.
7670    
7671 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
7672 jonathan 1175
7673 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
7674     the image is rendered. Fixes RTbug #1937.
7675    
7676     2003-06-12 Jonathan Coles <[email protected]>
7677    
7678 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
7679 jonathan 1193 user directory if it doesn't exist on a posix system.
7680     Fixes RTbug #1815.
7681 jonathan 1191
7682     * Thuban/Model/resource.py (get_user_proj_files): Moved the
7683     called to get_application_dir here, so that the directory
7684     will only be called if this method is invoked.
7685    
7686     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
7687     the projfilepath if no projection is selected.
7688    
7689     2003-06-12 Jonathan Coles <[email protected]>
7690    
7691 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
7692     the scalebar if the current map has no projection set.
7693    
7694     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
7695     projfilepath label to just the basename of the projection file
7696     rather than include the entire path.
7697    
7698     * Thuban/Model/resource.py: Fix missed proj functions that
7699     needed to be renamed.
7700    
7701     2003-06-12 Jonathan Coles <[email protected]>
7702    
7703 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
7704     tested if the variable was an instance of Color.
7705    
7706     * Thuban/Model/color.py (Color): Remove commented code that isn't
7707     used.
7708     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
7709     Fixes RTbug #1835.
7710     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
7711     Needed now that the class doesn't inherit from Color.
7712    
7713     2003-06-12 Jonathan Coles <[email protected]>
7714    
7715 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
7716     check unicode strings.
7717    
7718     * test/test_layer.py: Check for existence of gdal.
7719    
7720     2003-06-12 Jonathan Coles <[email protected]>
7721 jonathan 1172
7722     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
7723     that was in load.py
7724 jonathan 1169
7725 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
7726     that was in save.py
7727    
7728     2003-06-12 Jonathan Coles <[email protected]>
7729    
7730 jonathan 1169 This is largely a collection of bug fixes. We also handle the
7731     case where gdal is not on the system. The XMLReader and XMLWriter
7732     classes were moved into there own files to resolve some circular
7733     import references and because they shouldn't really be in the
7734     file that is dediciated to reading/writing session files since
7735     they are also used elsewhere.
7736    
7737     * Thuban/Model/classgen.py: Renamed functions to follow the
7738     function_names_with_underscores style. Fixes RTbug #1903.
7739     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7740    
7741     * Thuban/Model/layer.py: Import gdal only if it available.
7742     (RasterLayer): Handle the case where the gdal library is unavailable.
7743     Addresses RTbug #1877.
7744    
7745     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7746     xmlreader.py.
7747    
7748 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
7749    
7750     This is largely a collection of bug fixes. We also handle the
7751     case where gdal is not on the system. The XMLReader and XMLWriter
7752     classes were moved into there own files to resolve some circular
7753     import references and because they shouldn't really be in the
7754     file that is dediciated to reading/writing session files since
7755     they are also used elsewhere.
7756    
7757     * Thuban/Model/classgen.py: Renamed functions to follow the
7758     function_names_with_underscores style. Fixes RTbug #1903.
7759     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7760    
7761     * Thuban/Model/layer.py: Import gdal only if it available.
7762     (RasterLayer): Handle the case where the gdal library is unavailable.
7763     Addresses RTbug #1877.
7764    
7765     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7766     xmlreader.py.
7767    
7768 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
7769     file xmlwriter.py.
7770    
7771     * Thuban/Model/resource.py: Renamed functions to following the
7772     function_names_with_underscores style.
7773     (has_gdal_support): New function that returns true if the gdal
7774     library is available. Addresses RTbug #1877.
7775    
7776     * Thuban/UI/application.py (ThubanApplication.OpenSession):
7777     Display a message box if the gdal library is not available, but
7778     only if there are any layers that would use it. Addresses RTbug #1877.
7779    
7780     * Thuban/UI/classgen.py: Use renamed projection resource functions.
7781     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
7782     when using integers versus floats.
7783    
7784     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
7785     determine if the "Add Image Layer" menu option should be
7786     greyed out or not. Addresses RTbug #1877.
7787    
7788     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
7789    
7790     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
7791     optimize if a raster layer is visible. Fixes RTbug #1931.
7792     Only draw the raster layer if the gdal library is available.
7793     Addresses RTbug #1877.
7794    
7795     * test/test_classgen.py: Add tests for generate_singletons,
7796     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
7797     (test_calculate_quantiles): Fix some tests to catch the new
7798     ValueError that is raised.
7799    
7800     * test/test_proj.py: Use renamed projection resource functions.
7801    
7802     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
7803     test for saving classified layers. Fixes RTbug #1902.
7804     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
7805    
7806 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
7807    
7808     Fix for http://intevation.de/rt/webrt?serial_num=1900.
7809    
7810     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
7811    
7812     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
7813     multiplechoicedialog.py rather than from the wxPython library.
7814    
7815 frank 1151 2003-06-11 Frank Koormann <[email protected]>
7816    
7817 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
7818     update.
7819    
7820     2003-06-11 Frank Koormann <[email protected]>
7821    
7822 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
7823     determine the absolute .thuban/thuban directory under
7824     "posix" (os.expanduser) and "nt" (read AppData registry key).
7825    
7826     * Thuban/Model/resource.py: Use get_application_dir
7827    
7828     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7829     Use get_application_dir.
7830    
7831 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
7832    
7833 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
7834     the messages MAP_LAYERS_REMOVED messages
7835     (LayerTableFrame.OnClose): Unsubscribe from it.
7836     (LayerTableFrame.map_layers_removed): New. Receiver for
7837     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
7838     dialog is showing is removed.
7839    
7840     2003-06-10 Bernhard Herzog <[email protected]>
7841    
7842 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
7843     of the receivers list so that unsubscribing in a receiver doesn't
7844     modify it while iterating over it.
7845    
7846     * test/test_connector.py
7847     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
7848     unsubscribing in a receiver works correctly. See docstring for
7849     details
7850    
7851     2003-06-10 Bernhard Herzog <[email protected]>
7852    
7853 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
7854     message.
7855    
7856     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
7857     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
7858     LAYER_CHANGED will still be sent if the classification changes.
7859    
7860     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
7861     parameter so we can subscribe to some of its messages
7862     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
7863     and the layer's LAYER_SHAPESTORE_REPLACED
7864     (Classifier.unsubscribe_messages): New. Unsubscribe from message
7865     subscribed to in __init__
7866     (Classifier.map_layers_removed)
7867     (Classifier.layer_shapestore_replaced): receivers for the messages
7868     subscribed to in __init__. Unsubscribe and close the dialog
7869    
7870     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
7871     the map to the Classifier dialog
7872    
7873     * test/test_layer.py (SetShapeStoreTests): Derive from
7874     SubscriberMixin as well so we can test messages
7875     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
7876     messages
7877     (SetShapeStoreTests.tearDown): Clear the messages again
7878     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
7879     for the modified flag too
7880     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
7881     to check whether SetShapeStore sets the modified flag
7882     (SetShapeStoreTests.test_set_shape_store_different_field_name)
7883     (SetShapeStoreTests.test_set_shape_store_same_field)
7884     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
7885     Add tests for the messages. This checks both the new
7886     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
7887    
7888 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
7889    
7890     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
7891     the menu items.
7892    
7893 frank 1134 2003-06-05 Frank Koormann <[email protected]>
7894    
7895 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7896     Layout reimplemented without panel. Make life easier to fit the list
7897     in the dialog.
7898    
7899     2003-06-05 Frank Koormann <[email protected]>
7900    
7901 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
7902     once on initialisation (Former implementation resulted in multiple
7903     entries for each projection).
7904     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
7905     if set, select the projection found under the specified name. This
7906     overwrites any other selection estimate.
7907     Removed projchoice filling from this method.
7908     (ProjFrame._OnSave, ProjFrame._OnAddToList):
7909     Updated call of ProjFrame.__FillAvailList
7910     (LCCPanel._DoLayout): Moved parameter controls in more common order.
7911    
7912     * Resources/Projections/defaults.proj: Extended defaults representing
7913     various common European projections.
7914    
7915     2003-06-05 Frank Koormann <[email protected]>
7916    
7917 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7918     Use ListCtrl instead of GridCtrl
7919    
7920     * Thuban/Model/resource.py:
7921     Guess location of .thuban directory from tempdir parent directory.
7922    
7923     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7924     Guess location of .thuban directory from tempdir parent directory.
7925    
7926 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
7927    
7928     Do not cache the values returned by the tree widget's
7929     GetFirstChild and GetNextChild methods because it led to lots of
7930     segfaults. The new way requires more brute force but is more
7931     reliable.
7932    
7933     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
7934     variable layer2id
7935     (LegendTree.find_layer): New method to do with brute force what
7936     layer2id tried to accomplish
7937     (LegendTree._OnMsgLayerChanged)
7938     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
7939     Use find_layer instead of layer2id
7940     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
7941     update layer2id anymore
7942     (LegendTree._OnMsgMapLayersRemoved)
7943     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
7944    
7945 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
7946    
7947     * Thuban/Model/classgen.py (GenQuantiles0): New function.
7948    
7949 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
7950    
7951 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
7952     New commands.
7953     (main_menu): Add the new commands.
7954     (MainWindow.TableRename): New. Implementation of the table_rename
7955     command.
7956     (MainWindow.RenameLayer): New. Implementation of the layer_rename
7957     command.
7958    
7959     * Thuban/Model/session.py (Session.AddTable): call self.changed to
7960     set the modified flag
7961    
7962     * test/test_session.py (TestSessionSimple.test_add_table): Test
7963     whether the modified flag is set properly
7964    
7965     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
7966     instead of issue so that the modified flags get updated.
7967    
7968     * test/test_base.py (SomeTitledObject): Derive from Modifiable
7969     instead of Publisher to reflect reality better and to accomodate
7970     the fact that SetTitle now calls changed instead of issue
7971    
7972     2003-06-02 Bernhard Herzog <[email protected]>
7973    
7974     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
7975     acquisition has to happen before the try in a try-finally.
7976    
7977     2003-06-02 Bernhard Herzog <[email protected]>
7978    
7979 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
7980     possible that a layer is removed that is not currently selected in
7981     the legend so don't check for this.
7982    
7983 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
7984    
7985 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
7986     variables to None that have direct or indirect references to
7987     shapefiles or dbf files to make sure that they do go away and the
7988     files are closed.
7989    
7990     2003-05-30 Bernhard Herzog <[email protected]>
7991    
7992 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
7993     availImgListIndices when a new image list is created
7994    
7995     2003-05-30 Bernhard Herzog <[email protected]>
7996    
7997 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
7998     changing_selection to indicate whether the LegendTree code itself
7999     is currently changing the selection
8000     (LegendTree.normalize_selection): New method to normalize the
8001     selection by selecting the layer item even if the user clicked on
8002     the classification.
8003     (LegendTree._OnSelChanged): normalize the selection. This works
8004     around a bug in wx which doesn't keep track of the selection
8005     properly when subtrees are deleted.
8006    
8007     2003-05-30 Bernhard Herzog <[email protected]>
8008    
8009 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
8010     maximum and minimum scale factors.
8011    
8012     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
8013     changes in classgen.py
8014    
8015 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
8016    
8017     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
8018     all the methods functions. Fixes RTBug #1903.
8019    
8020     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
8021     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
8022     RTBug #1907.
8023    
8024     * Thuban/UI/classgen.py: Use classgen functions that were part
8025     of the ClassGenerator class. Put try/finally blocks around
8026     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
8027     RTBug #1904.
8028    
8029     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
8030    
8031     * Thuban/UI/legend.py: The legend was cleared and repopulated any
8032     time something changed which caused some state to be lost such
8033     as which children were expanded or collapsed. Fixes RTBug #1901.
8034     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
8035     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
8036     the legend but not in the map.
8037     (LegendTree.__FillTree): Move main functionality out into smaller
8038     methods that can be used by other methods.
8039     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
8040     if they are available.
8041     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
8042     that we override the wxTreeCtrl method. Iterate over children
8043     and call __RemoveLayer.
8044     (LegendTree.__AddLayer): New. Add a new layer to the legend.
8045     (LegendTree.__RemoveLayer): Remove a layer from the legend.
8046     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
8047     Should only be called with the id of a layer branch.
8048     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
8049     Returns the root item or creates one if necessary.
8050    
8051     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
8052     ProjectRasterFile with tuple arguments instead of strings.
8053    
8054     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
8055     with try/finally. Fixes RTBug #1904.
8056    
8057     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
8058     with try/finally. Fixes RTBug #1904.
8059     (MapCanvas.FitSelectedToWindow): If a single point is selected
8060     simply center it on the display. Fixes RTBug #1849.
8061    
8062     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
8063     to be compiled as a standalone app. Now the code can only be
8064     called from Python which simplifies the parameter passing.
8065     (ProjectRasterFile): Handle Python arguments. Remove code that
8066     checks for a destination dataset. Add more clean up code.
8067    
8068     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
8069     TestMapWithContents.test_lower_layer_bottom):
8070     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
8071     Fixes RTBug #1907.
8072    
8073     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
8074     extent to the map when the legend is toggled. Fixes RTBug #1881.
8075    
8076 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
8077    
8078     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
8079     unsubscribes all that is subcribed in __init__.
8080    
8081 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
8082    
8083 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
8084     (MainWindow.CanDuplicateLayer): New methods to implement the
8085     Layer/Duplicate command.
8086     (layer_duplicate command): New.
8087     (main_menu): Add layer_duplicate to the Layer menu.
8088    
8089     2003-05-28 Bernhard Herzog <[email protected]>
8090    
8091 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
8092     renderer so that NULL/None values get displayed differently (by a
8093     gray rectangle).
8094     (TableGrid.__init__): Override the default renderers
8095    
8096     2003-05-28 Bernhard Herzog <[email protected]>
8097    
8098 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
8099     classification to "None" if the type of the field has changed.
8100    
8101     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
8102     test for the Layer.SetShapeStore method
8103    
8104 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
8105 jan 1085
8106 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
8107     does not necessarily have a filename).
8108    
8109     2003-05-28 Jan-Oliver Wagner <[email protected]>
8110    
8111 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
8112     sort the selection list for the dialog.
8113    
8114 frank 1083 2003-05-28 Frank Koormann <[email protected]>
8115    
8116     * extensions/thuban/wxproj.cpp
8117     (project_point): Removed cast to int for projected point coordinates.
8118     (shape_centroid): Return last point if all polygon vertices fall
8119     to one point.
8120    
8121 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
8122    
8123 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
8124     with layers that don't have shapestores, i.e. raster layers.
8125    
8126     2003-05-28 Bernhard Herzog <[email protected]>
8127    
8128 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
8129     when determining the title from the filename.
8130    
8131     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
8132     reflect changes in the way the title is derived from the filename
8133    
8134 frank 1077 2003-05-28 Frank Koormann <[email protected]>
8135    
8136     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
8137     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
8138    
8139 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
8140    
8141 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
8142     delegate SelectedLayer.
8143     (MainWindow.LayerUnjoinTable): Implement.
8144     (_can_unjoin): New. Helper function for the sensitivity of the
8145     layer/unjoin command.
8146    
8147     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
8148     (DerivedShapeStore.OrigShapeStore): New. Return the original
8149     shapestore. Used to figure out how to unjoin.
8150     (DerivedShapeStore.Shapefile): Fix a typo.
8151    
8152     2003-05-27 Bernhard Herzog <[email protected]>
8153    
8154 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
8155     well
8156     (JoinDialog.__init__): Use the layer parameter and only build the
8157     left choice when a layer is given
8158     (JoinDialog.OnJoin): Handle layer joins as well
8159     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
8160     that the user selects the "Select..." item. The sensitivitly
8161     updating is now in update_sensitivity
8162     (JoinDialog.y): New method to refactor the sensitivity update of
8163     the join button into its own method.
8164    
8165     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
8166    
8167     2003-05-27 Bernhard Herzog <[email protected]>
8168    
8169 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
8170     iff there are unreferenced tables in the session
8171    
8172     2003-05-27 Bernhard Herzog <[email protected]>
8173    
8174 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
8175    
8176     * Thuban/Model/session.py (Session.UnreferencedTables): New method
8177     to return tables that are not referenced by other tables or shape
8178     stores and can be removed.
8179     (Session.RemoveTable): Issue a TABLE_REMOVED message after
8180     removing the table
8181    
8182     * Thuban/UI/mainwindow.py: Remove unused imports
8183     (MainWindow.TableClose): Implement.
8184    
8185     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
8186     messages so that the frame will be automatically closed when a new
8187     session is opened or the table is removed.
8188     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
8189     __init__
8190     (TableFrame.close_on_session_replaced)
8191     (TableFrame.close_on_table_removed): New. Subscribers that close
8192     the window
8193    
8194     * test/test_session.py (TestSessionMessages.test_remove_table)
8195     (TestSessionSimple.test_remove_table): Move the test to
8196     TestSessionSimple and add test for the TABLE_REMOVED message
8197     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
8198     (TestSessionSimple.test_unreferenced_tables) New. Test for the
8199     UnreferencedTables method.
8200     (UnreferencedTablesTests): New. Class with some more sophisticated
8201     tests for UnreferencedTables.
8202    
8203 frank 1065 2003-05-27 Frank Koormann <[email protected]>
8204    
8205 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
8206     display has some unwanted side effects. Removed again.
8207    
8208     2003-05-27 Frank Koormann <[email protected]>
8209    
8210 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
8211    
8212     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
8213    
8214 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
8215    
8216 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
8217     Menu.RemoveItem().
8218 jan 1062
8219 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
8220     the menu.
8221 jan 1062
8222 frank 1059 2003-05-27 Frank Koormann <[email protected]>
8223    
8224     Nonmodal dialogs without parent (i.e. they can fall behind the main
8225     window)
8226    
8227     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
8228     all dialogs in the dialogs dictionary and the canvas.
8229    
8230     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
8231     parent, i.e. can fall behind other windows.
8232     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
8233     dictionary before removing it.
8234    
8235     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
8236    
8237     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
8238     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
8239     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
8240    
8241 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
8242    
8243 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
8244     tableview dialog
8245     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
8246     Also, don't use the table's titles as the dialog names. The titles
8247     aren't guaranteed to be unique.
8248     (MainWindow.TableOpen): Open a table view dialog after opening the
8249     table
8250    
8251     2003-05-27 Bernhard Herzog <[email protected]>
8252    
8253 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
8254     effect can be achieved by simply closing the window showing the
8255     table.
8256     (MainWindow.TableHide): Removed.
8257     (main_menu): Removed "table_hide"
8258    
8259 frank 1051 2003-05-27 Frank Koormann <[email protected]>
8260    
8261     Fix legend tree display problems under Win32
8262    
8263     * Thuban/UI/legend.py: BMP_SIZE_W = 15
8264     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
8265     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
8266    
8267     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
8268    
8269 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
8270    
8271     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
8272     'after' now allows to insert separators almost anywhere in the menu.
8273    
8274 frank 1046 2003-05-27 Frank Koormann <[email protected]>
8275    
8276     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
8277     "S" of selection box label to hint on hot key (Alt-S). Works under
8278     Win32 but is ignored under GTK.
8279    
8280     2003-05-26 Frank Koormann <[email protected]>
8281    
8282     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
8283     Center Choices.
8284    
8285 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
8286    
8287 bh 1044 Remove the Precision methods again. They're too DBF specific to be
8288     part of the table interface and they're only used in table_to_dbf
8289     anyway.
8290    
8291     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
8292     fixed precision of 12 for doubles.
8293     (TransientTableBase.Precision): Removed
8294     (AutoTransientTable.Width): Delegate to self.table.
8295    
8296     * Thuban/Model/table.py (DBFTable.Precision)
8297     (MemoryTable.Precision): Removed.
8298     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
8299     (table_to_dbf): Use a fixed precision of 12 for floats unless the
8300     column object specifies something else.
8301    
8302     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
8303     test for table_to_dbf
8304    
8305     2003-05-26 Bernhard Herzog <[email protected]>
8306    
8307     * test/test_transientdb.py
8308     (TestTransientTable.run_iceland_political_tests): Fix a comment.
8309    
8310     2003-05-26 Bernhard Herzog <[email protected]>
8311    
8312 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
8313     implementation. Mark parts of the file format strings for
8314     localization.
8315    
8316     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
8317     file and add the table to the tables managed by the session
8318    
8319 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
8320     New. test case for OpenTableFile
8321    
8322 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
8323    
8324 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
8325     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
8326     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
8327     Replace the true/false of wxWindows by True/False of Python 2.2.1.
8328    
8329     2003-05-26 Jan-Oliver Wagner <[email protected]>
8330    
8331 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
8332     already a selection present, update the grid accordingly.
8333 jan 1033
8334     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
8335     resizeable and increase its initial size.
8336    
8337 frank 1030 2003-05-26 Frank Koormann <[email protected]>
8338    
8339     Table export functionality
8340    
8341     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
8342     Return width (in characters) for a column.
8343     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
8344     (table_to_dbf): Write table to dbf file.
8345     (table_to_csv): Write table to csv file.
8346    
8347     * Thuban/Model/transientdb.py (TransientTableBase.Width,
8348     TransientTableBase.Precision): Return column width and precision.
8349    
8350     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
8351     or table_to_csv depending on file selection.
8352    
8353     * test/test_dbf_table.py:
8354     Test table_to_dbf (extension of former part of test).
8355    
8356     * test/test_csv_table.py:
8357     Test table_to_csv.
8358    
8359 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
8360    
8361 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
8362     Use QueryTableFrame instead of TableFrame.
8363 jan 1021
8364 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
8365     table window with 'Layer Table:' instead of 'Table:'.
8366    
8367     2003-05-23 Jan-Oliver Wagner <[email protected]>
8368    
8369     Give all tables a title via mix-in TitledObject.LayerShowTable
8370    
8371 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
8372     only if it exists.
8373    
8374     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
8375     and call its init-method with a default title. Remove Title() method.
8376    
8377     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
8378     AutoTransientTable): mix-in TitledObject and call its init-method with
8379     a default title. Remove Title() method.
8380    
8381 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
8382    
8383     * Thuban/Model/session.py (Session.AddShapeStore): Define
8384     AddShapeStore analogously to AddTable.
8385    
8386     * test/test_session.py (TestSessionSimple.test_add_shapestore):
8387     New. Test for AddShapeStore
8388    
8389 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
8390    
8391     Introducing QueryTableFrame and a very coarse ShowTable implementation.
8392    
8393     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
8394     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
8395     The latter implements the selection GUI without dependency on a layer.
8396     LayerTableFrame now is derived from QueryTableFrame and connects
8397     to a layer.
8398    
8399     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
8400     implementation that still needs work.
8401    
8402     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
8403    
8404 frank 1011 2003-05-22 Frank Koormann <[email protected]>
8405    
8406     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
8407     Added "outer_join = False" as optional parameter.
8408     (TransientJoinedTable.create): If outer join is true, perform a
8409     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
8410     the left table. Records not matching are filled with 0 / None.
8411    
8412     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
8413     (JoinDialog.OnJoin): Consider outer join check box.
8414    
8415 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
8416    
8417 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
8418     somewhat safer way. Storing the traceback in a local variable can
8419     lead to memory leaks
8420    
8421     2003-05-22 Bernhard Herzog <[email protected]>
8422    
8423 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
8424     the wxMessageDialog's Destroy() method.
8425    
8426 frank 1004 2003-05-22 Frank Koormann <[email protected]>
8427    
8428     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
8429     TransientTable.Title()
8430    
8431     2003-05-22 Frank Koormann <[email protected]>
8432    
8433     Join Dialog, initial version.
8434    
8435     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
8436    
8437     * Thuban/UI/join.py (JoinDialog): Functional implementation of
8438     former framework. Renamed Table1/Table2 to LeftTable/RightTable
8439     in all occurences.
8440    
8441     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
8442     Typo fixed.
8443    
8444 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
8445    
8446 bh 999 Give the tables titles so that the GUI can display more meaningful
8447     names. For now the titles are fixed but depend on e.g. filenames
8448     or the titles of the joined tables.
8449    
8450     * Thuban/Model/transientdb.py (TransientTable.Title)
8451     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
8452    
8453     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
8454    
8455     * test/test_transientdb.py
8456     (TestTransientTable.test_auto_transient_table_title): New. Test
8457     for the Title method
8458     (TestTransientTable.test_transient_joined_table)
8459     (TestTransientTable.test_transient_table): Add test for the Title
8460     methods
8461    
8462     * test/test_memory_table.py (TestMemoryTable.test_title): New.
8463     Test for the Title method
8464    
8465     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
8466     the Title method
8467    
8468     2003-05-22 Bernhard Herzog <[email protected]>
8469    
8470 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8471     Provide a better way to destroy the layers
8472     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
8473     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8474     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
8475     the new way to destroy the layers.
8476     (TestLayer.test_derived_store): New. Test for using a layer with a
8477     DerivedShapeStore
8478    
8479     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
8480     filename if the shape store actually has one.
8481    
8482     2003-05-22 Bernhard Herzog <[email protected]>
8483    
8484 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
8485     for the filename
8486    
8487     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
8488     for the FileName method
8489     (TestDBFTableWriting.test_write): Fix spelling of filename
8490    
8491 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
8492    
8493     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
8494     from SciParam that now really is immutable.
8495    
8496 frank 992 2003-05-22 Frank Koormann <[email protected]>
8497    
8498     Layer Top/Bottom placement added to legend.
8499    
8500     * Thuban/UI/legend.py
8501     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
8502     bound to tool events.
8503     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
8504     New, methods binding the event methods with the map methods.
8505    
8506     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
8507     layer at top/bottom of layer stack.
8508    
8509     * Resources/Bitmaps/top_layer.xpm: New button icon.
8510    
8511     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
8512    
8513 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
8514    
8515     * Thuban/Model/session.py (Session.RemoveTable): New method to
8516     remove tables
8517    
8518     * test/test_session.py (TestSessionSimple.test_remove_table): New.
8519     Test for RemoveTable
8520    
8521 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
8522    
8523     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
8524     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
8525    
8526 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
8527    
8528 bh 985 Implement a way to discover dependencies between tables and
8529     shapestores.
8530    
8531     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
8532     (TransientJoinedTable.Dependencies)
8533     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
8534     interface
8535     (TransientJoinedTable.__init__): Keep tack of the original table
8536     objects in addition to the corresponding transient tables.
8537    
8538     * Thuban/Model/table.py (DBFTable.Dependencies)
8539     (MemoryTable.Dependencies): New. Implement the dependencies
8540     interface
8541    
8542     * Thuban/Model/data.py (ShapeTable): New. Helper class for
8543     ShapefileStore
8544     (ShapefileStore.__init__): Use ShapeTable instead of
8545     AutoTransientTable
8546     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
8547     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
8548     methods for filename and type
8549     (ShapefileStore.Dependencies): New. Implement the dependencies
8550     interface
8551     (DerivedShapeStore): New class to replace SimpleStore. The main
8552     difference to SimpleStore is that it depends not on a shapefile
8553     but another shapestore which expresses the dependencies a bit
8554     better
8555     (SimpleStore.__init__): Add deprecation warning.
8556    
8557     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
8558     Test for the Dependencies method.
8559    
8560     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
8561     New. Test for the Dependencies method.
8562    
8563     * test/test_transientdb.py
8564     (TestTransientTable.test_auto_transient_table_dependencies): New.
8565     Test for the Dependencies method.
8566     (TestTransientTable.test_transient_joined_table): Add test for the
8567     Dependencies method.
8568    
8569     * test/test_session.py (TestSessionSimple.setUp)
8570     (TestSessionSimple.tearDown): New. Implement a better way to
8571     destroy the sessions.
8572     (TestSessionSimple.test_initial_state)
8573     (TestSessionSimple.test_add_table): Bind session to self.session
8574     so that it's destroyed by tearDown
8575     (TestSessionSimple.test_open_shapefile): New. Test for
8576     OpenShapefile and the object it returns
8577    
8578     2003-05-22 Bernhard Herzog <[email protected]>
8579    
8580 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
8581     register tables with the session.
8582     (Session.Tables): Return the tables registered with AddTable too.
8583    
8584     * test/test_session.py (TestSessionSimple.test_add_table): New.
8585     Test case for the AddTable method
8586    
8587 frank 981 2003-05-22 Frank Koormann <[email protected]>
8588    
8589     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
8590     lower right corner, center labels for selections, initialize controls
8591     in reasonable order for keyboard navigation.
8592    
8593     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
8594     (ProjFrame.__DoOnProjAvail): Determine position of current projection
8595     using the wxListBox.FindString() method. Still a problem (#1886)
8596    
8597     * Thuban/UI/classifier.py
8598     (Classifier.__init__, SelectPropertiesDialog.__init__)
8599    
8600     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
8601     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
8602     different classification types from here to __init__.
8603     (GenUniquePanel.__init__): Set the column width of the first field
8604     in the Field ListCtrl to the full width.
8605    
8606     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
8607     Button to 'Export'. Center Buttons in Selection Box, set Focus to
8608     Grid.
8609     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
8610     changes focus to the Selection when pressing "Alt-S".
8611    
8612     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
8613     the text if not visible. The italic font sometimes exceeds the
8614     rendering area.
8615    
8616 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
8617 jonathan 971
8618 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
8619     to OnClose so that Thuban closes correctly.
8620    
8621     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
8622     DockFrame.OnClose, not DockFrame._OnClose.
8623    
8624     2003-05-21 Jonathan Coles <[email protected]>
8625    
8626 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
8627     references to 'inf' and use new Range __init__ to pass floats
8628     directly rather than converting them to strings first.
8629     Fixes RTBug #1876.
8630    
8631     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
8632     Use new Range ___init__ to pass floats.
8633    
8634     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
8635     filename is a valid image file. Throw IOError otherwise.
8636    
8637     * Thuban/Model/range.py: Brought over new Range from SciParam that
8638     is immutable and has an __init__ which can accept floats.
8639    
8640     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
8641     into try block. AddLayer doesn't throw any exceptions anymore.
8642     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
8643     try block.
8644    
8645     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
8646     the first item in choices. Fixes RTBug #1882.
8647    
8648     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
8649     has gone to 0 which is a serious problem. abort.
8650     (MapRenderer.draw_raster_layer): Catch IOError seperately and
8651     print the error from GDAL.
8652    
8653     * Thuban/UI/tableview.py (TableGrid.__init__): Call
8654     ToggleEventListeners to turn on listening.
8655     (TableGrid.ToggleEventListeners): New. Turns event listening on
8656     and off so as to prevent excessive messages.
8657     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
8658     to suppress excessive messages when selecting many rows.
8659     Fixes RTBug #1880.
8660    
8661     * Thuban/UI/view.py: Added checks against if scale == 0. This
8662     is a serious problem that can occur when an image without
8663     geo data is loading and causes the map projection bounds to
8664     go to infinity. Right now, the solution is to simply try
8665     to recover.
8666    
8667     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
8668     to set the MFILEReceiver attributes even if the data is NULL.
8669    
8670     * extensions/thuban/gdalwarp.cpp: Improved the error handling
8671     and passed GDAL messages back up to the Python layer. Also
8672     tried to fix some memory leaks that were present in the original
8673     utility but didn't matter because the program aborted.
8674    
8675     * test/test_range.py: Copied over tests from SciParam. Removed
8676     tests against importing. Fixes RTBug #1867.
8677    
8678 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
8679    
8680     * test/test_load.py: Remove unused imports and restructure the
8681     test code
8682     (LoadSessionTest): Split into one class for each test and turn
8683     LoadSessionTest itself into the base class for all such session
8684     tests.
8685     (ClassificationTest): New base class for load tests that test
8686     classifications
8687     (TestSingleLayer, TestLayerVisibility, TestClassification)
8688     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
8689     for the individual tests
8690    
8691     * test/support.py (FileLoadTestCase.filename): New base class for
8692     file loading tests
8693    
8694 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
8695    
8696     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
8697     Mercator' to 'UTM Zone 32' as a more convenient example.
8698     Added 'Gauss Krueger Zone 6'.
8699    
8700     * Data/iceland_sample_raster.thuban: political polygon now
8701     filled transparent to have the raster image visible at once.
8702    
8703 frank 952 2003-05-21 Frank Koormann <[email protected]>
8704    
8705     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
8706     OnClose() to keep in sync with extensions. Internally Thuban
8707     still uses "underscored" names.
8708    
8709 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
8710    
8711     This puts back Raster layer support. These layers support projections
8712     through the GDAL library. Currently, the CVS version is being used.
8713     There are no Debian packages available although this may change soon.
8714     A GDAL driver was extended to support writing to memory rather to
8715     files.
8716    
8717     There is still some work that needs to be done, such as some error
8718     handling when loading invalid images or when there is a problem
8719     projecting the image. This putback simply checks in the majority
8720     of the work.
8721    
8722     * setup.py: Add gdalwarp library extension.
8723    
8724     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
8725     Defaults to False, but can be overridden by subclasses if they
8726     support classification.
8727     (RasterLayer): New. Defines a new layer that represents an
8728     image.
8729    
8730     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
8731     tag handler.
8732     (SessionLoader.start_layer): Encode the filename.
8733     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
8734     New. Supports reading a rasterlayer tag.
8735    
8736     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
8737    
8738     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
8739     get a string in Latin1. If we get such as string convert it to
8740     unicode first, otherwise leave if alone before encoding.
8741     (SessionSaver.write_layer): Add support for writing both Layers
8742     and RasterLayers.
8743    
8744     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8745     The right argument may not be a string, it could also be a Column.
8746    
8747     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
8748     Make initial window size 600x400. Fixes RTBug #1872.
8749    
8750     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
8751     the dialog is constructed so that we can support layers that
8752     do not have classifications.
8753     (Classifier._OnTry): Only build a classification if the layer
8754     supports one.
8755    
8756     * Thuban/UI/legend.py: Change all checks that a layer is an
8757     instance of Layer into checks against BaseLayer.
8758     (LegendTree.__FillTreeLayer): Only add children to a branch if
8759     the layer supports classification.
8760    
8761     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
8762     MainWindow.OpenSession): Don't proceed with an action if the
8763     user chooses Cancel when they are asked to save changes.
8764     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
8765     user to select an image file. Create a new RasterLayer and add
8766     it to the map.
8767    
8768     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
8769     for rendering RasterLayer layers.
8770     (MapRenderer.draw_raster_layer): Actually method that calls
8771     the GDALWarp python wrapper and constructs an image from the
8772     data returned.
8773    
8774     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
8775     Choices symbols to match those used in the table query method.
8776     Replace deprecated method calls on table with new method names.
8777    
8778     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
8779     how small the scale can get. This still needs more testing.
8780    
8781     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
8782     Provides a driver to output in .bmp format.
8783    
8784     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
8785     New. Provides IO routines which write to memory, rather than a file.
8786    
8787     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
8788     of the gdalwarp utility provided in GDAL. Added function calls
8789     that can be accessed from python.
8790    
8791     * Data/iceland_sample_raster.thuban: New. Sample file that uses
8792     a raster layer.
8793    
8794     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
8795     layer image data.
8796    
8797     * Doc/thuban.dtd: Added rasterlayer attribute definition.
8798    
8799     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
8800     tests associated with the raster layer code.
8801    
8802     * test/test_transientdb.py
8803     (TestTransientTable.test_auto_transient_table_query): Added a test
8804     for using a Column object as the "right" parameter to a query.
8805    
8806 frank 924 2003-05-19 Frank Koormann <[email protected]>
8807    
8808 frank 927 * Thuban/version.py (get_changelog_date):
8809     Catch exceptions if ChangeLog does not exist.
8810    
8811     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
8812    
8813     2003-05-19 Frank Koormann <[email protected]>
8814    
8815 frank 924 Extended version information for Thuban
8816    
8817     * Thuban/version.py: New, version information for Thuban: Last
8818     modification date and last ChangeLog entry date.
8819    
8820     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
8821     information: Display Thuban, wxPython and Python version.
8822    
8823 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
8824    
8825 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
8826     __future__ import for nested_scopes as Thuban relies on Python 2.2
8827     now.
8828     (XMLWriter.encode): Remove the special case for a None argument.
8829     In the saver encode is always called with a string argument.
8830    
8831     2003-05-16 Bernhard Herzog <[email protected]>
8832    
8833 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
8834     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
8835     of the bug was that e.g. float("1.2") would fail. Thuban now
8836     requires 2.4.x.
8837    
8838 frank 917 2003-05-16 Frank Koormann <[email protected]>
8839    
8840     Printing enhancement and WMF export (under Win32)
8841    
8842     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
8843     ScreenRenderer. Renders Map, Legend and Scalebar for export.
8844     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
8845     PrintRender.
8846    
8847     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
8848     to fullfil information needed for PrinterRenderer.
8849     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
8850     (MapCanvas.Print): Adapted to new MapPrintout.
8851     (OutputTransform): General calculations to transform from canvas
8852     coordinates to export/printing devices.
8853    
8854     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
8855     new method_command to call ExportMap, with platform dependency (only
8856     __WXMSW__)
8857    
8858     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
8859     of scalebar drawing area as new parameters.
8860    
8861     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
8862    
8863     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
8864     Update to extended scalebar.DrawScalebar header.
8865    
8866     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
8867    
8868     * test/test_scalebar.py: Made test executable as standalone.
8869    
8870 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
8871    
8872     * Thuban/Model/table.py (Table): Remove this compatibility alias
8873     for DBFTable.
8874    
8875     * test/test_table.py: Import DBFTable as Table because that alias
8876     doesn't exist anymore.
8877    
8878     * Thuban/UI/classgen.py: Remove some unused imports
8879    
8880 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
8881    
8882     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
8883     Fix docstring.
8884     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
8885     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
8886     values of the supplied range to determine the beginning and end
8887     bounds of the generated classes.
8888    
8889     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
8890     do not have a leading 0 (.5 is now accepted as well as 0.5).
8891    
8892     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
8893     call to ClassGenerator.GenUniformDistribution.
8894    
8895     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
8896     layout bug with the 'Projection' label.
8897    
8898     * test/support.py (FloatTestCase): New. Needed for the Range tests.
8899    
8900     * test/test_range.py: New. Imported from SciParam.
8901    
8902 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
8903    
8904 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
8905     to table.UniqueValues() with calls that retrieve all the values
8906     from the table. This will need to be replaced by a method on table
8907     which can simply return the list (perhaps more efficiently).
8908    
8909     2003-05-12 Jonathan Coles <[email protected]>
8910    
8911 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
8912     Refer to the documentation for details.
8913    
8914     * test/test_classgen.py: Modified Quantile tests to use the
8915     new return values.
8916    
8917     * Thuban/Model/classgen.py
8918     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
8919     use new return values from CalculateQuantiles to produce the correct
8920     range bounds in the Classification.
8921     (ClassGenerator.CalculateQuantiles): Add more comments describing
8922     the return values and parameters. Make minor adjustments to improve
8923     the legibility of the code. Fix problem with adjusted not being set
8924     in most cases.
8925    
8926 frank 893 2003-05-12 Frank Koormann <[email protected]>
8927    
8928     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
8929     and latin1. Fixes #1851 finally.
8930    
8931 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
8932    
8933 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
8934    
8935     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
8936     Clean up debugging statement, add comments, fix a small bug in the
8937     returned adjusted percentiles.
8938    
8939     2003-05-09 Jonathan Coles <[email protected]>
8940    
8941 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
8942     and such ranges can now be saved and loaded from disk.
8943    
8944     Quantiles are now available in the Classification Generator.
8945    
8946     Initial support for building Queries on a table. Doesn't do anything
8947     but run some tests.
8948    
8949     * Thuban/Model/classification.py: Explicit imports.
8950     (ClassGroupRange): Use the Range class to store the underlying
8951     range information. The interface remains the same, except for
8952     GetRange(), and you can also supply a Range object as the min
8953     parameter to SetRange or __init__.
8954    
8955     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
8956     string appropriately for use in Thuban. Fixes RTbug #1851.
8957     (SessionLoader.end_projection): Handle the context of the
8958     projection tag a bit better by looking at what objects are not
8959     None. There was an assumption that a projection tag for a map
8960     could occur before any layers.
8961     (SessionLoader.start_clrange): Provide backward compatibility for
8962     reading min/max values as well as the new range parameter.
8963    
8964     * Thuban/Model/map.py: Explicit imports.
8965    
8966     * Thuban/Model/resource.py: Import _.
8967     (ProjFileSaver.write): write header using projfile.dtd.
8968    
8969     * Thuban/Model/save.py: Explicit imports.
8970     (XMLWriter.encode): New. Encode the given string from a format
8971     used by Thuban into UTF-8. Fixes RTbug #1851.
8972    
8973     * Thuban/UI/classgen.py: Explicit imports.
8974     (ClassGenDialog.__init__): Clean up the code and add support
8975     for Quantiles.
8976     (ClassGenDialog.OnOK): Add support for Quantiles.
8977     (GenQuantilesPanel): New. Input panel for Quantiles.
8978     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
8979     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
8980    
8981     * Thuban/Model/classgen.py: New. Contains all the classes named above.
8982    
8983     * Thuban/UI/classifier.py: Explicit imports.
8984     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
8985     ClassTable.SetValueAsCustom): Reworked to use new Range class.
8986    
8987     * Thuban/UI/legend.py: Explicit imports.
8988    
8989     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
8990     a Table menu and associated method calls.
8991     (MainWindow.choose_color): Removed. No longer needed.
8992    
8993     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
8994     should be disabled if no projection is selected in the available
8995     list.
8996    
8997     * Thuban/UI/renderer.py: Explicit imports.
8998    
8999     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
9000     with correctly selecting the rows and issuing the right events.
9001     Be sure to call Skip() to allow the grid to do some of its own
9002     handling which allows the rows to actually be selected.
9003     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
9004     selecting multiple shapes.
9005     (LayerTableFrame): Support for building Queries.
9006     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
9007    
9008     * Thuban/UI/tree.py: Explicit imports.
9009    
9010     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
9011     table view can call it.
9012    
9013     * test/test_classification.py: Explicit imports.
9014     (TestClassification.test_ClassGroupRange): Fix test for new
9015     Range class.
9016    
9017     * Doc/thuban.dtd: Add range parameter for clrange.
9018    
9019     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
9020     object in ClassGroupRange, and also uesd for inputting ranges in
9021     the classifer table and elsewhere.
9022    
9023     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
9024     yet.
9025    
9026 frank 872 2003-05-09 Frank Koormann <[email protected]>
9027    
9028     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
9029    
9030 frank 860 2003-05-08 Frank Koormann <[email protected]>
9031    
9032 frank 870 Coding style updates
9033    
9034     * test/test_scalebar.py: Replaced tab indentation by spaces.
9035    
9036     * Thuban/UI/scalebar.py: Explicit imports.
9037    
9038     2003-05-08 Frank Koormann <[email protected]>
9039    
9040 frank 867 * Thuban/UI/scalebar.py
9041     (ScaleBar.DrawScalebar): Format string bug fixed.
9042    
9043     2003-05-08 Frank Koormann <[email protected]>
9044    
9045 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
9046    
9047     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
9048     (deriveInterval):
9049     Calculate scalebar interval and unit which fits in width for scale.
9050     (roundInterval): Round float.
9051    
9052     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
9053    
9054     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
9055    
9056     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
9057    
9058     2003-05-08 Frank Koormann <[email protected]>
9059    
9060 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
9061     Initialize ScaleBar with canvas.map
9062    
9063     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
9064     round intervals to display smarter lengths
9065     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
9066     layer. If the maps has no projection applied grey the scalebar.
9067    
9068 frank 857 2003-05-07 Frank Koormann <[email protected]>
9069    
9070     Basic Scalebar features added.
9071    
9072     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
9073    
9074     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
9075     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
9076     and the renderer.
9077    
9078     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
9079    
9080     * Thuban/UI/messages.py: SCALE_CHANGED added.
9081    
9082 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
9083    
9084 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
9085     variable shapestores to hold a list of all open shapestore objects
9086     (Session.ShapeStores): New. Accessor method for the shapestores
9087     list.
9088     (Session._add_shapestore, Session._clean_weak_store_refs): New.
9089     Internal methods to maintain the shapestores list.
9090     (Session.Tables): New. Return all tables open in the session.
9091     (Session.OpenShapefile): Insert the new ShapeStore into the
9092     shapestores list.
9093    
9094     * test/test_session.py (TestSessionSimple.test_initial_state): Add
9095     tests for ShapeStores and Tables
9096     (TestSessionWithContent.test_shape_stores)
9097     (TestSessionWithContent.test_tables): New. Test cases for
9098     ShapeStores and Tables
9099    
9100     2003-05-07 Bernhard Herzog <[email protected]>
9101    
9102 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
9103     Add comments about the optimizations used.
9104     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
9105     Implement the ReadValue table interface method.
9106    
9107     * test/test_transientdb.py
9108     (TestTransientTable.run_iceland_political_tests)
9109     (TestTransientTable.test_transient_joined_table): Add tests for
9110     ReadValue
9111    
9112 frank 848 2003-05-07 Frank Koormann <[email protected]>
9113    
9114     * Resources/Bitmaps/fulllayerextent.xpm,
9115     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
9116     new icons.
9117    
9118 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
9119    
9120 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
9121     New. Simply delegate to the transient table's version.
9122    
9123     * test/test_transientdb.py
9124     (TestTransientTable.test_auto_transient_table_query): New. Test
9125     case for AutoTransientTable's SimpleQuery
9126    
9127     2003-05-06 Bernhard Herzog <[email protected]>
9128    
9129 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
9130     Implement a simple query method for the query dialog
9131     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
9132     the row index or shapeid.
9133     (TransientTable.create): Insert the right value of the row index
9134     (TransientJoinedTable.create): Copy the row index of the left
9135     table to the joined result table
9136    
9137     * test/test_transientdb.py
9138     (TestTransientTable.test_transient_table_read_twice): Fix
9139     doc-string
9140     (TestTransientTable.test_transient_table_query): New. Test for the
9141     SimpleQuery method
9142    
9143     2003-05-06 Bernhard Herzog <[email protected]>
9144    
9145 bh 840 Convert all table users to use the new table interface. This only
9146     covers Thuban itself, not GREAT-ER or other applications built on
9147     Thuban yet, so the compatibility interface stays in place for the
9148     time being but it now issues DeprecationWarnings.
9149    
9150     Finally, the new Table interface has a new method, HasColumn.
9151    
9152     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
9153     issue deprecation warnings when they're. The warnings refer to the
9154     caller of the method.
9155     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
9156     for the deprecation warnings
9157    
9158     * test/test_table.py: Ignore the deprecation warnings for the old
9159     table in the tests in this module. The purpose of the tests is to
9160     test the old interface, after all.
9161    
9162     * test/test_transientdb.py
9163     (TestTransientTable.run_iceland_political_tests): Use the
9164     constants for the types. Add a test for HasColumn
9165     (TestTransientTable.test_transient_joined_table): Adapt to new
9166     table interface. Add a test for HasColumn
9167     (TestTransientTable.test_transient_table_read_twice): Adapt to new
9168     table interface
9169    
9170     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
9171     Adapt to new table interface
9172    
9173     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
9174     new table interface
9175    
9176     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
9177     (RecordTable.SetTable): Adapt to new table interface
9178    
9179     * Thuban/UI/classifier.py (Classifier.__init__)
9180     (Classifier.__init__): Adapt to new table interface
9181    
9182     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
9183     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
9184     to new table interface
9185    
9186     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
9187     (AutoTransientTable.HasColumn): Implement the new table interface
9188     method
9189     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
9190     (AutoTransientTable.UniqueValues): Adapt to new table interface
9191    
9192     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
9193     Adapt to new table interface
9194    
9195     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
9196     simplify opening shapefiles a bit easier.
9197     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9198     (TestLayer.test_point_layer): Use the new helper method
9199     (TestLayer.test_get_field_type): New. Test for the GetFieldType
9200     method
9201    
9202     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
9203     the new table method
9204    
9205     * test/test_memory_table.py (TestMemoryTable.test_has_column):
9206     Test for the new table method HasColumn
9207    
9208 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
9209    
9210     Addresses the "Selection Extent" wish of RTbug #1787.
9211    
9212     * Resources/Bitmaps/fulllayerextent.xpm,
9213     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
9214     extent. These are just place holders for the real bitmaps.
9215    
9216     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
9217     calculate the bounding box once (the first time compute_bbox() is
9218     called).
9219     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
9220     the bounding box for the shapes in lat/long coordinates.
9221    
9222     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
9223     option.
9224     (MainWindow.has_selected_shapes): New. Returns true if there are
9225     any selected shapes.
9226     (MainWindow.FullSelectionExtent): New. Calls
9227     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
9228     (_has_selected_shapes): New. Returns true if there are any
9229     selected shapes.
9230    
9231     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
9232     true if there are any selected shapes.
9233    
9234     * Thuban/UI/view.py (MapCanvas): Added delegated method
9235     HasSelectedShapes.
9236     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
9237     shapes on the canvas using the map projection (if any).
9238    
9239     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
9240     for Layer.ShapesBoundingBox().
9241    
9242 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
9243    
9244     * Resources/Projections/defaults.proj: Fix spelling of Mercator
9245    
9246 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
9247    
9248     Addresses the "Full Layer Extent" wish of RTbug #1787.
9249    
9250     * Resources/Projections/defaults.proj: Added UK National Grid.
9251    
9252     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
9253     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
9254     when the user selects the menu option.
9255    
9256     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
9257     scales the given layer on the canvas using the map projection.
9258    
9259 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
9260    
9261     Convert the table implementations to a new table interface. All
9262     tables use a common mixin class to provide backwards compatibility
9263     until all table users have been updated.
9264    
9265     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
9266     provide backwards compatibility for table classes implementing the
9267     new interface
9268     (DBFTable, MemoryTable): Implement the new table interface. Use
9269     OldTableInterfaceMixin as base for compatibility
9270     (DBFColumn, MemoryColumn): New. Column description for DBFTable
9271     and MemoryTable resp.
9272    
9273     * test/test_dbf_table.py: New. Test cases for the DBFTable with
9274     the new table interface.
9275    
9276     * test/test_memory_table.py: New. Test cases for the MemoryTable
9277     with the new table interface.
9278    
9279     * test/test_table.py: Document the all tests in this file as only
9280     for backwards compatibility. The equivalent tests for the new
9281     interface are in test_memory_table.py and test_dbf_table.py
9282     (MemoryTableTest.test_read): field_info should be returning tuples
9283     with four items
9284     (MemoryTableTest.test_write): Make doc-string a more precise.
9285    
9286     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
9287     table interface. Derive from from OldTableInterfaceMixin for
9288     compatibility.
9289     (TransientTableBase.create): New intance variable column_map to
9290     map from names and indices to column objects
9291     (TransientTable.create): Use the new table interface of the input
9292     table
9293     (AutoTransientTable): Convert to new table interface. Derive from
9294     from OldTableInterfaceMixin for compatibility.
9295     (AutoTransientTable.write_record): Removed. It's not implemented
9296     yet and we still have to decide how to handle writing with the new
9297     table and data framework.
9298    
9299     * test/test_transientdb.py
9300     (TestTransientTable.run_iceland_political_tests)
9301     (TestTransientTable.test_transient_joined_table): Use the new
9302     table interface
9303    
9304 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
9305    
9306     This is namely a collection of UI updates to improve user interactivity.
9307     Tabbing between controls now exists and you can use ESC to close dialog
9308     boxes; ENTER will active the default button.
9309    
9310     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
9311     order that the controls are created so that tabbing works correctly.
9312     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
9313     wxDialog can handle the default button correctly.
9314     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
9315     same reasons as for OnOK.
9316     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
9317     when we ask the table for the maximum/minimum values of a field
9318     which could take a very long time.
9319    
9320     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
9321     order that the controls are created so that tabbing works correctly.
9322     (SelectPropertiesDialog.__init__): Rearrange the order that the
9323     controls are created so that tabbing works correctly.
9324    
9325     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
9326     to derive from a wxDialog but behave like the original implementation
9327     which was derived from a wxFrame. wxDialog provides useful key
9328     handling functionality like ESC calling OnCancel and ENTER calling
9329     OnOK which is lost with wxFrame.
9330    
9331     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
9332     new dialogs.
9333    
9334     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
9335     order that the controls are created so that tabbing works correctly.
9336     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
9337     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
9338     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
9339     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
9340     can provide the "UK National Grid" as a default projection.
9341     (UTMPanel.__init__): Rearrange the order that the controls are
9342     created so that tabbing works correctly.
9343    
9344 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
9345    
9346 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
9347     (project_point): If a map projection but no layer projection is
9348     given, convert degrees to radians before applying the map
9349     projection.
9350    
9351 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
9352     (TableGrid.allow_messages): New methods to make it possible to
9353     inhibit message sending.
9354     (TableGrid.issue): Only send the message if not inhibited.
9355     (LayerTableGrid.select_shape): Use the new methods to make sure
9356     that no ROW_SELECTED message is sent while we're updating the
9357     selected rows to match the selected shapes.
9358    
9359 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
9360    
9361     Implementation of MemoryTable.
9362    
9363     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
9364     implementation that operates on a list of tuples. All of the data
9365     are kept in the memory.
9366    
9367     * test/test_table.py (MemoryTableTest): New.
9368    
9369     * test/test_transientdb.py (SimpleTable): Removed.
9370     (TestTransientTable.test_transient_joined_table,
9371     (TestTransientTable.test_transient_table_read_twice): Replaced
9372     SimpleTable by MemoryTable.
9373    
9374 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
9375    
9376 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
9377     for each of the layers.
9378    
9379     * Resources/Projections/defaults.proj: Geographic projection
9380     contains unit conversion parameter.
9381    
9382     2003-04-30 Jonathan Coles <[email protected]>
9383    
9384 jonathan 793 The most important part of this putback is the projection changes.
9385     It should now be possible to specify the projection that a layer
9386     is in and then specify a different projection for the map. The
9387     projection dialog has an extra parameter for a geographic projection
9388     which lets the user select if the input is in degrees or radians.
9389    
9390     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
9391     to say that the parameter is a tuple of unprojected
9392     points (which is what the callers to this method were assuming).
9393     Also, since the points are unprojected we need to projected them.
9394    
9395     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
9396     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
9397     groups are selected, move the layer up/down. Fixes RTbug #1833.
9398    
9399     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
9400    
9401     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
9402     parameter in call to SetClientData.
9403     (GeoPanel): Add support for selecting the units that the
9404     source data is in (Radians or Degrees).
9405    
9406     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
9407     the rendering loop by reducing the number of if's, removing the
9408     unnecessary try/except block, and checking if the old group
9409     is the same as the new one (which happens a lot if there is
9410     no classification, or lots of shapes are in the same group).
9411    
9412     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
9413     around the redraw routine to try to catch problems that the user
9414     may create by selecting invalid projections for the data set and
9415     map. Clears the display if there are any problems and prints the
9416     error.
9417     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
9418     rectangle.
9419    
9420     * extensions/thuban/wxproj.cpp (project_point): First invert the
9421     supplied point (which should be in projected coordinates) using
9422     the layer's projection and then project the point using the
9423     map's projection.
9424     (project_points): Use project_point() to project each point.
9425    
9426 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
9427    
9428     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
9429     don't set the Classification to None if the classfication field
9430     is None (ie only a DEFAULT).
9431    
9432 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
9433    
9434 bh 790 * Thuban/UI/view.py: Fix some typos.
9435    
9436 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
9437     not pop up the dialog if the selection becomes empty (this could
9438     happen if e.g. a new selection is opened while the identify tool
9439     is active and dialog had been closed)
9440    
9441     2003-04-30 Bernhard Herzog <[email protected]>
9442    
9443 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
9444     instance variable read_record_last_result
9445     (TransientTableBase.read_record): Make sure reading the same
9446     record twice works. The implementation uses the new instance
9447     variable read_record_last_result
9448    
9449     * test/test_transientdb.py
9450     (TestTransientTable.test_transient_table_read_twice): New test
9451     case for the above bug-fix.
9452    
9453 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
9454    
9455     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
9456    
9457     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
9458    
9459     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
9460     (ClassTable.SetValueAsCustom): Rename keyword argument in
9461     ClassGroup* constructors to match argument name.
9462    
9463 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
9464    
9465     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
9466     transient DB if it exists to make sure it doesn't leave a journal
9467     file in the temp directory.
9468    
9469     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
9470     self.conn to None after closing the connection to make sure it's
9471     not closed twice
9472    
9473 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9474    
9475 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
9476     "true". If anything other than "false" is specified we also assume
9477 jonathan 776 "true". Addresses RTbug #1025.
9478 jonathan 769
9479     * Doc/thuban.dtd: Add visible parameter to a layer.
9480    
9481     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
9482     of visible from 1 to True.
9483     (Layer.__init__): Change default value of visible from 1 to True.
9484    
9485     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
9486     parameter.
9487    
9488     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
9489     parameter.
9490    
9491     * test/test_load.py: Add new test data contents_test_visible.
9492     (LoadSessionTest.setUp): save test data.
9493     (LoadSessionTest.testLayerVisibility): Test if the visible flag
9494     is loaded correctly.
9495    
9496     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
9497     for saving an invisible layer.
9498    
9499     2003-04-29 Jonathan Coles <[email protected]>
9500    
9501 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
9502     legend dialog box and tell it to change its map to the one
9503     supplied to SetMap(). Fixes RTbug #1770.
9504    
9505 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
9506    
9507 bh 766 Next step of table implementation. Introduce a transient database
9508     using SQLite that some of the data is copied to on demand. This
9509     allows us to do joins and other operations that require an index
9510     for good performance with reasonable efficiency. Thuban now needs
9511     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
9512     haven't tested that.
9513    
9514     * Thuban/Model/transientdb.py: New. Transient database
9515     implementation.
9516    
9517     * test/test_transientdb.py: New. Tests for the transient DB
9518     classes.
9519    
9520     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
9521     classes to help automatically remove temporary files and
9522     directories.
9523     (Session.__init__): New instance variables temp_dir for the
9524     temporary directory and transient_db for the SQLite database
9525     (Session.temp_directory): New. Create a temporary directory if not
9526     yet done and return its name. Use AutoRemoveDir to have it
9527     automatically deleted
9528     (Session.TransientDB): Instantiate the transient database if not
9529     done yet and return it.
9530    
9531     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
9532     AutoTransientTable so that data is copied to the transient DB on
9533     demand.
9534     (SimpleStore): New class that simply combines a table and a
9535     shapefile
9536    
9537     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
9538     DBFTable and update its doc-string to reflect the fact that this
9539     is only the table interface to a DBF file. Table is now an alias
9540     for DBFTable for temporary backwards compatibility.
9541    
9542     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
9543     the last reference to the session goes away so that the temporary
9544     files are removed properly.
9545    
9546     * test/test_load.py (LoadSessionTest.tearDown): Remove the
9547     reference to the session to make sure the temporary files are
9548     removed.
9549    
9550     2003-04-29 Bernhard Herzog <[email protected]>
9551    
9552 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
9553     the __parser instance variable into a normal local variable in
9554     read. It's only used there and read will never be called more than
9555     once. Plus it introduces a reference cycle that keeps can keep the
9556     session object alive for a long time.
9557    
9558 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9559 jonathan 735
9560 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
9561     Projection an immutable item. Fixes RTbug #1825.
9562     (Projection.__init__): Initialize instance variables here.
9563     (ProjFile.Replace): New. Replace the given projection object with
9564     the new projection object. This solves the problem of needing the
9565     mutator Projection.SetProjection() in the ProjFrame class and
9566     allows a projection to change parameters without changing its
9567     location in the file.
9568    
9569     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
9570     be of type wxSAVE and should verify overwriting a file.
9571    
9572     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
9573     ProjFile.Replace() method instead of the mutator
9574     Projection.SetProjection(). Also requires that we reassign the
9575     client data to the new projection.
9576    
9577     * test/test_proj.py (TestProjection.test): Test GetName() and
9578     GetAllParameters()
9579     (TestProjFile.test): Remove tests for Set*() methods. Add tests
9580     for Replace().
9581    
9582     2003-04-25 Jonathan Coles <[email protected]>
9583    
9584 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
9585     to save the name of the projection.
9586    
9587     * test/test_save.py (SaveSessionTest.testLayerProjection): New
9588     test to verify layer projections are saved correctly.
9589    
9590     2003-04-25 Jonathan Coles <[email protected]>
9591    
9592 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
9593     to "Unknown" if name is None.
9594     (Projection.SetAllParameters): New. Set the projection's
9595     parameter list to the one supplied.
9596     (Projection.SetProjection): New. Set the projection's
9597     properties to those of the supplied Projection.
9598    
9599     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
9600     the dialog title to include the map's title.
9601     (MainWindow.LayerProjection): Set the dialog title to include
9602     the layer's title.
9603    
9604     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
9605     error dialogs into a single method call.
9606     (ProjFrame.__VerifyButtons): Add more states to check.
9607     (ProjFrame.__GetProjection): Return the current state of an
9608     edited projection or None.
9609     (ProjFrame.__FillAvailList): Remove checks for states that
9610     shouldn't exist.
9611     (ProjFrame._OnNew): Clear all selected items and supply
9612     a projection panel if necessary.
9613    
9614     * test/test_proj.py (TestProjFile.test): Add tests for
9615     ProjFile.SetAllParameters, ProjFile.SetProjection,
9616     ProjFile.SetName.
9617    
9618     2003-04-25 Jonathan Coles <[email protected]>
9619    
9620 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
9621     takes an optional argument to select the current projection.
9622     This does not guarantee that the item is visible due to
9623     limited wxWindows functionality. Fixes RTBug #1821.
9624    
9625     2003-04-25 Jonathan Coles <[email protected]>
9626    
9627 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
9628     the projection name and use it when constructing the Projection
9629     object.
9630    
9631     * Thuban/Model/proj.py (Projection.__init__): Change the default
9632     value for 'name' to None and then test if name is equal to None
9633     in the body of the constructor. This way the caller doesn't have to
9634     know what the default value should be. Namely, useful in load.py
9635     where we have to pick a default value if the 'name' parameter
9636     doesn't exist in the XML file.
9637    
9638     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
9639     Tests a file where a layer has a projection.
9640    
9641     2003-04-25 Jonathan Coles <[email protected]>
9642    
9643 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
9644     tree for projection information.
9645    
9646     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
9647     XMLReader.GetFileName.
9648     (SessionLoader): Added support for loading projection tags that
9649     appear inside a layer.
9650    
9651     * Thuban/Model/proj.py (ProjFile): Document the class. Move
9652     back to using a list because the order of the projections in
9653     the file is important to maintain. Fixes RTbug #1817.
9654    
9655     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
9656     to ProjFile.GetFilename.
9657    
9658     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
9659     information.
9660    
9661     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
9662     ProjFrame._OnSaveAs. Removed old dead code from previous
9663     implementation.
9664     (ProjFrame._OnExport): Add support for exporting more than one
9665     projection to a single file.
9666     (ProjFrame.__FillAvailList): use string formatting (% operator)
9667     to build strings that are (partly) translated. Fixes RTbug #1818.
9668    
9669     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
9670     class.
9671    
9672 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
9673    
9674     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
9675    
9676     * po/fr.po: New. French translation by Daniel Calvelo Aros
9677    
9678     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
9679     empty strings.
9680    
9681 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
9682 jonathan 724
9683     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
9684     implement the interface that the ProjFrame dialog expects.
9685    
9686     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
9687     name of the projection to be changed.
9688     (ProjFile): Use a dictionary instead of a list so that removing
9689     projections is easier and we are sure about uniqueness.
9690     (ProjFile.Remove): Remove the given projection object.
9691    
9692     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
9693     Return a list with only one projection file instead of searching for
9694     any projection file. This simplifies many things if the user can
9695     only have one system file and one user file.
9696    
9697     * Thuban/UI/classgen.py: Change all references to
9698     genCombo to genChoice.
9699    
9700     * Thuban/UI/mainwindow.py: Add a Projection option under the
9701     layer menu.
9702     (MainWindow.LayerProjection): New. Open up a projection window
9703     for a layer.
9704    
9705     * Thuban/UI/projdialog.py: Large changes to how the dialog is
9706     laid out. Use three panels instead of one. One for the list of
9707     projections, one for the edit controls, and one for the buttons.
9708     Fixed resizing problems so that the dialog resizes correctly
9709     when the projection panel changes. Added import/export, save, and
9710     new buttons/functionality.
9711    
9712 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
9713    
9714     First step towards table management. Introduce a simple data
9715     abstraction so that we replace the data a layer uses more easily
9716     in the next step.
9717    
9718     * Thuban/Model/data.py: New file with a simple data abstraction
9719     that bundles shapefile and dbffile into one object.
9720    
9721     * Thuban/Model/session.py (Session.OpenShapefile): New method to
9722     open shapefiles and return a shape store object
9723    
9724     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
9725     object instead of a shapefile filename. This introduces a new
9726     instance variable store holding the datastore. For intermediate
9727     backwards compatibility keep the old instance variables.
9728     (open_shapefile): Removed. No longer needed with the shape store.
9729     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
9730     get the shape store used by a layer.
9731     (Layer.Destroy): No need to explicitly destroy the shapefile or
9732     table anymore.
9733    
9734     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
9735     (MainWindow.AddLayer): Use the session's OpenShapefile method to
9736     open shapefiles
9737    
9738     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
9739     session's OpenShapefile method to open shapefiles
9740    
9741     * test/test_classification.py
9742     (TestClassification.test_classification): Use the session's
9743     OpenShapefile method to open shapefiles and build the filename in
9744     a more platform independed way
9745    
9746     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
9747     Implement to have a session to use in the tests
9748     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9749     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
9750     session's OpenShapefile method to open shapefiles
9751     (TestLayerLegend.setUp): Instantiate a session so that we can use
9752     it to open shapefiles.
9753     (TestLayerLegend.tearDown): Make sure that all references to
9754     layers and session are removed otherwise we may get a resource
9755     leak
9756    
9757     * test/test_map.py (TestMapAddLayer.test_add_layer)
9758     (TestMapWithContents.setUp): Instantiate a session so that we can
9759     use it to open shapefiles.
9760     (TestMapWithContents.tearDown): Make sure that all references to
9761     layers, maps and sessions are removed otherwise we may get a
9762     resource leak
9763     ("__main__"): use support.run_tests() so that more info about
9764     uncollected garbage is printed
9765    
9766     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
9767     session's OpenShapefile method to open shapefiles
9768     ("__main__"): use support.run_tests() so that more info about
9769     uncollected garbage is printed
9770    
9771     * test/test_selection.py (TestSelection.tearDown): Make sure that
9772     all references to the session and the selection are removed
9773     otherwise we may get a resource leak
9774     (TestSelection.get_layer): Instantiate a session so that we can
9775     use it to open shapefiles.
9776     ("__main__"): use support.run_tests() so that more info about
9777     uncollected garbage is printed
9778    
9779     * test/test_session.py (TestSessionBase.tearDown)
9780     (TestSessionWithContent.tearDown): Make sure that all references
9781     to the session and layers are removed otherwise we may get a
9782     resource leak
9783     (TestSessionWithContent.setUp): Use the session's OpenShapefile
9784     method to open shapefiles
9785    
9786 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
9787    
9788     * Thuban/Model/load.py (XMLReader.read): Should have been checking
9789     if the file_or_filename object had the 'read' attribute.
9790    
9791 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
9792    
9793 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
9794     (ReadProjFile): Add documentation about which exceptions are raised.
9795     Always pass the exceptions up to the caller.
9796     (GetProjFiles): If the directory can't be read return an empty list.
9797     If any of the proj files can't be read skip that file and go
9798     on to the next one.
9799    
9800     * test/test_proj.py: Added test cases to handle nonexistent files,
9801     unreadable files, and files that don't parse correctly.
9802    
9803     2003-04-23 Jonathan Coles <[email protected]>
9804    
9805 jonathan 716 Projection dialog. Allows the user to select from a list
9806     of projection templates and optionally edit them and save new ones.
9807    
9808     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
9809     (ProjPanel): Base class for projection specific panels.
9810     (TMPanel): Projection panel for Transverse Mercartor.
9811     (UTMPanel): Projection panel for Universal Transverse Mercartor.
9812     (LCCPanel): Projection panel for Lambert Conic Conformal.
9813     (GeoPanel): Projetion panel for Geographic Projection.
9814    
9815     2003-04-23 Jonathan Coles <[email protected]>
9816    
9817 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
9818     promote symmetry. There now exists XMLReader and XMLWriter.
9819     (XMLReader.read): New. Call to read the given file descriptor or
9820     filename.
9821     (XMLReader.close): New. Make sure the file is closed.
9822     (XMLReader.GetFileName): New. Return just the file name that is being
9823     read from.
9824     (XMLReader.GetDirectory): New. Return just the directory of the file
9825     that is being read.
9826     (XMLReader.AddDispatchers): New. Take a dictionary which contains
9827     the names of functions to call as the XML tree is parsed.
9828     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
9829     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
9830     (SessionLoader): Removed class variables start_dispatcher and
9831     end_dispatcher since this functionality is now part of a class
9832     instance. Fixes RTbug #1808.
9833     (SessionLoader.__init__): Add dispatcher functions.
9834     (load_xmlfile): Code was moved into the XMLReader.read().
9835     (load_session): Use modified SessionLoader.
9836    
9837     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
9838     map's projection.
9839    
9840     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
9841     GetAllParameters.
9842     (Projection.GetParameter): Returns the value for the given parameter.
9843    
9844     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
9845     (GetProjFiles): Renamed from GetProjections. Now returns a list
9846     of ProjFile objects.
9847     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
9848     a list of ProjFile objects whose files are not user defined.
9849     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
9850     list of ProjFile objects whose files are user defined.
9851     (ProjFileReader): Extend new XMLReader.
9852    
9853     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
9854     promote symmetry.
9855    
9856     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
9857     control instead of a wxComboBox. wxChoice controls do not generate
9858     events as the uses highlights possible choices which fixes problems
9859     with resizing the dialog when the use selects an option.
9860    
9861     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
9862     control instead of a wxComboBox.
9863    
9864     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
9865     dialog.
9866    
9867     * test/test_proj.py (TestProjection.test): New tests for GetParameter
9868     method.
9869    
9870 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
9871    
9872 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
9873     constants
9874    
9875 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
9876     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
9877    
9878 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
9879    
9880 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
9881     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
9882     anymore.
9883     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
9884     (Layer.ShapeType, Layer.Shape): No need to call
9885     self.open_shapefile since it's always called in __init__
9886    
9887 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
9888     In wxPython 2.4 there's no need to extend MainLoop anymore since
9889     wxPython itself makes sure OnExit is called.
9890    
9891 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
9892    
9893 jonathan 693 Initial putback of projection management code. Includes new
9894     classes to read and write projection files. The current load
9895     and save classes were abstracted a bit so they could be reused.
9896     The Projection class was extended to provide new methods and
9897     have a name.
9898    
9899     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
9900     general XML reading methods that were part of ProcessSession.
9901    
9902     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
9903     name.
9904     (ProjFile): New. Represents a file that contains projection
9905     information.
9906    
9907     * Thuban/Model/resource.py: New. Contains general utilities
9908     for read and writing projection files.
9909    
9910     * Thuban/Model/save.py (XMLSaver): New. Contains all the
9911     general XML writing methods that were part of SessionSaver.
9912     (SessionSaver): Renamed from Saver.
9913    
9914     * test/test_proj.py: New test cases for the projection
9915     file read and write functions.
9916    
9917     2003-04-16 Jonathan Coles <[email protected]>
9918    
9919 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
9920     in the ClassGroup*.__repr__() methods so it is clearer when
9921     a value is a string and when it is a number.
9922    
9923     * test/test_load.py: Rework the classification test to test
9924     that we can load old files.
9925     (testLabels): Test a file where the groups have labels.
9926    
9927 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
9928    
9929     Safer implementation of the performance enhancements of the
9930     low-level renderer:
9931    
9932     * extensions/thuban/wxproj.cpp (extract_projection)
9933     (extract_pointer): Rename extract_projection to extract_pointer
9934     and redefine its purpose to return the pointer stored in a CObject
9935     returned by the object's cobject method. Update all callers.
9936     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
9937     handling of these low-level parameters so that each s_draw_info
9938     instance is handled as a CObject at python level that also
9939     contains real references to the actual python objects which
9940     contain the values in the struct. Add free_draw_info as the
9941     destructor.
9942     (draw_polygon_shape): Add the py_draw_info parameter which must a
9943     cobject containing an s_draw_info pointer.
9944    
9945     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
9946     method to instantiat the low-level render parameter
9947     (MapRenderer.draw_shape_layer): Use the new method. Remove some
9948     commented out code.
9949     (MapRenderer.draw_polygon_shape): Make the first parameter not the
9950     layer but the low-level render parameter
9951     (ScreenRenderer.draw_shape_layer): Use the low-level render
9952     parameter.
9953    
9954 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
9955    
9956 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
9957     the ClassGroup* classes to make debugging a bit easier.
9958     (ClassGroup.SetLabel): Check that the string is an instance
9959     of StringTypes not StringType. Accounts for Unicode strings.
9960    
9961     * Thuban/Model/color.py: Implemented __repr__ to make
9962     debugging a bit easier.
9963    
9964     * Thuban/Model/save.py (Saver.write_classification): Need to
9965     save the group label.
9966    
9967     * test/test_load.py (testClassification): New. Loads the
9968     iceland_sample_test.thuban file and checks if it was loaded
9969     correctly.
9970    
9971     2003-04-15 Jonathan Coles <[email protected]>
9972    
9973 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
9974     to improve rendering performance by initializing the variables
9975     that are not change each time draw_polygon_shape() is called.
9976     The values are stored in a global struct draw_info.
9977     (draw_polygon_shape): Removed initialization code that is
9978     now in draw_polygon_init().
9979    
9980     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
9981 jonathan 674 drawing initialization call to draw_polygon_init()
9982     (MapRenderer.draw_polygon_shape): Use new signature of
9983     draw_polygon_shape.
9984 jonathan 673
9985 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
9986     weirdness by setting the range to (1, maxint).
9987 jonathan 673
9988 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
9989     instance variables private and optimize comparison operator
9990     by first checking if the color references are the same.
9991     (ClassGroupSingleton): Make instance variables private.
9992     (ClassGroupRange): Make instance variables private.
9993 jonathan 673
9994 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
9995    
9996 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
9997    
9998     First stab at internationalized messages:
9999    
10000     * Thuban/__init__.py (_): Implement the translation function for
10001     real using the python gettext module.
10002    
10003     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
10004     translate empty strings.
10005    
10006     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
10007     Add a missing space to a warning message
10008    
10009     * po/README: New. Notes about the management of the translation
10010     files.
10011    
10012     * po/Makefile: New. Makefile to help manage the translation files.
10013    
10014     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
10015    
10016     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
10017     translations and support files in po/
10018    
10019     * setup.py (data_files): Add the *.mo files to the data_files too
10020    
10021     * README: Add note about the translations when building from CVS
10022    
10023 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
10024    
10025     * Thuban/UI/dock.py: Fixes some window resizing problems most
10026     noticable under windows. Always assume the button bitmaps will
10027     be there. Code clean up.
10028     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
10029     images for the dock/undock button to the same images.
10030     Work around for RTbug #1801.
10031    
10032     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
10033     be allowed to grow within the sizer. Fixes a bug under Windows
10034     where the toolbar wasn't being drawn.
10035    
10036 frank 664 2003-04-14 Frank Koormann <[email protected]>
10037    
10038     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
10039     Updated design to try to make the button functionality more
10040     transparent.
10041    
10042 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
10043    
10044     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
10045     finalize the intialization of the panel.
10046    
10047     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
10048     creation of the panel. Should be the last thing called in the
10049     initializer of a subclass.
10050    
10051     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
10052     set the current selections in the combo boxes. This is needed
10053     under Windows.
10054    
10055     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
10056     level panel to the dialog so that the background colors are
10057     consistent under Windows.
10058    
10059 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
10060    
10061 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
10062     not black.
10063    
10064     * Thuban/UI/legend.py: Enable/disable the legend buttons when
10065     the legend changes. Fixes RTbug #1793.
10066    
10067     * test/test_classification.py: Added test for copying of
10068     classifications.
10069    
10070     2003-04-11 Jonathan Coles <[email protected]>
10071    
10072 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
10073     such as bitmaps.
10074    
10075     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
10076     added images to the move buttons, added 'reverse' button.
10077     (CustomRampPanel.__init__): Added images to the move buttons.
10078     (GreyRamp): New. Generates a ramp from white to black.
10079     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
10080    
10081     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
10082     ID_PROPERTY_*.
10083     (Classifier.__init__): Minor changes to the layout.
10084     (Classifier._OnTitleChanged): Listen for when the user edits the
10085     title and update the dialog's title and the layer's title.
10086    
10087     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
10088    
10089     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
10090     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
10091     if the layer's title changes.
10092    
10093     * Thuban/UI/mainwindow.py: Added new menu item and associated code
10094     to open a dialog to rename the map.
10095     (MainWindow): Use new resource class to import bitmaps.
10096    
10097     2003-04-11 Jonathan Coles <[email protected]>
10098    
10099 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
10100 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
10101     Resources/Bitmaps/group_use_none.xpm,
10102     Resources/Bitmaps/group_use_not.xpm,
10103     Resources/Bitmaps/hide_layer.xpm,
10104     Resources/Bitmaps/layer_properties.xpm,
10105     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
10106     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
10107     New.
10108 jonathan 646
10109 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
10110    
10111 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
10112     Should pass group to ClassGroup constructor.
10113    
10114     2003-04-10 Jonathan Coles <[email protected]>
10115    
10116 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
10117     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
10118     here. Implement SetVisible(), IsVisible().
10119     (ClassGroup.__init__): Add group parameter which acts as a copy
10120     constructor.
10121    
10122     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
10123     "Visible" check boxes.
10124     (Classifier): Rename the buttons and refactor the code to match
10125     the new labels.
10126    
10127     * Thuban/UI/legend.py: Classify button is now called "Properties".
10128     Refactored the code to change variable names.
10129     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
10130    
10131     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
10132     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
10133     renamed to MainWindow.LayerEditProperties.
10134     (MainWindow.ToggleLegend): Don't include map name in legend title.
10135     (MainWindow.SetMap): Added the map name to the window title.
10136     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
10137     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
10138     Functionality is found in the layer properties dialog.
10139    
10140     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10141     draw visible groups.
10142    
10143 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
10144    
10145 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
10146     addition and selection of new color schemes.
10147     (MonochromaticRamp): New. Generates a ramp between two colors.
10148     (RedRamp): New. Generates a ramp of all red.
10149     (GreenRamp): New. Generates a ramp of all green.
10150     (BlueRamp): New. Generates a ramp of all blue.
10151    
10152     2003-04-09 Jonathan Coles <[email protected]>
10153    
10154 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
10155     Need to copy over field and fieldType attributes.
10156    
10157     * Thuban/Model/table.py (Table.field_range): New. Retrive the
10158     maximum and minimum values over the entire table for a given
10159     field.
10160     (Table.GetUniqueValues): New. Retrieve all the unique values
10161     in the table for a given field.
10162    
10163     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
10164     (GenUniquePanel): New. Controls to allow the user to select
10165     which unique field values they would like in the classification.
10166     (CustomRampPanel): Code that was in ClassGenDialog that allows
10167     the user to select the properties for a custom ramp.
10168     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
10169    
10170     * Thuban/UI/classifier.py: Removed a lot of debugging code.
10171     (Classifier._SetClassification): Callback method so that the
10172     class generator can set the classification in the grid.
10173     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
10174     editing of a group properties class into a wxWindows control.
10175    
10176     * Thuban/UI/dock.py: It was decided that if the user closes
10177     a dockable window the window should simply hide itself. That
10178     way if the user wants to show the dock again it appears in the
10179     same place as it was when it was closed.
10180     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
10181     (DockableWindow._OnButtonClose): Hide the window instead of
10182     destroying it.
10183     (DockableWindow._OnClose): Hide the window instead of
10184     destroying it.
10185    
10186     * Thuban/UI/legend.py (LegendTree): Use a private method to
10187     consistently set the font and style of the text. Fixes RTbug #1786.
10188    
10189     * Thuban/UI/mainwindow.py: Import just the Classifier class.
10190    
10191 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
10192    
10193 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
10194     to the map module
10195    
10196     2003-04-07 Bernhard Herzog <[email protected]>
10197    
10198 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
10199     favor of ToggleSessionTree
10200     (MainWindow.ToggleSessionTree): New method to toggle visibility of
10201     the session tree.
10202     (MainWindow.SessionTreeShown): New method to return whether the
10203     session tree is currently shown.
10204     (MainWindow.ToggleLegend): New method to toggle visibility of the
10205     legend
10206     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
10207     LegendShown
10208     (MainWindow.LegendShown): New method to return whether the legend
10209     is currently shown.
10210     (_method_command): Add checked parameter so we can define check
10211     menu items
10212     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
10213     mainwindow methods.
10214     (show_session_tree, show_legend commands): Removed.
10215     (toggle_session_tree, toggle_legend commands): New commands to
10216     toggle the visibility of the dialogs
10217    
10218 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
10219    
10220 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
10221    
10222     * Thuban/UI/dock.py: Fix Windows problem.
10223    
10224     * Thuban/UI/mainwindow.py: Use False instead of false.
10225     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
10226    
10227     2003-04-07 Jonathan Coles <[email protected]>
10228    
10229 jonathan 612 Since we now say that the order of the groups in a classification
10230     matters, it makes sense to be able to manipulate that order. Most
10231     of the changes to Thuban/Model/classification.py are to that end.
10232    
10233     * Thuban/Model/classification.py (Classification.AppendGroup,
10234     Classification.InsertGroup, Classification.ReplaceGroup,
10235     Classification.RemoveGroup, Classification.GetGroup): Do as the
10236     names imply.
10237     (Classification.FindGroup): This was called GetGroup, but GetGroup
10238     takes an index, while FindGroup takes a value.
10239     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
10240     REFERENCE. Currently there is a cyclic reference between the layer
10241     and its classification. If the classification doesn't need to know
10242     its owning layer we can change this, since it may make sense to be
10243     able to use the same classification with different layers.
10244    
10245     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
10246    
10247     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
10248     not AddGroup()
10249    
10250     * Thuban/UI/classifier.py: Now that we can depend on the order in
10251     a Classification and have methods to manipulate that order we don't
10252     need to use our own data structures in the grid. We can simply make
10253     the grid/table access the information they need from a copy of
10254     the classification object.
10255     (Classifier._OnCloseBtn): Event handler for when the user clicks
10256     'Close'. This is needed so if the user applies changes and then
10257     continues to change the table the user has the option of discarding
10258     the most recent changes and keeping what they applied.
10259    
10260     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
10261     into the same group.
10262    
10263     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
10264     with a really old version of proj, PJ_VERSION won't even be defined.
10265     If it isn't defined then just compile so that the function always
10266     returns Py_False.
10267    
10268     * test/test_classification.py: Fix tests to use the renamed methods.
10269     Still need to write tests for the new methods.
10270    
10271 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
10272 jonathan 608
10273 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
10274     call to SetSelection out of the method and before the call
10275     to __SelectField in __init__. This prevents a recursion of events
10276     when _OnFieldSelect is triggered by the user.
10277    
10278     2003-04-04 Jonathan Coles <[email protected]>
10279    
10280 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
10281     Color.Transparent.
10282     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
10283     Don't bother copying the color, since Colors are immutable.
10284    
10285     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
10286     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
10287     Thuban/UI/renderer.py, Thuban/UI/view.py:
10288     Rename Color.None to Color.Transparent.
10289    
10290     * test/test_classification.py, test/test_load.py: Rename Color.None
10291     to Color.Transparent.
10292    
10293     2003-04-04 Jonathan Coles <[email protected]>
10294 jonathan 603
10295     * Thuban/Model/classification.py: Fix assert calls.
10296     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
10297     Copy the color parameter rather than hold onto a reference.
10298 jonathan 601
10299 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
10300     the color object.
10301     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
10302     are sure there exists only one refernce to Color.None in the system.
10303     This allows us to use 'is' rather than the comparision functions.
10304    
10305     * Thuban/Model/save.py: Fix assert calls.
10306    
10307     * Thuban/UI/classifier.py: Fix assert calls.
10308     (ClassGrid._OnCellDClick): Call up to the classifier to open the
10309     dialog to edit the groups properties.
10310     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
10311     correctly if a cell is resized.
10312     (ClassTable.SetClassification): New. Changes the classification
10313     that is in the table.
10314     (ClassTable.__SetRow): Allow groups to be prepended.
10315     (Classifier): New code for opening the EditProperties and
10316     GenerateRanges dialogs.
10317     (SelectPropertiesDialog.__GetColor): Only set the color in the
10318     color dialog if the current color is not None.
10319    
10320     * Thuban/UI/dock.py: Fix assert calls.
10321    
10322     * Thuban/UI/legend.py: Fix assert calls.
10323    
10324     * Thuban/UI/renderer.py: Fix assert calls.
10325    
10326     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
10327     classifications.
10328     (GenRangePanel): Panel specific to range generation.
10329     (GenSingletonPanel): Panel specific to singleton generation.
10330     (ClassGenerator): Class responsible for actually generating
10331     the classification from the data gathered in the dialog box.
10332     (PropertyRamp): Generates properties whose values range from
10333     a starting property to an ending property.
10334 jonathan 601
10335 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
10336    
10337     * test/support.py (print_garbage_information): New function that
10338     prints information about still connected messages and memory
10339     leaks.
10340     (run_suite): Removed.
10341     (run_tests): New function for use as a replacement of
10342     unittest.main in the test_* files. This one calls
10343     print_garbage_information at the end.
10344    
10345     * test/runtests.py (main): Use support.print_garbage_information
10346    
10347     * test/test_layer.py: Use support.run_tests instead of
10348     unittest.main so we get memory leak information
10349     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
10350     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
10351     (TestLayerLegend.test_visibility): Call the layer's Destroy method
10352     to fix a memory leak.
10353    
10354     * test/test_classification.py: Use support.run_tests instead of
10355     unittest.main so we get memory leak information
10356     (TestClassification.test_classification): Call the layer's Destroy
10357     method to fix a memory leak.
10358    
10359 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
10360    
10361 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
10362     Handle the reference counts of the return value and errors in
10363     PyArg_ParseTuple correctly.
10364    
10365 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
10366     sure the filename is absolute to avoid problems when saving the
10367     session again
10368    
10369 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
10370    
10371 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
10372    
10373 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
10374 jonathan 587 that there actually are points in the returned list of points
10375     before trying to index into the list. The list may be empty if
10376     the shape is a Null Shape.
10377    
10378 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
10379    
10380     * test/test_map.py: Don't use from <module> import *
10381    
10382 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
10383    
10384     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
10385     LAYER_LEGEND_CHANGED
10386    
10387     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
10388     self.Destroy() to close the window after yesterday's changes.
10389    
10390     * test/test_map.py, test/test_session.py: Fix messages that
10391     are sent from maps and layers.
10392    
10393 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
10394    
10395     * Thuban/UI/classifier.py: Commented out some debugging statements.
10396     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
10397     RTbug #1769.
10398    
10399     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
10400     position (although position doesn't work yet under GTK).
10401     (DockableWindow.Destroy): New. Called when the window must be
10402     closed. Namely needed when the DockFrame closes and must close
10403     its children.
10404     (DockFrame): Listen for EVT_CLOSE and destroy all children.
10405    
10406     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
10407     when then window is told to close.
10408     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
10409     comment in source for more info.
10410    
10411     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
10412    
10413     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
10414     symmetry with other such methods.
10415     (MainWindow.ShowLegend): Show the legend docked by default.
10416    
10417 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
10418    
10419     * Thuban/UI/classifier.py: Support for highlighting a specific
10420     group within the grid when the classification dialog is opened.
10421     Also contains a lot of debugging printouts which will later
10422     be removed.
10423    
10424     * Thuban/UI/dock.py: Complete rework on the dock code so that
10425     that it is fairly removed from the rest of the Thuban application.
10426     It is easy to add new docks which the rest of the program having
10427     to be aware of them.
10428    
10429     * Thuban/UI/legend.py: Modifications to support selecting a
10430     specific group in the classification dialog. Changed how layers
10431     are drawn when the layer is visible/invisible.
10432    
10433     * Thuban/UI/mainwindow.py: Removed legend specific code and
10434     replaced it with calls to the new dock code.
10435    
10436     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
10437     to check if scale > 0. Trying to track down a divide by zero.
10438    
10439 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
10440    
10441 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
10442     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
10443     now part of DockableWindow.
10444     (LegendPanel.DoOnSelChanged): Select the current layer in the
10445     map.
10446     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
10447     with the selected layer and/or group.
10448    
10449     2003-03-26 Jonathan Coles <[email protected]>
10450    
10451 jonathan 557 This putback contains the code for dockable windows. There is
10452     no support in wxWindows as of this date for windows that can
10453     attach themselves to other windows.
10454    
10455     The current model contains a DockableWindow which has a parent
10456     window for when it is detached and a dock window that it puts
10457     its contents in when it is docked. The contents of a DockableWindow
10458     must be a DockPanel. DockPanel itself derives from wxPanel.
10459    
10460     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
10461     message, not a LAYER_LEGEND_CHANGED message.
10462    
10463     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
10464    
10465     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
10466     as one of the style properties for the fieldTypeText item to
10467     be sure that its size is correct when the text changes.
10468    
10469     * Thuban/UI/dock.py: New. Classes for the DockPanel and
10470     DockableWindow.
10471    
10472     * Thuban/UI/legend.py: Added some more buttons and made the
10473     LegendPanel a DockPanel.
10474    
10475     * Thuban/UI/mainwindow.py: Added sash windows to the main window
10476     and supporting functions for manipulating the sashes.
10477     (MainWindow.ShowLegend): Create a DockableWindow with the
10478     LegendPanel as the contents.
10479    
10480     * Thuban/UI/messages.py: Added DOCKABLE_* messages
10481    
10482     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
10483     not LAYER_LEGEND_CHANGED, messages.
10484    
10485 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
10486    
10487     * setup.py: Added custom script bdist_rpm_build_script so that
10488     when the rpm is built the path to wx-config is correct.
10489    
10490     * setup.cfg: Added line saying to use the custom build script
10491    
10492 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
10493    
10494     Initial implementation of the Legend.
10495    
10496     * Thuban/UI/legend.py: New. Creates a window that shows the map's
10497     Legend information and allows the user to add/modify classifications
10498     and how the layers are drawn on the map.
10499    
10500     * setup.py: New command 'build_docs' which currently uses
10501     happydoc to generate html documentation for Thuban.
10502    
10503     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
10504     Returns a string which is appropriately describes the group.
10505    
10506     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
10507     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
10508    
10509     * Thuban/Model/map.py (Map): Rename messages and use new, more
10510     specific, messages.
10511    
10512     * Thuban/Model/messages.py: New message to indicate that a layer's
10513     data has changed (LAYER_CHANGED). New map messages to indicate
10514     when layers have been added/removed/changed or if the stacking order
10515     of the layers has changed.
10516    
10517     * Thuban/Model/session.py: Rename and use new messages.
10518    
10519     * Thuban/UI/classifier.py: Remember if any changes have actually
10520     been applied so that if the dialog is cancelled without an application
10521     of changes we don't have to set a new classification.
10522     (ClassDataPreviewer): Pulled out the window specific code and put it
10523     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
10524     symbols on any DC.
10525    
10526     * Thuban/UI/mainwindow.py: New code to open the legend.
10527    
10528     * Thuban/UI/view.py: Use new message names.
10529    
10530 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
10531    
10532     * Thuban/UI/main.py (verify_versions): New. Checks the versions
10533     of Python, wxPython, and some other libraries.
10534    
10535     * extensions/thuban/wxproj.cpp (check_version): Checks the given
10536     version against what wxproj was compiled with.
10537     (check_version_gtk): If wxproj was compiled with gtk then check
10538     the given version against the version of the gtk library
10539     currently being used.
10540    
10541 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
10542    
10543     * test/test_command.py: Run the tests when the module is run as a
10544     script
10545    
10546     2003-03-14 Bernhard Herzog <[email protected]>
10547    
10548     Implement selection of multiple selected shapes in the same layer:
10549    
10550     - Introduce a new class to hold the selection. This basically
10551     replaces the interactor which was nothing more than the
10552     selection anyway. A major difference is of course that the new
10553     selection class supports multiple selected shapes in one layer
10554    
10555     - Move the object that represents the selection from the
10556     application to the canvas. The canvas is a better place than the
10557     application because the selection represents which shapes and
10558     layer of the map displayed by the canvas are selected and
10559     affects how the map is drawn.
10560    
10561     - Make the selection and its messages publicly available through
10562     the mainwindow.
10563    
10564     - The non-modal dialogs do not get a reference to the interactor
10565     anymore as they can simply refer to their parent, the
10566     mainwindow, for the what the interactor had to offer.
10567    
10568     * Thuban/UI/selection.py: New module with a class to represent the
10569     selection.
10570    
10571     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
10572     these unused messages
10573    
10574     * Thuban/UI/application.py (ThubanApplication.OnInit)
10575     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
10576     interactor is gone now.
10577     (ThubanApplication.CreateMainWindow): There is no interactor
10578     anymore so we pass None as the interactor argument for now for
10579     compatibility.
10580    
10581     * Thuban/UI/view.py (MapCanvas.delegated_messages)
10582     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
10583     Unsubscribe, delegate messages according to the delegated_messages
10584     class variable.
10585     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
10586     attributes from instance variables as described with the
10587     delegated_methods class variable.
10588     (MapCanvas.__init__): New instance variable selection holding the
10589     current selection
10590     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
10591     pass them on to the renderer
10592     (MapCanvas.SetMap): Clear the selection when a different map is
10593     selected.
10594     (MapCanvas.shape_selected): Simple force a complete redraw. The
10595     selection class now takes care of only issueing SHAPES_SELECTED
10596     messages when the set of selected shapes actually does change.
10597     (MapCanvas.SelectShapeAt): The selection is now managed in
10598     self.selection
10599    
10600     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
10601     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
10602     Unsubscribe, delegate messages according to the delegated_messages
10603     class variable.
10604     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
10605     attributes from instance variables as described with the
10606     delegated_methods class variable.
10607     (MainWindow.__init__): The interactor as ivar is gone. The
10608     parameter is still there for compatibility. The selection messages
10609     now come from the canvas.
10610     (MainWindow.current_layer, MainWindow.has_selected_layer):
10611     Delegate to the the canvas.
10612     (MainWindow.LayerShowTable, MainWindow.Classify)
10613     (MainWindow.identify_view_on_demand): The dialogs don't need the
10614     interactor parameter anymore.
10615    
10616     * Thuban/UI/tableview.py (TableFrame.__init__)
10617     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
10618     (LayerTableFrame.row_selected): The interactor is gone. It's job
10619     from the dialog's point of view is now done by the mainwindow,
10620     i.e. the parent. Subscribe to SHAPES_SELECTED instead
10621     of SELECTED_SHAPE
10622    
10623     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
10624     is gone. It's job from the dialog's point of view is now done by
10625     the mainwindow, i.e. the parent.
10626    
10627     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
10628     gone. It's job from the dialog's point of view is now done by the
10629     mainwindow, i.e. the parent.
10630    
10631     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
10632     gone. It's job from the dialog's point of view is now done by the
10633     mainwindow, i.e. the parent.
10634     (SessionTreeCtrl.__init__): New parameter mainwindow which is
10635     stored as self.mainwindow. The mainwindow is need so that the tree
10636     can still subscribe to the selection messages.
10637     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
10638     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
10639     selection is now accessible through the mainwindow. Subscribe to
10640     SHAPES_SELECTED instead of SELECTED_SHAPE
10641    
10642     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
10643     SHAPES_SELECTED message now.
10644     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
10645     so deal with multiple shapes
10646     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
10647     gone. It's job from the dialog's point of view is now done by the
10648     mainwindow, i.e. the parent.
10649    
10650     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
10651     parameter is now a list of shape ids.
10652     (RecordTable.SetTable): The second parameter is now a list of
10653     indices.
10654    
10655     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
10656     selected_shape parameter and ivar to selected_shapes. It's now a
10657     list of shape ids.
10658     (MapRenderer.draw_label_layer): Deal with multiple selected
10659     shapes. Rearrange the code a bit so that the setup and shape type
10660     distinctions are only executed once.
10661    
10662     * test/test_selection.py: Test cases for the selection class
10663    
10664 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
10665    
10666     * Thuban/Model/load.py: Temporary fix so that the xml reader
10667     doesn't cause Thuban to crash.
10668    
10669     * Thuban/Model/layer.py: Handle the cyclic references between
10670     a layer and its classification better, and be sure to disconnect
10671     the classification from the layer when the layer is destroyed
10672     so that we don't maintain a cyclic reference that may not be
10673     garbage collected.
10674    
10675     * Thuban/Model/classification.py: See comment for layer.py.
10676    
10677 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
10678    
10679     * HOWTO-Release: New. Information on the steps for releasing
10680     a new version of Thuban.
10681    
10682 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
10683    
10684     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
10685     Use True instead of true.
10686     (Classifier): Should have a single panel in which all the controls lie.
10687    
10688     * Thuban/UI/proj4dialog.py: Add normal border.
10689    
10690     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
10691    
10692     * Thuban/UI/mainwindow.py: Use True instead of true.
10693    
10694     * setup.py: Update some definitions to use wxWindows2.4 files
10695    
10696     * Data/iceland_sample_class.thuban: Fixed file so that the
10697     field_type information is present.
10698    
10699 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
10700    
10701 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
10702     field type label grow so that when the text changes the
10703     size is updated correctly. This may be a wxWindows bug.
10704    
10705     2003-03-10 Jonathan Coles <[email protected]>
10706    
10707 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
10708     SESSION_REPLACED.
10709    
10710     * Thuban/UI/classifier.py: Wrap text with _().
10711     (ClassGrid.CreateTable): Set dimensions and size hints here,
10712     instead of in Reset, so we only set the size once.
10713    
10714     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
10715    
10716     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10717     Call Close() instead of Shutdown().
10718    
10719     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10720    
10721     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10722     Go back to using OnClose() instead of Shutdown().
10723    
10724     2003-03-10 Jonathan Coles <[email protected]>
10725    
10726 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
10727     to know the old field index as well as the new one.
10728    
10729     2003-03-10 Jonathan Coles <[email protected]>
10730    
10731 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
10732     to correctly set the table information and call this from
10733     __init__ and from _OnFieldSelect so that all the information
10734     is up to date when the dialog opens and when a field is changed.
10735    
10736     2003-03-10 Jonathan Coles <[email protected]>
10737    
10738 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
10739     layer's message function directly, use the ClassChanged() method
10740     when then classification changes. SetField/SetFieldType/SetLayer
10741     must keep the information about field name and field type in
10742     sync when an owning layer is set or removed.
10743    
10744     * Thuban/Model/layer.py: Added ClassChanged() so that the
10745     classification can tell the layer when its data has changed.
10746     (Layer.SetClassification): Accepts None as an arguement to
10747     remove the current classification and correctly handles
10748     adding a new classification.
10749    
10750     * Thuban/Model/load.py: Comment out print statement
10751    
10752     * test/test_classification.py, test/test_save.py: New and
10753     improved tests.
10754    
10755 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
10756    
10757     * Thuban/Model/classification.py: Implemented __copy__ and
10758     __deepcopy__ for ClassGroup* and ClassGroupProperites so
10759     they can easily be copied by the classifier dialog.
10760     (ClassGroupProperites.__init__): The default line color should
10761     have been Color.Black.
10762    
10763     * Thuban/UI/classifier.py: Setting and Getting table values now
10764     uses a consistent set of functions.
10765     (Classifier): Now non-modal. Has field type label which changes
10766     as the field changes. Keep track of buttons in a list so that
10767     we can enable/disable the buttons when the None field is selected.
10768     (SelectPropertiesDialog): Add buttons to make the colors transparent.
10769    
10770     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
10771     does what OnClose did, but can be called by the application to
10772     close a window. Needed when a session changes, and we have to
10773     close the classifier windows.
10774    
10775     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10776     Shuts down open dialogs. Used when a new session is created
10777     or a session is opened.
10778     (MainWindow.SaveSession): Should only call application.SaveSession()
10779     if we don't call SaveSessionAs first.
10780     (MainWindow.Classify): Allow different classifier dialogs for
10781     different layers.
10782    
10783     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
10784     the parent class handle it. Add Shutdown() to unsubscibe from
10785     event notification and call the parent Shutdown(). This was
10786     necessary so the application can close the tree window.
10787    
10788 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
10789    
10790     * Thuban/Model/classification.py: Minor documentation changes,
10791     Addition of __eq__ and __ne__ methods.
10792     (Classification.SetLayer): prevent recursion between this method
10793     and Layer.SetClassification().
10794    
10795     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
10796    
10797     * Thuban/Model/layer.py (SetClassification): prevent recursion
10798     between this method and Classification.SetLayer().
10799    
10800     * test/test_classification.py, test/test_load.py,
10801     test/test_session.py: Fixed and added tests for the classification
10802     classes.
10803    
10804 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
10805    
10806     * Thuban/UI/classifier.py (ClassGrid.__init__)
10807     (ClassGrid.CreateTable): Move the SetSelectionMode call to
10808     CreateTable because otherwise it triggers an assertion in
10809     wxPython/wxGTK 2.4.
10810    
10811 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
10812    
10813 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
10814 jonathan 471
10815 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
10816 jonathan 471
10817 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
10818 jonathan 471
10819 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
10820 jonathan 471
10821     2003-03-05 Jonathan Coles <[email protected]>
10822    
10823 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
10824     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
10825     Store just the groups in the table and generate the other
10826     column information when it is requested. Add "None" field
10827     to pull-down to select no classification.
10828    
10829     * Thuban/common.py: Moved FIELDTYPE constants from table.py
10830     (Str2Num): Only catch ValueError exceptions.
10831    
10832     * Thuban/Model/classification.py: Class documentation. Renaming
10833     of methods with Stroke to Line. Groups are stored in a single
10834     list with the default as the first element. Groups are searched
10835     in the order they appear in the list.
10836    
10837     * Thuban/Model/color.py: Documentation.
10838    
10839     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
10840     the kind of data represented by a field.
10841    
10842     * Thuban/Model/load.py (ProcessSession): Use proper string
10843     conversion function; fixes RTbug #1713.
10844    
10845     * Thuban/Model/save.py (Saver): Store field type information.
10846    
10847     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
10848     (Table): Add field_info_by_name() to retrieve field information
10849     by specifying the field name, not the number.
10850    
10851     * Thuban/UI/mainwindow.py: Function name changes.
10852    
10853     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10854     get the layer classification once. Don't try to classify
10855     values when the field is None: just use the default properties.
10856    
10857     * Thuban/UI/view.py: Function name changes.
10858    
10859     * Doc/thuban.dtd: Add field_type attribute to a classification.
10860    
10861 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
10862    
10863 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
10864     the fill and stroke layer attributes optional with suitable
10865     default values. Add the stroke_width layer attribute. Use correct
10866     syntax for empty elements. Make the attribute list for labels
10867     refer to the label element.
10868    
10869     2003-03-04 Bernhard Herzog <[email protected]>
10870    
10871 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
10872     Python 2.3 containing some of the functionality we implement in
10873     setup.py ourselves.
10874    
10875     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
10876     before the selection mode. Doing it the other way round triggers
10877     an assertion in wxWindows.
10878    
10879     * Thuban/Model/save.py (escape): Fix typo in doc-string
10880    
10881     * Thuban/Model/classification.py: Remove unnecessary wxPython
10882     import
10883    
10884 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
10885    
10886     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
10887     Parameter 'value' should default to None.
10888    
10889     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
10890     the class attribute __classification is now private.
10891    
10892     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
10893     Classifier to ClassGrid. Added support for removing selected rows,
10894     which including code for keeping track of when cells are selected,
10895     and deselected.
10896     (ClassTable): Support for added/removing rows. Fixed a problem
10897     with __ParseInput whereby it would not allow strings (only numbers)
10898     to be entered.
10899     (Classifier): Added button and supporting code for removing
10900     selected rows.
10901    
10902 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
10903 jonathan 434
10904     * Thuban/common.py: Moved color conversion functions into
10905     Thuban/UI/common.py.
10906     (Str2Num): Now converts the float (not the string) to a long/int
10907     so that an exception isn't thrown.
10908    
10909     * Thuban/UI/common.py: Common functions used in several UI modules
10910    
10911     * Thuban/Model/classification.py: Changed the class hierarchy
10912     so that a Classification consists of Groups which return
10913     Properties when a value matches a Group.
10914    
10915     * Thuban/Model/layer.py: Fixed name resolution problem.
10916    
10917     * Thuban/Model/load.py: Use new Classification and Group functions.
10918    
10919     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
10920     failure.
10921     (Saver.write_classification): Use new Classification and Group
10922     functions.
10923    
10924     * Thuban/UI/classifier.py: Changes to use new Classification and Group
10925 jonathan 445 functions. Fix to create a tuple with a single value instead of
10926     simply returning the value.
10927 jonathan 434
10928     * Thuban/UI/renderer.py: Use new Classification and Group functions.
10929     Use common.py functions.
10930    
10931 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
10932 jonathan 447
10933     * test/test_classification.py: Use new Classification and Group
10934     classes.
10935 jonathan 434
10936 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
10937    
10938     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
10939     functions from Thuban color objects to wxWindow colour objects.
10940    
10941     * Thuban/Model/classification.py (Classification): Renamed
10942     GetProperties() to GetClassData(). Used the new iterator
10943     in TreeInfo().
10944     (ClassIterator): Iterator implementation to iterate over the
10945     ClassData objects in a classification object.
10946    
10947     * Thuban/Model/save.py (Saver.write_classificaton): Uses
10948     the new iterator to save the classification information.
10949    
10950     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
10951     for changing the stroke and fill colors and previewing the
10952     changes.
10953    
10954     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
10955     MainWindow.SaveSessionAs): Text string changes so the dialogs
10956     have more meaningful titles.
10957    
10958     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
10959     Classification method name from GetProperties to GetClassData.
10960    
10961     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
10962     instead of accessing now non-existent class variables.
10963    
10964 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
10965    
10966     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
10967     unneeded Shape() call. Rendering is substantially faster without
10968     it and it avoids some problems with broken shape files.
10969    
10970 frank 423 2003-02-20 Frank Koormann <[email protected]>
10971    
10972     Force minimal size of identify and label dialogs. The autosizing
10973     looked too ugly.
10974    
10975     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
10976     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
10977     Set size of listctrl.
10978     * Thuban/UI/identifyview.py (IdentifyView.__init__):
10979     Set size of dialog.
10980    
10981 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
10982    
10983     * test/test_classification.py, test/test_layer.py,
10984     test/test_load.py, test/test_map.py, test/test_session.py:
10985     Updated the tests to use the new functions that are in the
10986     respective classes.
10987    
10988     * Thuban/Model/classification.py (Classification):
10989     Uses the new ClassData* classes. Modification messages are
10990     passed up to the parent layer (if it exists).
10991     (ClassData): New class to encapsulate the common data in each
10992     classification property.
10993     (ClassDataDefault): Represents the Default class. data.
10994     (ClassDataPoint): Represents a single class. data point
10995     (ClassDataRange): Represents a class. range
10996     (ClassDataMap): Represents a class. map (unused).
10997    
10998     * Thuban/Model/color.py: Added Color.None to represent something
10999     with no color. Color.Black represents the color black.
11000     (NoColor): Helper class derived from Color to represent something
11001     with no color.
11002    
11003     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
11004     stroke_width attributes. Made the 'classification' attribute private.
11005     New methods for setting/getting the classification.
11006    
11007     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
11008     to get the classifcation and use the new ClassData* classes to
11009     hold the classification data. Use Str2Num to convert numbers
11010     properly.
11011    
11012     * Thuban/Model/save.py (Saver): Use new Color and Classification
11013     methods
11014    
11015     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
11016     custom grid.
11017     (ClassTable): Support for editing Values and Labels and for
11018     changing what type (point or range) of data is stored in each
11019     property based on how the user enters the data.
11020     (Classifier): Support for saving the new classifications and
11021     launching the dialog to edit a property.
11022     (SelectPropertiesDialog): New class for editing the visual
11023     properties of a classification (stroke color, width, and fill color)
11024     (ClassPreviewer): Took the Draw method from ClassRenderer and
11025     made most of it into this new class. Intend to use this class in
11026     the SelectPropertiesDialog for previewing changes.
11027    
11028     * Thuban/UI/renderer.py: Use new Color and Classification methods.
11029    
11030     * Thuban/UI/tree.py: Formatting changes.
11031    
11032     * Doc/thuban.dtd: Add 'label' element
11033    
11034     * Thuban/common.py: New. Contains common routines used throughout
11035     the code.
11036     (Str2Num): Takes a string and converts it to the "best" type of
11037     number.
11038    
11039 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
11040    
11041     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
11042     dragging flag is always set to 0 even when the tool implementation
11043     raises an exception
11044    
11045 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
11046    
11047     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
11048     method to create a splash screen.
11049     (ThubanApplication.ShowMainWindow): New. Show the main window.
11050     Needed so the splash screen can display the mainwindow
11051     (ThubanApplication.OnInit): Call the
11052     new splash_screen method to determine whether the application
11053     should display a splash screen. If it displays a splash screen do
11054     not immediately show the main window.
11055    
11056 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
11057    
11058     * Thuban/Model/classification.py: Added import line to fix
11059     feature conflicts between running on python2.2 and python2.1.
11060    
11061     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
11062     onto the clinfo parameter, so removed the deepcopy().
11063    
11064 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
11065    
11066 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
11067 jonathan 396 Added element_open variable to track opening and closing of tags
11068     so that tags that don't span more than one line are closed with
11069     /> instead of </tag_name>. Use the GetDefault*() methods of
11070     the Classification class.
11071    
11072     * Thuban/Model/classification.py (Classificaton): Added set and
11073     get methods for the default data. The class also takes a layer
11074     reference so that modification messages can be sent. Fixed the
11075     methods to use the new ClassData class.
11076     (ClassData): New class to encapsulate the classification data
11077    
11078     * Thuban/Model/layer.py (Layer): Remove the
11079 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
11080 jonathan 396 SetDefault*() methods on the layer's classification object.
11081 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
11082 jonathan 396 Classification class.
11083    
11084     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
11085     object instead of a dictionary.
11086    
11087 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
11088 jonathan 396 draw the classifications in the dialog box's table.
11089     (Classifier): Modified to use the ClassRenderer class.
11090    
11091 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
11092     methods of the Classification class.
11093 jonathan 396
11094     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
11095     of the ClassData class.
11096    
11097     * test/test_classification.py, test/test_layer.py,
11098     test/test_map.py, test/test_session.py: Fix the tests to work
11099     with the above code changes.
11100    
11101 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
11102    
11103     * Thuban/Model/classification.py (Classification): Added getNull()
11104     to return the NullData reference
11105    
11106     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
11107     Layer.SetStrokeWidth): Modified these functions to change the
11108     null data in the classification rather than keep these values
11109     directly in the Layer class. Menu options to change these values
11110     work again.
11111    
11112 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
11113    
11114 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
11115 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
11116 jonathan 380 classification data.
11117    
11118 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
11119     Colors in the tree view.
11120    
11121     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
11122     the tree info for classifications. Commented out unnecessary lines.
11123    
11124     * Thuban/Model/classification.py (Classification.TreeInfo): New
11125     function to add information about the classification into the
11126     tree view.
11127    
11128 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
11129 jan 375
11130 tkoester 403 * Thuban/__init__.py (_): New.
11131 jan 375
11132     * Thuban/Model/classification.py, Thuban/Model/extension.py,
11133     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
11134 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
11135     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
11136     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
11137     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
11138     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
11139     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
11140 jan 375
11141 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
11142    
11143 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
11144 jonathan 370
11145 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
11146     a layer classification. Supports specific data points and
11147     ranges.
11148 jonathan 370
11149 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
11150     information.
11151 jonathan 370
11152 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
11153     information.
11154 jonathan 370
11155 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
11156     specifying classification information.
11157 jonathan 370
11158 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
11159     dialog.
11160 jonathan 370
11161 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
11162     classification information.
11163 jonathan 370
11164 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
11165     classification data.
11166 jonathan 370
11167 tkoester 403 * test/test_classification: Tests for the Classification class.
11168 jonathan 370
11169 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
11170    
11171 bh 361 * test/test_command.py: New. Tests for the command classes.
11172    
11173 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
11174     (Command.IsTool): New method to distinguish between command
11175     switching tools and other commands.
11176    
11177     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
11178     the tool to avoid direct assignments to instance variables
11179     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
11180     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
11181     change the tool
11182    
11183     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
11184     active tool's command turns insensitive, disable the tool.
11185     (_tool_command): Use the new ToolCommand class
11186    
11187     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
11188     SelectTool method to change the tool
11189     (iconfile): Use the ToolCommand class
11190    
11191 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
11192    
11193     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
11194     the case of selected items that are not children of Layers or Maps
11195     properly. Previously this bug would trigger an assertion in
11196     wxWindows.
11197    
11198 frank 352 2002-11-06 Frank Koormann <[email protected]>
11199    
11200 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
11201     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
11202     Full Extent).
11203 tkoester 403
11204 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
11205    
11206     * setup.py (setup call): version now 0.1.3
11207    
11208     * MANIFEST.in: Add the files in test/
11209    
11210     * test/README: Add note about tests requiring the iceland data
11211    
11212     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
11213     copyright notice.
11214    
11215 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
11216    
11217     * test/test_map.py
11218     (TestMapWithContents.test_projected_bounding_box): Use an explicit
11219     epsilon.
11220    
11221     * test/support.py (FloatComparisonMixin.assertFloatEqual)
11222     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
11223     message if the assertion fails and don't return the return value
11224     of self.assert_. In assertFloatSeqEqual the return meant that not
11225     all items of the sequence were compared.
11226    
11227 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
11228    
11229 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
11230    
11231     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
11232    
11233 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
11234     the string with the bounding box on the fly because of platform
11235     differences in the way %g is handled.
11236    
11237     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
11238     DBFfile too because Thuban layers can't yet cope missing DBF
11239     files.
11240    
11241     2002-09-20 Bernhard Herzog <[email protected]>
11242    
11243 bh 326 * test/test_menu.py: Use initthuban instead of
11244     add_thuban_dir_to_path to initialize Thuban.
11245    
11246     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
11247     Mixin class for float comparisons
11248     (SubscriberMixin): New. Mixin class to test messages sent through
11249     the Connector class
11250    
11251     * test/README: Fix a typo and add the -v flag to the command for
11252     individual tests
11253    
11254 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
11255    
11256     * test/test_proj.py: New. Test cases for Thuban.Model.proj
11257    
11258     * test/test_map.py: New. Test cases for Thuban.Model.map
11259    
11260     * test/test_layer.py: New. Test cases for Thuban.Model.layer
11261    
11262     * test/test_label.py: New. Test cases for Thuban.Model.label
11263    
11264     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
11265    
11266     * test/test_color.py: New. Test cases for Thuban.Model.color
11267    
11268     * test/test_base.py: New. Test cases for Thuban.Model.base
11269    
11270 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
11271    
11272     * Thuban/Model/session.py (Session.forwarded_channels): Forward
11273     the CHANGED channel too.
11274    
11275     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
11276     CHANGED channel too.
11277     (Map.__init__): Call the Modifiable constructor as well.
11278    
11279     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
11280     event if the modified flag changes.
11281     (Modifiable.changed): Tweak the doc-string.
11282    
11283     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
11284     (MainWindow.set_position_text): Put the code that puts the text
11285     with the mouse position into the status bar into the new method
11286     set_position_text so that it can overwritten in derived classes.
11287    
11288 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
11289    
11290     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
11291     message box on the main window.
11292    
11293 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
11294    
11295     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
11296     the 'E' because it's less likely to interfere with other menu
11297     entries.
11298 bh 315 (MainWindow.build_menu): remove an incorrect comment.
11299 bh 313
11300 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
11301    
11302     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
11303     (_tool_command): Add sensitive parameter
11304     (_has_visible_map): Sensitivity callback to tools and other
11305     commands that require a visible map. Use it in map_zoom_in_tool,
11306     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
11307     and map_full_extent
11308    
11309 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
11310    
11311     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
11312     VIEW_POSITION
11313    
11314 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
11315 frank 306
11316     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
11317    
11318 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
11319    
11320 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
11321     wxWindows already and our implementation doesn't work correctly
11322     with wxGTK 2.3:
11323     (MapCanvas.__init__): Remove the instance variable
11324     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
11325     be drawin
11326     (MapCanvas.OnIdle): Removed.
11327    
11328 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
11329     a parameter to determine the size of the rectangle.
11330     (MapCanvas.find_shape_at): Create the box around the point on a
11331     layer by layer basis and make the size depend on the shape type.
11332     This solves a problem with the selection of point shapes at the
11333     border of the layer's bounding box
11334    
11335 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
11336    
11337 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
11338     for the sensitivity of remove layer.
11339     (_can_remove_layer): New. Sensitivity callback for remove layer
11340     (Command layer_remove): Use _can_remove_layer
11341    
11342     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
11343     determine whether a given layer can be deleted.
11344    
11345 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
11346     (MapCanvas.do_redraw): Get rid of the unused update_region
11347     instance variable
11348    
11349 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
11350    
11351 bh 292 * test/: new subdirectory with a bunch of unit tests.
11352    
11353     * test/README, test/test_table.py, test/test_save.py,
11354     test/test_menu.py, test/test_load.py: Initial set of tests and
11355     brief instructions on how to run them
11356    
11357 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
11358    
11359 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
11360     arcs with multiple parts.
11361    
11362 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
11363     Handle degenrate rectangles.
11364    
11365 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
11366     (Table.__init__): Keep track of whether the DBF is open for
11367     writing
11368     (Table.write_record): Open the DBF file for writing when necessary
11369    
11370 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
11371    
11372     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
11373     dbf files only for reading by default. Use a new writable dbf
11374     object for writing.
11375    
11376 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
11377    
11378 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
11379     (MainWindow.Context): New method to return a context
11380     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
11381     new method
11382    
11383 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
11384     layer table specific code from TableGrid into LayerTableGrid
11385     (TableFrame, LayerTableFrame): Split the layer table specific code
11386     from TableFrame into LayerTableFrame
11387 bh 280 (LayerTableGrid.select_shape): Remove a debug print
11388 bh 278
11389     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
11390     LayerTableFrame
11391    
11392 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
11393    
11394     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
11395     absolute filename.
11396    
11397 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
11398    
11399 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
11400     records.
11401 tkoester 403 (Table.__init__): Open the DBF file for writing too.
11402 bh 275
11403     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
11404     into the underlying table.
11405    
11406     * extensions/shapelib/shapefil.h (DBFCommit),
11407     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
11408     commit any changes made to the DBF file.
11409    
11410 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
11411     (_tool_command): Put the code that generates the "checked"
11412     callback into a separate function so that we can reuse it
11413     elsewhere
11414    
11415 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
11416     session into an XML file. The main reason to introduce a class is
11417     that applications built on Thuban can derive from it so that they
11418     can save additional information in a session file.
11419     (save_session): Delegate almost all the work to the Saver class.
11420     Rename the filename argument to file because it may be a file like
11421     object now.
11422    
11423     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
11424     code. Remove the little test code which would be executed when the
11425     module is run as a script which didn't work anymore since it can't
11426     import the other Thuban modules.
11427     (ProcessSession, load_session): Refactor the ProcessSession to
11428     have one method for each element start and end tag so that derived
11429     classes can easily override the processing of individual tags.
11430     Also, always parse with namespaces enabled because applications
11431     built on top of Thuban will likely use namespaces if they extend
11432     the session file format.
11433    
11434 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
11435    
11436     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
11437     because thubaninit_contents will do it for us.
11438    
11439 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
11440 jan 265
11441     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
11442     tree window already open
11443    
11444 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
11445    
11446 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
11447     with self.
11448    
11449     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
11450     when we have actually captured it.
11451    
11452 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
11453     shapefile and destroy the table.
11454    
11455     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
11456    
11457 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
11458    
11459 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
11460     instance variable columns
11461     (RecordTable.GetTypeName): row and col may be negative in some
11462     cases.
11463    
11464 bh 254 * setup.py (InstallLocal.initialize_options)
11465     (InstallLocal.finalize_options, InstallLocal.user_options): New
11466     option create-init-file to build a thubaninit.py when running
11467     install_local
11468     (InstallLocal.run): Create the thubaninit.py module when requested
11469     (thubaninit_contents): Split the template into several parts and
11470     create a new function thubaninit_contents that creates the
11471     contents of a thubaninit module.
11472     (ThubanInstall.run): Use the new function to create the thubaninit
11473     module.
11474    
11475 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
11476    
11477     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
11478     cleanup.
11479     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
11480    
11481     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
11482     direct base class' Destroy method.
11483    
11484     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
11485     layers.
11486     (Map.Destroy): Destroy the label_layer as well and call the
11487     inherited Desatroymethod first so that no more messages are
11488     issued.
11489     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
11490     message if the stacking order actually has changed. Add
11491     doc-strings.
11492     (Map.BoundingBox): Correct the doc-string.
11493     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
11494     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
11495    
11496     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
11497     all labels.
11498    
11499 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
11500    
11501     * Thuban/Model/map.py (Map.subscribe_layer_channels)
11502     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
11503     to a layer's channels into separate methods.
11504     (Map.RemoveLayer, Map.AddLayer): Call the new methods
11505     (Map.Destroy): Unsubscribe from a layer's channels before
11506     destroying it.
11507    
11508     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
11509     selected_layer parameter to searched_layer which is the layer to
11510     search in.
11511     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
11512     search to that layer. Return the selected layer and shape.
11513    
11514     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
11515     typo
11516    
11517 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
11518    
11519 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
11520     Extend the doc string.
11521     (ThubanApplication.subscribe_session)
11522     (ThubanApplication.unsubscribe_session): New methods to
11523     subscribe/unsubscribe to/from session channels.
11524     (ThubanApplication.SetSession): Call the new methods here.
11525     (ThubanApplication.maps_changed, ThubanApplication.set_map):
11526     Renamed set_map to maps_changed. Its now a subscriber for
11527     MAPS_CHANGED.
11528    
11529     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
11530     x-coordinate in case of simple clicks
11531    
11532     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
11533     don't pass it as a parameter
11534    
11535     * Thuban/Model/session.py (Session.RemoveMap): New
11536    
11537 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
11538     window size into a parameter.
11539    
11540 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
11541    
11542 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
11543     just commands.
11544    
11545 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
11546     parameter list a bit to allow setting the window title and the
11547     initial message in the status bar. Update the callers.
11548    
11549     * Thuban/UI/application.py (ThubanApplication.OnInit)
11550     (ThubanApplication.CreateMainWindow): Put the mainwindow
11551     instantiation into a separate method so that it can be overridden
11552     by a subclass.
11553    
11554 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
11555    
11556 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
11557     another changed message is issued to make it easier to get
11558     notified of changes.
11559     (Session): Update the doc string
11560     (Session.forward): Issue changed-events as CHANGED as well.
11561     (Session.changed): Overwrite the inherited version to issue
11562     CHANGED events as well.
11563    
11564     * Thuban/UI/tree.py: We can now simply subscribe to the session's
11565     CHANGED channel to be informed of changes.
11566     (SessionTreeCtrl.session_channels): Not needed any longer.
11567 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
11568 bh 234 Only have to (un)subscribe CHANGED
11569    
11570     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
11571    
11572 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
11573     for the wxPython locale bug to __init__.py so that it's
11574     automatically executed by anybody using UI code from Thuban.
11575    
11576 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
11577    
11578 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
11579    
11580     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
11581     as parameter and store it in an instance variable
11582     (MainWindow.invoke_command, MainWindow.update_command_ui)
11583     (MainWindow.save_modified_session, MainWindow.NewSession)
11584     (MainWindow.OpenSession, MainWindow.SaveSession)
11585     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
11586     application object.
11587    
11588     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
11589     the main window with self.
11590    
11591 bh 225 * Thuban/UI/context.py: New module with the context class
11592    
11593     * Thuban/UI/command.py (Command): Update doc string.
11594    
11595     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
11596     MainWindow.update_command_ui): Pass an instance of the context
11597     class to the command's methods
11598     (check_current_tool, call_method): Handle the new context
11599     implementation
11600    
11601     * Examples/simple_extensions/simple_tool.py (simple_tool,
11602     check_simple_tool): Handle the new context implementation
11603    
11604     * Examples/simple_extensions/simple_command.py (simple_command):
11605     Handle the new context implementation. Update the comments about
11606     the context.
11607    
11608     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
11609     doc-string
11610     (ThubanApplication.Session): New method to return the session
11611     object
11612    
11613     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
11614     interactor's selected_layer may not be a layer of the current
11615     session when the tree is updated while a new session is being set.
11616    
11617 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
11618    
11619     * Thuban/UI/tree.py (color_string): Removed. No longer used.
11620     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
11621     update_tree into update_tree and add_items. The tree now uses a
11622     more generic way to display the contents of the tree.
11623     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
11624    
11625     * Thuban/Model/layer.py (Layer.TreeInfo),
11626     Thuban/Model/extension.py (Extension.TreeInfo),
11627     Thuban/Model/map.py (Map.TreeInfo),
11628 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
11629 bh 217 Add TreeInfo methods to implement the new tree view update scheme
11630    
11631 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
11632    
11633     * Thuban/UI/application.py: Don't use "import from" for the
11634     MainWindow. It can't always be resolved.
11635     (ThubanApplication.OnInit): change reference to MainWindow
11636     accordingly.
11637    
11638     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
11639     completely
11640    
11641 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
11642    
11643     * setup.py (create_init_module): New configurable variable whose
11644     default depends on the platform we're running on.
11645     (ThubanInstall.initialize_options): Initialize
11646     self.create_init_module from the global create_init_module
11647     (ThubanInstall.user_options): indictate that the options
11648     create-init-module and init-module-dir have arguments.
11649    
11650     * setup.py: In the setup call change the version number to include
11651     cvs.
11652    
11653     * MANIFEST.in: Add the files in Examples
11654    
11655 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
11656    
11657 bh 210 * setup.py: In the setup call, use the thuban homepage as the
11658     value of the url parameter.
11659    
11660 bh 208 * Examples: New subdirectory for examples.
11661    
11662     * Examples/simple_extensions/simple_tool.xpm,
11663     Examples/simple_extensions/simple_tool.py,
11664     Examples/simple_extensions/simple_command.py,
11665     Examples/simple_extensions/README: Simple examples showing how to
11666     add new commands and tools.
11667    
11668 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
11669     bdist_rpm that we also have an install script.
11670     (bdist_inno): Add 2002 to the copyright notice.
11671    
11672 bh 205 * setup.py: Create a file in python's site-packages directory to
11673     make installation of Thuban as a library easier.
11674     (ThubanInstall.user_options): Add two new options,
11675     create-init-module and init-module-dir
11676     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
11677     filenames for installation in the default directories.
11678     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
11679     the inherited methods to capture some filenames before they're
11680     transformed too much by distutils.
11681     (ThubanInstall.run): Create the init module if requested.
11682     (ThubanInstall.thuban_init_filename): New method to return the
11683     full name of the init module.
11684     (ThubanInstall.get_outputs): Append the filename of the init
11685     module.
11686    
11687 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
11688    
11689 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
11690     handle the prefix properly which means that the default for the
11691     installation prefix should be /usr for RPMs and /usr/local when
11692     doing a normal source install.
11693     (bdist_rpm_install_script): Script to override the default install
11694     commands in the specfile generated by the bdist_rpm command.
11695     (thuban_bdist_rpm.user_options): Add a prefix option
11696     (thuban_bdist_rpm.initialize_options): Init the prefix option.
11697     Create the script files for the spec files as empty files here
11698     (thuban_bdist_rpm._make_spec_file): Override the inherited method
11699     to fill the script files with content.
11700    
11701 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
11702     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
11703     argument. save_session now automatically uses this version,
11704     solving a problem when saving to a relative filename.
11705    
11706     * setup.py: In the setup call, make sure that the library
11707     directories are under $prefix/lib not directly under $prefix.
11708    
11709 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
11710 jan 199
11711     * Thuban/Model/extension.py: new module to handle extension objects.
11712     * Thuban/Model/messages.py: new messages for extensions.
11713     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
11714     Session.AddExtension): new for handling extensions.
11715     Also some other minor changes to round up extension handling.
11716     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
11717     of Extension titles and title and names of its objects.
11718    
11719 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
11720    
11721     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
11722 bh 202 the events for a command.
11723 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
11724     Call bind_command_events to bind the events. add_toolbar_command
11725     can now bind events too so that it's possible to have commands
11726     that are only available through the toolbar.
11727     (MainWindow.init_ids): New instance variable events_bound to keep
11728     track of for which commands events have been bound.
11729    
11730 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
11731    
11732     * Thuban/UI/menu.py: New module to build and manage menus.
11733    
11734     * Thuban/UI/mainwindow.py: Remove some unused imports.
11735     (MainWindow.__init__, main_menu): move the definition of the main
11736     menu from __init__ to the Menu instance main_menu.
11737     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
11738     build the menu bar and sub-menus from a menu description.
11739    
11740     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
11741     startup file
11742     (ThubanApplication.read_startup_files): New method to run
11743     ~/.thuban/thubanstart.py
11744    
11745 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
11746     Move the toolbar definition to the Menu instance main_toolbar.
11747     (MainWindow.build_toolbar): New method to build the toolbar
11748     similar to the build_menu methods
11749    
11750 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
11751    
11752 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
11753     layer_outline_color. Fix it in the definition of the command too.
11754    
11755 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
11756    
11757 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
11758    
11759     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
11760     in the docstring
11761    
11762 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
11763    
11764 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
11765     when the shapefile is empty.
11766     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
11767     now return None for empty shapefiles. Update doc-strings.
11768    
11769     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
11770     the layer's bbox being None.
11771    
11772     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
11773     layer's bbox being None.
11774    
11775 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
11776     necessary.
11777     (MapCanvas.__init__): New instance variables, last_selected_layer
11778     and last_selected_shape to determine how the selection has
11779     changed.
11780    
11781     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
11782     AutoSizeColumns because it will cause a traversal of the entire
11783     table which for large .dbf files will take a very long time.
11784    
11785 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
11786    
11787     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
11788     maximum depth for the tree than shapelib does by default.
11789    
11790 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
11791    
11792     * setup.py (py_modules): The shptree modules doesn't have a
11793     wrapper, so don't include it in the py_modules
11794    
11795 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
11796    
11797     * extensions/shapelib/shptree.c (compare_ints): Make arguments
11798     const void * as in the qsort prototype
11799     (SHPTreeFindLikelyShapes): Remove some unused variables.
11800    
11801     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
11802     maintains to redraw the window during a drag.
11803     (MapCanvas.unprojected_rect_around_point): New method to determine
11804     a small region around a point for hit-testing.
11805     (MapCanvas.find_shape_at): Only test the shapes in a small region
11806     around the point.
11807    
11808     * setup.py: Increment the version to 0.1.2
11809    
11810     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
11811     debug print and set session to None after unsubscribing
11812    
11813 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
11814    
11815 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
11816     the file to have a .thuban extension.
11817    
11818 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
11819     all the session channels to subscribe to to update the tree
11820     (SessionTreeCtrl.session_changed): Remember the session so that we
11821     can unsubscribe properly. Use the new class constant to
11822     unsubscribe from the old session and subscribe to the new one.
11823     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
11824     subscriptions of the SessionTreeCtrl.
11825     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
11826    
11827     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
11828     Session Tree" command to the file menu.
11829    
11830     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
11831     as update_region to the renderer.
11832    
11833     * Thuban/UI/renderer.py
11834     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
11835     update box is now directly a tuple, not a wxRect anymore.
11836    
11837     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
11838     prints.
11839    
11840     2002-05-07 Bernhard Herzog <[email protected]>
11841    
11842 bh 146 * setup.py: Add the shptree extension module. See
11843     extensions/pyshapelib/ChangeLog for more details.
11844    
11845     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
11846     extensions/shapelib/dbfopen.c: Really update to the versions of
11847     shapelib 1.2.9. For some reason it wasn't really done on
11848     2002-04-11.
11849    
11850     * extensions/shapelib/shptree.c: Modified version of shptree.c of
11851     shapelib 1.2.9. The only real difference is the use of qsort
11852     instead of a bubble sort implementation
11853    
11854     * Thuban/Model/layer.py (Layer.__init__): New instance variable
11855     shapetree to hold the shapelib quadtree for the shapefile
11856     (Layer.open_shapefile): Create the quad tree.
11857     (Layer.ShapesInRegion): New method to return the ids of shapes in
11858     a given region using the quad tree.
11859    
11860     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
11861     comment
11862     (draw_polygon_shape): Accept both arcs and polygons.
11863     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
11864     the api.
11865    
11866     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
11867     return the shape ids to be rendered in a given layer.
11868     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
11869     ids. Use draw_polygon_shape to draw arc shapes as well.
11870     (ScreenRenderer.RenderMap): New parameter for the rectangle that
11871     has to be updated
11872     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
11873     calling it's ShapesInRegion method.
11874    
11875     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
11876     update_region for the update region.
11877     (MapCanvas.OnPaint): Maintain the update region
11878     (MapCanvas.do_redraw): Pass the bounding box of the update_region
11879     to the renderer when drawing the bitmap. Reset the update_region.
11880    
11881 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
11882    
11883 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
11884     MainWindow.OpenSession): Change the file extension of the session
11885     files to .thuban
11886    
11887 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
11888     Move the map channels to be forwarded by the session into the
11889 bh 146 class constant with forwarded_channels. Also add
11890     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
11891     forwarded_channels
11892 bh 129
11893     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
11894     typo and some rewording).
11895    
11896 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
11897    
11898     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
11899     around to speed up most redraws:
11900     (MapCanvas.__init__): New instance variable bitmap which holds the
11901     bitmap
11902     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
11903     self.bitmap to draw.
11904     (MapCanvas.full_redraw): New method to force a full redraw
11905     including the bitmap
11906     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
11907     make sure the bitmap is redrawn.
11908     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
11909     MapCanvas.shape_selected): Call full_redraw instead of readraw to
11910     make sure the bitmap is redrawn.
11911     (MapCanvas.OnSize): New method to handle size events so that the
11912     bitmap can be redrawn.
11913    
11914 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
11915    
11916     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
11917     canvas' VIEW_POSITION event
11918     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
11919     Update the text in the status-bar accordingly.
11920    
11921     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
11922     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
11923     called.
11924     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
11925     current_position
11926     (MapCanvas.set_current_position): New method to set
11927     current_position. Issue a VIEW_POSITION event
11928     (MapCanvas.CurrentPosition): New public method to return the value
11929     of current_position. Should be called when the VIEW_POSITION event
11930     is processed.
11931     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
11932     Update the position.
11933     (MapCanvas.OnLeaveWindow): Set the position to None.
11934    
11935     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
11936     position in the statusbar
11937    
11938 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
11939 frank 120
11940     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
11941    
11942 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
11943    
11944 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
11945    
11946     * Resources/Bitmaps/fullextent.xpm: new
11947 jan 116
11948 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
11949 jan 116
11950 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
11951     box
11952 jan 114
11953 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
11954    
11955 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
11956    
11957     * Thuban/UI/tree.py (update_tree): added added map extent
11958    
11959     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
11960 tkoester 403 icon; added map_full_extend as tool
11961 jan 114
11962 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
11963 jan 107
11964     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
11965     saving _new_ sessions
11966    
11967     * Thuban/Model/session.py (create_empty_session): new session
11968     don't have a filename (set to None)
11969    
11970     * Thuban/UI/tree.py (update_tree): added filename and modified flag
11971    
11972     * Thuban/Model/load.py (ProcessSession): convert projection
11973     parameters from unicode to regular string
11974    
11975     * Data/iceland_sample.session: Added UTM Zone 26 projection.
11976    
11977 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
11978    
11979     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
11980     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
11981     1.2.9
11982    
11983     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
11984     the pyshapelib directoy into the list of include dirs, so that
11985     pyshapelib_api.h can be found.
11986    
11987     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
11988     holds the pyshapelib C-API
11989     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
11990     pyshapelib_api to access the shapelib functions.
11991     (initwxproj): Import the c_api from the shapelib module and
11992     initialize pyshapelib_api.
11993    
11994 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
11995    
11996 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
11997     initialize_options to create the scripts for the rpm.
11998    
11999 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
12000    
12001 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
12002    
12003 bh 87 * setup.py: Increment version to 0.1.1
12004    
12005 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
12006     Layer" and "Remove Layer" commands from the layer menu to the map
12007     menu
12008    
12009 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
12010    
12011     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
12012     argument (python <= 1.5.2 erroneously accepted multiuple
12013     arguments)
12014    
12015 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
12016    
12017     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
12018     RecordGrid in the identifyview.
12019     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
12020     IdentifyListCtrl. The grid allows editing of the values.
12021    
12022     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
12023     implementing a grid for a single row of a thuban table.
12024    
12025     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
12026     layers by default. Easier to use than the previous default of only
12027     searching through the select layer which meant that if no layer
12028     was selected, you couldn't select a shape.
12029    
12030     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
12031    
12032     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
12033     stroke_width attribute
12034    
12035     * Thuban/Model/save.py (save_session): Write the new stroke_width
12036     attribute
12037    
12038     * Thuban/Model/load.py (ProcessSession.startElement): Read the
12039     stroke_width attribute
12040    
12041     * Thuban/Model/layer.py (Layer.__init__): New parameter and
12042     instance variable stroke_width
12043     (Layer.SetStrokeWidth): Set the stroke_width.
12044    
12045 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
12046    
12047     * extensions/thuban/wxproj.cpp (project_points): Fix two
12048     off-by-one errors in the last loop that joins the various parts
12049     together.
12050    
12051 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
12052    
12053     * setup.py (data_dist.make_distribution): Fix some typos
12054    
12055 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
12056    
12057     * README: Slight tweaking in preparation for the 0.1 release
12058    
12059     * setup.cfg: Add section for sdist to create both tgz and zip
12060     archives
12061    
12062     * setup.py: increase version number to 0.1
12063     (data_dist): New command class for data distribution
12064    
12065 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
12066    
12067 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
12068     Handle the case of no layer (i.e. layer is None) properly.
12069    
12070 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
12071 bh 70 Set the initial selection of the combo boxes to reflect the
12072     projection we're starting with in a way that works on windows,
12073     too.
12074    
12075 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
12076     puiblisher's ids in hex to make it easier to compare them to the
12077     standard repr of python methods
12078    
12079     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
12080     messages
12081    
12082 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
12083    
12084 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
12085     deselect the layer if no layer is selected
12086    
12087 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
12088     idle time when there actually is something to draw. If there's
12089     nothing to draw simply clear the window
12090     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
12091     (MapCanvas.SetMap): force a redraw in all cases because
12092     FitMapToWindow doesn't always do it.
12093     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
12094     specify the point to move into the center of the window
12095     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
12096     dragged, zoon in/out by a factor of 2
12097 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
12098     index, i.e. reversed drawing order) so that objects appearing to
12099     be in from of others are selected first. This is probably mostly
12100     relevant for point shapes where the symbols used may overlap
12101 bh 59
12102     * Thuban/Model/session.py (create_empty_session): Unset the
12103     modified bit before returning it
12104    
12105     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
12106     create_empty_session session to create the new, empty session.
12107    
12108     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
12109     the tool bitmaps.
12110     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
12111     the code that asks whether the session should be saved into the
12112     new method save_modified_session.
12113     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
12114     method to save modified session here too.
12115    
12116 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
12117    
12118     * setup.py (InnoIconItem): fix typo
12119    
12120     (thuban_bdist_inno.run):
12121     (bdist_inno.run): Move the decision not to create symlinks on
12122     non-nt platforms to thuban_bdist_inno and do it unconditinally
12123     since we never want to create the symlinks here
12124    
12125 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
12126    
12127 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
12128     identify view immediately
12129    
12130     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
12131     and SelectableRecordListCtrl that implement the code shared by the
12132     identify view and the label dialog
12133    
12134     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
12135     new class RecordListCtrl
12136    
12137     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
12138     return value of GetValue is None instead of using it as a boolean
12139     directly so that Zero numbers are handled properly.
12140     (LabelListCtrl): Derive from the new class
12141     SelectableRecordListCtrl
12142    
12143 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
12144     (Proj4Dialog.dialogLayout): Make the window resizable and set the
12145     size of the text control explicitly to make the sizers work on
12146     both Windows and X.
12147    
12148 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
12149    
12150     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
12151     that can limit the search to the currently selected layer.
12152     (MapCanvas.SelectShapeAt): Make sure that the currently selected
12153     layer stays selected even when no shape is found
12154 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
12155     height do nothing (avoids zero division errors)
12156 bh 44
12157 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
12158    
12159 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
12160     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
12161     convenient :-)
12162     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
12163     a new instvar layer_to_item to map layers to tree items
12164     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
12165     to match the current selection in the interactor
12166    
12167 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
12168     (Interactor.HasSelectedLayer): New methods to query the current
12169     selection
12170    
12171     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
12172     (MainWindow.has_selected_layer): Simply call the appropriate
12173     interactor method
12174    
12175     * Thuban/UI/mainwindow.py (MainWindow.__init__):
12176     (MainWindow.LayerShowTable):
12177     (MainWindow.identify_view_on_demand): Store the interactor in an
12178     instvar and use that reference instead of going through main.app
12179    
12180 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
12181     * Thuban/UI/application.py (ThubanApplication.OnInit):
12182 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
12183     with the new mainwindow method ShowSessionTree and not directly
12184     the application's OnInit method
12185    
12186     * Thuban/UI/tree.py (myTreeCtrlPanel):
12187     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
12188     TreeCtrl isntead of a panel. This affects most method since we now
12189     refer to self instead of self.tree
12190     (SessionTreeView): New class implementing a non-modal dialog
12191     showing the session tree.
12192    
12193 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
12194     layer to the tableview dialog.
12195    
12196     * Thuban/UI/tableview.py: Add some doc-strings
12197 tkoester 403 (TableGrid):
12198 bh 35 (TableGrid.OnRangeSelect):
12199     (TableGrid.OnSelectCell):
12200     (TableFrame.__init__):
12201     (TableFrame.row_selected):
12202     Selecting rows in the grid view now updates the selected shapes
12203     through the TableFrame. To achieve this we derive TableGrid from
12204     Publisher and introduce the message type ROW_SELECTED which the
12205     TableFrame subscribes to and which is issued by OnRangeSelect and
12206     OnSelectCell
12207    
12208     (DataTable.SelectRow): Removed because it's no longer needed in
12209     the row/shape selection scheme
12210    
12211 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
12212     dialogs
12213    
12214     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
12215     the SELECTED_SHAPE message anymore. This is now handled by the
12216     parent.
12217     (TableGrid.select_shape): Only update the selection if the shape
12218     is not None.
12219     (TableFrame): Inherit from the new NonModalDialog class.
12220     (TableFrame.__init__, TableFrame.select_shape): Handle the
12221     SELECT_SHAPE message.
12222     (TableFrame.OnClose): Extend the inherited method to unsubscribe
12223     SELECT_SHAPE
12224    
12225     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
12226     (MainWindow.add_dialog):
12227     (MainWindow.dialog_open):
12228     (MainWindow.remove_dialog):
12229     (MainWindow.get_open_dialog): New methods to maintain a dictionary
12230     of opened non-modal dialogs.
12231    
12232     (MainWindow.__init__): Initialize the new non-modal dictionary
12233     management code
12234     (MainWindow.LayerShowTable): maintain separate dialogs for each
12235     table using the non-modal dialog management code to only open a
12236     view once for each table.
12237    
12238     (MainWindow.IdentifyTool):
12239     (MainWindow.__init__):
12240     (MainWindow.identify_view_on_demand): Don't open the identify view
12241     in IdentifyTool anymore. This will be done automatically by the
12242     new method identify_view_on_demand which handles the
12243     SELECTED_SHAPE message so that the identify view will be opened on
12244     demand
12245    
12246     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
12247     the interactor argument. The SELECTED_SHAPE message is now handled
12248     by the parent.
12249     (IdentifyView.__init__): Add the interactor argument so that we
12250     can handle the SELECTED_SHAPE message here
12251     (IdentifyView.selected_shape): New method to handle the
12252     SELECTED_SHAPE messages
12253    
12254     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
12255     NonModalDialog class
12256     (IdentifyView.OnClose): Extend the inherited version to
12257     unsubscribe SELECT_SHAPE
12258    
12259     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
12260    
12261 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
12262    
12263     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
12264 tkoester 403
12265 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
12266     interactor to pass through to the MapCanvas
12267 tkoester 403
12268 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
12269     argument to the MainWindow constructor to get rid of the ugly hack
12270     that made main.app available early just so that the mapcanvas
12271     could access the interactor object.
12272    
12273 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
12274    
12275 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
12276     that runs a modal message box
12277     (MainWindow.OnClose): Use the new method
12278     (MainWindow.RemoveLayer): Just do nothing in case no layer is
12279     selected. The command should be grayed out anyway, so there's no
12280     need to pop up a message box.
12281     (MainWindow.AddLayer): Pop up a message box with an error message
12282     if the shape file can't be opened
12283    
12284     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
12285     immediately. This will cause an exception in case the file can't
12286     be opened and we can display an appropriate message.
12287    
12288 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
12289    
12290     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
12291     specific bdist_rpm command.
12292    
12293     * Thuban/UI/main.py: Catch ImportError exceptions when importing
12294     the locale module because it may not be available on some
12295     installations.
12296    
12297     * extensions/pyprojection/LICENSE: Copy of the license text in
12298     Projection.i. Having it in a separate file makes it easier to
12299     refer to license text in e.g. RPMs
12300    
12301 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
12302    
12303 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
12304     more generic
12305    
12306     * setup.py (ThubanInstall.get_outputs): Add the symlink in
12307     <prefix>/bin to the outputs
12308     (ThubanInstall.link_file): New method to link files. We need this
12309     because the standard copy_files refuses to link non-existing
12310     files.
12311     (ThubanInstall.run): Remove the leading install root from the
12312     script filename if an install root was specified and use the new
12313     link_file method
12314 tkoester 403
12315 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
12316     the window when the first layer is added to the map.
12317    
12318     * setup.py (ThubanInstall.run): Honor the build root (self.root)
12319     when linking thuban.py to <prefix>/bin
12320    
12321 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
12322    
12323     * setup.py: In the setup call, the install parameters shouldn't
12324     have trailing slashes because distutils on non-posix platforms
12325     doesn't like that. The same applies to other directories like
12326     "Resources/Bitmaps"
12327    
12328     In the configuration section for nt, move the wxWindows directory
12329     optins into the part clearly marked as editable.
12330    
12331     (InstallLocal.initialize_options):
12332     (InstallLocal.user_options): remove the currently unused debug
12333     flag
12334     (thuban_build_py.find_all_modules): Add this method so that it
12335     works for our case of having packages and modules in one
12336     distribution as well.
12337     (ThubanInstall.initialize_options):
12338     (ThubanInstall.finalize_options):
12339     (ThubanInstall.user_options):
12340     (ThubanInstall.boolean_options): Add new options, do-symlink and
12341     extra files. Since these are the first ThubanInstall specific
12342     options, override user_options and boolean_options
12343     (ThubanInstall.run): Honor the new do-symlink and extra-files
12344     options.
12345     (ThubanInstall.get_outputs): Add to override the base-class's
12346     version and add the extra-files to the outputs
12347     (bdist_inno): New class for windows distributions with Inno Setup
12348     (InnoIconItem): Helper class for bdist_inno
12349     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
12350     this together with the appropriate parameters, to the setup call.
12351 tkoester 403
12352 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
12353     installer
12354    
12355     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
12356     changing_selection to avoid recursive selection events when
12357     modifying the selection in response to a selection event.
12358     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
12359     changing the tree's selection.
12360     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
12361     we're not being called indirectly from normalize_selection.
12362    
12363     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
12364     event.Check only if the command is actuall checkable.
12365     (MainWindow.__init__): Call the toolbar's Realize method to make
12366     sure that the items are actually shown
12367    
12368 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
12369    
12370 bh 9 * setup.py: Fix some doc strings
12371    
12372 bh 7 * ChangeLog: started
12373    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26