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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2716 - (hide annotations)
Mon Nov 6 12:00:12 2006 UTC (18 years, 4 months ago) by dpinte
Original Path: trunk/thuban/ChangeLog
File size: 476075 byte(s)
2006-11-06 Didrik Pinte <dpinte@itae.be>

       * libraries/thuban/wxproj.cpp: bugfix - allow compilation with
       msvc++ toolkit 2003


1 dpinte 2716 2006-11-06 Didrik Pinte <[email protected]>
2    
3     * libraries/thuban/wxproj.cpp: bugfix - allow compilation with
4     msvc++ toolkit 2003
5    
6 bernhard 2714 2006-11-06 Bernhard Reiter <[email protected]>
7    
8 bernhard 2715 Made it easier to run PostGIS test on Debian Etch. Improving
9     https://wald.intevation.org/tracker/index.php?func=detail&aid=173 .
10 bernhard 2714
11     * test/postgissupport.py: Taking pg_ctl and initdb commands
12     from internal variables now. Adding deactivated example values
13     for Debian Etch.
14     find_postgis_sql(): Added special line for Debian Etch postgresql-8.1.
15     Added copyright year 2006.
16    
17 bernhard 2713 2006-10-25 Bernhard Reiter <[email protected]>
18    
19     Moved ogr Extension to Extension menu.
20    
21     * Extensions/ogr/
22     __init__.py, ogrstart.py, ogrshapes.py, ogrdialog.py
23     test/test_OGRShapestore.py, test/__init__.py:
24     adding encoding information and made sure Autor's names
25     with an umlaut are actually written with an umlaut.
26    
27     * Extensions/ogr/ogrstrat.py: now registering in menu "Extensions",
28     having a "(testing)" string before the submenu to prepare for 1.2.0
29     release. Bumped copyright year to 2006.
30    
31 bernhard 2712 2006-10-15 Bernhard Reiter <[email protected]>
32    
33     * Thuban/UI/renderer.py: Added module variable verbose and
34     added verbose output before doing a raster projection.
35     Minor: Added (c) year 2006.
36    
37     * test/test_baserenderer.py: Added new function
38     test_projected_raster_decimalcommalocale()
39     Added new author Bernhard Reiter and new copyright year 2006.
40    
41     * libraries/thuban/gdalwarp.cpp(ProjectRasterFile): Adding
42     switching to LC_NUMERIC "C" and back before calling GDAL functions -
43     only #if python >=2.4 .
44    
45 dpinte 2710 2006-10-10 Didrik Pinte <[email protected]>
46 dpinte 2711
47     Win32 build updates
48    
49     * setup.py :
50     - update to the latest libs for win32 setup tasks
51     - added gdal and Lib content to the inno setup build task
52     - added stable and experimental extensions to setup packages
53    
54     * thuban.py :
55     - gdal support for win32 inno installation
56    
57     2006-10-10 Didrik Pinte <[email protected]>
58    
59 dpinte 2710 * Thuban/Model/layer.py (Layer.GetLabelPosFromShape): new method
60     extracted from Thuban/UI/viewport.py
61     * Thuban/UI/viewport.py (Viewport.LabelShapeAt): uses new method
62    
63 dpinte 2709 2006-09-28 Didrik Pinte <[email protected]>
64    
65     * Thuban/UI/classgen.py: bugfix due to wx2.6 update
66    
67     * Thuban/UI/view.py: removed non needed declaration
68    
69     * Thuban/UI/selection.py : typo correction
70    
71 bernhard 2705 2006-09-24 Bernhard Reiter <[email protected]>
72    
73 bernhard 2708 * Thuban/Model/proj.py(_do_we_have_to_work_around_broken_proj):
74     Making the test more robust for observed python 2.3 problems
75     with setlocale().
76    
77 bernhard 2705 * test/runtests.py: Added new option ---setdecimalcommalocale
78 bernhard 2712 to run all tests with an LC_NUMERIC that uses comma as decimal_point.
79 bernhard 2705 Minor: Added (c) year 2006. Fixed typo in a docstring.
80    
81     * test/test_transientdb.py: Minor: Added (c) year 2006. Fixed typo in
82     a docstring.
83    
84 bernhard 2702 2006-09-23 Bernhard Reiter <[email protected]>
85    
86     * Extensions/ogr/test/test_OGRShapestore.py: fixed skip_if_no_ogr()
87     and added it to TestOGRTable.setUp() so that all tests get skipped
88     if ogr cannot be imported. Added (c) year 2006.
89    
90 dpinte 2701 2006-09-18 Didrik Pinte <[email protected]>
91    
92     * wxPython 2.6 update : wx 2.4 syntax has been updated to 2.6
93    
94 bernhard 2696 2006-09-18 Bernhard Reiter <[email protected]>
95    
96 bernhard 2698 Fixed proj behaviour with python >=2.4 when decimal_point != '.'.
97    
98 bernhard 2697 * Thuban/UI/application.py: Fixed warning dialog when gdal is missing.
99    
100     * test/test_proj.py: new test_lc_numeric_robustness(). Added author
101     Bernhard Reiter and new copyright year 2006.
102    
103 bernhard 2698 * Thuban/Model/proj.py: New _do_we_have_to_work_around_broken_proj()
104     and Projection.assuregoodlocale(), Projection.assureinitlocale().
105     Added author Bernhard Reiter and (c) 2006.
106    
107 bernhard 2694 2006-09-15 Bernhard Reiter <[email protected]>
108 bernhard 2692
109     * README: added RXP and pyRXP as optional for tests.
110 bernhard 2697
111 bernhard 2694 * test/localessupport.py: New. Contains a helper function
112     to find a locale with comma used as decimal_point.
113 bernhard 2692
114 bernhard 2690 2006-08-31 Bernhard Reiter <[email protected]>
115 bernhard 2691
116 bernhard 2690 * README: fixed URLs to sqlite and pysqlite.
117 bernhard 2697
118 bernhard 2691 * Thuban/UI/about.py: Added Didrik Pinte as contributor. Extended
119     copyright range to include 2006.
120 bernhard 2690
121 dpinte 2689 2006-06-29 Didrik Pinte <[email protected]>
122    
123     * Thuban/UI/main.py: circular import fix.
124    
125 frank 2688 2006-06-27 Frank Koormann <[email protected]>
126    
127     New Classification "Pattern": Classify text attributes by regexp.
128    
129     * Thuban/Model/classification.py (class ClassGroupPattern):
130     New, group is associated with a regular expression.
131     (Classification._compile_classification): Store compiled regexp and
132     original group for pattern.
133     (Classification.FindGroup): Added pattern.
134    
135     * Thuban/UI/classifier.py
136     (ClassGrid._OnLabelRightClicked, ClassGrid.labelPopup):
137     New, add popup to select singleton/pattern.
138     (ClassTable.GetRowLabelValue, ClassTable.GetValueAsCustom,
139     ClassTable.SetValueAsCustom): Added pattern.
140     (ClassTable.__ParseInput): Autodetect singleton/pattern.
141    
142     * Thuban/Model/save.py (SessionSaver.write_classification):
143     Added pattern.
144    
145     * Thuban/Model/load.py (SessionLoader.start_clpattern,
146     SessionLoader.end_clpattern): New, process pattern elements.
147    
148     * test/test_classification.py (class TestClassGroupPattern): New.
149     (TestClassification.test_add_pattern,
150     TestClassification.test_multiple_groups_textual,
151     TestClassification.test_deepcopy_textual): New.
152     (TestClassification.test_multiple_groups_numerical):
153     Renamed test_multiple_groups.
154     (TestClassification.test_deepcopy_numerical): Renamed test_deepcopy.
155    
156     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
157     Added pattern.
158    
159     * test/test_load.py (ClassificationTest.TestLayers, TestClassification):
160     Added pattern.
161    
162     * test/test_layer.py
163     (TestLayerModification.test_set_classification_textual): New
164     (TestLayerModification.test_set_classification_numerical):
165     Renamed test_set_classification.
166    
167     * Doc/manual/thuban-manual.xml: Added pattern to layer classification
168     description.
169    
170     * Resources/XML/thuban-1.1.dtd: Added clpattern element and attribs.
171    
172 dpinte 2687 2006-06-29 Didrik Pinte <[email protected]>
173    
174     * Thuban/version.py: Bugfix determination of SQLite, the wright one !
175    
176 dpinte 2685 2006-06-28 Didrik Pinte <[email protected]>
177    
178 dpinte 2686 * packaging/windows/thubanstart.py: sample file loading all the stable
179     extensions
180    
181     2006-06-28 Didrik Pinte <[email protected]>
182    
183 dpinte 2685 * Thuban/version.py: Bugfix determination of SQLite on old and recent
184     systems (support pysqlite1 and pysqlite2)
185    
186 frank 2684 2006-06-27 Frank Koormann <[email protected]>
187    
188     * Thuban/version.py: Bugfix determination of SQLite on old systems.
189    
190 dpinte 2683 2006-05-17 Didrik Pinte <[email protected]>
191     * Extensions/ogr/__init__.py : updated test for win32 and correct
192     imports
193    
194 dpinte 2680 2006-05-15 Didrik Pinte <[email protected]>
195 dpinte 2682 Ashamed ... still some tabs in the files
196    
197     * Thuban/version.py : tabs removed
198     * Thuban/Model/transientdb.py : tabs removed
199    
200     2006-05-15 Didrik Pinte <[email protected]>
201    
202 dpinte 2681 * Thuban/version.py : coding style correction
203 dpinte 2682 * Thuban/Model/transientdb.py : coding style correction
204 dpinte 2681
205     2006-05-15 Didrik Pinte <[email protected]>
206 dpinte 2682
207 dpinte 2680 * Thuban/version.py : Updated imports to support pysqlite2
208 dpinte 2682
209     * Thuban/Model/transientdb.py : Updated imports to support pysqlite2
210 dpinte 2680 Patched the querying system to support the param style of pysqlite2
211    
212 dpinte 2679 2006-04-24 Didrik Pinte <[email protected]>
213 bernhard 2690 * Extensions/svgexport/__init__.py: The extension now works on win32
214 dpinte 2679 architecture. Bug #87 corrected.
215    
216 bernhard 2678 2006-04-20 Bernhard Reiter <[email protected]>
217     * Doc/technotes/coding_guidelines.txt: Changed text from CVS to SVN.
218     Removed emacs specific hint and replaced it with a general hint
219     that editors might support writing changelogs.
220    
221 bernhard 2677 2006-04-12 Bernhard Reiter <[email protected]>
222 bernhard 2678
223 bernhard 2677 * Thuban/version.py: Changed thuban_release mechanism to use "svn"
224     instead of "cvs".
225    
226 bernhard 2676 2006-03-31 Bernhard Reiter <[email protected]>
227    
228     * libraries/thuban/wxproj.cpp: including proj_api.h instead of
229     projects.h now. According the Frank Warmerdam and man pj_init
230     this is the public interface to proj. Thus I have changed PJ to projPJ.
231     And I could remove the hack to avoid clashes with typedef PVALUE
232     and #define LP in projects.h clashing with symbols when trying to
233     build on windows. The file is cleaner and nicer now.
234    
235 bernhard 2675 2006-03-29 Bernhard Reiter <[email protected]>
236 bernhard 2678
237 bernhard 2675 * libraries/thuban/wxproj.cpp: undef LP to avoid clash when
238     trying to build with mingw.
239    
240 bernhard 2673 2005-10-18 Bernhard Reiter <[email protected]>
241    
242 bernhard 2674 * Thuban/UI/about.py: remove unused import of getdefaultlocale.
243     Added display of internal encoding to the about dialog text.
244    
245     * Extensions/svgexport/__init__.py: changed version to "1.0.0+cvs".
246    
247     2005-10-18 Bernhard Reiter <[email protected]>
248    
249 bernhard 2673 Startup improved: We fail right away if the internal encoding could
250     not be determined.
251    
252     * Thuban/__init__.py (get_internal_encoding): new.
253    
254     * test/test_stringrepresentation.py (class TestInternalEncoding):
255     Preserve the internal encoding for the tests in this class.
256    
257 bernhard 2671 2005-10-17 Bernhard Reiter <[email protected]>
258    
259 bernhard 2672 * test/test_stringrepresentation.py: New file, for now testing
260     that set_internal_coding() is throwing an exception for bad exceptions.
261    
262     * Thuban/__init__.py (set_internal_encoding): added a forwards
263     and backward translation, so that we fail early if the
264     internal_encoding is bad.
265    
266     2005-10-17 Bernhard Reiter <[email protected]>
267    
268 bernhard 2671 svgexport 1.0.0cvs: Fixed ARC layer writing: No filling is done.
269     You could actually get polylines with filling in between,
270     when the classification for the lines had a fill color.
271     E.g. this happens when you generate a classification from a ramp.
272    
273     * Extensions/svgexport/test/test_svgmapwriter.py:
274     New test_export_arc_no_fill(). Extend copyright notice to 2005.
275    
276     * Extensions/svgexport/svgmapwriter.py
277     (SVGRenderer.draw_shape_layer_incrementally()):
278     Setting TRANSPARENT_BRUSH for shaptype ARC.
279     Extend copyright notice to 2005.
280    
281     * Extensions/svgexport/__init__.py: Extend copyright notice to 2005.
282    
283 frank 2670 2005-09-08 Frank Koormann <[email protected]>
284    
285     * Doc/manual/thuban-manual.xml (Map Management): Fixed typo reported
286     by Erik (sigra.at.home.se)
287    
288 jan 2669 2005-08-18 Jan-Oliver Wagner <[email protected]>
289    
290     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
291     Call the right method for the default size.
292    
293 jan 2667 2005-08-11 Jan-Oliver Wagner <[email protected]>
294    
295     * Extensions/export_shapefile: New.
296    
297     * Extensions/export_shapefile/__init__.py: New. Initialize
298     the export_shapefile extension.
299    
300     * Extensions/export_shapefile/export_shapefile.py: New.
301     Exports a layer as a Shapefile.
302    
303 jan 2664 2005-08-08 Jan-Oliver Wagner <[email protected]>
304    
305     * po/de.po: String fixes. This fixes Debian bug #313843.
306    
307 jan 2660 2005-07-27 Jan-Oliver Wagner <[email protected]>
308    
309     Remove the attributes from the layer element in
310     .thuban files for the save routine.
311     This also solves RT bug #3149,
312     https://intevation.de/rt/webrt?serial_num=3149
313    
314     * test/test_load.py: (TestSingleLayer, TestNonAsciiColumnName,
315     TestLayerVisibility, TestSymbolSize, TestClassification, TestLabels,
316     TestLayerProjection, TestJoinedTable, TestLabelLayer): Removed
317     attributes from layer element to classification clnull element.
318    
319     * test/test_save.py (SaveSessionTest.testSingleLayer,
320     SaveSessionTest.testLayerProjection,
321     SaveSessionTest.testClassifiedLayer,
322     SaveSessionTest.test_joined_table, SaveSessionTest.test_save_postgis):
323     Removed attributes from layer element to classification clnull element.
324     (test_save_postgis.NonConnectionStore._fetch_table_information):
325     added pretending to have a shape_type.
326    
327     * Resources/XML/thuban-1.1.dtd: Make the attributes field
328     and field_type of classification optional.
329    
330     * Thuban/Model/classification.py (Classification.TreeItem.build_info):
331     Added output of size.
332    
333     * Thuban/Model/load.py (SessionLoader.start_classification):
334     Change attribute 'field' and 'field_type' from obligatory to
335     optional to allow empty classes (ie. only with a default=clnull).
336    
337     * Thuban/Model/save.py (SessionSaver.write_layer): Don't write
338     any attributes anymore for the layer element.
339     (SessionSaver.write_classification): Even if there is no
340     classification field, still write the classification because
341     the clnull (default) symbol will not be defined anymore as
342     part of the layer element.
343    
344 bh 2643 2005-07-05 Bernhard Herzog <[email protected]>
345    
346 bh 2652 * setup.py (setup call): Version 1.1.0
347    
348     * NEWS: Update for 1.1.0
349    
350     * MANIFEST.in: Add *.txt to files taken from Doc. Otherwise the
351     technores won't be included
352    
353     * Thuban/UI/about.py (About.__init__): Extend copyright notice to
354     2005
355    
356     * po/de.po: Updated.
357    
358     2005-07-05 Bernhard Herzog <[email protected]>
359    
360 bh 2645 * README: gdal 1.1.8 is too old. 1.2.5 works.
361    
362     2005-07-05 Bernhard Herzog <[email protected]>
363    
364 bh 2650 * Resources/XML/thuban-1.1.dtd (rasterlayer): Add the opacity and
365     masktype attributes.
366    
367     2005-07-05 Bernhard Herzog <[email protected]>
368    
369 bh 2644 * Thuban/Model/layer.py (Layer.__mangle_bounding_box)
370     (Layer.ClipBoundingBox): Rename ClipBoundingBox to
371     __mangle_bounding_box. See the comments in the code and RT #2845
372    
373     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
374     Remove the explicit test of ClipBoundingBox. The method isn't
375     public anymore and the direct call in the test wasn't necessary in
376     the first place. If ClipBoundingBox (now __mangle_bounding_box)
377     isn't called, the return value of ShapesInRegion will be
378     different.
379    
380     2005-07-05 Bernhard Herzog <[email protected]>
381    
382 bh 2643 * Thuban/UI/viewport.py (ViewPort.set_view_transform): Handle
383     ZeroDivisionError exceptions. I don't know when they happen
384     exactly. It probably happens when the projections aren't set
385     properly.
386    
387 bh 2642 2005-07-01 Bernhard Herzog <[email protected]>
388    
389     First step towards unicode. With this roughly we're at step 1
390     string_representation.txt
391    
392     * Doc/technotes/string_representation.txt: New. Document how
393     strings are represented in Thuban and how to get to a Unicode
394     Thuban.
395    
396     * Thuban/__init__.py (set_internal_encoding)
397     (unicode_from_internal, internal_from_unicode): New. The first few
398     functions for the internal string representation
399    
400     * Thuban/UI/about.py (unicodeToLocale): Removed. Use
401     internal_from_unicode instead.
402    
403     * Thuban/UI/__init__.py (install_wx_translation): Determine the
404     encoding to use for the internal string representation. Also,
405     change the translation function to return strings in internal
406     representation even on unicode builds of wxPython
407    
408     * Thuban/Model/load.py (SessionLoader.check_attrs): Decode
409     filenames too.
410     (SessionLoader.start_clrange): Use check_attrs to decode and check
411     the attributes.
412    
413     * Thuban/Model/xmlreader.py (XMLReader.encode): Use
414     internal_from_unicode to convert unicode strings.
415    
416     * Thuban/Model/xmlwriter.py (XMLWriter.encode): Use
417     unicode_from_internal when applicable
418    
419     * test/runtests.py (main): New command line option:
420     internal-encoding to specify the internal string encoding to use
421     in the tests.
422    
423     * test/support.py (initthuban): Set the internal encoding to
424     latin-1
425    
426     * test/test_load.py (TestSingleLayer.test, TestClassification.test)
427     (TestLabelLayer.test): Use the internal string representation when
428     dealing with non-ascii characters
429    
430     * test/test_load_1_0.py (TestSingleLayer.test)
431     (TestClassification.test, TestLabelLayer.test): Use the internal
432     string representation when dealing with non-ascii characters
433    
434     * test/test_load_0_9.py (TestSingleLayer.test)
435     (TestClassification.test): Use the internal string representation
436     when dealing with non-ascii characters
437    
438     * test/test_load_0_8.py (TestUnicodeStrings.test): Use the
439     internal string representation when dealing with non-ascii
440     characters
441    
442     * test/test_save.py (XMLWriterTest.testEncode)
443     (SaveSessionTest.testClassifiedLayer): Use the internal string
444     representation when dealing with non-ascii characters where
445     applicable
446    
447 bh 2638 2005-06-30 Bernhard Herzog <[email protected]>
448    
449 bh 2641 * test/runtests.py: Untabify.
450    
451     2005-06-30 Bernhard Herzog <[email protected]>
452    
453 bh 2639 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
454     untabify.
455    
456     2005-06-30 Bernhard Herzog <[email protected]>
457    
458 bh 2638 * Extensions/ogr/test/__init__.py: Add missing coding directive
459    
460 jan 2631 2005-06-28 Jan-Oliver Wagner <[email protected]>
461    
462 jan 2636 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
463     Use the default size for rendering selected items of default type.
464     Fixes part 2 of https://intevation.de/rt/webrt?serial_num=3149
465    
466     2005-06-28 Jan-Oliver Wagner <[email protected]>
467    
468 jan 2631 * Extensions/importAPR/apr.py (APR_BShSym): Extend by 'Stripple'.
469     (APR_TClr.GetThubanColor): Fix bug in color interpretation.
470     Thanks to Frank Koormann who identified this problem.
471    
472     * Extensions/importAPR/importAPR.py (APR_VShSym): New. Just
473     another symbol identified.
474    
475 jan 2628 2005-06-27 Jan-Oliver Wagner <[email protected]>
476    
477     * Doc/manual/thuban-manual-de.xml: More translations.
478    
479 jonathan 2626 2005-05-12 Jonathan Coles <[email protected]>
480    
481     * Thuban/UI/projdialog.py: Add missing import, which led to an
482     exception when opening a layer's projection.
483    
484 bh 2623 2005-05-09 Bernhard Herzog <[email protected]>
485    
486 bh 2624 * test/support.py (FileLoadTestCase.filename): Fix doc-string.
487    
488     2005-05-09 Bernhard Herzog <[email protected]>
489    
490 bh 2623 * Thuban/Model/postgisdb.py (PostGISConnection.connect): Set the
491     connection to autoconnect. Fixes RT#3148.
492    
493     * test/test_postgis_db.py
494     (TestPostGISSpecialCases.test_simple_error_handling): New test
495     that attempts to reproduce RT#3148.
496    
497 jonathan 2622 2005-05-06 Jonathan Coles <[email protected]>
498    
499     Add support for saving and loading the opacity and mask type
500     properties of RasterLayers. Also add support for proper use
501     of alpha information while drawing images not in 'RAW' format.
502     If transparency in an image format (e.g, PNG) is supported by
503     wxWidgets then the image would previously have been draw with
504     transparent regions, but the opaque regions would have been
505     unaffected by a change in the layer's opacity. This patch
506     corrects the problem.
507    
508     * Thuban/Model/layer.py (RasterLayer): Added opacity and
509     masktype parameters to the constructor, and set the
510     appropriate variables to those values.
511    
512     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Added
513     code to read the opacity and mask type of the layer and construct
514     a new layer with the additional parameters.
515    
516     * Thuban/Model/save.py (SessionSaver.write_layer): Added code
517     to save the opacity and mask type of a layer.
518    
519     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
520     the opacity of the layer to draw_raster_data rather than the layer.
521     (BaseRenderer.draw_raster_data): Remove the layer parameter because
522     the function doesn't need to know about the layer. Add the optional
523     opacity parameter whose default is 1.0. Add 'PNG' as a supported
524     graphics format.
525    
526     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Fixed
527     signature to match that in BaseRenderer. Use the new opacity argument
528     in place of calling layer.Opacity(). In the case where the
529     format is not 'RAW', alpha_data is None and the loaded image has
530     alpha information, use the file's alpha information. This is
531     still subject to the layer's opacity setting.
532    
533     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
534     Fixed signature to match that in BaseRenderer.
535    
536     * test/test_load.py (TestRasterLayer): Change file_contents to
537     include opacity and masktype variables.
538     (TestRasterLayer.test): Include tests for opacity and masktype
539     changes.
540    
541     * test/test_save.py (SaveSessionTest.testRasterLayer): Restructure
542     test to cover a variety of combinations of masktype and opacity
543     settings.
544    
545 jan 2612 2005-05-02 Jan-Oliver Wagner <[email protected]>
546    
547     * debian/rules: add --use-wx-python-swig-hack
548     to the build command.
549     Thanks to Moritz Lennert for pointing this out.
550    
551 jan 2610 2005-04-28 Jan-Oliver Wagner <[email protected]>
552    
553     Introduce OGRFileShapeStore in ogr extension.
554     This allows at least that loaded shapefile shape stores
555     can be saved correctly in the thuban session file
556     and reloaded again (reload is via core shapefile
557     routine, not OGR). For other types, .thuban files
558     can not be reloaded for the time being.
559    
560     * Extensions/ogr/ogrshapes.py (OGRFileShapeStore): New. This
561     class ist to be used for any file-based shape stores
562     accessed through OGR.
563    
564     * Extensions/ogr/ogrstart.py (open_with_ogr): Added
565     forgotten _ for i18n. Adapted call OpenFileShapestore
566     regarding new parameter.
567     (OpenFileShapestore): Use OGRFileShapeStore instead of
568     OGRShapeStore. Fix return value (None instead of null).
569     Add new parameter "mainwindow" to avoid accessing global
570     context.
571    
572 jan 2607 2005-04-27 Jan-Oliver Wagner <[email protected]>
573    
574     Introduce FileShapeStore as generalization for
575     file-based shape stores. In a first instance
576     this allows additional modules to handle shapefile
577     format as well, namely the OGR extension.
578    
579     * Thuban/Model/data.py: Various small fixes in doc-strings.
580     (FileShapeStore): New class.
581     (ShapefileStore): Derive from FileShapeStore.
582     (ShapefileStore.__init__): Call __init__ of FileShapeStore,
583     rename self.table to self._table, initialize self._bbox
584     (ShapefileStore._open_shapefile): Use self._bbox instead of self.bbox
585     and self.FileName() instead of self.filename.
586     (ShapefileStore.Table): Use self._table instead of self.table.
587     (ShapefileStore.FileName): Removed (moved to FileShapeStore).
588     (ShapefileStore.BoundingBox): Use self._bbox instead of self.bbox.
589    
590     * Thuban/Model/save.py: Replace ShapefileStore by FileShapeStore.
591     (SessionSaver.write_data_containers): Only use methods of the
592     base class FileShapeStore.
593    
594 joey 2604 2005-04-26 Martin Schulze <[email protected]>
595    
596     * Extensions/wms/wms.py (render_wms_layer): Adjusted the render
597     function to the modified render engine
598    
599     2005-04-25 Martin Schulze <[email protected]>
600    
601     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
602     Added a description according to the CVS log message
603    
604     2005-04-23 Martin Schulze <[email protected]>
605    
606     * Thuban/UI/renderer.py: Added a missing import
607    
608 russell 2600 2005-04-23 Russell Nelson <[email protected]>
609    
610 russell 2613 * Thuban/UI/view.py (MapCanvas.OnMiddle{Up,Down}): Changed the
611     way the previous tool is remembered, so that middle-button
612     panning works even if you haven't selected a tool.
613 russell 2600
614 bh 2598 2005-04-11 Bernhard Herzog <[email protected]>
615    
616     * libraries/thuban/wxproj.cpp: Move the compatibility code that
617     deals with the wxPython 2.4 version of wxPython.h into the #ifdef
618     branch that includes wxPython.h because it's only needed when
619     wxPython.h is used. Also, it won't compile when
620     USE_WX_PYTHON_SWIG_HACK is set otherwise.
621    
622 bh 2597 2005-04-07 Bernhard Herzog <[email protected]>
623    
624     * Thuban/UI/classifier.py (ClassGrid.__init__): Use -1 as the ID.
625     (ID_CLASS_TABLE): Removed. It wasn't used anywhere except in
626     ClassGrid.__init__ and it's value is outside of the valid
627     range (must be < 32768). wxPython 2.5 complains about it with an
628     exception.
629    
630 jan 2596 2005-04-05 Jan-Oliver Wagner <[email protected]>
631    
632     * Doc/manual/thuban-manual-de.xml: More translations.
633    
634 bh 2590 2005-04-05 Bernhard Herzog <[email protected]>
635    
636 bh 2591 * libraries/thuban/wxproj.cpp: Make it work with a wxPython.h from
637     wxPython 2.4 as well. Also, remove a now obsolete comment.
638    
639     2005-04-05 Bernhard Herzog <[email protected]>
640    
641 bh 2590 Use wxPython.h by default but provide a workaround when it isn't
642     available.
643    
644     * setup.py (wxproj_extension): New variable. Assign the Extension
645     instance for Lib.wxproj to this variable instead of putting it
646     directly into the listso that it can be accessed by other code
647     later.
648     (thuban_build_ext.user_options): Added boolean option
649     --use-wx-python-swig-hack.
650     (thuban_build_ext.initialize_options): Initialize the new option
651     to False.
652     (thuban_build_ext.finalize_options): If the new option was given,
653     define the preprocesser macro USE_WX_PYTHON_SWIG_HACK.
654     (thuban_build_ext): Update the doc-string
655    
656     * libraries/thuban/wxproj.cpp: Normally we use
657     wx/wxPython/wxPython.h now. Only if USE_WX_PYTHON_SWIG_HACK is
658     defined, use swigPtrConvertHack.h instead.
659    
660     * libraries/thuban/swigPtrConvertHack.h: Remove the code that was
661     copied over from wxPython.h.
662     (decode_pointer_new): New. Equivalent of decode_pointer for
663     wxPython 2.5.
664     (wxPyConvertSwigPtr): Modified to cope with wxPython 2.5 as well.
665    
666     * README: Add section on potential build problems which explains
667     how the work-around for a missing wxPython.h is activated.
668    
669 bh 2588 2005-03-29 Bernhard Herzog <[email protected]>
670    
671 bh 2589 * test/postgissupport.py (find_postgis_sql): Added yet another
672     potential location for (lw)postgis.sql because the file has moved
673     again in postgis 1.0.0 rc4.
674    
675     2005-03-29 Bernhard Herzog <[email protected]>
676    
677 bh 2588 * Thuban/UI/legend.py (BMP_SIZE_W, BMP_SIZE_H): Set both to 16 to
678     match the site of the legend_icon_layer icon. Otherwise wxpython
679     2.5 complains when the legend is created with the error:
680    
681     PyAssertionError: C++ assertion "(bitmap.GetWidth() == m_width &&
682     bitmap.GetHeight() == m_height) || (m_width == 0 && m_height ==
683     0)" failed in ./src/generic/imaglist.cpp(81): invalid bitmap size
684     in wxImageList: this might work on this platform but definitely
685     won't under Windows.
686    
687 jonathan 2587 2005-03-23 Jonathan Coles <[email protected]>
688    
689     These changes add support for adjusting the opacity of a raster layer.
690    
691     * Thuban/Model/layer.py (RasterLayer.Opacity): Replaces AlphaOpacity.
692     (RasterLayer.SetOpacity): Replaces SetAlphaOpacity. Also triggers
693     a LAYER_CHANGED event if the opacity actually changes.
694    
695     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_data): Added
696     layer parameter needed in the implementation of this method in
697     renderer.py.
698    
699     * Thuban/UI/layerproperties.py (LayerProperties.dialog_layout): Fixed
700     typo 00 -> 0.
701    
702     * Thuban/UI/rasterlayerproperties.py (RasterLayerProperties): Added
703     control to adjust opacity.
704    
705     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Scale the
706     alpha data based on the opacity level of the layer.
707    
708     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Now
709     accepts a layer parameter.
710    
711     * test/test_layer.py (TestLayerModification.test_raster_layer):
712     Rename opacity method calls and add test for LAYER_CHANGED.
713    
714 bh 2586 2005-03-16 Bernhard Herzog <[email protected]>
715    
716     * test/test_connector.py (DeletionTestMixin.check_deletions)
717     (DeletionTestMixin.check_deletetions): renamed to check_deletions.
718     update the callers.
719    
720 jan 2585 2005-03-14 Jan-Oliver Wagner <[email protected]>
721    
722     * Doc/manual/thuban-manual-de.xml: More translations.
723    
724 jan 2584 2005-03-10 Jan-Oliver Wagner <[email protected]>
725    
726     Introducing initialization callbacks for extensions.
727    
728     * Thuban/UI/extensionregistry.py (ExtensionDesc.__init__): Added
729     optional parameter init_callback.
730     (ExtensionDesc.init_ext): New. Executes the callback and sets
731     a status.
732    
733     * Thuban/UI/application.py (ThubanApplication.OnInit): Add the
734     initialization of the extensions.
735     (ThubanApplication.init_extensions): Init all extensions.
736    
737     * Thuban/UI/about.py (About.__init__): Added status of the extensions
738     to the about text.
739    
740     * Extensions/gns2shp/__init__.py: Added init method for Extension
741     description.
742     (init): New. Contains the initialization of the module.
743    
744 nhueffme 2577 2005-03-04 Nina Hüffmeyer <[email protected]>
745    
746     * Extensions/ogr/ogrdialog.py: Added a dialog, which asks for
747     OGRConnection to open a datasource. Removed dialog to display all
748     available drivers. Added some doc strings.
749    
750     * Extensions/ogr/ogrstart.py: Added menu entry for opening an
751     OGRDatasource with a string. Added two opening methods which return an
752     OGRDatasource (either data from file or from DB).
753    
754     * Extensions/ogr/ogrshapes.py: Added class OGRGeometry, which
755     represents a geometry reference of an OGRFeature. OGRShape now has a
756     list of referenced geometry objects (important for geometry
757     collections).
758     For OGRShapeStores loaded from a DB an ID column can be specified now.
759    
760 jan 2576 2005-02-22 Jan-Oliver Wagner <[email protected]>
761    
762     * test/test_map.py (TestMapWithContents.test_tree_info):
763     Added label layer for comparison.
764    
765 jonathan 2574 2005-02-18 Jonathan Coles <[email protected]>
766    
767     * libraries/thuban/gdalwarp.cpp (GetImageData): Optimize the loop
768     which builds a mask. Handle the majority of an image in a loop,
769     creating 8 bits at a time. Later, handle the edge case where less
770     than 8 bits are packed.
771    
772 bh 2573 2005-02-18 Bernhard Herzog <[email protected]>
773    
774     * test/test_baserenderer.py (TestBaseRenderer.setUp): Fix
775     doc-string
776    
777 jonathan 2571 2005-02-18 Jonathan Coles <[email protected]>
778    
779 jonathan 2572 * setup.py: Remove wx_cs_params from gdal compile options.
780    
781     2005-02-18 Jonathan Coles <[email protected]>
782    
783 jonathan 2571 Refactored baserenderer.py and renderer.py to remove baserenderer.py's
784     dependencies on wxPython. Added a new method projected_raster_layer()
785     that returns a raster layer image in projected space. This must be
786     implemented in classes derived from BaseRenderer. This also eliminates
787     the dependency on gdal in baserenderer.py.
788    
789     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
790     new projected_raster_layer() to get projected raster image instead
791     of directly calling ProjectRasterFile().
792     (BaseRenderer.projected_raster_layer): New. This must be implemented
793     by derived classes. It takes almost the same arguments as ProjectRasterFile
794     did and returns a projected image with mask and alpha data (if requested).
795     (BaseRenderer.render_map_incrementally): Remove the check for gdal since
796     that check will be done in MapRenderer.projected_raster_layer(). This
797     also allows other implementations to use different projection code.
798    
799     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
800     Implementation of BaseRenderer.projected_raster_layer. Checks for
801     gdal support and wxPython version. Also handles exceptions from
802     ProjectRasterFile.
803    
804     * libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
805     and added a variable which can be set through the options argument
806     of ProjectRasterFile.
807    
808     * test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
809     Calls ProjectRasterFile and returns the result.
810     (TestBaseRenderer.test_projected_raster_layer): New. Tests the results
811     of calling projected_raster_layer() with different options.
812     (TestBaseRenderer.test_raster_no_projection): Removed tests based on
813     wxPython version and all tests of masks and alpha channels. These are
814     now in test_projected_raster_layer().
815    
816 jan 2565 2005-02-17 Jan-Oliver Wagner <[email protected]>
817    
818 jan 2570 * Thuban/Model/map.py, Thuban/Model/label.py: Fixed
819     doc-strings to comply with coding_guidelines.
820    
821     2005-02-17 Jan-Oliver Wagner <[email protected]>
822    
823 jan 2565 Docstring improvements and minor fixes for labellayer.
824    
825     * Thuban/Model/map.py:
826     (Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
827     Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
828     Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
829     Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
830     doc string.
831     (Map.BoundingBox): Removed superfluous test for label_layer
832     and improved doc string.
833     (Map.TreeInfo): Added label_layer and improved sdo string.
834    
835     * Thuban/Model/label.py: Added import of _.
836     (Label, Label.__init__): Improved/added doc string.
837     (LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
838     LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
839     Improved/added doc string.
840     (LabelLayer.AddLabel): Use already defined names for
841     align strings and improved doc string.
842     (LabelLayer.TreeInfo): New. Return the object data for
843     the tree view.
844    
845 jonathan 2562 2005-02-16 Jonathan Coles <[email protected]>
846    
847     Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
848     so that that wxproj doesn't crash. Added GUI support for selecting
849     alpha channel (opacity can't be selected yet).
850    
851     NOTE: If wxPython.h is including in future distribution packages
852     then it will not be necessary to have the files swigPtrConvertHack.h
853     and wxPython_int.h included with Thuban. This is hopefully
854     a temporary workaround.
855    
856     * setup.py (thuban_build_ext.finalize_options): gdalwarp needs
857     access to the macro wxCHECK_VERSION so that it will properly
858     generate a bit mask. There was a problem between wx2.4 and wx2.5
859     that this works around.
860    
861     * Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
862     of RasterLayer.MaskType.
863     (RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
864     (RasterLayer.MaskType): New. Returns the type of mask to use. Can
865     specify none, a bitmap, or an alpha channel.
866     (RasterLayer.SetMaskType): New. Set what kind of mask to use.
867    
868     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
869     Set the raster warping options for the mask based on the value
870     of RasterLayer.MaskType.
871    
872     * Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
873     deprecated calls to SetItemSelectedImage in favor of SetItemImage
874     with wxTreeItemIcon_Selected.
875    
876     * Thuban/UI/rasterlayerproperties.py: Support selecting to use
877     an alpha channel for the mask.
878    
879     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
880     data if it is available and an alpha channel is supported under
881     the current version of wxPython.
882    
883     * libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
884     to select whether 1's or 0's select the desired portion of an image
885     in the bit mask. wx2.4 has a bug where the documentation is the opposite
886     from behavior.
887     (ProjectRasterFile): Only generate an alpha channel if the version
888     of wxPython is >= 2.5.3.
889    
890     * libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
891     When wxPython >= 2.5.3 use the special swig functions to decode an
892     object's address.
893    
894     * libraries/thuban/swigPtrConvertHack.h: Includes conditional code
895     based on the version of wxPython. If >= 2.5.3 use the special swig
896     functions from wxPython to decode wxPython objects, otherwise use
897     the old method of retrieving the address from the object __repr__ string.
898    
899     * libraries/thuban/wxPython_int.h: Copied from wxPython source.
900     Unnecessary code was removed to make it smaller.
901    
902     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
903     Add tests for returning an alpha channel.
904    
905     * test/test_layer.py (TestLayerModification.test_raster_layer): Fix
906     tests that used removed functions UseMask and SetUseMask
907    
908    
909 bh 2560 2005-02-08 Bernhard Herzog <[email protected]>
910    
911 bh 2561 More wxPython 2.5 changes. This time taken from a patch from
912     Daniel Calvelo Aros.
913    
914     * Thuban/UI/tableview.py (QueryTableFrame.__init__)
915     (QueryTableFrame.__init__): Pass the size of a spacer as a single
916     item.
917    
918     * Thuban/UI/projdialog.py (ProjFrame.build_dialog)
919     (ProjFrame.build_dialog): Pass the size of a spacer as a single
920     item.
921    
922     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
923     size of a spacer as a single item.
924    
925     * Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
926     size of a spacer as a single item.
927    
928     2005-02-08 Bernhard Herzog <[email protected]>
929    
930 bh 2560 Compatibility with wxPython 2.5. The changes should make it work
931     better with 2.5 while still keeping compatibility with 2.4. There
932     are still problems with 2.5, though.
933    
934     * Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
935     of a spacer as a single item.
936    
937     * Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
938     from wxControl
939    
940     * Thuban/UI/legend.py (LegendTree): When running with wxPython <
941     2.5, add an implementation of the GetFirstChild method that does
942     not require the second parameter.
943     (LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
944     (LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
945     (LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
946     pass the second parameter to GetFirstChild
947    
948 nhueffme 2559 2005-02-08 Nina Hüffmeyer <[email protected]>
949    
950     * Extensions/ogr/ogrshapes.py: Removed some print commands.
951    
952     * Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
953     additional menu but appears as a possibility in the menu Map.
954    
955 jonathan 2558 2005-02-07 Jonathan Coles <[email protected]>
956     * libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
957     and PYTHON_ERRF since they were no longer necessary.
958    
959 bernhard 2556 2005-02-07 Bernhard Reiter <[email protected]>
960     * Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
961     Enable translation for message string.
962    
963 joey 2555 2005-02-06 Martin Schulze <[email protected]>
964    
965     * Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
966     the arguments of the contstructor to fit the global scheme
967    
968 nhueffme 2554 2005-01-31 Nina Hüffmeyer <[email protected]>
969    
970     * Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
971     some dialogs needed to start ogr.
972    
973     * Extensions/ogr/__init__.py: Changed comments to avoid encoding
974     warnings.
975    
976     * Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
977     encoding warnings.
978    
979 jonathan 2552 2005-01-28 Jonathan Coles <[email protected]>
980    
981 jonathan 2553 * libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
982     mask is packed into a bit array. It's now slightly faster.
983    
984     2005-01-28 Jonathan Coles <[email protected]>
985    
986 jonathan 2552 * Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
987     default to true.
988    
989     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
990     code that loads the state of the layer's use_mask flag. Its
991     usefulness is still being debated.
992    
993     * Thuban/Model/save.py (SessionSaver.write_layer): Remove
994     code that saves the state of the layer's use_mask flag. Its
995     usefulness is still being debated.
996    
997     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
998     options to ProjectRasterFile based on the state of layer.UseMask().
999     Catch more exceptions from ProjectRasterFile so that Thuban doesn't
1000     quit is there is a problem projecting.
1001     (BaseRenderer.draw_raster_data): Change the documentation to
1002     describe the new format (XBM) that the mask data will be in.
1003    
1004     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
1005     data is in XBM format when format='RAW' which means it doesn't
1006     need to be converted to a wxImage before being used as a mask
1007     for a wxBitmap. Assume that if format != 'RAW' that the image
1008     data and mask data are in the same format.
1009    
1010     * libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
1011     and a mask is requested, convert the alpha band to a bit array in
1012     XBM format. if an alpha channel is requested, simply return the
1013     data in the alpha band. Provide better error handling by returning
1014     python error messages (also fixes RT #2947).
1015     (ProjectRasterFile): Support multiple mask options, rather than simply
1016     a flag indicating that a mask should or should not be used. Provide
1017     better error handling by returning python error messages.
1018    
1019     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1020     Add mask data to test.
1021    
1022     * test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
1023     should use the mask by default.
1024     (TestLayerModificaton.test_raster_layer): Test that a layer should use
1025     the mask by default.
1026    
1027     * test/test_load.py (TestRasterLayer.test): Remove testing for
1028     use_mask flag in file.
1029    
1030     * test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
1031     for use_mask in file.
1032    
1033     * test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
1034    
1035 jonathan 2551 2005-01-26 Jonathan Coles <[email protected]>
1036    
1037     Add a new dialog box for raster layers. The dialog box allows
1038     the user to toggle a mask that is generated by ProjectRasterFile
1039     and is used to only draw the real parts of the projected image.
1040    
1041     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
1042     Instruct the warping code to generate a mask if the raster layer
1043     requests one.
1044     (BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
1045    
1046     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
1047     obsolete optional mask argument.
1048    
1049     * Thuban/UI/classifier.py (Classifier): Change the parent class
1050     to LayerProperties and rework the code to support layout calls
1051     from the parent.
1052     (Classifier.dialog_layout): New. Layout the dialog box.
1053     (Classifier.map_layers_removed): Removed. Moved to parent class.
1054     (Classifier.map_replaced): Removed. Moved to parent class.
1055     (Classifier._OnTry): Renamed to OnTry to support parent class.
1056     (Classifier.OnClose): Removed. Supplied in parent class.
1057     (Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
1058     (Classifier._OnOK): Renamed to OnOK to support parent class.
1059     (Classifier._OnRevert): Renamed to OnRevert to support parent class.
1060    
1061     * Thuban/UI/layerproperties.py: New. Base class for layer properties
1062     dialog boxes.
1063    
1064     * Thuban/UI/rasterlayerproperties.py: New. Class for displaying
1065     raster layer properties.
1066    
1067     * libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
1068     with the non-simple version supplied with gdal. This allows added
1069     features such as creating an alpha band.
1070     (GetImageData): Generate a mask array from the alpha band that is
1071     generated by gdal if the user has selected it. Try to support images
1072     that have more than three bands, such as images with RGB plus an
1073     alpha band.
1074     (ProjectRasterFile): Convert python argument for mask and tell
1075     gdal to enable or disable an alpha band.
1076    
1077     * Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
1078     describing what kind of layer the class is. Defaults to "Unknown",
1079     but should be overridden by subclasses.
1080     (Layer.Type): New. Override base class method.
1081     (RasterLayer.__init__): Create a flag for using a mask. Record extra
1082     data from gdal for display in the properties dialog.
1083     (RasterLayer.Type): New. Override base class method.
1084     (RasterLayer.UseMask): New. Returns True if the mask should be used.
1085     (RasterLayer.SetUseMask): New. Set if the mask should be used.
1086     (RasterLayer.ImageInfo): New. Return extra information about the image.
1087    
1088     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
1089     the mask information.
1090    
1091     * Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
1092    
1093     * Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
1094     Classifier classes as dialogs to use with the proper layer types.
1095    
1096     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1097     Fix test.
1098    
1099     * test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
1100     (TestLayerModification.build_path): New. Support function.
1101     (TestLayerModification.test_raster_layer): New. Test new methods.
1102    
1103     * test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
1104    
1105     * test/test_load.py (TestRasterLayer): Add tests for mask.
1106    
1107     * test/test_load_1_0_1.py: New. Copied from test_load.py.
1108    
1109     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
1110     obsolete optional mask argument.
1111    
1112 nhueffme 2549 2005-01-26 Nina Hüffmeyer <[email protected]>
1113    
1114     * Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
1115     which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
1116     RowOrdinalToId() and ReadRowAsDict().
1117    
1118     * Extensions/ogr/ogrstart.py: Added menu item which opens database
1119     layers for existing database connections.
1120    
1121     * Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
1122    
1123    
1124 jan 2548 2005-01-26 Jan-Oliver Wagner <[email protected]>
1125    
1126     * Doc/manual/thuban-manual-de.xml: More translations.
1127    
1128 bh 2544 2005-01-24 Bernhard Herzog <[email protected]>
1129    
1130     Rework the status bar updates a bit to make sure the message about
1131     the projections is produced at the right times.
1132    
1133     * Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
1134     New class variable with messages that may require a status bar
1135     update.
1136     (MainWindow.view_position_changed)
1137     (MainWindow.update_status_bar): Rename from view_position_changed
1138     to update_status_bar. It's meaning has changed now that it may
1139     also generate messages about problems with projection settings.
1140     (MainWindow.__init__): Use the new update_status_bar_messages
1141     class variable to subscribe update_status_bar
1142     (MainWindow.set_position_text): Update doc-string. This method
1143     has to be renamed at some point. See doc-string and comments.
1144     (MainWindow.OnClose): Unsubscribe update_status_bar from all
1145     messages in update_status_bar_messages
1146    
1147     * Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
1148     class attribute. map messages to be forwarded by the viewport.
1149     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
1150     the messages in forwarded_map_messages
1151    
1152 bh 2543 2005-01-21 Bernhard Herzog <[email protected]>
1153    
1154     * test/postgissupport.py (PostGISDatabase.__init__): Tweak
1155     doc-string
1156     (find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
1157     different name for the initialization SQL file.
1158    
1159 jonathan 2537 2005-01-21 Jonathan Coles <[email protected]>
1160 jan 2542
1161     * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
1162     a projection and returns a formatted string representing the
1163     parameters to feed to gdalwarp. This function eliminates
1164     redundancy in draw_raster_layer().
1165     (BaseRenderer.render_map_incrementally): Removed the optimization which
1166     drew the top most raster layer first and then only those vector-
1167     based layers that are above it. With the support for transparency
1168     this optimization breaks correct behaviour.
1169     (BaseRenderer.draw_raster_layer): Reorganize code to support possible
1170     future enhancements to raster layer bounding box. The old behaviour has
1171     not changed. Also, change calling parameters to draw_raster_data()
1172     to specify new RAW data format and mask.
1173     (BaseRenderer.draw_raster_data): Change signature to include an optional
1174     parameter for mask information. Change documentation to mention
1175     support for new parameter and added option for RAW data format.
1176     The data argument is now a list of [width, height, data].
1177    
1178     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
1179     mask parameter. Add new condition for RAW format, which
1180     significantly reduces rendering time. Add condition for
1181     mask parameter.
1182    
1183     * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
1184 jonathan 2537 data array of RGB values from the projected image returned from
1185     the gdal warping functions. In the case of palette based images, it
1186 jan 2542 converts the NO_DATA index to the mask color.
1187     (ProjectRasterFile): Removed all custom memory driver references
1188     and replaced it with the standard in-memory dataset provided
1189     by gdal. The return data is no longer a BMP file, but an array
1190     of RGB values, one set triple per pixel.
1191 jonathan 2537
1192     * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
1193     * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
1194     * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
1195    
1196 jan 2542 * setup.py (thuban_build_ext.finalize_options): Removed mention
1197     of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
1198     files. These are obsolete with the new version of gdalwarp.cpp
1199    
1200     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
1201     Updated signature.
1202     (TestBaseRenderer.test_raster_no_projection): Changed the test
1203     data to be data in the uncompressed RAW format returned from
1204     ProjectRasterFile.
1205    
1206 jan 2535 2005-01-21 Jan-Oliver Wagner <[email protected]>
1207    
1208 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
1209     string available for i18n.
1210 jan 2535
1211 russell 2532 2005-01-20 Russell Nelson <[email protected]>
1212    
1213     * Resources/Projections/defaults.proj: Ruin the speling of the
1214 russell 2533 Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
1215     It's the wrong thing to do in the long run, but it's necessary for
1216     those users until that bug is fixed. Otherwise the projection
1217     dialog segfaults. Better to annoy some Lambert-93 users with a
1218     spelling mistake than every Fedora Core 3 user of Thuban-CVS.
1219 russell 2532
1220 bernhard 2531 2005-01-20 Bernhard Reiter <[email protected]>
1221    
1222 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
1223     docstring and comment that the warning code here is a hack.
1224 bernhard 2531
1225 russell 2529 2005-01-20 Russell Nelson <[email protected]>
1226    
1227 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
1228     user about misprojected layers when their lat/lon bounding
1229 russell 2529 box exceeds rational lat/lon values.
1230    
1231 bernhard 2525 2005-01-20 Bernhard Reiter <[email protected]>
1232    
1233 jan 2542 * Thuban/UI/about.py (unicodeToLocale): Improved:
1234 bernhard 2528 Use 'ascii' and then 'replace' for other characters
1235     when getdefaultlocale returns None. Thanks to Bernhard H. .
1236 jan 2542
1237 bernhard 2528 2005-01-20 Bernhard Reiter <[email protected]>
1238    
1239 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
1240 bernhard 2527 that OnRangeText might be called twice and using None as argument.
1241 jan 2542
1242 bernhard 2527 2005-01-20 Bernhard Reiter <[email protected]>
1243    
1244 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
1245     OnRangeText(0) to work around a different in wx Behaviour noticed
1246     on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
1247    
1248 bernhard 2526 2005-01-20 Bernhard Reiter <[email protected]>
1249    
1250     * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
1251 bernhard 2525 None. (Fixes rt#2910.)
1252    
1253 frank 2524 2005-01-18 Frank Koormann <[email protected]>
1254    
1255     New Extension: mouseposition
1256     Tool to collect mouse click positions (map coordinates) in a dialog.
1257    
1258     * Extensions/mouseposition/__init__.py: New, extension registration
1259    
1260     * Extensions/mouseposition/mouseposition.py: New, implements the
1261     dialog and adds a tool to Thuban mainwindow.
1262    
1263     * Extensions/mouseposition/position.xpm: New, icon for tool.
1264    
1265 jan 2522 2005-01-14 Jan-Oliver Wagner <[email protected]>
1266    
1267     * Doc/manual/thuban-manual-de.xml: More translations.
1268    
1269 frank 2520 2005-01-11 Frank Koormann <[email protected]>
1270    
1271     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1272     Fix indention bug.
1273    
1274 frank 2517 2005-01-09 Frank Koormann <[email protected]>
1275    
1276     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1277 frank 2520 BugFix 2901: Explicitly copy layers ClassificationColumn since it
1278 frank 2517 is not part of the layers Classification.
1279    
1280 frank 2515 2005-01-03 Frank Koormann <[email protected]>
1281    
1282 frank 2517 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
1283     BugFix 2883: Former implementation only worked on classified point
1284     layers: KeyError was raised, now use the default size if field is None.
1285 frank 2515
1286 bernhard 2513 2004-12-27 Bernhard Reiter <[email protected]>
1287    
1288     svgexport 1.0.0cvs: Fixed label export.
1289    
1290     * Extensions/svgexport/test/test_svgmapwriter.py:
1291     class TestSVGRenderer(): New class; new test test_label_font().
1292    
1293     * Extensions/svgexport/svgmapwriter.py
1294     (SVGRenderer.label_font()): initialised Font size with self.factor now,
1295     makes test_label_font happy.
1296    
1297     * Extensions/svgexport/TODO: crossed out fixed label export item.
1298     Added item for options.
1299    
1300     * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
1301    
1302 russell 2511 2004-12-27 Russell Nelson <[email protected]>
1303    
1304 jan 2512 Middle mouse button pans.
1305 russell 2511
1306 jan 2512 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
1307     OnMiddleDown and OnMiddleUp events.
1308     (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
1309     previously used tool.
1310     (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
1311     pressing the middle mouse button.
1312    
1313 jan 2509 2004-12-27 Jan-Oliver Wagner <[email protected]>
1314    
1315     * Doc/manual/thuban-manual-de.xml: More translations.
1316    
1317 jan 2506 2004-12-23 Jan-Oliver Wagner <[email protected]>
1318    
1319     * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
1320     \n to stderr after the warnings. Thanks to Russell Nelson.
1321    
1322 nhueffme 2493 2004-12-20 Nina Hueffmeyer <[email protected]>
1323    
1324     * Extensions/ogr/ogrshapes.py: Fixed some issues from
1325     Bernhard (coding guidelines etc.). Additionally it is now possible to
1326     display shapefiles containing feature collections (e.g.polygons
1327     with holes). Works with gdal 1.2.1 now.
1328    
1329     * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
1330     from Bernhard (coding guidelines etc.). If ogr can't be imported,
1331     tests are skipped now.
1332    
1333     * Extensions/ogr/ogrstart.py: Fixed some typings.
1334    
1335 bernhard 2490 2004-12-20 Bernhard Reiter <[email protected]>
1336    
1337     * Extensions/svgexport/TODO: updated to add support for
1338     raster layers and labels for 1.0.1.
1339    
1340     * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
1341     Issue a warning now.
1342    
1343 bernhard 2488 2004-12-19 Bernhard Reiter <[email protected]>
1344    
1345 bernhard 2489 * Extensions/svgexport/TODO: Added idea to support triggering
1346     the application down the pipe.
1347    
1348     2004-12-19 Bernhard Reiter <[email protected]>
1349    
1350 bernhard 2488 svgexport: Improved code quality, mainly by better naming.
1351    
1352     * Extensions/svgexport/svgmapwriter.py:
1353     DrawPath() renamed to DrawPolygonPath(),
1354     added documentation, improved comments and variable names.
1355    
1356     * Extensions/svgexport/svgmapwriter.py,
1357     Extensions/svgexport/test/test_svgmapwriter.py:
1358     All using DrawPolygonPath() now, the default parameter closed=True
1359     omitted.
1360    
1361     * Extensions/svgexport/test/test_svgmapwriter.py:
1362     renamed test_polygon_opened() to test_polyline()
1363     renamed test_transparent_polygon() to test_transparent_polyline()
1364    
1365 jan 2487 2004-12-18 Jan-Oliver Wagner <[email protected]>
1366    
1367     Some fixes of gns2shp extension.
1368    
1369     * Extensions/gns2shp/test/__init__.py: New. Make this directory a
1370     package.
1371    
1372     * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
1373     dynamically.
1374    
1375     * Extensions/gns2shp/test/README: Simplified description how to test.
1376    
1377     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
1378     fixed some dimensions of fields according to the GNS documentation
1379     which seems to change undocumented.
1380     Now killing trailing \n and/or \r from MODIFY_DATE.
1381     This fixes RT#2453.
1382    
1383 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
1384 bernhard 2480
1385 bernhard 2482 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
1386    
1387     * Extensions/svgexport/test/test_svgmapwriter.py:
1388     Added new tests: test_export_polygon_with_hole()
1389     and test_polygon_with_hole().
1390    
1391     * Extensions/svgexport/svgmapwriter.py
1392     (draw_polygon_shape()): Uses DrawPath correctly now.
1393    
1394     * Doc/manual/thuban-manual.xml: Added documentation for stable
1395     extention svgexport.
1396     * Doc/manual/thuban-manual-de.xml: Copied English section about
1397     svexport over.
1398    
1399 jan 2509 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
1400 bernhard 2482
1401     * Extensions/svgexport/svgsaver.py,maplegend.py:
1402     Moved from experimental to stable extension menu.
1403    
1404     * Extensions/svgexport/TODO: updated.
1405    
1406    
1407     2004-12-18 Bernhard Reiter <[email protected]>
1408    
1409 bernhard 2481 Added Extensions/svgexport/TODO
1410    
1411     2004-12-18 Bernhard Reiter <[email protected]>
1412    
1413 bernhard 2480 Refactored in svgexport:
1414     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
1415    
1416     * Extensions/svgexport/svgmapwriter.py
1417     Added verbosity level 3 to print out polygon points.
1418     (class Point): added __repr__
1419     (class Brush, __str__()): Added space after ,.
1420     (DrawPolygon): Renamed to DrawPath()
1421     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
1422     (DrawLines): Using DrawPath now.
1423    
1424     * Extensions/svgexport/test/test_svgmapwriter.py:
1425     Replaced DrawPolygon() calls with DrawPath() and put the first argument
1426     inside another list. Adapted test data with a newline before "M".
1427    
1428     2004-12-18 Bernhard Reiter <[email protected]>
1429 bernhard 2479
1430     Refactored svgexport tests: 9 double tests runs eliminated;
1431     code size reduced by 8 lines.
1432    
1433     * Extensions/svgexport/test/test_svgmapwriter.py:
1434     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
1435     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
1436     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
1437     this fixed the double running of the nine tests of TestVirtualDC.
1438     (class TestVirtualDC): Using self.dc and self.file from setUp().
1439    
1440 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
1441    
1442     Two windows specific fixes ported from thuban-1­0-branch:
1443    
1444     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
1445     instead of getlocale because getlocale doesn't return a usable
1446     encoding name on a german windows 2000
1447    
1448     * setup.py: windows build: Removed the absolute path names and
1449     made all prfixes relative to the directory containing setup.py.
1450     Makes it a little easier to adapt to a different system.
1451    
1452 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
1453    
1454 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
1455 bh 2472 Fixes RT#2299
1456    
1457     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
1458    
1459     * test/postgissupport.py
1460     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
1461     table to "roads-multi" because it now uses MULTILINESTRING
1462     geometries and introduce a new "roads" table that uses LINESTRING
1463     (coords_to_multilinestring): Make the doc string more precise
1464     (coords_to_linestring): New. Create a LINESTRING WKT
1465     representatin
1466     (wkt_converter): Add coords_to_linestring
1467     (upload_shapefile): Rephrase the doc-string a bit.
1468    
1469     * test/test_postgis_db.py (TestPostGISShapestoreArc)
1470     (LineStringTests)
1471     (TestPostGISShapestoreLineString)
1472     (TestPostGISShapestoreMultiLineString): Split
1473     TestPostGISShapestoreArc into a base class LineStringTests and two
1474     derived classes TestPostGISShapestoreLineString for LINESTRING
1475     geometries and TestPostGISShapestoreMultiLineString for
1476     MULTILINESTRING geometries. Most test methods are in the base
1477     class with the exception of tests that explicitly check the raw
1478     format.
1479    
1480     2004-12-16 Bernhard Herzog <[email protected]>
1481    
1482 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
1483    
1484     * test/postgissupport.py (find_postgis_sql): Different postgis
1485     versions put the postgis.sql file into slightly different places
1486     so we have to look in both. The updated doc string describes this
1487     is more detail.
1488    
1489     * test/test_postgis_db.py
1490     (TestPostGISSpecialCases.test_column_name_quoting): The return
1491     value of UniqueValues is unsorted, so it has to be sorted for
1492     comparison.
1493    
1494     2004-12-16 Bernhard Herzog <[email protected]>
1495    
1496 bh 2470 Fix for RT#2237
1497    
1498     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
1499     panel to be shown is the UnknownProjPanel disable the OK and Try
1500     buttons. Otherwise enable them.
1501     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
1502     the parameters. In that case __GetProjection also returns None
1503     now.
1504    
1505 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
1506    
1507 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
1508     minimum number of classes to 2. The calculate_quantiles needs at
1509     least two and raises an exception otherwise.
1510     Fixes RT#2549
1511    
1512     2004-12-15 Bernhard Herzog <[email protected]>
1513    
1514 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
1515     so that it returns a result for select statements.
1516     (PostgreSQLServer.server_version): New. Return the version of the
1517     server software.
1518     (PostgreSQLServer.require_authentication): The format of
1519     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
1520     server version and generate the file in the correct format
1521    
1522     2004-12-15 Bernhard Herzog <[email protected]>
1523    
1524 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
1525     in the doc string and rephrase it a little.
1526    
1527 frank 2457 2004-12-15 Frank Koormann <[email protected]>
1528    
1529     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
1530     session has been loaded successfully. The check is called by the relevant
1531     tests after executing load_session().
1532    
1533 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
1534    
1535 bh 2454 Make sure the region used to determine which shapes are visible
1536     actually matches the region on the printed page. If this isn't
1537     done properly some shapes might not be printed.
1538     Fixes RT #2692
1539    
1540     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
1541     renderer has to be at the same position as the mapregion
1542    
1543     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
1544     has to be moved by (self.shiftx, self.shifty) too.
1545    
1546     2004-12-13 Bernhard Herzog <[email protected]>
1547    
1548 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
1549     generated python code which leads to exception in the __del__
1550     method when the constructor fails. See the comments in the code
1551     for more details.
1552    
1553     * libraries/pyprojection/Projection.py: Updated from Projection.i
1554     with SWIG.
1555    
1556     2004-12-13 Bernhard Herzog <[email protected]>
1557    
1558 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
1559     (TestAltPath.test_02_path_error_fix_from_list)
1560     (TestAltPath.test_05_path_error_fix_from_list_changed)
1561     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
1562     is destroyed in tearDown, so there's no need to do it in a test
1563     case.
1564    
1565     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
1566     debug print
1567    
1568     2004-12-13 Bernhard Herzog <[email protected]>
1569    
1570 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
1571     (TestDrawSplines.setUp): Do not use super with the unittest
1572     classes because in Python 2.2 they're still old-style classes.
1573    
1574 frank 2448 2004-12-13 Frank Koormann <[email protected]>
1575    
1576     Alternative Path feature: When loading a (moved) session where
1577     shapefiles cannot be found, ask the user. Use the specified path
1578     if further shapefiles are missing. However, ask the usr for confirmation
1579     in such cases.
1580    
1581     * test/test_load.py (TestAltPath): New, tests for alternative path feature
1582     in load_session()
1583     (Shapefile_CallBack): Helper, implements controllable callback.
1584    
1585     * Thuban/UI/application.py (ThubanApplication.OnInit):
1586     Added "alt_path" to self.path
1587     (ThubanApplication.OpenSession): Added shapefile_callback as second
1588     callback similar to db_connection_callback.
1589     (ThubanApplication.run_alt_path_dialog): New, implementaion of
1590     shapefile_callback. In addition to raising the dialog the control of
1591     self.path('alt_path') is implemented here.
1592    
1593     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
1594     (SessionLoader.open_shapefile): Open shapefile, eventually with
1595     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
1596     formerly used in start_fileshapesource()/start_layer().
1597     (SessionLoader.start_fileshapesource): Call open_shapefile().
1598     (SessionLoader.start_layer): Call open_shapefile().
1599     (load_session): Added shapefile_callback.
1600    
1601     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
1602     feature (search / check).
1603    
1604     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
1605    
1606 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
1607    
1608 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
1609    
1610     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
1611     (def draw_point_shape): new parameter size defaults to 2 as before.
1612     (draw_shape_layer_incrementally): Moved draw_func log line higher.
1613     Added draw_func call with size when dealing with a point layer.
1614    
1615     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
1616    
1617     2004-12-11 Bernhard Reiter <[email protected]>
1618    
1619 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
1620     to raise the chance that the line length will be below 255 characters,
1621     as recommended by REC SVG 1.1 in section 8.3.1.
1622    
1623     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
1624     Adding \n before L's and changed whitespace handling.
1625    
1626     * Extensions/svgexport/test/test_svgmapwriter.py:
1627     Adapted tests to new whitespace handling of DrawPolygon.
1628    
1629     2004-12-11 Bernhard Reiter <[email protected]>
1630    
1631 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
1632    
1633     * Extensions/svgexport/test/test_svgmapwriter.py:
1634     Removed test_drawbezier in favour of new test_drawspline3 and
1635     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
1636     All only to test DrawSpline.
1637    
1638     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1639     New implementation now really using the strange algorithm of
1640     xfig 3.1's approximated splines and its conversion to postscript
1641     with one twist: SVG can do quadratic beziers, so skipped translation
1642     to cubic beziers.
1643     (TestWithDC): Typo in comment fixed.
1644    
1645 joey 2442 2004-12-09 Martin Schulze <[email protected]>
1646    
1647     * Thuban/Model/classgen.py: Added missing character encoding
1648    
1649     * Extensions/wms/properties.py (OpenWMSProperties): removed
1650    
1651     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
1652     support for get_srs_discrepancies() since there are no
1653     discrepancies anymore (was a thinko)
1654    
1655     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
1656     format priority now that more formats are supported globally by
1657     the render engine.
1658    
1659 silke 2437 2004-12-08 Silke Reimer <[email protected]>
1660     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
1661     because it is not available in all versions of ogr
1662    
1663 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
1664     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
1665     global tests until a real one is commited.
1666    
1667 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
1668    
1669     * /Extensions/ogr/: Adding a new extension to read shapefiles with
1670     ogr. It is planned to add other vector formats.
1671    
1672     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
1673    
1674 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
1675    
1676     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
1677     part of a (non-)fix to renable that the tests are always
1678     executed.
1679    
1680 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
1681    
1682     * Extensions/svgexport/test/test_svgmapwriter.py:
1683     Added test_drawbezier() to test DrawSpline().
1684    
1685     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1686     Really implemented bezier drawing.
1687    
1688     * Extensions/svgexport/__init__.py: Bumped version of svgexport
1689     to 0.9.1 because now the legend examples lines styles
1690     will be drawing with beziers.
1691    
1692 joey 2431 2004-12-05 Martin Schulze <[email protected]>
1693    
1694     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
1695     GIF as supported bitmap image formats (helpful for the WMS extension)
1696    
1697 joey 2430 2004-11-30 Martin Schulze <[email protected]>
1698    
1699     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
1700     Improved the test for the internal compare method
1701    
1702 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
1703    
1704     * Thuban/UI/about.py (About.__init__): Added
1705     Norbert Solymosi for hungarian translation and Ole Rahn
1706     as contrbutor. Moved Bernhard Reiter from Contributor
1707     to Developer.
1708    
1709 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
1710    
1711     * Extensions/svgexport/test/test_svgmapwriter.py:
1712     Removed Jan from author list as he did not change enough significant
1713     lines yet.
1714    
1715     * Extensions/svgexport/__init__.py: Added Bernhard as author
1716     of the Extension.
1717    
1718 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
1719    
1720     * po/hu.po: New. Hungarian translation. Contributed
1721     by Norbert Solymosi.
1722    
1723 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
1724    
1725     * Extensions/svgexport/test/test_svgmapwriter.py
1726     (Testobjectexport.test_transparent_polygon): Commented out some
1727     debug prints
1728    
1729 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
1730    
1731     Fix broken tests for svg extension and added svg legend
1732     to Experimental menu.
1733    
1734     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
1735     the test run correctly even if the extension is a package.
1736     Also removed the "import Thuban" which makes no sense.
1737    
1738     * Extensions/svgexport/__init__.py: Fix to have the extensions'
1739     test module also be executed from the global test routine.
1740     This is done by looking for the absense of the DISPLAY variable.
1741    
1742     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
1743     to Experimental menu since this module has yet not reached a stable
1744     status (ie. 1.0).
1745    
1746 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
1747    
1748     * Extensions/svgexport/svgmapwriter.py:
1749     Added verbose variable and some logging depending on it.
1750     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
1751     because counting i is not necessary.
1752     (class Pen, class Brush): Added simple __str__ methods.
1753     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
1754     not exported to svg file) Note: holes still unhandled.
1755    
1756     * Extensions/svgexport/test/test_svgmapwriter.py:
1757     Made a baseclass TestWithDC for test needed a DC.
1758     Added tests for bug #2698 (transparent polygons are not
1759     exported to svg file):
1760     Testobjectexport.test_transparent_polygon()
1761    
1762     * Thuban/Model/base.py (UnsetModified):
1763     Fixed some typos in docstring.
1764    
1765     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
1766     Added hints on the used algorithm for handling holes.
1767    
1768 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
1769    
1770 jan 2412 Some face lifting for the examples.
1771    
1772     * Examples/__init__.py: Make this directory a package.
1773    
1774     * Examples/simple_extensions/__init__.py: Make this directory a package.
1775    
1776     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
1777     menu to Examples menu.
1778    
1779     * Examples/simple_extensions/simple_command.py: Some more comments,
1780     minor changes.
1781    
1782     * Examples/simple_extensions/simple_tool.py: Minor changes.
1783    
1784     2004-11-20 Jan-Oliver Wagner <[email protected]>
1785    
1786 jan 2407 Changed way of extension registry for wms and added extension
1787     registry for umn_mapserver extension.
1788    
1789     * Extensions/wms/__init__.py: Added registry entry and the importing
1790     of the actual wms module. Included a test for the required PyOGCLib.
1791    
1792     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
1793    
1794     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
1795     importing of the actual umn mapserver management modules.
1796     Included a test for the required Python MapScript.
1797    
1798     2004-11-20 Jan-Oliver Wagner <[email protected]>
1799    
1800 jan 2403 Changed way of extension registry for importAPR, bboxdump
1801     and added extension registry for svgexport.extension registry for
1802     svgexport.
1803    
1804     * Extensions/importAPR/__init__.py: Added registry entry and the importing
1805     of the actual importAPR module.
1806    
1807     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
1808     __init__.py).
1809    
1810     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
1811     »···of the actual bboxdump module.
1812    
1813     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
1814     »···__init__.py).
1815    
1816     * Extensions/svgexport/__init__.py: Added registry entry and the importing
1817     of the svgsaver module.
1818    
1819     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
1820     to Experimental menu since this module has yet not reached a stable
1821     status (ie. 1.0).
1822    
1823 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
1824    
1825     Now the hit test considers the size of point symbols.
1826    
1827     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
1828     'size' defaulting to the previously fixed value 5.
1829     Extended doc-string.
1830     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
1831     for symbols.
1832     Now the size of the largest point symbol is determined to find out
1833     about whether the point has been hit.
1834     This fixes the problem that only clicks inside a fixed distance of
1835     5 where found.
1836    
1837 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
1838    
1839 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
1840 jan 2395 selected symbols.
1841    
1842     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
1843     Added consideration of the specific size of point symbols.
1844     The property for each point symbol is retrieved and the size applied
1845     for the rendering method.
1846     Added doc-string.
1847    
1848 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
1849    
1850     Changed way of Extension Registry for gns2shp and profiling.
1851    
1852     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
1853     __init__.py).
1854    
1855     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
1856     of the actual gns2shp module.
1857    
1858     * Extensions/profiling/profiling.py: Removed registry entry (moved to
1859     __init__.py).
1860    
1861     * Extensions/profiling/__init__.py: Added registry entry and the importing
1862     of the actual profiling module.
1863    
1864 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
1865    
1866     * Extensions/svgexport/: Minor improvements to doc strings.
1867    
1868 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
1869    
1870     Further elements for sizable point objects now
1871     making this feature usable though not yet complete.
1872    
1873     * Thuban/Model/save.py (SessionSaver.write_classification): Write
1874     attribute 'size' for cldata when the shape layer is of point type.
1875     This also now make the test_load.py tests happy.
1876    
1877     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
1878     gradient.
1879    
1880     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
1881     ID_SELPROP_SPINCTRL_LINEWIDTH.
1882     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
1883     (ID_SELPROP_SPINCTRL_SIZE): New Id.
1884     (SelectPropertiesDialog.__init__): Added a second spin control
1885     for the size in case the corresponding layer is of point type.
1886     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
1887     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
1888     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
1889     and refresh preview.
1890    
1891    
1892    
1893 joey 2381 2004-10-04 Martin Schulze <[email protected]>
1894    
1895     * Extensions/wms/test/test_parser.py
1896     (TestWMSCapabilitiesParser.test_compareLists): Added missing
1897     self-test for compareLists()
1898     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
1899     self-test for compareDicts()
1900 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
1901     to verify the test routine fails with non-equal arguments
1902     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
1903     to verify the test routine fails with non-equal arguments
1904 joey 2381
1905 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
1906    
1907 jan 2380 First elements for sizeable point objects.
1908    
1909     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
1910    
1911     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
1912    
1913     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
1914     of a corresponding argument is given.
1915     (TestSymbolSize): New. Test the size attribute of cldata.
1916    
1917     * Thuban/Model/classification.py: Removed some trailing whitespaces.
1918     (ClassGroupProperties.__init__): Set default size.
1919     (ClassGroupProperties.SetProperties): Set the size.
1920     (ClassGroupProperties.GetSize): New. Return the size.
1921     (ClassGroupProperties.SetSize): New. Set the size.
1922     (ClassGroupProperties__eq__): Compare also size.
1923     (ClassGroupProperties__repr__): Print also size.
1924    
1925     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
1926     the size attribute.
1927    
1928     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
1929     Also, now there is a return value that indicates whether the drawing
1930     size exceeded the given rect extent and if so the new extent.
1931     Finally, point objects are drawn depending on the size. If either
1932     the width or height is exceeded, the new extent is returned.
1933     (ClassRenderer.Draw): Now when calling the previewer drawing function,
1934     evaluate the return value and, if not None, adapt the grid widget size
1935     accordingly and redraw again.
1936    
1937     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
1938     If the draw function is for points, call it with the size as additional
1939     parameter.
1940     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
1941     the size. Compute the radius using the size.
1942    
1943     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
1944     that Thuban supports size, apply this correctly.
1945    
1946     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
1947    
1948     2004-10-03 Jan-Oliver Wagner <[email protected]>
1949    
1950 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
1951     Map chapter.
1952    
1953 joey 2368 2004-10-01 Martin Schulze <[email protected]>
1954    
1955     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
1956     argument for general use through properties-dialog selector
1957    
1958     * Thuban/UI/classifier.py: Register properties dialog classes for
1959     both provided layer classes/types.
1960    
1961     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
1962     map can be retrieved through the parent which is passed to the
1963     constructor anyway and doesn't require an argument of its own,
1964     required for the unification of arguments for general use through
1965     properties-dialog selector.
1966     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
1967     whether a dialog is already opened (and raising it to the users
1968     attention) and creating a new dialog into a function of its own
1969     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
1970     method
1971     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
1972     global registration of properties dialog classes (which are indeed
1973     layer-specific).
1974    
1975     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
1976     for general use through properties-dialog selector, the map can be
1977     retrieved through the parent and doesn't require an argument of
1978     its own.
1979    
1980     * Extensions/wms/wms.py: Register the properties dialog class for
1981     the provided WMS layer
1982    
1983 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
1984    
1985     New feature: Registry for Extensions.
1986    
1987     * Thuban/UI/extensionregistry.py: This module defines a registry for
1988     Extensions.
1989    
1990     * Thuban/UI/about.py (About.__init__): Added description
1991     of the registered extensions with all of the information.
1992    
1993     * Thuban/Model/extension.py (Extension): Improved doc-string.
1994    
1995     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
1996     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
1997     Extensions/wms/wms.py: Added registration of the extension.
1998    
1999 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
2000    
2001     More fixes to svgexport to make used ids unique and
2002     conforming to XML's Name production.
2003    
2004     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
2005     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
2006     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
2007     Added Bernhard R. as author.
2008     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
2009     concatenation char now (makes test_make_ide_nosetbaseid() valid).
2010     Also transform second id part with "%d" and catch the TypeError
2011     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
2012     Corrected typo inBernhard's author line.
2013     (SetBaseID): Return the transformed base id. Transform characters
2014     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
2015     import binascii. If to be set string starts with "xml" or so, add "t".
2016     (draw_shape_layer_incrementally): use the returned value of SetBaseID
2017     for used_baseids checks.
2018    
2019 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
2020    
2021     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2022     Remove a debug print and some tab characters.
2023    
2024 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
2025    
2026     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
2027     (SetBaseID, SetID, make_id): Improved docstring comments to explain
2028     the interaction of the three functions and the XML id contrains.
2029    
2030 bernhard 2352
2031 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
2032    
2033 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
2034     Module.
2035    
2036     * Doc/README: Added info on ThubanModel.xmi.
2037    
2038     2004-09-23 Jan-Oliver Wagner <[email protected]>
2039    
2040 jan 2346 * Doc/README: New. Some info about how to generate technical
2041     documentation from the source code.
2042     This text was send to the Thuban developer mailing list on
2043     September 21st 2004 by Bernhard Reiter.
2044    
2045 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
2046    
2047     Improved the svgexport to only use unique ids. Will issues
2048     an error message dialoge when two layer names are the same.
2049     ShapeIDs are now added with a dash within the svg ids.
2050    
2051     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
2052     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
2053     (TestSVGRenderer): New test class with test_make_in() and
2054     test_check_for_layer_name_clash()
2055     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
2056     and draw_shape_layer_incrementally() to not use a baseid twice,
2057     satisfying test_check_for_layer_name_clash()
2058     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
2059     test_make_in().
2060     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
2061     and wxICON_HAND.
2062     (write_to_svg): Put dc and rendering in a try statement and on
2063     catching SVGmapWriterError notify the user and delete the target file.
2064    
2065 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
2066    
2067     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
2068    
2069 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
2070    
2071     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
2072     small bug with the line color. Now the line color will now only set
2073     if it is set in Thuban an not Transparent.
2074    
2075     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
2076     deleting the layers from mapfile. Now all layers will delete backwards
2077     from the last.
2078    
2079 silke 2339 2004-08-20 Silke Reimer <[email protected]>
2080 silke 2338
2081 silke 2339 * Thuban/Model/layer.py:
2082     Fixes bug in projection handling: Otherwise very large region might not
2083     have valid values in the layer's projection.
2084    
2085     2004-08-20 Silke Reimer <[email protected]>
2086    
2087 silke 2338 * Thuban/UI/about.py:
2088     small changes to be consistent with coding style.
2089    
2090 joey 2337 2004-08-13 Martin Schulze <[email protected]>
2091    
2092     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
2093     Adjusted a comment
2094    
2095 silke 2335 2004-08-11 Silke Reimer <[email protected]>
2096 silke 2334
2097 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
2098     too many and too enhanced imports of locale
2099    
2100 silke 2334 2004-08-10 Silke Reimer <[email protected]>
2101    
2102     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
2103 silke 2339 function unicodeToLocale() to convert special characters to users
2104     locale encoding
2105 silke 2334
2106 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
2107    
2108     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
2109     lower case letter'
2110    
2111 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
2112    
2113     * ChangeLog: Rewrite the last ChangeLog entry to follow
2114     the standard way.
2115    
2116     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
2117     the function where it is needed, because it don't works if it stands
2118     at the beginning.
2119     (MF_Layer.__init__): Removed the extra numclassed variable. Now
2120     numclasses from the mapscript will be used.
2121     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
2122     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
2123     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
2124     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
2125     (MF_Map.create_new_layer): New. A new Layer is created and associated
2126     with the mapscript object.
2127     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
2128     the mapscript.
2129     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
2130     linked to the layer in thuban, else the layerobject linked to the
2131     thubanlayer will be used.
2132     AnnotationLayer will now store the filename of the shapefile.
2133     (MF_Map.remove_layer): If a layer is removed the associated object
2134     must be set new.
2135    
2136     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
2137     layers which are exists in thuban to the mapobj. All removed Layers
2138     will be removed from the mapobj.
2139     Added comments to all functions.
2140     (thuban_to_map): No layer will be removed here.
2141    
2142     * Extensions/umn_mapserver/mf_handle.py
2143     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
2144     Layersettings for the mapserver kann be edited.
2145    
2146     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
2147     imported, will be linked with the associated MF_Layer.
2148     (import_mapfile): All layers, which are not selected, will be removed.
2149     Disable the "import layer from mapfile" menu option.
2150    
2151     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
2152     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
2153     layer on permanently.
2154    
2155 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
2156    
2157 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
2158     New. This function removes all metadata
2159     (MF_Layer.set_group): New. Set the group setting.
2160     (MF_Layer.get_group): New. Get the group setting.
2161     (MF_Map): Removed the extra numlayers variable, used the mapscript
2162     parameter instead.
2163     (MF_Map.get_numlayers): New. This get numlayers.
2164     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
2165 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
2166     if the object is an instance. Also added the annotation layer here to
2167     export, but only the layer is created in the mapfile.
2168    
2169 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
2170     the check if a mapobj exist, because its not needed anymore. The
2171     export function is only available if a mapobj exist.
2172     Use the new function to remove all layers.
2173 jschuengel 2323
2174 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
2175     option and the metadata button. The layer dialog is temporary disabled.
2176     (Metadata_CustomDataTable): Added some functions to show the grid
2177 jschuengel 2323 correct.
2178    
2179 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
2180     the number of layer from import_mapfile to this function.
2181     (AnnotationLayer): New. This Class shows the Annotation layer in
2182     thuban. The layer don't do anything. It's only to show the layer
2183     and to save the layer order.
2184     (add_annotationlayer): New. Import an annotation layer to thuban.
2185     (select_layer2import): New. Import only layers to thuban and not
2186     the other settings like projection or scalebar.
2187     (create_new_mapfile): Moved the _has_umn_mapobj function and the
2188     create_new_mapfile functions from mf_handle.py to mf_import.py.
2189 jschuengel 2323
2190     * Extensions/umn_mapserver/sample/iceland.map: Added the group
2191     parameter to the roads and cultural layers. Also added a new
2192     Annotation Layer for the cultural points.
2193    
2194     * Extensions/umn_mapserver/sample/iceland.html: Added the select
2195     option for the annotation layer.
2196    
2197     * Extensions/umn_mapserver/sample/index.html: Added the start
2198     parameter for the annotation layer.
2199    
2200 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
2201    
2202     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
2203     translation completed.
2204    
2205     * Doc/manual/thuban-manual.xml (Chapter Session Management):
2206     Fixed unprecise description for Save Session.
2207    
2208 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
2209    
2210     Started translation of Users Manual into german.
2211    
2212     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
2213    
2214     * Doc/manual/Makefile: Added build instructions for german
2215     users manual.
2216    
2217     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
2218    
2219 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
2220    
2221     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
2222     functions. Now all metadata will handle by the function and its not
2223     needed to initialize it from outside. Therefor the associated mapobj
2224     will be stored in the Metadata Object. So we can use the special
2225     functions from the associated mapobj to get the Metadata.
2226     Therefor all initialization code for the metadata is removed from the
2227     other classes.
2228     (MF_Layer): Added a function to get the metadata object.
2229     (MF_Map): Added a function to set the mappath, the path where
2230     the mapfile ist stored.
2231    
2232     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
2233     to set the extent in the mapfile. Now the code is set by the displayed
2234     data in the Thuban-view.
2235     (export_mapfile): The shapepath is now set empty, until relative
2236     pathnames are supported.
2237    
2238     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
2239     metadata. Yet only mapfile metadata are supported. Layer and class
2240     supported are not implemented.
2241     Added a dialog to handle layer informations. The dialog only shows the
2242     selected layer at the moment.
2243    
2244     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
2245     code for setting the extent in thuban. Now the extent is set to the
2246     given extent from the mapfile.
2247     Fixed a logical mistake. Now the extent is set when realy a layer is
2248     loaded, and not if one is selected to load.
2249    
2250     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
2251     move the shown map in the browser.
2252    
2253     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
2254     line to the mapobj and added metadata to the political layer.
2255    
2256     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
2257     for Metadata.
2258    
2259 joey 2300 2004-07-26 Martin Schulze <[email protected]>
2260    
2261     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
2262     ClassMapper
2263    
2264     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
2265     case for the new ClassMapper
2266    
2267    
2268 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
2269    
2270 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
2271     visible extent of the map in projected coordinates
2272    
2273     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
2274     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
2275     tests.
2276     (SimpleViewPortTest.test_visible_extent): New. The real test for
2277     VisibleExtent()
2278    
2279     2004-07-22 Bernhard Herzog <[email protected]>
2280    
2281 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
2282     function when running asa script.
2283    
2284 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
2285    
2286     * Extensions/umn_mapserver/mf_export.py: Added "import os"
2287     Removed the old "import Thuban.UI.mainwindow" code.
2288     (tbextent_to_map): Removed the extra function and at the code direct
2289     to "thuban_to_map" function.
2290     (write_creatorcomment): Added. Now a short comment is added to the
2291     beginning of an generated mapfile.
2292     (export_mapfile): Now the Path and filename are saved in to variables,
2293     and not together in one variable. This is needed for the new
2294     write_creatorcomment function.
2295    
2296     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
2297     import module "re". Also added Range and the ClassGroupRange import
2298     from Thuban. Both are needed for the new range expression import.
2299     (create_rangeexpression): Added. Creates a Range Expression in Thuban
2300     style from a given mapfile expression.
2301     (added_rasterlayer): Make some small code changes. The shapepath is
2302     now stored in an extra variable and the clazz_name is set empty if no
2303     class name set in the mapfile.
2304     Changed the Error message for Range Expressions, becaus the new
2305     function create a error string which will be shown in the dialog.
2306    
2307     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
2308     range expression import.
2309 jan 2312
2310 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
2311    
2312     * Extensions/umn_mapserver/README: Added hint that
2313     installation as root can be avoided. Removed all tabs.
2314    
2315 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
2316    
2317     * test/test_viewport.py
2318     (ViewPortTest.test_changing_map_projection): Check that changing
2319     the projection of an empty map shown in a viewport doesn't lead to
2320     exceptions in the viewport's handler for the
2321     MAP_PROJECTION_CHANGED messages
2322    
2323     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
2324     try to keep the same region visible when the map actually contains
2325     something
2326    
2327 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
2328    
2329     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
2330     mappath directly from the mapobj. Is needed because of the changes
2331     in mf_import.py.
2332     (MF_Layer.add_thubanclass): Added a new comment.
2333     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
2334     mapobj is empty there is no extent get from thuban an so no one can
2335     set to th mapobj.
2336    
2337     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
2338     the discription.
2339     Split the funktion in to three smaller ones. The new functions are
2340     add_rasterlayer, add_polygonlayer and select_layer2import.
2341     Removed the mapfilepath and filepath initialisation, because its know
2342     include in the new functions.
2343     Now nothing will be imported if cancel is pressed in the
2344     layer choice dialog.
2345    
2346 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
2347    
2348     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
2349     import.
2350     (MF_Symbolset): Removed the extra variable for numsymbols.
2351     (MF_Class.__init__): Added a comment to the exception clause.
2352     Removed the extent init, because it was not needed anymore.
2353     (MF_Layer.add_thubanclass): Added the code to set the class name to
2354     the expression value from thuban if no label is defined.
2355     Added the code to export Range expressions from thuban to the mapfile.
2356     (MF_Map.set_extent): Removed the exception and replace it by some if
2357     code. If the size of a map is not defined the size will be set to 1,1.
2358     This is necessary because if the extent is set, mapscript checks if
2359     the size is greater than zero.
2360     (MF_Web): Added the get and set function for the template.
2361    
2362     * Extensions/umn_mapserver/mf_export.py: Added the function to check
2363     if a mapobject exists and used it to set the status of the menu items.
2364     If no mapfile exists the settings could not be edditied.
2365     Define after which menuitem the exportitem will include.
2366    
2367     * Extensions/umn_mapserver/mf_handle.py: Removed the import
2368     Thuban.UI.mainwindow clause, because it is not needed.
2369     Added the command Refresh() to all "OnChangeColor()" functions,
2370     because the color preview window was not updated on a color change.
2371     Added the function to check if a mapobject exists and used it to set the
2372     status of the menu items. If no mapobject exists the settings could not
2373     be edditied.
2374     (Map_Dialog): Moved the imagetype selector from the
2375     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
2376     (Web_Dialog): Removed the name label and added the template textbox.
2377    
2378     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
2379     the exception handling on loading the layers by an if statement. It
2380     is not necessary to us the exception there.
2381     The Filepath creation now use os.path.join to build the path.
2382    
2383     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
2384     definition from global to the setUp function. Now the testMap will
2385     initialize new on each test.
2386    
2387     * Extensions/umn_mapserver/sample/iceland.map: Include three new
2388     classes in the Line Layer, to test logical Expressions.
2389     Set the status of the class "Point9" in the Point Layer to off
2390    
2391 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
2392    
2393     * Thuban/UI/baserenderer.py
2394     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
2395     optimization that tries not to draw layers under a raster layer.
2396     The bug was harmless. All it effectively did was to produce The a
2397     strange messages about not being able to draw Layer instances for
2398     all vector layers below a raster layer which would be invisible
2399     anyway because the raster layer currently always covers the entire
2400     window
2401    
2402 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
2403    
2404     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
2405     a list of supported outputformats. This formats are not alle supported
2406     because there is no possibility to get the outputformat without the
2407     name known. Make some formal changes to the code.
2408     (MF_Map.set_name()): Fixed a bug if the name is None.
2409    
2410     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
2411     statement, because its not needed anymore. The Outputformat is now
2412     given as string from the object. Make some formal changes to the code.
2413    
2414     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
2415     most of the new setting which were added during the last changes.
2416     Removed the MF_Size Test.
2417    
2418     * Extensions/umn_mapserver/test/test.map: Added a new class to the
2419     cultural Layer to test expressions and the the status of that layer
2420     from on to default.
2421     Changed the data path the the correct Thuban Data
2422     Added the Outputformat Object and Symbol Object
2423    
2424 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
2425    
2426     * Extensions/umn_mapserver/mapfile.py: Added some new
2427     settings to edit (outputformat, label, imagetype)
2428    
2429     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
2430     the Label Dialog and add the OutputDialog.
2431     Make some changes to the code order.
2432    
2433 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
2434    
2435     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
2436     and line Obj and add the scalebar_status_type, scalebar_style_type and
2437     scalebar_position_type.
2438     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
2439     are only used to create a Symbol like the circle in Thuban.
2440     Added the scalebarObject (MF_Scalebar)
2441     (MF_Class): Added set_status and get_status.
2442     (MF_Layer.add_thubanclass): Added code to set the class status
2443     (MF_Map): Added code to handle the symbols and scalebar
2444     (MF_Label): Added the set_partials and get_partials functions
2445    
2446     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
2447     from mapfile. Added a function to create a circle object like the one
2448     from thuban if no one exists.
2449    
2450     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
2451     press ok in the assosiated dialog and not at the end of the
2452     colordialog.
2453     Added the Dialog for the Scalebar.
2454     (Label_Dialog): Added the offset option
2455    
2456     * Extensions/umn_mapserver/mf_import.py: Added code to import the
2457     status of the Classes.
2458     Fixed a bug with the projection. Now the to_meter parameter will be
2459     added to the Projection only if it doesn't exists.
2460    
2461 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
2462    
2463     Added the functionality to handle the content thuban is not
2464     able to handle directly.
2465    
2466     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
2467     Thuban with the possibility to edit the mapfile content.
2468    
2469     * Extensions/umn_mapserver/mf_import.py: Added the possibility
2470     to import mapfiles without any layer selected. So it is possible
2471     to edit the other settings in a mapfile.
2472     (import_mapfile): Added code to use the editing functions.
2473     Added the possibility to import the projection to a layer if one
2474     is defined.
2475     Status settings (On,Off) will now set in thuban (visible, invisible).
2476     fixed a bug with with classnames. If no classname is set in mapfile
2477     the value in Thuban will set to the expression.
2478    
2479     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
2480     possibility to save a new mapfile or use the old one which is
2481     imported or new created.
2482     Added code to use the editing functions.
2483     Remove some not needed import statements
2484    
2485     * Extensions/umn_mapserver/mapfile.py: Added new types which are
2486     need for the editing functions.
2487     Added needed set-functions for the editing functions.
2488     Added the possibility to export rasterimages.
2489     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
2490     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
2491     moment.
2492     (MF_Class.set_thubanstyle): Now point layers will set to a default
2493     symbol to show a circle in mapserver and not only a 1px dot.
2494     (MF_Style.__init__): Fixed a bug with the color. Color was not set
2495     correct before.
2496     (MF_Size): Removed, because it is not needed.
2497    
2498     * Extensions/umn_mapserver/README: Added the hints to use the
2499     export and editing functions, too.
2500    
2501     * Extensions/umn_mapserver/sample/iceland.map: Added the
2502     new parameter "UNITS METERS".
2503     Change the political layer to status OFF.
2504    
2505     * Extensions/umn_mapserver/sample/README: Added some
2506     more details to setup the sample in the MapServer.
2507    
2508 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
2509    
2510     * Extensions/svgexport/test/test_svgmapwriter.py:
2511     Removed class VFile and used standard StringIO instead.
2512    
2513 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
2514    
2515     Add the export function to the umn_mapserver extension.
2516    
2517     * Extension/umn_mapserver/mf_export.py: New. This module extents
2518     Thuban with the possibility to export the Thuban content.
2519    
2520     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
2521     with the export module. Especially added the possibility to
2522     add thuban objects directly to the map objects.
2523    
2524     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
2525     because of the hint from Bernhard Herzog.
2526     Corrected the handling of absolute pathnames.
2527     Changed the Text of the Menu-Item, now the beginning is upper case.
2528    
2529     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
2530    
2531 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
2532 jschuengel 2242
2533 jschuengel 2250 Add a sample and make some changes.
2534    
2535     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
2536     import from * to explicit used statements. Changed the
2537     Thuban.UI.mainwindow import phrase, too.
2538     (import_mapfile):Corrected a clerical mistake.
2539     Added wxCHANGE_DIR in OpenFile Dialog.
2540     Added a MultipleChoiceDialog, to select the layers to load from
2541     mapfile into thuban. Thereby the projection is only set if one layer
2542     is selected.
2543     Added the possibility to handle relative pathnames which uses
2544     up-level references.
2545     Removed some doubled code.
2546     Corrected an error with integer values used as label in thuban
2547     ClassGroup.
2548    
2549     * Extensions/umn_mapserver/sample: New.
2550    
2551     * Extensions/umn_mapserver/sample/README: New. Describes the
2552     usage of the sample files.
2553    
2554     * Extensions/umn_mapserver/sample/iceland.map: New. This is
2555     a suitable .map-file for the iceland data.
2556    
2557     * Extensions/umn_mapserver/sample/index.html: New. The template
2558     for the mapfile.
2559    
2560     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
2561     file for the Iceland Application on web.
2562    
2563     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
2564     some details.
2565    
2566     * Extensions/umn_mapserver/test/test_mapserver
2567     (mapserver_import_Test_generalClasses.test_MF_Color):
2568     Corrected the thubancolor test.
2569    
2570     2004-06-15 Jan Schüngel <[email protected]>
2571    
2572 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
2573    
2574 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
2575    
2576     * libraries/thuban/cpl_mfile.h: Added copyright header.
2577    
2578     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
2579     Free Software License so that it is most useful with gdalwarp
2580     and bmpdataset.
2581    
2582 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
2583    
2584     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
2585     import of wxPython.wx itself (as opposed to the contents of
2586     wxPython.wx). For some reason wxPython.wx is available as
2587     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
2588     wrt. wxPython 2.4.
2589    
2590 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
2591    
2592     Initial version of new extension "umn_mapserver". This extension aims
2593     to manage configuration for the UMN MapServer application. This
2594     inital version just imports the .map-files and displays all, Thuban is
2595     capable of.
2596    
2597     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
2598    
2599     * Extensions/umn_mapserver/test/README: New. Describes how to run the
2600     tests.
2601    
2602     * Extensions/umn_mapserver/test/test.map: New. This is a test
2603     .map-file for automated tests of the umn_mapserver extension of
2604     Thuban.
2605    
2606     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
2607     UMN Mapserver classes.
2608    
2609     * Extensions/umn_mapserver/__init__.py: New. Init to make this
2610     directory a package.
2611    
2612     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
2613     '.map'-file objects.
2614    
2615     * Extensions/umn_mapserver/mf_import.py: New. This module extends
2616     Thuban with the possibility to handle UMN MapServer mapfiles.
2617    
2618 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
2619    
2620     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
2621     to a tuple before using it as arguments to the % operator. This
2622     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
2623     reported today on thuban-list by Jan Schüngel
2624    
2625     * test/test_layer.py (TestLayerModification.setUp): Save the
2626     filename as an instance variable so we can refer to it in tests
2627     (TestLayerModification.test_tree_info): Uncomment this method
2628     again and make it work. This tests for the formatting issue
2629     filed in RT#2239 on 2004-01-13
2630    
2631 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
2632    
2633     * Thuban/UI/baserenderer.py: Fix some typos.
2634    
2635 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
2636    
2637     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
2638     by increasing a field size.
2639    
2640 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
2641    
2642     Update to newest shapelib and get rid of Thuban specific
2643     extensions, i.e. use the new DBFUpdateHeader instead of our
2644     DBFCommit kludge
2645    
2646     * libraries/shapelib/shpopen.c: Update to version from current
2647     shapelib CVS.
2648    
2649     * libraries/shapelib/shapefil.h: Update to version from current
2650     shapelib CVS.
2651    
2652     * libraries/shapelib/dbfopen.c: Update to version from current
2653     shapelib CVS.
2654     (DBFCommit): Effectively removed since shapelib itself has
2655     DBFUpdateHeader now which is better for what DBFCommit wanted to
2656     achieve.
2657     We're now using an unmodified version of dbfopen.
2658    
2659     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
2660     value '1' to the Lib.dbflibc extension. This simply reflects the
2661     shapelib and pyshapelib updates
2662    
2663 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
2664    
2665     Finished introduction of Menu.FindOrInsertMenu.
2666    
2667     * Extensions/drawshape/drawshape.py: Add the command
2668     to the experimental menu additionally to the toolbar.
2669    
2670     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
2671     finding menu on its own.
2672    
2673     * Doc/manual/thuban-manual.xml: updated sample file
2674     to use FindOrInsertMenu().
2675    
2676     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
2677     instead of finding menu on its own.
2678    
2679 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
2680    
2681     * test/test_menu.py (MenuTest.test): Added testing
2682     of method Menu.FindOrInsertMenu.
2683    
2684 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
2685    
2686     Introduce and use Menu.FindOrInsertMenu.
2687    
2688     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
2689     given menu or, if not found, insert it.
2690    
2691     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
2692     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
2693     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
2694     menu on its own.
2695    
2696 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
2697    
2698     Introduce a abstract ColorDialog class and remove
2699     and outdated file.
2700    
2701     * Thuban/UI/proj4dialog.py: Removed. It is has been
2702     replaced by projdialog for quite a while and is not used
2703     anymore.
2704    
2705     * Thuban/UI/colordialog.py: New. Abstraction for color selection
2706     dialog(s).
2707    
2708     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
2709     Now calls the abstract ColorDialog instead of wxColourDialog.
2710     This also removed the dependency to Color class conversion
2711     from this function.
2712    
2713 frank 2197 2004-05-04 Frank Koormann <[email protected]>
2714    
2715     * Extensions/bboxdump/__init__.py: Fixed string left over from
2716     copying.
2717    
2718     * Extensions/bboxdump/bboxdump.py (bboxdump):
2719     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
2720     xrange(layer.NumShapes()). Compile the bboxmessage from a list
2721     of formatted outputs (string.join) instead of appending to the
2722     message. Two progress bar dialogs to report progress on the sometimes
2723     lenghty processing.
2724    
2725 frank 2196 2004-04-22 Frank Koormann <[email protected]>
2726    
2727     New Extension to dump bounding boxes of all shapes of the selected
2728     layer. An optional column can be specified to group the objects,
2729     in this case the bounding box is a union of the separate boxes.
2730     Dump can be displayed in a ScrolledMessageDialog or written to file.
2731     The Extension is simply a combination of available and well tested
2732     Thuban functionality.
2733    
2734     * Extensions/bboxdump/__init__.py: New: Init to make this
2735     directory a package.
2736    
2737     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
2738     all shapes of the selected layer.
2739    
2740 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
2741    
2742     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
2743     strings to be i18n now.
2744    
2745 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
2746    
2747     Changing popup menu of legend from direct building
2748     to using the Menu construction as used for the mainwindow.
2749    
2750     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
2751     layer_to_bottom, layer_visibility
2752     (MainWindow.LayerToTop): New. Put current layer to the top.
2753     (MainWindow.LayerToBottom): New. Put current layer to bottom.
2754     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
2755     Replace 1,0 by True, False.
2756     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
2757     current layer.
2758     (MainWindow.LayerShowTable): Removed raising of dialog.
2759     (_has_selected_layer_visible): New. Support function.
2760    
2761     * Thuban/UI/legend.py: ID_POP_xxx: removed.
2762     (LegendPanel.__init__): Removed EVT_MENU bindings.
2763     (LegendTree._OnRightClick): Replace direct creation of
2764     menu via wx Classes by applying the menu definition
2765     as of Menu class of menu.py.
2766    
2767 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
2768    
2769     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
2770     button string to stronger clearify that Thuban will be closed when hitting
2771     the button.
2772    
2773     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
2774     Now for layers without a ShapeStore a corresponding message is given
2775     to the user, that this layer has no table to show.
2776    
2777 joey 2182 2004-04-15 Martin Schulze <[email protected]>
2778    
2779     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
2780     recalculate the format for the internal render engine as well.
2781    
2782     * Extensions/wms/properties.py (wmsProperties): First start for a
2783     properties dialog. It's functional for a first selection of
2784     layers, but still has some weired wxWidgets/GTK problems but
2785     beautification can be done later.
2786    
2787     * Extensions/wms/layer.py: Added more documentation
2788     (WMSLayer.getFormats): New: Return list of supported image formats
2789     by the WMS server
2790     (WMSLayer.getLayers): New: Return the list of layer names
2791     supported by the WMS server
2792     (WMSLayer.getLayerTitle): New: Return the title of the named layer
2793     (WMSLayer.getWMSFormat): New: Return the image format that is used
2794     for WMS GetMap requests
2795     (WMSLayer.setWMSFormat): New: Set the image format that is used
2796     for WMS GetMap requests
2797     (WMSLayer.__init__): Move away from using only one layer to using
2798     a list of layers (unsorted at the moment, though).
2799     (WMSLayer.getVisibleLayers): New: Return the list of names for all
2800     visible layers
2801     (WMSLayer.setVisibleLayers): New: Set the list of names for all
2802     visible layers
2803    
2804     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
2805     order to establish a clean structure.
2806    
2807     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
2808     own in order to establish a clean structure.
2809    
2810 joey 2174 2004-04-13 Martin Schulze <[email protected]>
2811    
2812     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
2813     support for oldstyle (WMS 1.0 apparently) image format
2814     specification.
2815    
2816     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
2817     supported graphic formats back to JPEG and BMP, PNG and others are
2818     too *cough* experimental... Sorry, I meant to filter this out
2819     before I committed this part. This should make the WMS extension
2820     run from CVS again.
2821     (wms_dialog): Reset an empty URL to None so that the subsequent
2822     program can depend on this, since the dialog will indeed return an
2823     empty URL, causing another declaration of love by Python.
2824    
2825     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
2826     Whenever a native BoundingBox request cannot be fulfilled, check
2827     whether the requested SRS is EPSG:3426, in which case return the
2828     LatLonBoundingBox values.
2829    
2830     * Extensions/wms/test/test_parser.py
2831     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
2832     ignoring AUTO:* SRS.
2833     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
2834     Added another test method to test whether the LatLonBoundingBox
2835     values will be returned if BoundingBox values are requested with
2836     SRS set to EPSG:3426.
2837    
2838     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
2839     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
2840     the moment by placing them into a variable which is currently
2841     unused. Also test whether the EPSG SRS is numerical as it should
2842     be and add an error message if it is not.
2843    
2844     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
2845     appear in the real world as well. Since we cannot handle them yet
2846     (OGCLib can't either), we will ignore them for the moment.
2847    
2848     * Extensions/wms/parser.py: Use a variable for denoting the sample
2849     filename
2850     (WMSCapabilitiesParser.peekLayers): Added support for error
2851     messages during grok(). They will be aggregated in an array and
2852     may be displayed later. We may have to add a classification
2853     "Warning" and "Error" to this. That requires more experience,
2854     though, since not every error may be lethal.
2855    
2856     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
2857     ShowTable() dialog/frame when the user attempts to display it
2858     while it has been opened before already and not closed again.
2859    
2860 joey 2161 2004-04-11 Martin Schulze <[email protected]>
2861    
2862     * Extensions/wms/infodialog.py: Adjusted the class documentation
2863    
2864     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
2865     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
2866     wxWidgets variants.
2867     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
2868    
2869     * Extensions/wms/infodialog.py: Added an information dialog that
2870     will display various information about the WMS current resource,
2871     so that additional information such as the title, the abstract,
2872     fees and access constraints can be displayed for the user if they
2873     are documented in the WMS XML.
2874    
2875 joey 2156 2004-04-10 Martin Schulze <[email protected]>
2876    
2877     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
2878     string handling. It's "foo".lower() and not lower(foo) without
2879     lower imported from strings or something.
2880    
2881     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
2882     from capabilities.py and parser.py. Implement priority list for
2883     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
2884     and GIF are supported here, but not yet by main Thuban. Hence,
2885     support for them may be removed later. Special contribution to
2886     usability: get wxWidgets to change the cursor when we're waiting
2887     for data from the network so the user won't start to worry. This
2888     causes a redrawing error/warning, though.
2889    
2890     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
2891     the DOM object.
2892    
2893     2004-04-01 Martin Schulze <[email protected]>
2894    
2895     * Extensions/wms/capabilities.py: Adjusted documentation
2896     (WMSCapabilities.__init__): Improved documentation, fixed syntax
2897     (WMSCapabilities.saveCapabilities): Only catch IOError when
2898     handling files
2899     (WMSCapabilities.loadCapabilities): Only catch IOError when
2900     handling files
2901     __main__: corrected variable naming
2902     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
2903     class a specialisation of WMSCapabilitiesParser as well. Also
2904     execute grok() after loading or fetching capabilities, if that
2905     went well, so that subsequent calls can already access the data.
2906     (WMSCapabilities.getVersion): Export the used version of the
2907     GetCapabilities request, so we can use it for subsequent calls,
2908     i.e. for GetMap requests.
2909     (WMSCapabilities.fetchCapabilities): Added proper error handling
2910     when the GetCapabilities request failed, so that the surrounding
2911     program can act accordingly.
2912    
2913 joey 2146 2004-03-30 Martin Schulze <[email protected]>
2914    
2915     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
2916     Adjusted the getLayerSRS method to return the list of SRSes
2917     extracted from <SRS> elements instead of <BoundingBox> elements.
2918     Added a bit of documentation as well.
2919     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
2920     since it was only implemented due to a misunderstanding.
2921    
2922     * Extensions/wms/test/test_parser.py
2923     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
2924     reflect the corrected interpretation of the standard: i.e. a layer
2925     does not have to define a BoundingBox for all SRSes it supports.
2926     Hence the <SRS></SRS> specification is authoritative, not the list
2927     of BoundingBoxes.
2928     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
2929     to ensure None is returned for a non-existing SRS.
2930     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
2931     since it is not applicable anymore. Listing more SRSes in <SRS>
2932     elements is valid according to the specs.
2933    
2934 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
2935 joey 2146
2936 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
2937     Reflected wxWidgets name change.
2938    
2939     * Thuban/UI/about.py: Extended copyright to 2004 and added
2940     information about the thuban-devel mailinglist.
2941    
2942 joey 2138 2004-03-24 Martin Schulze <[email protected]>
2943 joey 2120
2944 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
2945     'WMS', also added a linebreak where required
2946    
2947     * Extensions/wms/parser.py: Finally added the XML parser for the
2948     GetCapabilities response.
2949    
2950     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
2951     <SRS> elements match the <BoundingBox> elements, except for the
2952     layer 'beschriftung'.
2953    
2954     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
2955     since Python uses unicode strings internally, otherwise
2956     comparisons will fail. Removed tests for getLayerBBoxSRS() since
2957     the SRS will be calculated anyway and this method is obsoleted by
2958     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
2959     Move loading the sample file into the setUp method. Added a test
2960     for finding the integrity problem in the sample response.
2961     Improved formatting.
2962    
2963     * Extensions/wms/domutils.py: Added convenience routines for
2964     handling of Document Object Model (DOM) nodes.
2965    
2966     * Extensions/wms/test/test_domutils.py: Added a test for the
2967     domutils module
2968    
2969     2004-03-19 Martin Schulze <[email protected]>
2970    
2971 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
2972     Moved path detection and adding into a module of its own,
2973     adjustpath, which exports thubandir as main Thuban directory.
2974    
2975     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
2976     detection and adding into a module of its own, adjustpath, which
2977     exports thubandir as main Thuban directory. Reorganised the
2978     module in order to support the SkipTest feature for Thuban test
2979     cases.
2980    
2981     * Extensions/wms/test/adjustpath.py: Moved path detection and
2982     adding into a module of its own.
2983    
2984 joey 2115 2004-03-18 Martin Schulze <[email protected]>
2985    
2986     * Extensions/wms/test/test_parser.py: Added another test for
2987     checking whether the WMS XML parser (to be implemented) returns
2988     the information we expect. This requires a sample WMS WML file
2989     (sample.xml) which has been extracted from the frida server and
2990     "improved" manually.
2991    
2992     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
2993     main Thuban directory to the path in order to be able to import
2994     random modules. Adjusted the PyOGCLib detection to reuse the
2995     information gathered. Also added a note about the PYTHONPATH
2996     environment variable.
2997    
2998     * Extensions/wms/test/test_ogclib.py: The format specification is
2999     a mime-type, not a graphic format, hence image/jpeg wou ld be the
3000     proper format and not JPEG. We'll also have to take care of the
3001     encoding of / as %2F.
3002    
3003 joey 2111 2004-03-16 Martin Schulze <[email protected]>
3004    
3005     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
3006     comprehensive test for the getMapURL method, built compare URLs
3007     according to the documentation in OGC 01-068r3
3008    
3009     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
3010     class WMSCapabilities to manage capabilites, will incorporate
3011     parsing the capabilities response and provide details for other
3012     classes.
3013    
3014 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
3015    
3016 bh 2107 Support views in addition to normal tables in the postgis
3017     shapestore
3018    
3019     * Thuban/Model/postgisdb.py
3020     (PostGISShapeStore._fetch_table_information): Add a fallback for
3021     the case where the table name is not in the geometry_columns
3022     table. This is usually the case for views. Also, set
3023     self.shapestore here.
3024     (PostGISShapeStore.ShapeType): No need to query the database all
3025     the time. The shape type is now determined in
3026     _fetch_table_information
3027    
3028     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
3029     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
3030     New parameter to specify views.
3031     (PostGISDatabase.has_data): Also compare the views. New views
3032     parameter
3033     (PostGISDatabase.initdb): Create the views.
3034     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
3035     view
3036    
3037     * test/test_postgis_db.py
3038     (TestPostGISShapestorePointFromViews): New. Test a
3039     PostGISShapeStore with a view
3040     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
3041     the geometry_column explicitly to test whether that works
3042    
3043     2004-03-12 Bernhard Herzog <[email protected]>
3044    
3045 bh 2105 Final step for explicit id/geometry columns: Loading and saving
3046    
3047     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
3048     with the following changes:
3049     (dbshapesource): Two new attributes id_column and geometry_column
3050    
3051     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
3052     (SessionSaver.write_session): Use the new namespace
3053     (SessionSaver.write_data_containers): Write the new dbshapesource
3054     parameters
3055    
3056     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
3057     the new file format version
3058     (SessionLoader.start_dbshapesource): Handle the new db parameters
3059    
3060     * test/test_save.py: Update to the new dtd and namespace
3061     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
3062     mock object to provide a working IDColumn method.
3063    
3064     * test/test_load_1_0.py: New. Copy of the test_load.py before
3065     today's changes but with the round-trip tests removed.
3066    
3067     * test/test_load_0_9.py: Update doc-string.
3068    
3069     * test/test_load.py: Update all .thuban files to the new dtd and
3070     namespace.
3071     (TestPostGISLayer.file_contents): Add the new dbshapesource
3072     paramters
3073    
3074 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
3075    
3076 bh 2103 Next step for explicit id/geometry columns: User interaction
3077    
3078     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
3079     the dialog is constructed. Add combo boxes to select id and
3080     geometry column. Rename some instance variables.
3081     (ChooseDBTableDialog.GetTable): Return id and geometry column
3082     names
3083     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
3084     selections in the table list
3085    
3086     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
3087     and geometry_column
3088    
3089     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
3090     parameters for id_column and geometry column of PostGISShapeStore
3091     here as well.
3092    
3093     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
3094     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
3095     (PostGISConnection.GeometryTables): Use a better query to
3096     determine which relations in the database might be usable for
3097     shapestores. Now supports views as well but is more PostgreSQL
3098     specific
3099     (PostGISConnection.table_columns): New. Somewhat experimental
3100     method to let the db dialogs provide lists of columns to users so
3101     that they can select id and geometry columns.
3102     (PostGISTable.__init__): The default value of the id_column
3103     parameter is now None it still means "gid" effectively, though.
3104     (PostGISTable.IDColumn): New introspection method to return a
3105     column object for the id column
3106     (PostGISShapeStore.GeometryColumn): New introspection method to
3107     return a column object for the geometry column
3108    
3109     * test/test_postgis_db.py
3110     (TestPostGISConnection.test_gis_tables_non_empty):
3111     Removed. Subsumed by the new:
3112     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
3113     New. Tes the GeometryTables and table_columns methods with actual
3114     tables and views.
3115     (PointTests.test_id_column, PointTests.test_geometry_column):
3116     New. tests for the new methods.
3117     (TestPostGISShapestorePoint.setUp)
3118     (TestPostGISShapestorePointSRID.setUp)
3119     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
3120     instance variables needed by the new tests
3121    
3122     2004-03-11 Bernhard Herzog <[email protected]>
3123    
3124 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
3125     numbers given to ReadValue are ordinals.
3126    
3127     2004-03-11 Bernhard Herzog <[email protected]>
3128    
3129     Elimiate the requirement for PostGIS tables to have a column
3130     called "gid".
3131    
3132     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
3133     id_column to specify which column to use to identify rows. Also
3134     new instance variables id_column and quoted_id_column
3135     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
3136     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
3137     (PostGISTable.SimpleQuery): Use the id column name provided to the
3138     constructor instead of "gid"
3139     (PostGISShapeStore.__init__): New parameter id_column analogously
3140     to PostGISTable.__init__. This parameter is simply passed through
3141     to the base class constructor
3142     (PostGISShapeStore._create_col_from_description): Fix typo in
3143     doc-string
3144     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
3145     (PostGISShapeStore.ShapesInRegion): Use the id column name
3146     provided to the constructor instead of "gid"
3147    
3148     * test/postgissupport.py
3149     (PostgreSQLServer.get_default_static_data_db): New static table
3150     landmarks_point_id with an id column != "gid. Update the comments
3151     a bit.
3152     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
3153     doc-
3154     (upload_shapefile): New parameter gid_column to use a name other
3155     than "gid" for the column to store the shape ids
3156    
3157     * test/test_postgis_db.py (TableTests): New. Mixin-class
3158     containing all tests previously in TestPostGISTable. The actual
3159     tests are the same but the code is a bit more configurable to
3160     allow for different id columns etc.
3161     (TestPostGISTable): Derive from TableTests now for the actual
3162     tests.
3163     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
3164     except that it the landmarks_point_id table to test the id_column
3165     parameter
3166     (PointTests): Extend the doc-string
3167     (TestPostGISShapestorePointExplicitGIDColumn)
3168     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
3169     from PointTests to test the explicit id_column parameter. One
3170     tests with the name of the column holding the shape ids, the other
3171     uses PostgreSQL's OID column. For the latter a number of methods
3172     have to be overwritten to make them independent of the actual id
3173     values.
3174    
3175 silke 2095 2004-03-08 Silke Reimer <[email protected]>
3176    
3177     Update debian directory:
3178    
3179     * debian/changelog: Added new version.
3180     * deiban/rules: Updated management of patches (with cbds)
3181     * debian/control: Added cbds to dependencies
3182     * debian/patches/*: New. Adds better support for patches of thuban in
3183     debian
3184     * debian/menu: Syntax of menu changed slightly
3185     * debian/setup.py.patch: removed because it has been moved to
3186     debian/patechs/setup.py.patch
3187    
3188    
3189 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
3190    
3191     Create the Doc/technotes directory for text files with information
3192     for developers
3193    
3194     * Doc/technotes/README: New. README for the technotes
3195    
3196     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
3197     Thuban
3198    
3199     * Doc/technotes/release_process.txt: New. Used to be
3200     HOWTO-Release. Now slightly adapted to technote formatting style.
3201    
3202     * HOWTO-Release: Removed. It's contents are now in
3203     Doc/technotes/release_process.txt
3204    
3205 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
3206    
3207     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
3208     version of wxWindows the module was compiled with so we can check
3209     that against the wxPython version.
3210    
3211     * Thuban/version.py (thuban_branch, thuban_release): New variables
3212     controlling which and how Thuban versions are shown. See the
3213     comments for details.
3214     (verify_versions): Also check that the wx version that wxproj is
3215     compiled against matches that of the wxPython we use at runtime
3216    
3217 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
3218    
3219 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
3220     get_system_proj_file to read the epsg projections. The old way
3221     depended on the current directory being the top Thuban directory.
3222    
3223     2004-02-20 Bernhard Herzog <[email protected]>
3224    
3225 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
3226     (TestVirtualDC.test_clippath): Remove a debug print
3227    
3228     2004-02-20 Bernhard Herzog <[email protected]>
3229    
3230 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
3231     Extensions/svgexport into a package.
3232    
3233     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
3234     doc-string a bit. The doc-string must come first, otherwise it's
3235     not a doc-string. The __future__ import must be the first thing
3236     after the doc-string. Use only double quotes in doc-strings.
3237     Single quotes trip up emacs syntax highlighting if the text
3238     contains apostrophes.
3239    
3240     2004-02-20 Bernhard Herzog <[email protected]>
3241    
3242 bh 2080 * Extensions/svgexport/test/__init__.py,
3243     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
3244     suite for svgexport
3245    
3246     * test/runtests.py (find_test_modules): New. Function with the
3247     module finding code from main.
3248     (main): Use find_test_modules to figure out the default test
3249     modules and take modules from Extensions.svgexport.test too.
3250    
3251 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
3252    
3253 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
3254     the mainwindow has a reference to the map of the initial session.
3255     This fixes a bug introduced with the fix for RT#2245
3256    
3257     2004-02-19 Bernhard Herzog <[email protected]>
3258    
3259 bh 2075 * Extensions/svgexport/svgsaver.py,
3260     Extensions/svgexport/svgmapwriter.py,
3261     Extensions/svgexport/maplegend.py: Added again. This time in the
3262     correct place.
3263    
3264 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
3265    
3266 bh 2073 Fix for RT#2245
3267    
3268     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
3269     instance variables before trying to create any windows. Creating
3270     windows can start an event loop if e.g. message boxes are popped
3271     up for some reason, and event handlers, especially EVT_UPDATE_UI
3272     may want to access things from the application.
3273     (ThubanApplication.maps_changed): The mainwindow may not have been
3274     created yet, so check whether it has been created before calling
3275     its methods
3276    
3277     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
3278     have a map
3279    
3280     2004-02-17 Bernhard Herzog <[email protected]>
3281    
3282 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
3283     Extensions/svgmapwriter.py, Extensions/maplegend.py,
3284     extensions/svgexport/svgsaver.py,
3285     extensions/svgexport/svgmapwriter.py,
3286     extensions/svgexport/maplegend.py: Removed. These files were in
3287     the wrong places or didn't work at all.
3288    
3289 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
3290    
3291 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
3292     line
3293    
3294     2004-02-16 Bernhard Herzog <[email protected]>
3295    
3296 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
3297    
3298 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
3299    
3300     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
3301     to write a session to a file in SVG format.
3302     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
3303     to write a SVG map of a session.
3304     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
3305     in SVG format for the current session.
3306    
3307 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
3308    
3309     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
3310     can't be created, return immediately after displaying the error
3311     message.
3312    
3313 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
3314    
3315     Handle postgis tables with more than one geometry column.
3316    
3317     * Thuban/Model/postgisdb.py
3318     (PostGISTable._fetch_table_information): Delegate the creation of
3319     column objects to a different method so that we can extend that in
3320     derived classes
3321     (PostGISTable._create_col_from_description): New. Column object
3322     creation part of _fetch_table_information
3323     (PostGISShapeStore._create_col_from_description): New. Extend
3324     inherited method to handle geometry columns
3325     (PostGISShapeStore.__init__): New parameter geometry_column to
3326     specify which geometry column to use. Optional but mandatory for
3327     tables with more than one geometry column
3328     (PostGISShapeStore._fetch_table_information): Also use the name of
3329     the geometry column when looking for the srid
3330     (PostGISShapeStore.ShapeType): Also use the name of the geometry
3331     column when looking for the shape type
3332    
3333     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
3334     NonConnectionStore to changes in the PostGISShapeStore
3335    
3336     * test/test_postgis_db.py
3337     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
3338     PostGISShapeStore with tables having two geometry columns.
3339    
3340 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
3341    
3342     Fix some postgis problems. What remains to be done is real
3343     handling of SRIDs as they affect how reprojection is done
3344    
3345     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
3346     doc-string
3347     (PostGISShapeStore._fetch_table_information): New. Extend
3348     inherited method to retrieve srid
3349     (PostGISShapeStore.BoundingBox): Handle tables without data.
3350     extent yields NULL for those
3351     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
3352    
3353     * test/test_postgis_db.py
3354     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
3355     for the special case of a table without any data
3356     (TestPostGISShapestorePointSRID): New class with tests for a table
3357     that uses srids
3358     (PolygonTests): Fix a doc-string typo
3359    
3360     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
3361     reference_systems with a specification of spacial reference
3362     systems to create in the new db.
3363     (PostgreSQLServer.new_postgis_db)
3364     (PostgreSQLServer.get_static_data_db): New parameter
3365     reference_systems to be passed through ultimately to
3366     PostGISDatabase. In new_postgis_db also check whether an existing
3367     db already has the right srids
3368     (PostgreSQLServer.get_default_static_data_db): Add srids and a
3369     table that uses srids
3370     (PostGISDatabase.initdb): Create the entries for the reference
3371     systems
3372     (PostGISDatabase.has_data): Add reference_systems parameter to
3373     check for those too
3374     (upload_shapefile): New parameter srid to create tables with a
3375     specific srid
3376    
3377 frank 2055 2004-02-06 Frank Koormann <[email protected]>
3378    
3379     * po/pt_BR.po: Fixed charset
3380    
3381 frank 2054 2004-02-05 Frank Koormann <[email protected]>
3382    
3383     * po/pt_BR.po: Fixed format string for error message, missing %s
3384     added (Thuban/UI/application.py:273)
3385    
3386 frank 2053 2004-02-03 Frank Koormann <[email protected]>
3387    
3388     First version of Portuguese (Brazilian) translation
3389    
3390     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
3391     Brazilian Portuguese by Eduardo Patto Kanegae.
3392    
3393     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
3394     translators.
3395    
3396    
3397 frank 2052 2004-01-22 Frank Koormann <[email protected]>
3398    
3399     * Doc/manual/thuban-manual.xml: Added section on installation of
3400     Thuban under Win32 systems. Fixed image path references in the postgis
3401     section. Some minor source formattings.
3402    
3403 frank 2051 2004-01-21 Frank Koormann <[email protected]>
3404    
3405     Make Thuban remember path selections (at least for one application run).
3406    
3407     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
3408     attribute of application object. Path is a dictionary of
3409     strings, currently with the items "data" and "projection".
3410     (Application.SetPath): New, stores path for the specified item.
3411     (Application.Path): New, return path for the specified item.
3412    
3413     * Thuban/UI/mainwindow.py
3414     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
3415     MainWindow.AddLayer, MainWindow.AddRasterLayer,
3416     MainWindow.TableOpen): Access "data" path information of the
3417     application.
3418    
3419     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
3420     Access "projection" path information of the application.
3421    
3422 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
3423    
3424 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
3425    
3426     2004-01-05 Bernhard Herzog <[email protected]>
3427    
3428 bh 2048 * po/Makefile, po/README: Move the description of how to generate
3429     the translation statistics to the README.
3430    
3431 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
3432    
3433 bh 2045 * NEWS: Update for 1.0.0
3434    
3435     * po/it.po: Another update from Maurizio Napolitano
3436    
3437     2003-12-23 Bernhard Herzog <[email protected]>
3438    
3439 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
3440    
3441     2003-12-23 Bernhard Herzog <[email protected]>
3442    
3443     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
3444     for translation
3445    
3446     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
3447     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
3448     strings for translation
3449    
3450     * po/de.po: Update with the newly marked strings.
3451    
3452 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
3453    
3454 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
3455     updated
3456    
3457     2003-12-22 Bernhard Herzog <[email protected]>
3458    
3459 bh 2037 * setup.py (setup call): 1.0.0, yeah!
3460    
3461     * Thuban/version.py (longversion): 1.0.0, yeah!
3462    
3463     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3464     1.0.0 namespace too
3465    
3466     * Thuban/Model/save.py (SessionSaver.write_session): Save with
3467     1.0.0 namespace
3468    
3469     * test/test_load.py (LoadSessionTest.dtd)
3470     (TestSingleLayer.file_contents)
3471     (TestNonAsciiColumnName.file_contents)
3472     (TestLayerVisibility.file_contents)
3473     (TestClassification.file_contents, TestLabels.file_contents)
3474     (TestLayerProjection.file_contents)
3475     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3476     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
3477     (TestPostGISLayerPassword.file_contents)
3478     (TestLoadError.file_contents, TestLoadError.test): Update for
3479     1.0.0 namespace
3480    
3481     * test/test_save.py (SaveSessionTest.dtd)
3482     (SaveSessionTest.testEmptySession)
3483     (SaveSessionTest.testSingleLayer)
3484     (SaveSessionTest.testLayerProjection)
3485     (SaveSessionTest.testRasterLayer)
3486     (SaveSessionTest.testClassifiedLayer)
3487     (SaveSessionTest.test_dbf_table)
3488     (SaveSessionTest.test_joined_table)
3489     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
3490    
3491     2003-12-22 Bernhard Herzog <[email protected]>
3492    
3493 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
3494     alignment flags are byte strings not unicode and that they have
3495     valid values
3496    
3497     * test/test_load.py (TestLabelLayer): New. Test loading (and
3498     indirectly saving) of maps with labels.
3499    
3500     2003-12-22 Bernhard Herzog <[email protected]>
3501    
3502 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
3503     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
3504     unsubscribe all subscribers.
3505     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
3506     self.grid since it may already have been destroyed.
3507     Fixes RT #2256
3508    
3509 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
3510    
3511     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3512    
3513 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
3514 silke 2029
3515     * debian/bitmappath.patch, debian/setup.py.patch:
3516     added to ensure compliance with FHS for debian
3517     * debian/rules, debian/changelog:
3518     added patches in rules to ensure compliance with FHS for debian
3519 bh 2028
3520 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
3521    
3522 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
3523     statistics about the translations. Add a comment how produce even
3524     nicer statistics with sed.
3525    
3526 frank 2026 2003-12-09 Frank Koormann <[email protected]>
3527    
3528     * Resources/Projections/defaults.proj:
3529     French projection sample with correct accents (UNICODE).
3530    
3531 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
3532    
3533     * MANIFEST.in: Add the devtools directory
3534    
3535     * setup.py (setup call): Use license instead of licence. This
3536     silences a deprecation warning on Python 2.3
3537    
3538 frank 2022 2003-12-05 Frank Koormann <[email protected]>
3539    
3540 frank 2023 Documentation synced with 1.0rc1
3541    
3542     * Doc/manual/thuban-manual.xml:
3543     Minor formatting changes and references to database layers .
3544     Introduction.Internationalization: New section on i18n.
3545     MapManagement.AddingandRemovingLayers: Added item on database layers.
3546     MapManagement.TheLegend: Added section and screenshot on popup menu.
3547     ProjectionManagement: Updated screenshot and sentence on EPSG.
3548     Appendix.SupportedDataSources: Added PostGIS.
3549     Appendix.WorkingwithPostGIS: New section.
3550    
3551     * Doc/manual/images/6_projection.png: Updated screenshot including
3552     EPSG checkboxes.
3553    
3554     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
3555    
3556     * Doc/manual/images/app_postgis_add_layer.png,
3557     Doc/manual/images/app_postgis_db_add.png,
3558     Doc/manual/images/app_postgis_db_management.png:
3559     New screenshots focussing on database layers
3560    
3561     2003-12-05 Frank Koormann <[email protected]>
3562    
3563 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
3564     write warning to stderr instead of rising a warning dialog
3565    
3566 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
3567    
3568 bh 2021 Fix for RT #2243
3569    
3570 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
3571     New. Like has_selected_layer but for shape layers only
3572     (_has_selected_shape_layer): New. Like _has_selected_layer but for
3573     shape layers only
3574     (layer_show_table command, layer_jointable command): Use these
3575     commands should only be available for shape layers
3576    
3577     2003-12-03 Bernhard Herzog <[email protected]>
3578    
3579 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
3580     publishers that are wx objects and may have been destroyed by wx
3581     already. Fixes RT #2242.
3582    
3583     2003-12-03 Bernhard Herzog <[email protected]>
3584    
3585 bh 2016 * po/ru.po: Updates from Alex Shevlakov
3586    
3587 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
3588    
3589     * debian/control, debian/changelog: Added gdal-support to
3590     debian package, updated to new thuban version
3591    
3592    
3593 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
3594    
3595     * Thuban/Lib/version.py: New. Module for version number
3596     manipulations. The version of make_tuple here also deals better
3597     with more unusual version number strings, such as e.g.
3598     "1.2+cvs20031111"
3599    
3600     * Thuban/version.py (make_tuple): Removed. It's now in
3601     Thuban.Lib.version. Use that implementation instead.
3602    
3603     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
3604    
3605 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
3606    
3607 bh 2010 * MANIFEST.in: Add debian files
3608    
3609 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
3610     they're installed too
3611     (data_files): Add READMEs and sample data from some Extensions
3612    
3613     * NEWS: Add note about the extensions in binary packages
3614    
3615     2003-12-02 Bernhard Herzog <[email protected]>
3616    
3617 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
3618     with the thuban-1.0rc1
3619    
3620     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
3621     thuban-1.0rc1 namespace too
3622    
3623     * test/test_save.py (SaveSessionTest.dtd)
3624     (SaveSessionTest.testEmptySession)
3625     (SaveSessionTest.testSingleLayer)
3626     (SaveSessionTest.testLayerProjection)
3627     (SaveSessionTest.testRasterLayer)
3628     (SaveSessionTest.testClassifiedLayer)
3629     (SaveSessionTest.test_dbf_table)
3630     (SaveSessionTest.test_joined_table)
3631     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
3632     namespace
3633    
3634     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
3635     namespace
3636     (TestSingleLayer.file_contents)
3637     (TestNonAsciiColumnName.file_contents)
3638     (TestLayerVisibility.file_contents)
3639     (TestClassification.file_contents, TestLabels.file_contents)
3640     (TestLayerProjection.file_contents)
3641     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3642     (TestPostGISLayer.file_contents)
3643     (TestPostGISLayerPassword.file_contents)
3644     (TestLoadError.file_contents, TestLoadError.test): Update to
3645     thuban-1.0rc1 namespace
3646    
3647 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
3648    
3649 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
3650     nt to better match Intevation's current w32 setup
3651    
3652 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
3653    
3654     * MANIFEST.in: Add the Extensions
3655    
3656 bh 1998 * NEWS: Update for 1.0rc1
3657    
3658     2003-12-01 Bernhard Herzog <[email protected]>
3659    
3660 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
3661     cards for the dialog so that shapefiles ending in all uppercase
3662     SHP are listed too
3663    
3664 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
3665    
3666 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
3667    
3668     * setup.py (setup call): Update version to 1.0rc1. Use the
3669     [email protected] email address as author email instead of my
3670     personal one.
3671    
3672     2003-11-28 Bernhard Herzog <[email protected]>
3673    
3674 bh 1992 * po/de.po: Update german translation.
3675    
3676     2003-11-28 Bernhard Herzog <[email protected]>
3677    
3678 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
3679     files are more platform independend
3680    
3681     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
3682     that they can be used on both windows and unix
3683     (SessionSaver.prepare_filename): New. Handle all filename
3684     transformations for filenames stored in the thuban file
3685     (SessionSaver.write_data_containers, SessionSaver.write_layer):
3686     Use prepare_filename
3687    
3688     * test/test_save.py (SaveSessionTest.testSingleLayer)
3689     (SaveSessionTest.testLayerProjection)
3690     (SaveSessionTest.testRasterLayer)
3691     (SaveSessionTest.testClassifiedLayer)
3692     (SaveSessionTest.test_dbf_table)
3693     (SaveSessionTest.test_joined_table): Filenames are always stored
3694     with slashes on all currently supported platforms so adapt all
3695     tests to this
3696    
3697     * test/test_load.py (LoadSessionTest.filenames): With the new
3698     filename scheme the filenames in the tests should be
3699     understandable on all currently supported platforms so we turn
3700     this into an empty list because we don't have to normalize them
3701     anymore
3702    
3703     2003-11-28 Bernhard Herzog <[email protected]>
3704    
3705 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
3706     Add the ellipsoid to the projection since some Proj versions
3707     complain if it's missing.
3708    
3709 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
3710    
3711     Corect some bounding box projection problems
3712    
3713     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
3714     version of ForwardBBox
3715     (Projection._transform_bbox): New. common implementation of
3716     ForwardBBox and InverseBBox
3717     (Projection.ForwardBBox): Use _transform_bbox.
3718    
3719     * test/test_proj.py (TestProjection.test): Add test for
3720     InverseBBox
3721    
3722     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
3723     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
3724     new InverseBBox method to determine the unprojected bounding box
3725     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
3726     bbox.
3727    
3728     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3729     Removed.
3730     (TestLayer.test_arc_layer_with_projection): New. This test is
3731     better able to test whether bounding boxes are projected correctly
3732     than test_point_layer_with_projection
3733    
3734 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
3735     InverseBBox to unproject bboxes
3736    
3737 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
3738    
3739 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
3740     source code.
3741    
3742     2003-11-25 Bernhard Herzog <[email protected]>
3743    
3744 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
3745     there for backwards compatibility and all code relying on that
3746     should have been updated by now.
3747    
3748     2003-11-25 Bernhard Herzog <[email protected]>
3749    
3750 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
3751     round trip test.
3752     (TestClassification.file_contents): Update to the newest file
3753     format
3754    
3755     2003-11-25 Bernhard Herzog <[email protected]>
3756    
3757 bh 1975 Add very experimental (and possibly dangerous) extension to draw
3758     polygons:
3759    
3760     * Extensions/drawshape/README: New. Brief installation
3761     instructions
3762    
3763     * Extensions/drawshape/drawshape.py: New. Implementation of the
3764     drawshape extensions
3765    
3766     * Extensions/drawshape/patch.diff: Patch to apply before the
3767     extension can be used.
3768    
3769 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
3770    
3771 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
3772     (ShapefileStore.__init__): Factor opening the shapefile into a
3773     separate method (the new _open_shapefile). This makes the code a
3774     bit more readable but the real reason is that it makes some evil
3775     hacks easier. :-)
3776    
3777     2003-11-24 Bernhard Herzog <[email protected]>
3778    
3779 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
3780     converter is specified for an attribute assume it's a string
3781     containing only Latin1 characters. Update doc-string accordingly.
3782     This change should fix many places where unicode objects might
3783     accidentally enter Thuban.
3784    
3785     * test/test_load.py (TestNonAsciiColumnName): New test to check
3786     what happens with column names in DBF files that contain non-ascii
3787     characters
3788    
3789 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
3790    
3791     Enable the experimental attribute editing again and introduce a
3792     command line switch to actually activate it
3793    
3794     * Thuban/UI/main.py (options): New. Container for options set on
3795     the commmand line
3796     (main): Add the --enable-attribute-editing flag.
3797    
3798     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
3799     editing is enabled use the grid ctrl which allows editing of the
3800     values
3801    
3802     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
3803     New. Just delegate this to the underlying table.
3804    
3805 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
3806    
3807     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
3808     Skip this test if run under non-posix systems since it only works
3809     there
3810    
3811 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
3812    
3813 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
3814     determined so that we can give a reason in the about why gdal is
3815     not supported.
3816     (gdal_support_status): New. Variable holding a string with the
3817     reason for no gdal support
3818    
3819     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
3820     not supported to the message
3821    
3822     2003-11-19 Bernhard Herzog <[email protected]>
3823    
3824 bh 1963 Remove the old table interface and its test cases
3825    
3826     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
3827     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
3828     anymore
3829    
3830     * Thuban/Model/transientdb.py (TransientTableBase)
3831     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
3832     anymore
3833    
3834     * test/test_table.py: Removed since the old interface it tests is
3835     gone.
3836    
3837     * test/runtests.py (main): The old table interface is gone and
3838     with it the deprecation warnings so remove the code that turns
3839     these warnings into errors
3840    
3841     2003-11-19 Bernhard Herzog <[email protected]>
3842    
3843 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
3844     tests to use the new table interface is completely wrong since the
3845     whole purpose of the tests in this module is to test the old
3846     interface.
3847    
3848 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
3849    
3850 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
3851     New. Test whether the connection matches a set of connection
3852     parameters
3853    
3854     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
3855     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
3856     for existing connections with the same parameters and break out of
3857     the loop correctly.
3858    
3859     * test/test_postgis_db.py (TestBriefDescription)
3860     (TestPostGISSimple.test_brief_description): Rename
3861     TestBriefDescription to TestPostGISSimple and the test method to
3862     test_brief_description so that we can add more test methods.
3863     (TestPostGISSimple.test_matches_parameters): New. Test the new
3864     MatchesParameters method
3865    
3866     2003-11-18 Bernhard Herzog <[email protected]>
3867    
3868 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
3869 bh 1954 _was_destroyed, to indicate whether an publisher instance has
3870     already been destroyed.
3871     (Publisher.Unsubscribe): Only disconnect if the publisher has not
3872     been destroyed yet.
3873     (Publisher.Destroy): Set the _was_destroyed flag to true.
3874    
3875     * test/test_connector.py
3876     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
3877     calling Unsubscribe after Destroy doesn't raise an exception
3878    
3879 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
3880    
3881     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
3882     typo in doc-string
3883    
3884 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
3885    
3886     Quote table and column names properly for postgis.
3887    
3888     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
3889     quote an identifier for use in an sql statement
3890     (PostGISColumn.__init__): Add the quoted_name attribute
3891     (PostGISTable.__init__): New instance variable quoted_tablename
3892     (PostGISTable._fetch_table_information): Use the quoted table
3893     name. New isntance variable quoted_geo_col with a quoted version
3894     of geometry_column
3895     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
3896     (PostGISTable.RowOrdinalToId): Use the quoted table name
3897     (PostGISTable.ReadValue, PostGISTable.ValueRange)
3898     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
3899     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
3900     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
3901     Use quoted table and column names
3902    
3903     * test/test_postgis_db.py (TestPostGISSpecialCases)
3904     (TestPostGISIgnoredColumns): Rename the class to
3905     TestPostGISSpecialCases because that better describes the new
3906     cases
3907     (TestPostGISSpecialCases.test_unsupported_types)
3908     (TestPostGISSpecialCases.test): Rename the method to
3909     test_unsupported_types because we need a more descriptive name now
3910     that there are more methods
3911     (TestPostGISSpecialCases.test_table_name_quoting)
3912     (TestPostGISSpecialCases.test_column_name_quoting)
3913     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
3914     cases to test quoting of table and column names in PostGISTable
3915     and PostGISShapeStore
3916    
3917     * test/postgissupport.py
3918     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
3919     AddGeometryColumn desn't support table or column names with sapces
3920     or double quotes
3921    
3922 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
3923    
3924     * Extensions/wms/__init__.py: New: Init to make this
3925     directory a package.
3926    
3927     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
3928    
3929 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
3930    
3931 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
3932     Constant for the file woth deprecated epsg projections
3933     (get_system_proj_file): Update doc-string
3934    
3935     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
3936     above the EPS widgets, introduce a check box for the deprecated
3937     eps projections and a label for the epsg widgets
3938     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
3939     too
3940    
3941     2003-11-11 Bernhard Herzog <[email protected]>
3942    
3943 bh 1939 Avoid warnings when run under Python 2.3
3944    
3945     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
3946     (BaseRenderer.draw_label_layer): Coordinates must be ints.
3947    
3948     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
3949     real method so that we can convert to int.
3950     (MapRenderer.label_font): The font size mist be an int.
3951    
3952     * Thuban/UI/common.py (Color2wxColour): The color values must be
3953     ints. Also, remove the unnecessary asserts.
3954    
3955     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
3956     (TestUnicodeStrings.test): Python source code should not contain
3957     non-ascii characters unless an encoding is specified in the file.
3958     Therefore use \x escapes in the string literals for non-ascii
3959     characters.
3960    
3961     2003-11-11 Bernhard Herzog <[email protected]>
3962    
3963 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
3964     parameter so that this function can be used for all proj files in
3965     Resource/Projections
3966     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
3967     get_system_proj_file
3968    
3969     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
3970     ProjFile self.__sysProjFile use a dictionary of system ProjFile
3971     objects self._sys_proj_files
3972     (ProjFrame.build_dialog): Adapt to the new changes in the
3973     ProjectionList constructor. Add a check button to toggle whether
3974     EPSG projections are shown
3975     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
3976     events.
3977     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
3978     the busy cursor if the files have not yet been loaded by the
3979     dialog.
3980     (ProjFrame.load_system_proj): Add a parameter for the name of the
3981     proj file. Maintain the dictionary of system projections
3982     self._sys_proj_files
3983    
3984     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
3985     user_projs parameters into one parameter proj_files which is a
3986     list of proj files.
3987     (ProjectionList._subscribe_proj_files)
3988     (ProjectionList._unsubscribe_proj_files): New. Move
3989     subscription/unsubscription of projfile messages to separate
3990     methods
3991     (ProjectionList.Destroy): The unsubscribe is now done in
3992     _unsubscribe_proj_files
3993     (ProjectionList.update_projections): We now have a list of proj
3994     file objects
3995     (ProjectionList.SetProjFiles): New method to set a new list of
3996     proj file objects
3997    
3998     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
3999     Specify explicitly which system proj file to load.
4000    
4001     2003-11-11 Bernhard Herzog <[email protected]>
4002    
4003 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
4004     instance variables to cut cyclic references. The GC would have
4005     collected the loader eventually but it can happen that it doesn't
4006     run at all until thuban is closed (2.3 but not 2.2 tries a bit
4007     harder and forces a collection when the interpreter terminates)
4008     (load_session): Call the handler's Destroy method to make sure
4009     that it gets garbage collected early. Otherwise it will be
4010     collected very late if at all and it holds some references to e.g.
4011     shapestores and the session which can lead to leaks (of e.g. the
4012     temporary files)
4013    
4014     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
4015     resource leak in load_session
4016    
4017 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
4018    
4019     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
4020     extensions are to be rendered.
4021     (_renderer_extensions): New. List with renderer for layers in
4022     extensions
4023     (add_renderer_extension): New. Add a renderer extension
4024     (init_renderer_extensions): New. Init the renderer extensions
4025     (BaseRenderer.render_map_incrementally): Search
4026     _renderer_extensions for how to draw unknown layer types
4027     (BaseRenderer.draw_raster_data): Add format parameter so that
4028     formats other than BMP can be drawn
4029     (BaseRenderer.draw_raster_layer): Pass an explicit format to
4030     draw_raster_data
4031    
4032     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
4033     strings of the format parameter of draw_raster_data method to wx
4034     constants
4035     (MapRenderer.draw_raster_data): Add the format parameter and use
4036     raster_format_map to map it to the right wxwindows constant for
4037     wxImageFromStream
4038    
4039     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
4040     the format parameter and record it
4041     (TestBaseRenderer.test_raster_no_projection): check the format
4042     paramter of the draw_raster_data method
4043     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
4044     extension facility
4045    
4046 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
4047    
4048     Tweak the usage of the sqlite database to make common use cases
4049     more responsive. In most cases copying the data to the sqlite
4050     database takes so long that using sqlite doesn't have enough
4051     advantages.
4052    
4053     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
4054     comments about performance and query the min and max in separate
4055     statements because only that way will indexes be used.
4056     (TransientTableBase.UniqueValues): Add some comments about
4057     performance.
4058     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
4059     Do not copy the data to the transient DB but use the transient
4060     copy if it exists. See the new comments for the performance trade
4061     offs
4062    
4063     * test/test_transientdb.py
4064     (TestTransientTable.test_auto_transient_table): Make sure that the
4065     data is copied to the transient database at some point.
4066    
4067 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
4068    
4069 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
4070     globals to locals so that it's a bit faster
4071    
4072     2003-11-03 Bernhard Herzog <[email protected]>
4073    
4074 bh 1920 * Thuban/UI/baserenderer.py
4075     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
4076     method. ReadValue is faster than ReadRowAsDict since it only reads
4077     one cell especially now that the dbf file objects actually
4078     implement it.
4079    
4080     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
4081     read_attribute method of the dbf objects
4082    
4083     2003-11-03 Bernhard Herzog <[email protected]>
4084    
4085 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
4086     variable to indicate whether the result should be shown in a
4087     dialog box
4088     (profile_screen_renderer, time_screen_renderer): Only show a
4089     dialog box if popup_dialog_box is true.
4090     (profile_screen_renderer): Flush stdout after the printing the
4091     first part of the "profiling..." message
4092    
4093     * Thuban/UI/baserenderer.py
4094     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
4095     brushes for the groups so that they're not created over and over
4096     again
4097    
4098 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
4099     (Classification._compile_classification)
4100     (Classification._clear_compiled_classification): New. Methods to
4101     manage a 'compiled' representation of the classification groups
4102     which is created on demand
4103     (Classification.InsertGroup, Classification.RemoveGroup)
4104     (Classification.ReplaceGroup): reset the compiled representation
4105     (Classification.FindGroup): Use the compiled representation to
4106     find the matching group
4107     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
4108    
4109 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
4110    
4111 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
4112     Send a CLASS_CHANGED message
4113     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
4114     not return the removed group since it wasn't used.
4115    
4116     * test/test_classification.py
4117     (TestClassification.test_set_default_group): New. Test the
4118     SetDefaultGroup method
4119     (TestClassification.test_insert_group): New. Test the InsertGroup
4120     method
4121     (TestClassification.test_remove_group): New. Test the RemoveGroup
4122     method
4123     (TestClassification.test_replace_group): New. Test the
4124     ReplaceGroup method
4125    
4126     2003-10-31 Bernhard Herzog <[email protected]>
4127    
4128 bh 1908 * test/test_classification.py (TestClassification.setUp):
4129     Subscribe to the CLASS_CHANGED messages
4130     (TestClassification.tearDown): New. Destroy the classification
4131     properly
4132     (TestClassification.test_defaults): Add tests for the default line
4133     width and whether no messages were sent yet
4134     (TestClassification.test_set_default_properties): Add tests for
4135     messages and setting the default line width
4136     (TestClassification.test_add_singleton)
4137     (TestClassification.test_add_range)
4138     (TestClassification.test_multiple_groups): Add tests for messages
4139    
4140     2003-10-31 Bernhard Herzog <[email protected]>
4141    
4142 bh 1906 Some more refactoring in preparation for new tests:
4143    
4144     * test/test_classification.py (TestClassification.setUp): New.
4145     Instantiate the classification here. Update the test methods
4146     accordingly.
4147     (TestClassification.test_multiple_groups): Make sure that the two
4148     singletons matching 1 are considered different.
4149    
4150     2003-10-31 Bernhard Herzog <[email protected]>
4151    
4152 bh 1904 * test/test_classification.py (red, green, blue): New. These
4153     constants were used in several cases. Update the relevant methods.
4154     (TestClassification.test_defaults)
4155     (TestClassification.test_set_default_properties)
4156     (TestClassification.test_add_singleton)
4157     (TestClassification.test_add_range)
4158     (TestClassification.test_multiple_groups)
4159     (TestClassification.test_deepcopy): New. These were formerly all
4160     part of the single method test.
4161     (TestClassification.test_deepcopy): Removed.
4162     (TestClassIterator): Removed. The test case is now a method of
4163     TestClassification since it tests part of the public interface of
4164     Classification
4165     (TestClassification.test_iterator): New. Used to be
4166     TestClassIterator effectively
4167    
4168 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
4169    
4170     GUIfied the functions of the profiling extension.
4171    
4172     * /Extensions/profiling/__init__.py: New: Init to make this
4173     directory a package.
4174    
4175     * Extensions/profiling/profiling.py: Moved menu entries to
4176     the Extensions menu. Applied _() for strings.
4177     (profile_screen_renderer): Catch the detailed printout and present
4178     it in a dialog.
4179 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
4180 jan 1902 of printing it to stdout.
4181    
4182 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
4183    
4184 bh 1899 * test/test_classification.py (TestClassGroupProperties)
4185     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
4186     (TestClassGroupSingleton, TestClassIterator, TestClassification):
4187     Split TestClassification into several classes, one for each class
4188     being tested. TestClassification itself now only tests
4189     Classification. This split makes changes to the tests a bit easier
4190    
4191     2003-10-31 Bernhard Herzog <[email protected]>
4192    
4193 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
4194     Thuban performance
4195    
4196 frank 1895 2003-10-31 Frank Koormann <[email protected]>
4197    
4198     Added two items to legend popup menu: Remove Layer and Show Layer Table
4199    
4200     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
4201     LegendPanel._OnShowTable): New event handlers, call the corresponding
4202     mainwindow methods.
4203     (LegendTree._OnRightClick): Added items to popup menu.
4204    
4205 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
4206    
4207     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
4208     EVT_WINDOW_DESTROY
4209     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
4210     nothing but is convenient for the derived classes.
4211    
4212     * Thuban/UI/tableview.py
4213     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
4214     Unsubscribe the messages here not in OnClose because that might
4215     get called multiple times. Fixes RT #2196
4216     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
4217     anymore.
4218    
4219     * README: Update the minimum requirement for wxPython. Since we
4220     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
4221     the version in which that was introduced for all platforms
4222    
4223 frank 1890 2003-10-30 Frank Koormann <[email protected]>
4224    
4225     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
4226     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
4227     frame.
4228    
4229 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
4230    
4231     Improved APR import extension, added further EPSG definitions
4232     and some cleanup regarding string class.
4233    
4234     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
4235     Added test for alias 'longlat'.
4236    
4237     * Resources/Projections/epsg-deprecated.proj: New. Contains
4238     deprecated EPSG definitions.
4239    
4240     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
4241     the variable names for objects.
4242    
4243     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
4244     Copied from importAPR and provided with documentation.
4245    
4246     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
4247     Moved to apr.py.
4248     (APR_View): Added object ref 'ITheme'.
4249    
4250     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
4251     split function by corresponding use of the string class method.
4252    
4253     * Thuban/Model/xmlwriter.py: Replaced string replace function by
4254     corresponding string method.
4255    
4256 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
4257    
4258     * Thuban/UI/baserenderer.py
4259     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
4260     special case of a classification that only has the default group
4261    
4262 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
4263    
4264 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
4265    
4266 bh 1876 * po/de.po: Update.
4267    
4268     * Thuban/UI/application.py
4269     (ThubanApplication.ShowExceptionDialog): Handle translation of the
4270     dialog message properly
4271    
4272     2003-10-27 Bernhard Herzog <[email protected]>
4273    
4274 bh 1873 Rework how localization works so that we use wx's translation
4275     functions when running Thuban as a normal application but not when
4276     we don't need any UI, such as in the test suite. See the comment
4277     in Thuban/__init__.py for details
4278    
4279     * Thuban/__init__.py (_): Add one level of indirection to make the
4280     translation handling more flexible and to make it possible to use
4281     either wx's translation services or not.
4282     (gettext_identity, translation_function_installed)
4283     (install_translation_function): New function to help with this
4284    
4285     * Thuban/UI/__init__.py: Install the wx specific translation
4286     function if it's OK to do that
4287    
4288     * test/support.py (initthuban): Install a dummy translation
4289     function so that importing Thuban.UI doesn't install a wx specific
4290     one for which would need to import wxPython
4291    
4292     2003-10-27 Bernhard Herzog <[email protected]>
4293    
4294 bh 1870 * HOWTO-Release: Source archives should be created first and the
4295     binary packages should be created from the source archives.
4296     There's an official debian package now so there's no need to test
4297     the rpm on debian anymore
4298    
4299     2003-10-27 Bernhard Herzog <[email protected]>
4300    
4301 bh 1868 Several rendering changes:
4302    
4303     - Render the selection into a separate bitmap so that only that
4304     bitmap needs to be redrawn when the selection changes
4305    
4306     - Render incrementally showing previews and allowing interaction
4307     before rendering is complete
4308    
4309     - Update the renderer interface a bit. Most parameters of
4310     RenderMap are now parameters of the constructor
4311    
4312     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
4313     and the update region as parameters. Update the doc-string
4314     (BaseRenderer.render_map_incrementally): New. Generator function
4315     to renders the map incrementally
4316     (BaseRenderer.render_map): Remove the map argument (it's now in
4317     the constructor) and simply iterate over the
4318     render_map_incrementally generator to draw the map.
4319     (BaseRenderer.draw_shape_layer_incrementally)
4320     (BaseRenderer.draw_shape_layer): Renamed to
4321     draw_shape_layer_incrementally and changed into a generator that
4322     yields True every 500 shapes. Used by render_map_incrementally to
4323     render shape layers incrementally
4324    
4325     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
4326     map and region parameters which are now in the constructor
4327     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
4328     the inherited render_map_incrementally.
4329     (BaseRenderer.draw_shape_layer): Removed.
4330     (ScreenRenderer.draw_selection_incrementally): New. The selection
4331     drawing part of the removed draw_shape_layer as a generator
4332     (ScreenRenderer.layer_shapes): Update because of the region
4333     parameter change
4334     (ExportRenderer.__init__): New. Extend the inherited constructor
4335     with the destination region for the drawing
4336     (ExportRenderer.RenderMap): Removed the map and region parameters
4337     which are now in the constructor
4338    
4339     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
4340     bitmap suitable for a preview in a tool
4341     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
4342     bitmap
4343     (MapPrintout.draw_on_dc): Adapt to new renderer interface
4344     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
4345     exists
4346     (MapCanvas.OnIdle): Update the logic to deal with incremental
4347     rendering and the selection bitmap
4348     (MapCanvas._do_redraw): Handle the instantiation of the render
4349     iterator and the redraws during rendering
4350     (MapCanvas._render_iterator): New. Generator to incrementally
4351     redraw both bitmaps
4352     (MapCanvas.Export): Adapt to new renderer interface.
4353     (MapCanvas.full_redraw): Reset the selection bitmap and the
4354     renderer iterator too
4355     (MapCanvas.redraw_selection): New. Force a redraw of the selection
4356     bitmap
4357     (MapCanvas.shape_selected): Only redraw the selection bitmap
4358    
4359     * test/test_baserenderer.py
4360     (TestBaseRenderer.test_polygon_no_projection)
4361     (TestBaseRenderer.test_raster_no_projection)
4362     (TestBaseRenderer.test_point_map_projection)
4363     (TestBaseRenderer.test_point_layer_and_map_projection)
4364     (TestBaseRenderer.test_point_layer_projection)
4365     (TestBaseRenderer.test_point_with_classification): Adapt to new
4366     renderer interface
4367    
4368 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
4369    
4370     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
4371     (point_in_polygon_shape, shape_centroid): Raise an exception if
4372     the shape can't be read. Previously invalid shape ids would lead
4373     to a segfault.
4374    
4375     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
4376     New. test whether an exception is raised for invalid shape ids
4377    
4378 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
4379    
4380 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
4381     as alias for 'latlong'.
4382    
4383     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
4384     as alias for 'latlong'.
4385    
4386     2003-10-24 Jan-Oliver Wagner <[email protected]>
4387    
4388 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
4389     the projection even for the UnknownPanel.
4390     (UnknownProjPanel.__init__): Define the text and create the textctrl
4391     widget.
4392     (UnknownProjPanel._DoLayout): Replaced static text widget by the
4393     textctrl created in __init__.
4394     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
4395     including the parameters of the projection.
4396    
4397     2003-10-24 Jan-Oliver Wagner <[email protected]>
4398    
4399 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
4400     EPSG codes with parameters for proj. The list has been
4401     generated using devtools/create_epsg.py based on the
4402     file nad/epsg of the proj 4.4.7 package. Four projection
4403     definitions have been deleted as they are not accepted by proj:
4404     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
4405     and "HD72 / EOV".
4406    
4407 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
4408    
4409     Some more tweaks to the projection dialog which should fix RT
4410     #1886.
4411    
4412     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
4413     the ProjFile's messages and call the base class methods correctly
4414     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
4415     flag on the newly selected item too. Otherwise some other item is
4416     focused and the first time the focus is moved with the keyboard
4417     the selection moves in unexpected ways.
4418    
4419     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
4420     focus on the OK button, only on the projection list. That way the
4421     list really has the focus initially
4422     (ProjFrame.OnClose): Call the projection list's Destroy method to
4423     make it unsubscribe all messages
4424    
4425 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
4426    
4427 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
4428     and most of 2168
4429    
4430     * Thuban/UI/projlist.py: New. The class ProjectionList is a
4431     special wxListCtrl to show a list of projections in a more MVC
4432     fashion
4433    
4434     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
4435     throughout the class. The main change is to use the ProjectionList
4436     class instead of a normal wxListBox. Also, add an explicit
4437     "Unknown" projection to the projection choice control.
4438     (ProjPanel.__init__): Add an "unknown" ellipsoid
4439     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
4440     instantiation of the panel's controls to make the tab-order more
4441     natural
4442    
4443     2003-10-21 Bernhard Herzog <[email protected]>
4444    
4445 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
4446     (TestSingleLayer.test): Add non-ascii characters to the titles of
4447     session, map and layer. This is effectively a port of the
4448     TestUnicodeStrings test in test_load_0_8.py which for some reason
4449     was only added there.
4450    
4451     * test/test_load_0_9.py (TestSingleLayer.file_contents)
4452     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
4453     characters to the titles of session, map and layer,.
4454    
4455     2003-10-21 Bernhard Herzog <[email protected]>
4456    
4457 bh 1847 Add EPSG projection handling to .thuban files
4458    
4459     * test/test_save.py (SaveSessionTest.dtd)
4460     (SaveSessionTest.testEmptySession)
4461     (SaveSessionTest.testLayerProjection)
4462     (SaveSessionTest.testRasterLayer)
4463     (SaveSessionTest.testClassifiedLayer)
4464     (SaveSessionTest.test_dbf_table)
4465     (SaveSessionTest.test_joined_table)
4466     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
4467     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
4468     use a and epsg projection to test saving them
4469    
4470     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
4471     namespace
4472     (TestLayerVisibility.file_contents, TestLabels.file_contents)
4473     (TestLayerProjection.file_contents)
4474     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4475     (TestPostGISLayer.file_contents)
4476     (TestPostGISLayerPassword.file_contents)
4477     (TestLoadError.file_contents, TestLoadError.test): Update to use
4478     1.0-dev namespace
4479     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
4480     use 1.0-dev namespace and use an EPSG projection to test whether
4481     loading it works
4482    
4483     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
4484     as of Thuban 0.9. These are now tests to determine whether Thuban
4485     can still read files generated by Thuban 0.9
4486    
4487     * Thuban/Model/save.py (SessionSaver.write)
4488     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
4489     namespace
4490     (SessionSaver.write_projection): Write the projection's epsg
4491     attribute
4492    
4493     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
4494     thuban-1.0-dev.dtd namespace
4495     (SessionLoader.check_attrs): Allow a callable object as conversion
4496     too
4497     (SessionLoader.start_projection, SessionLoader.end_projection)
4498     (SessionLoader.start_parameter): Handle the epsg attribute and
4499     rename a few instance variables to lower case
4500    
4501     * Resources/XML/thuban-1.0.dtd: New. Only difference to
4502     thuban-0.9.dtd is the epsg attribute for projections.
4503    
4504     2003-10-21 Bernhard Herzog <[email protected]>
4505    
4506 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
4507     on the command line
4508    
4509     * test/support.py (ThubanTestResult.getDescription): Override to
4510     give a better short description. The description can be used as a
4511     parameter to run_tests to run that particular test in isolation.
4512    
4513 frank 1837 2003-10-21 Frank Koormann <[email protected]>
4514    
4515     Popup menu for legend. Scheduled for the 1.2 release this was too
4516     simple to implement: The popup menu is bound to the legend tree, while
4517     the events are hanlded by its anchestor, the legend panel. This
4518     allows reuse of all the event handlers already implemented for the
4519     legend toolbar buttons.
4520    
4521     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
4522     to add handlers for the events issued by the popup menu.
4523     (LegendPanel._OnToggleVisibility): Handler for toggling layer
4524     visibility event
4525     (LegendPanel._OnProjection): Handler for layer projection event.
4526     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
4527     (LegendTree._OnRightClick): Event handler for right click, select item
4528     and pop up menu.
4529     (LegendTree.ToggleVisibility): Toggle layer visibility
4530     (LegendTree.LayerProjection): Raise layer projection dialog for
4531     current layer.
4532    
4533 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
4534    
4535     * Resources/Projections/defaults.proj: Use correct DOCTYPE
4536     declaration. The top-level element is projectionlist not projfile
4537    
4538 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
4539    
4540     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
4541     method to write a projfile and display a busy cursor and error
4542     dialogs.
4543     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
4544     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
4545     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
4546     busy cursor while loading the user and system prj files.
4547    
4548 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
4549    
4550     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
4551     ProjFile objects
4552     (clear_proj_file_cache): New function to clear the cache. Mainly
4553     useful for use by the test suite
4554     (read_proj_file): Use the cache.
4555    
4556     * test/test_proj.py (TestProjFile): Clarify the doc-string
4557     (ProjFileReadTests): Update doc-string
4558     (ProjFileReadTests.test_get_system_proj_file): Check whether the
4559     system proj files is cached.
4560     (ProjFileLoadTestCase): New base class for the proj file tests
4561     derived from support.FileLoadTestCase to provide some common
4562     behavior.
4563     (TestLoadingProjFile)
4564     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
4565     (TestProjFileWithInvalidParameters.file_contents): Derive from
4566     ProjFileLoadTestCase
4567     (TestLoadingProjFile.test_caching): New. Test whether the cache
4568     works
4569    
4570 silke 1829 2003-10-16 Silke Reimer <[email protected]>
4571    
4572     * debian/*: New directory with configuration files for building a thuban
4573     deb-package.
4574    
4575 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
4576    
4577 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
4578     __main__ so that missing unsubscribes are detected
4579     (TestProjFile.tearDown): Destroy the proj_file properly
4580    
4581     2003-10-14 Bernhard Herzog <[email protected]>
4582    
4583 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
4584     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
4585     the ProjFile objects
4586    
4587     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
4588     easily send messages when the projections change
4589     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
4590     when the change was successful
4591    
4592     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
4593     proj file messages
4594     (TestProjFile.test_add_remove)
4595     (TestProjFile.test_remove_non_existing)
4596     (TestProjFile.test_replace)
4597     (TestProjFile.test_replace_non_existing): Test whether the right
4598     messages are sent
4599    
4600     2003-10-14 Bernhard Herzog <[email protected]>
4601    
4602 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
4603     tests
4604     (TestProjFile.test_add_remove)
4605     (TestProjFile.test_remove_non_existing)
4606     (TestProjFile.test_replace)
4607     (TestProjFile.test_replace_non_existing): Some of the new
4608     individual test cases
4609     (TestProjFileSimple): New class for the rest of the test cases
4610     that came out of the refactoring
4611     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
4612     derived classes don't have to
4613    
4614 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
4615    
4616 bh 1820 Add an optional EPSG code to the projection objects and extend the
4617     .proj file format accordingly.
4618    
4619     * Resources/XML/projfile.dtd (element projection): Add epsg
4620     attribute
4621    
4622     * Thuban/Model/proj.py (Projection.__init__): New parameter and
4623     instance variable epsg. Update doc-string
4624     (Projection.EPSGCode, Projection.Label): New methods to provide
4625     access to EPSG code and a label for use in dialogs
4626    
4627     * Thuban/Model/resource.py (ProjFileReader.start_projection)
4628     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
4629     Handle the epsg code attribute when reading or writing proj files
4630    
4631     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
4632     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
4633     (ProjFrame.__FillAvailList): Use the projection's Label method to
4634     get the string for the list box
4635    
4636     * test/test_proj.py (TestProjection.test_label)
4637     (TestProjection.test_label_epsg)
4638     (TestProjection.test_epsgcode_for_non_epsg_projection)
4639     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
4640     for the label and EPSGCode methods
4641     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
4642     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
4643     objects in the test cases and put the expected contents into the
4644     test case methods too. Update doTestWrite accordingly
4645     (TestLoadingProjFile)
4646     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
4647     read tests from TestProjFile.
4648     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
4649     tests are now in the new classes.
4650     (sample_projfile, sample_projfile_data)
4651     (sample_projfile2, sample_projfile_data2): Removed. Not used
4652     anymore.
4653     (TestProjFile.test_read_unreadable_file): No need to reset the
4654     permissions at the end anymore since we use a unique filename
4655    
4656     2003-10-13 Bernhard Herzog <[email protected]>
4657    
4658 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
4659     (ProjFileTest): New base class for the proj file tests.
4660     (TestProjFile): Derive from ProjFileTest
4661     (TestProjFile.test_read_unreadable_file)
4662     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
4663     the new filename method to get a unique filename
4664     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
4665     (WriteProjFileTests): New class for proj file write tests.
4666     Contains the write test that were in TestProjFile originally.
4667    
4668     2003-10-13 Bernhard Herzog <[email protected]>
4669    
4670 bh 1812 * test/test_proj.py (TestProjFile.testRead)
4671     (TestProjFile.test_read_non_existing_file)
4672     (TestProjFile.test_read_unreadable_file)
4673     (TestProjFile.test_read_empty_file): Split into several methods.
4674    
4675 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
4676    
4677 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
4678    
4679     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
4680     all projection type specific panels and put them into a
4681     NotebookLikeSizer. This way the dialog doesn't change its size
4682     when a different projection is selected
4683     (ProjFrame.__init__): Rename projection_panels
4684     projection_panel_defs and reuse projection_panels for a list of
4685     the instantiated panels.
4686     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
4687     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
4688     the panels
4689     (UnknownProjPanel._DoLayout): Place the newlines in the message
4690     differently to make the panel narrower.
4691     (TMPanel._DoLayout): Layout the parameters in one column.
4692    
4693     2003-10-10 Bernhard Herzog <[email protected]>
4694    
4695 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
4696     that contains all the setup for the dialog's widgets, layout and
4697     event handling.
4698     (__): Call build_dialog to build the dialog.
4699     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
4700     Their functionality is now in build_dialog
4701     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
4702     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
4703     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
4704     different widget names and hierarchy introduced with build_dialog.
4705    
4706     2003-10-10 Bernhard Herzog <[email protected]>
4707    
4708 bh 1805 * README: Fix typo.
4709    
4710 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
4711    
4712     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
4713     projection is already in the list. This is *a lot* faster when
4714     loading files with hundreds of projections since it saves a linear
4715     search. OTOH this will allow adding the same projection to the
4716     user.proj file multiple times in the projection dialog but we'll
4717     deal with that later
4718    
4719 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
4720    
4721     * devtools: New. Directory for developer tools that are not intended
4722     for the regular user.
4723    
4724     * devtools/create_epsg.py: New. Convert the epsg file of proj into
4725     a python .proj file.
4726    
4727 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
4728    
4729     * test/test_proj.py
4730     (TestProjection.test_get_parameter_without_equals_sign): New. Test
4731     whether GetParameter handles parameters without "=" sign correctly
4732    
4733     * Thuban/Model/proj.py (Projection.GetParameter): Handle
4734     parameters that do not contain a "=". Update the doc-string
4735    
4736 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
4737    
4738 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
4739     length limit on the projname text control
4740    
4741     2003-10-08 Bernhard Herzog <[email protected]>
4742    
4743 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
4744     (TestProjection.test_get_projection_units_normal): New. Tests for
4745     the Projection.GetProjectedUnits method
4746    
4747 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
4748    
4749     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
4750     Added missing 'val' parameter.
4751    
4752 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
4753    
4754 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
4755     projection type of the currently selected projection is not known,
4756     i.e. there's no panel for it, use the UnknownProjPanel
4757     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
4758     the actual replacing of the proj panel into the new method
4759     _show_proj_panel.
4760     (UnknownProjPanel): Add doc-string.
4761     (UnknownProjPanel._DoLayout): Insert a newline into the text so
4762     that the panel is not so wide.
4763    
4764     2003-10-08 Bernhard Herzog <[email protected]>
4765    
4766 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
4767     too. Update the doc-string
4768     (get_proj_files): Removed. It wasn't used anywhere
4769     (get_system_proj_files, get_system_proj_file): Rename to
4770     get_system_proj_file and return the ProjFile object and not a list
4771     of ProjFile objects. Update the callers.
4772     (get_user_proj_files, get_user_proj_file): Rename to
4773     get_user_proj_file return the ProjFile object and not a list of
4774     ProjFile objects. Update the callers.
4775     (ProjFileReader.__init__): New instance variable for the warnings.
4776     Rename the __pf ivar to projfile. Update the methods referring to
4777     __pf
4778     (ProjFileReader.end_projection): Catch any errors raised when
4779     instantiating the projection and record that as an error. The
4780     projection will not be in the final ProjFile object.
4781     (ProjFileReader.GetWarnings): New method to return the warnings.
4782    
4783     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
4784     show the warnings from the projfile reader
4785     (ProjFrame._OnImport): Deal with any warnings returned by
4786     read_proj_file
4787     (ProjFrame.__FillAvailList): Deal with any warnings returned by
4788     get_system_proj_file or get_user_proj_file.
4789    
4790     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
4791     (TestProjFileWithInvalidParameters.file_contents): New test cases
4792     to test whether read_proj_file handles invalid projection
4793     parameters correctly
4794     (TestProjFile.test_get_system_proj_file): New. Simple test for
4795     resource.get_system_proj_file
4796    
4797 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
4798    
4799     * test/test_derivedshapestore.py
4800     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
4801     properly so that the temporary directories get deleted correctly
4802    
4803 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
4804    
4805 bh 1783 Handle the title changes in a proper MVC way.
4806    
4807     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4808     canvas' TITLE_CHANGED messages
4809     (MainWindow.update_title): New. Update the main window's title
4810     (MainWindow.__SetTitle): Removed. Use update_title instead.
4811     (MainWindow.SetMap): Use update_title instead of __SetTitle
4812     (MainWindow.RenameMap): Do change the window title explicitly
4813     here. That's handled in a proper MVC way now.
4814     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
4815     messages
4816    
4817     * Thuban/Lib/connector.py (Conduit): New class to help classes
4818     that forward messages
4819    
4820     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
4821     (ViewPort): Derive from Conduit instead of Publisher
4822     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
4823     when calling the inherited versions
4824     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
4825     methods to subscribe and unsubscribe map messages
4826     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
4827     handle the map subscriptions
4828     (ViewPort.Map, ViewPort.map_projection_changed)
4829     (ViewPort.layer_projection_changed): Add or update doc-strings
4830    
4831     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
4832     typo
4833     (MyConduit): Helper class for the Conduit test.
4834     (TestConduit): Test cases for Conduit
4835    
4836     * test/test_connector.py: Use support.run_tests as main.
4837    
4838     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
4839     the TITLE_CHANGED messages
4840     (ViewPortTest.test_forwarding_title_changed): New test to check
4841     whether the viewport forwards the map's TITLE_CHANGED messages
4842     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
4843     after the port's because the latter may require a still functional
4844     map.
4845    
4846     2003-10-06 Bernhard Herzog <[email protected]>
4847    
4848 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
4849     doc-string
4850    
4851     2003-10-06 Bernhard Herzog <[email protected]>
4852    
4853 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
4854     (SimpleViewPortTest.test_init_with_size): Move the test for the
4855     initial size as a constructor parameter from ViewPortTest.setUp
4856     method to a new separate test in SimpleViewPortTest.
4857    
4858     2003-10-06 Bernhard Herzog <[email protected]>
4859    
4860 bh 1773 * test/test_viewport.py (MockView): New class derived from
4861     ViewPort with a mock implementation of GetTextExtent to be used in
4862     the test cases
4863     (ViewPortTest.setUp): Use MockView instead of ViewPort
4864    
4865     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
4866     into what would be a "pure virtual function" in C++: always raise
4867     NotImplementedError. Mock implementations for test cases don't
4868     belong into the real code
4869    
4870 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
4871    
4872     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
4873     close the dbf file we create so that it's contents have been
4874     written properly.
4875    
4876     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
4877     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
4878     Update to shapelib 1.2.10
4879    
4880 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
4881    
4882     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
4883     it annoys lintian which warns about these files not being
4884     executable. The #! isn't necessary here since if you absolutely
4885     must execute them you can always say "python <filename>".
4886    
4887 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
4888    
4889 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
4890     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
4891     is ported to a newer the import will fail, so it should be noticed
4892     immediately that this function is gone.
4893     Fixes RT#1919
4894    
4895     2003-09-26 Bernhard Herzog <[email protected]>
4896    
4897 bh 1757 Add a DTD for the projection files and make thuban write valid
4898     projection files
4899    
4900     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
4901     files
4902    
4903     * Thuban/Model/resource.py (ProjFileSaver.write): Use
4904     'projectionlist' as the name in the document type declaration so
4905     that it matches the element type of the root element.
4906    
4907     * test/test_proj.py (sample_projfile, sample_projfile2): Use
4908     'projectionlist' as the name in the document type declaration just
4909     as it is done now in the files thuban would write
4910     (sample_projfile, sample_projfile_data): Fix spelling of
4911     "Mercator"
4912     (TestProjFile.doTestWrite): Validate the written and the expected
4913     XML data
4914     (TestProjFile): Derive from ValidationTest so that we can run xml
4915     validation tests
4916    
4917 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
4918    
4919     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
4920     modify the list returned by map.Layers() in place since it is the
4921     actual list of layers used by the map.
4922    
4923 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
4924    
4925     * Doc/manual/thuban-manual.xml: Added subsection to chapter
4926     Extensions to describe the extensions coming with the Thuban
4927     standard package (gns2shp and importAPR).
4928    
4929 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
4930    
4931     * libraries/thuban/wxproj.cpp (project_point): if there's an
4932     inverse but no forward projection, convert to degrees after
4933     applying the inverse projection. Fixes RT#2096
4934    
4935     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
4936     implicitly tests for the fix to RT#2096
4937    
4938     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
4939     Check that the sequences have the same lengths
4940    
4941     * Resources/Projections/defaults.proj (Geographic projection): Use
4942     a much more precise value for the to_meter attribute.
4943    
4944 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
4945    
4946     * test/support.py (initthuban): Make sure to unset the LANG env.
4947     var. so that tests that compare translated strings work. Solves RT
4948     #2094
4949    
4950 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
4951    
4952 jan 1735 Small improvement of APR import.
4953    
4954     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
4955     Added tests for text-ranges.
4956    
4957     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
4958     returns a string object if the range is based on text.
4959    
4960     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
4961     range retrieval.
4962    
4963     2003-09-22 Jan-Oliver Wagner <[email protected]>
4964    
4965 jan 1730 Initial version of the importAPR extension which is in
4966     experimental state.
4967    
4968     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
4969     /Extensions/importAPR/test/: New directories.
4970    
4971     * /Extensions/importAPR/samples/README: New: Howto load the samples.
4972    
4973     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
4974     file which refers to the Thuban Iceland demo data.
4975    
4976     * /Extensions/importAPR/test/README: New: Howto execute the tests.
4977    
4978     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
4979    
4980     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
4981     as in '.apr'-files.
4982    
4983     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
4984     ODB Objects as in '.apr', '.avl' and other files.
4985    
4986     * /Extensions/importAPR/__init__.py: New: Init to make this
4987     directory a package.
4988    
4989     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
4990     project file (.apr) and convert it to Thuban.
4991    
4992     2003-09-22 Jan-Oliver Wagner <[email protected]>
4993    
4994     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
4995    
4996 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
4997    
4998     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
4999     with description on RPM installation and RPM binary package
5000     creation.
5001    
5002 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
5003    
5004     * setup.py (data_files): Only add the mo files if the Locales
5005     directory actually exists, so that setup.py works with a fresh CVS
5006     checkout
5007    
5008 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
5009    
5010     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
5011     in viewport, not anymore in view
5012    
5013 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
5014    
5015     Introducing first Extension (gns2shp).
5016    
5017     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
5018    
5019     * Extensions/__init__.py: New. init to make this dir a package.
5020    
5021     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
5022    
5023     * Extensions/gns2shp/test/README: New. some info on this test directory.
5024    
5025     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
5026    
5027     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
5028     of Shapefile from GNS text file format
5029    
5030 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
5031    
5032 jan 1707 Fix/workaround for bug #2019:
5033     https://intevation.de/rt/webrt?serial_num=2019
5034    
5035     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
5036     (IdentifyView.__init__): Added another button that allows to
5037     stop the identify mode.
5038     (IdentifyView.OnStop): New. Stops the identify mode.
5039    
5040     2003-09-03 Jan-Oliver Wagner <[email protected]>
5041    
5042 jan 1705 Introducing a new exception dialog that allows to exit the
5043     application immediately.
5044     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
5045    
5046     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
5047    
5048     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5049     Made strings available to translations. Exchanged the simple
5050     ScrolledMessageDialog by the new ExceptionDialog.
5051    
5052 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
5053    
5054 bh 1701 * NEWS: New. Summary of changes and release notes.
5055    
5056     * MANIFEST.in: Add NEWS
5057    
5058     2003-09-01 Bernhard Herzog <[email protected]>
5059    
5060 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
5061     include the documentation too.
5062    
5063     * setup.py (data_files): Add the .mo files
5064     (setup call): Up to version 0.9.0
5065    
5066     2003-09-01 Bernhard Herzog <[email protected]>
5067    
5068 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
5069     parameter list to just parent and session
5070     (ChooseDBTableDialog.__set_properties): Removed. Setting the
5071     selection of empty list boxes is not allowed (and produces C++
5072     assertion errors) and the rest of the setup is better done in
5073     __init__ anyway.
5074     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
5075     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
5076     builtins True/False for booleans to avoid warnings from wxPython
5077    
5078     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
5079     ChooseDBTableDialog constructor parameters.
5080    
5081     2003-09-01 Bernhard Herzog <[email protected]>
5082    
5083 bh 1694 * Thuban/Model/postgisdb.py
5084     (PostGISTable): Extend doc-string
5085     (PostGISTable._fetch_table_information): Set the column index
5086     correctly, pretending ignored columns don't exist.
5087    
5088     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
5089     for postgis tables with data types not yet supported by thuban.
5090    
5091 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
5092    
5093     * HOWTO-Release: Tweak item about running the tests.
5094    
5095 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
5096    
5097     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
5098    
5099 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
5100    
5101     Add some missing parameters to projections. Proj complains about
5102     them on windows but for some reason not on Linux.
5103    
5104     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
5105     missing required projection parameters
5106    
5107     * test/test_proj.py (TestProjFile.test): Add missing required
5108     projection parameters
5109    
5110     * test/test_load_0_8.py (TestLayerProjection.file_contents)
5111     (TestLayerProjection.test): Add missing required projection
5112     parameters and tests for them
5113    
5114     * test/test_load.py (TestLayerProjection.file_contents)
5115     (TestLayerProjection.test): Add missing required projection
5116     parameters and tests for them
5117    
5118     * test/test_layer.py (TestLayer.test_base_layer): Add missing
5119     required projection parameters
5120    
5121     2003-08-29 Bernhard Herzog <[email protected]>
5122    
5123     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
5124     access the pj_errno because directly accessing pj_errno doesn't
5125     work on windows if the proj library is in a DLL
5126    
5127     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
5128    
5129 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
5130    
5131 bh 1685 * test/test_proj.py: Import things from Thuban after calling
5132     initthuban
5133    
5134     * test/test_load.py (LoadSessionTest.filenames): New class
5135     variable with the filename attributes to normalize
5136     (LoadSessionTest.check_format): Pass self.filenames to
5137     sax_eventlist to normalize the filename attributes
5138    
5139     * test/xmlsupport.py: Add cvs keywords
5140     (SaxEventLister.__init__): New parameter filenames which indicates
5141     attributes that contain filenames
5142     (SaxEventLister.startElementNS): Normalize the filename attributes
5143     with os.path.normpath
5144     (sax_eventlist): New parameter filenames to pass through to
5145     SaxEventLister
5146    
5147     * test/test_derivedshapestore.py: Make this file callable as a
5148     program to execute the tests
5149     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
5150     the session to self.session so that it gets destroyed properly
5151    
5152     * test/test_layer.py (TestLayer.tearDown): Call the session's
5153     Destroy method
5154    
5155     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
5156     too if it exists
5157     (TestMapAddLayer.test_add_layer): Bind the session to self.session
5158     so that it gets destroyed properly
5159    
5160     * test/postgissupport.py (reason_for_not_running_tests): Add a
5161     test for the existence of popen2.Popen4.
5162    
5163     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
5164     reliable way to destroy the sessions created in the test cases
5165     (SaveSessionTest.test_dbf_table): Bind the session to self.session
5166     so that it gets destroyed properly
5167     (SaveSessionTest.testLayerProjection): Bind the session to
5168     self.session so that it gets destroyed properly
5169    
5170     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
5171     sure that the session is destroyed properly
5172    
5173     * test/test_shapefilestore.py: Make this callable as a program to
5174     execute the tests
5175    
5176     * test/test_scalebar.py: Remove unnecessary import of _ from
5177     Thuban
5178    
5179     * test/support.py (print_garbage_information): Call initthuban
5180     here because it may be called indirectly from test cases that test
5181     test support modules which do not use anything from thuban itself
5182     (ThubanTestProgram.runTests): Remove unnecessary debug print
5183    
5184     2003-08-28 Bernhard Herzog <[email protected]>
5185    
5186 bh 1672 * Thuban/version.py (longversion): Update to 0.9
5187    
5188     * Thuban/UI/mainwindow.py: Remove some unused imports
5189    
5190     * README: Add section about required additional software. Add date
5191     and revision CVS keywords
5192    
5193     * HOWTO-Release: Add item about the translations. Add date and
5194     revision CVs keywords and change formatting to match README a bit
5195     better
5196    
5197     * po/de.po: Update for 0.9
5198    
5199     * test/README: Tweak the wording a little because many tests are
5200     not really unittest.
5201    
5202 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
5203    
5204 bh 1665 As preparation for the 0.9 release, switch thuban files to a
5205     non-dev namespace
5206    
5207     * Thuban/Model/save.py (SessionSaver.write_session): Write files
5208     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
5209     namespace
5210    
5211     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
5212     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
5213    
5214     * test/test_save.py (SaveSessionTest.dtd)
5215     (SaveSessionTest.testEmptySession)
5216     (SaveSessionTest.testSingleLayer)
5217     (SaveSessionTest.testLayerProjection)
5218     (SaveSessionTest.testRasterLayer)
5219     (SaveSessionTest.testClassifiedLayer)
5220     (SaveSessionTest.test_dbf_table)
5221     (SaveSessionTest.test_joined_table)
5222     (SaveSessionTest.test_save_postgis): Update for new namespace
5223    
5224     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
5225     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5226     (TestLayerProjection.file_contents)
5227     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5228     (TestPostGISLayer.file_contents)
5229     (TestPostGISLayerPassword.file_contents)
5230     (TestLoadError.file_contents, TestLoadError.test): Update for new
5231     namespace
5232    
5233     2003-08-27 Bernhard Herzog <[email protected]>
5234    
5235 bh 1663 Make the table interface distinguish between row ids (an integer
5236     that uniquely identifies a row) and row ordinals (a simple row
5237     count from 0 to NumRows() - 1)
5238    
5239     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
5240     (PostGISTable.RowOrdinalToId): New methods to conver between row
5241     ids and row ordinals
5242     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
5243     parameter row_is_ordinal to indicate whether the row parameter is
5244     the row id or the ordinal
5245    
5246     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
5247     (TransientTableBase.RowOrdinalToId)
5248     (AutoTransientTable.RowIdToOrdinal)
5249     (AutoTransientTable.RowOrdinalToId): Same new methods as in
5250     PostGISTable.
5251     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
5252     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
5253     Same new parameter as in PostGISTable.
5254    
5255     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
5256     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
5257     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
5258     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
5259     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
5260     parameter as in PostGISTable.
5261    
5262     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
5263     (DataTable.RowOrdinalToId): New methods to convert between row ids
5264     and row ordinals.
5265     (TableGrid.SelectRowById): New method to select a row based on its
5266     ID as opposed to its ordinal
5267     (DataTable.GetValue, TableGrid.OnRangeSelect)
5268     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
5269     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
5270     (LayerTableFrame.__init__): Convert between row ids and row
5271     ordinals as appropriate
5272    
5273     * test/postgissupport.py (PostGISDatabase.__init__): Add
5274     doc-string.
5275     (PostGISDatabase.initdb): The optional third item in a tuple in
5276     tables is now a (key, value) list with additional arguments to
5277     pass to upload_shapefile
5278     (upload_shapefile): New parameter gid_offset to allow gids that
5279     are not the same as the shapeids in the shapefile
5280     (PostgreSQLServer.get_default_static_data_db): Use the new
5281     gid_offset to make the gids in landmarks 1000 higher than the
5282     shapeids in the shapefile
5283    
5284     * test/test_viewport.py
5285     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
5286     new shapeids in the landmarks table
5287    
5288     * test/test_transientdb.py
5289     (TestTransientTable.run_iceland_political_tests)
5290     (TestTransientTable.test_transient_joined_table): Add tests for
5291     the new table methods and new keywords arguments.
5292    
5293     * test/test_postgis_db.py
5294     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
5295     (TestPostGISTable.test_read_value_row_count_mode)
5296     (TestPostGISTable.test_row_id_to_ordinal)
5297     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
5298     table methods and the new arguments
5299     (TestPostGISShapestorePoint.test_shapes_in_region)
5300     (TestPostGISShapestorePoint.test_shape_raw_data)
5301     (TestPostGISShapestorePoint.test_shape_points)
5302     (TestPostGISShapestorePoint.test_shape_shapeid)
5303     (TestPostGISShapestorePoint.test_all_shapes)
5304     (TestPostGISTable.test_simple_query)
5305     (TestPostGISTable.test_simple_query)
5306     (TestPostGISTable.test_simple_query)
5307     (TestPostGISTable.test_read_value)
5308     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
5309     shapeids in the landmarks table
5310    
5311     * test/test_memory_table.py
5312     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
5313     (TestMemoryTable.test_read_value_row_count_mode)
5314     (TestMemoryTable.test_row_id_to_ordinal)
5315     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
5316     table methods and the new arguments
5317    
5318     * test/test_dbf_table.py
5319     (TestDBFTable.test_read_row_as_dict_row_count_mode)
5320     (TestDBFTable.test_read_value_row_count_mode)
5321     (TestDBFTable.test_row_id_to_ordinal)
5322     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
5323     methods and the new arguments
5324    
5325 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
5326    
5327 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
5328     more postgis specific but much faster method to get the bounding
5329     box
5330    
5331     2003-08-26 Bernhard Herzog <[email protected]>
5332    
5333 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
5334     (PostGISShapeStore.AllShapes): Add these missing methods.
5335     (PostGISShapeStore.ShapesInRegion): No need to raise
5336     StopIteration. We can simply return
5337    
5338     * test/test_postgis_db.py (TestPostGISTable.test_title)
5339     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
5340     new methods
5341    
5342 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
5343    
5344 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
5345    
5346     * test/test_postgis_db.py (PolygonTests): New class containing
5347     those tests from TestPostGISShapestorePolygon that can also be
5348     used to test MUTLIPOLYGON tables
5349     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
5350     so derive from that
5351     (TestPostGISShapestoreMultiPolygon): New class with tests for
5352     MUTLIPOLYGON tables
5353    
5354     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
5355     tables argument to have tuples with three items to override the
5356     WKT type used.
5357     (PostgreSQLServer.get_default_static_data_db): Use the above to
5358     create a polygon table with MUTLIPOLYGONs
5359     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
5360     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
5361     coords_to*
5362     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
5363     (wkt_converter): New. Map WKT types to converters
5364     (upload_shapefile): New parameter force_wkt_type to use a
5365     different WKT type than the default
5366    
5367     2003-08-25 Bernhard Herzog <[email protected]>
5368    
5369 bh 1655 * Thuban/UI/application.py
5370     (ThubanApplication.run_db_param_dialog): New. Suitable as a
5371     db_connection_callback. Main difference is that the dialog run
5372     from this method doesn't have a parent so it can be used even when
5373     there is no main window
5374     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
5375     no db_connection_callback was given. This way the dialog pops up
5376     even when the .thuban file was given as a command line parameter.
5377    
5378     2003-08-25 Bernhard Herzog <[email protected]>
5379    
5380 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
5381     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
5382     which leads to an effectively frozen X session because the user
5383     can only interact with the dialog but the mouse is still grabbed
5384     by the canvas.
5385     Also, call the tool's Hide method before MouseLeftUp because
5386     MouseLeftUp may change the tool's coordinates.
5387    
5388     2003-08-25 Bernhard Herzog <[email protected]>
5389    
5390 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
5391     LoadCancelled exceptions and handle them by returning immediately.
5392    
5393     2003-08-25 Bernhard Herzog <[email protected]>
5394    
5395 bh 1649 GUI part of loading sessions with postgis connections which may
5396     require user interaction to get passwords or updated parameters
5397    
5398     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
5399     bit nucer and be more generic.
5400     (DBFrame.OnAdd): Adapt to new DBDialog interface
5401    
5402     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
5403     optional parameter db_connection_callback which is passed to
5404     load_session.
5405    
5406     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
5407     Suitable as a db_connection_callback
5408     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
5409     db_connection_callback of the application's OpenSession method
5410    
5411    
5412     2003-08-25 Bernhard Herzog <[email protected]>
5413    
5414 bh 1647 Basic loading of sessions containing postgis connections:
5415    
5416     * Thuban/Model/load.py (LoadError): Add doc-string
5417     (LoadCancelled): New exception class to indicate a cancelled load
5418     (SessionLoader.__init__): Add the db_connection_callback parameter
5419     which will be used by the loader to get updated parameters and a
5420     password for a database connection
5421     (SessionLoader.__init__): Add the new XML elements to the
5422     dispatchers dictionary
5423     (SessionLoader.check_attrs): Two new conversions, ascii to convert
5424     to a byte-string object and idref as a generic id reference
5425     (SessionLoader.start_dbconnection)
5426     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
5427     elements
5428     (load_session): Add the db_connection_callback to pass through the
5429     SessionLoader
5430    
5431     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
5432     New classes to test loading of sessions with postgis database
5433     connections.
5434    
5435     2003-08-25 Bernhard Herzog <[email protected]>
5436    
5437 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
5438     replace it and the comment with __BuildDate__ by the Source: and
5439     Id: cvs keywords as used in the other files.
5440    
5441     2003-08-25 Bernhard Herzog <[email protected]>
5442    
5443 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
5444     LoadError when a required attribute is missing. The code used to
5445     be commented out for some reason, but probably should have been
5446     active.
5447    
5448     * test/test_load.py (TestLoadError.test): Test the message in the
5449     LoadError too to make sure it really is about the missing
5450     attribute
5451    
5452 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
5453 bh 1641
5454     * test/test_save.py (SaveSessionTest.test_dbf_table)
5455     (SaveSessionTest.test_joined_table): Add XML validation tests.
5456    
5457     2003-08-22 Bernhard Herzog <[email protected]>
5458    
5459 bh 1639 Implement saving a session with a postgis connection
5460 bh 1632
5461 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
5462     elements for database connections and shapestores using db
5463     connections
5464     (session): Add the dbconnections to the content model
5465    
5466     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
5467     Write the db connections
5468     (SessionSaver.write_session): Call write_db_connections to write
5469     the connection before the data sources
5470     (SessionSaver.write_data_containers): Handle postgis shapestores
5471    
5472     * test/test_save.py (SaveSessionTest.thubanids)
5473     (SaveSessionTest.thubanidrefs): Update for new DTD
5474     (SaveSessionTest.test_save_postgis): New. Test saving a session
5475     with postgis connections
5476    
5477     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
5478     (PostGISTable.TableName): New accessor methods for the connection
5479     and table name
5480    
5481     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
5482     (TestPostGISTable.test_dbname): New methods to test the new
5483     PostGISConnection methods
5484    
5485     2003-08-22 Bernhard Herzog <[email protected]>
5486    
5487 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
5488     for exceptions occurring when establishing a Database connection
5489     (PostGISConnection.connect): Catch psycopg.OperationalError during
5490     connects and raise ConnectionError.
5491    
5492     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
5493     tests for database exceptions
5494    
5495     2003-08-22 Bernhard Herzog <[email protected]>
5496    
5497 bh 1635 Prepare the test suite for tests with required authentication
5498    
5499     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
5500     variables with two predefined users/passwords, one for the admin
5501     and one for a non-privileged user.
5502     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
5503     the non-privileged user to the database and set the admin password
5504     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
5505     Better error reporting
5506     (PostgreSQLServer.connection_params)
5507     (PostgreSQLServer.connection_string): New methods to return
5508     information about how to connect to the server
5509     (PostgreSQLServer.execute_sql): New. Convenience method to execute
5510     SQL statements
5511     (PostgreSQLServer.require_authentication): Toggle whether the
5512     server requires authentication
5513     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
5514     Add or alter users
5515     (PostGISDatabase.initdb): Pass the admin name one the
5516     subprocesses' command lines. Grant select rights on
5517     geometry_columns to everybody.
5518     (upload_shapefile): Use the admin name and password when
5519     connecting. Grant select rights on the new table to everybody.
5520    
5521     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
5522     server's new methods to get the connection parameters.
5523    
5524     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
5525     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
5526     server's new methods to get the connection parameters.
5527    
5528     * test/test_postgis_db.py
5529     (TestPostGISConnection.test_gis_tables_empty)
5530     (TestPostGISConnection.test_gis_tables_non_empty)
5531     (PostGISStaticTests.setUp): Use the server's new methods to get
5532     the connection parameters.
5533    
5534     2003-08-22 Bernhard Herzog <[email protected]>
5535    
5536 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
5537    
5538     * Thuban/version.py: Add psycopg version
5539    
5540     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
5541     version of the psycopg module
5542    
5543     2003-08-22 Bernhard Herzog <[email protected]>
5544    
5545     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
5546     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
5547     at the moment. The functionality should probably be implemented
5548     some time, though.
5549 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
5550     removed because it's still in use.
5551 bh 1632
5552 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
5553    
5554     * Thuban/UI/about.py (About.__init__): split up the huge about
5555     text into elements/lists for easier translation. This fixes bug
5556     https://intevation.de/rt/webrt?serial_num=2058
5557     Also, made some forgotten string available for the i18n.
5558    
5559 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
5560    
5561     Make postgis support really optional including insensitive menu
5562     items.
5563    
5564     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
5565     whether the postgis is supported.
5566    
5567     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
5568     to make postgis support optional
5569    
5570     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
5571     version of Thuban.Model.postgisdb.has_postgis_support
5572     (database_management command): Make it only sensitive if postgis
5573     is supported.
5574    
5575 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
5576    
5577 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
5578     (section Adding and Removing Layers): Added text and described
5579     multi-selection.
5580     (chapter Extensions): New.
5581    
5582     2003-08-21 Jan-Oliver Wagner <[email protected]>
5583    
5584 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
5585     settings to allow multiple files to load into the map.
5586     Also reduced selection to *.shp as a default.
5587    
5588 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
5589    
5590     Add dialogs and commands to open database connections and add
5591     database layers.
5592    
5593     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
5594     method to open the database connection management dialog
5595     (MainWindow.AddDBLayer): New method to add a layer from a database
5596     (_has_dbconnections): New helper function to use for sensitivity
5597     (database_management command, layer_add_db command): New commands
5598     that call the above new methods.
5599     (main_menu): Add the new commands to the menu.
5600    
5601     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
5602     (PostGISConnection.connect): Establish the actual connection in a
5603     separate method and call it in __init__. This makes it easier to
5604     override the behavior in test cases
5605     (PostGISConnection.BriefDescription): New method to return a brief
5606     description for use in dialogs.
5607    
5608     * test/test_postgis_db.py (NonConnection): DB connection that
5609     doesn't actually connect
5610     (TestBriefDescription): New class with tests for the new
5611     BriefDescription method
5612    
5613 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
5614    
5615     Moved anything from extensions to libraries.
5616    
5617     * libraries: New.
5618    
5619     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
5620    
5621     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
5622     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
5623     been moved here from thuban/extensions/pyprojection/
5624     See there in the Attic for the older history.
5625    
5626     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
5627     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
5628     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
5629     have been moved here from thuban/extensions/pyshapelib/
5630     See there in the Attic for the older history.
5631    
5632     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
5633     files have been moved here from thuban/extensions/shapelib/
5634     See there in the Attic for the older history.
5635    
5636     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5637     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
5638     thuban/extensions/thuban/
5639     See there in the Attic for the older history.
5640    
5641     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
5642    
5643     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5644     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
5645    
5646     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
5647     Moved to libraries/shapelib.
5648    
5649     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
5650     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
5651     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
5652     Moved to libraries/pyshapelib.
5653    
5654     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
5655     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
5656     Moved to libraries/pyprojection.
5657    
5658     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
5659    
5660     * extensions: Removed.
5661    
5662 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
5663    
5664 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
5665     facilities of FileTestMixin so don't derive from it.
5666     (TestViewportWithPostGIS): New class with tests for using a
5667     viewport on a map with postgis layers.
5668    
5669     2003-08-19 Bernhard Herzog <[email protected]>
5670    
5671     Add the db connection management to the session.
5672    
5673     * Thuban/Model/session.py (Session.__init__): New instance
5674     variable db_connections
5675     (Session.AddDBConnection, Session.DBConnections)
5676     (Session.HasDBConnections, Session.CanRemoveDBConnection)
5677     (Session.RemoveDBConnection): New methods to manage and query the
5678     db connections managed by the session
5679     (Session.OpenDBShapeStore): New method to open a shapestore from a
5680     db connection
5681    
5682     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
5683     messages for the db connection handling in the session
5684    
5685     * test/test_postgis_session.py: New. test cases for the session's
5686     db connection handling with postgis connections
5687    
5688     2003-08-19 Bernhard Herzog <[email protected]>
5689    
5690 bh 1606 Add very basic postgis database support and the corresponding test
5691     cases. The test cases require a PostgreSQL + postgis installation
5692     but no existing database. The database will be created
5693     automatically by the test cases
5694    
5695     * test/README: Add note about skipped tests and the requirements
5696     of the postgis tests.
5697    
5698     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
5699    
5700     * test/test_postgis_db.py: New. Test cases for the postgis
5701     support.
5702    
5703     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
5704     format
5705    
5706     * test/test_wellknowntext.py: New. Test cases for the
5707     wellknowntext parser
5708    
5709     * test/postgissupport.py: New. Support module for tests involving
5710     a postgis database.
5711    
5712     * test/support.py (execute_as_testsuite): Shut down the postmaster
5713     if it's still running after the tests
5714    
5715     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
5716     well known text format
5717    
5718 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
5719    
5720     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
5721     message dialog.
5722    
5723 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
5724    
5725 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
5726     reason for the skips in the output to make it a bit more readable.
5727     (execute_as_testsuite): New helper function to run a test suite
5728     and print some more information.
5729     (run_tests): Use execute_as_testsuite to run the tests
5730    
5731     * test/runtests.py (main): Use execute_as_testsuite to run the
5732     tests
5733    
5734     2003-08-18 Bernhard Herzog <[email protected]>
5735    
5736 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
5737     changes introduced in Python 2.3:
5738    
5739     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
5740     filename is an absolute name
5741    
5742     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
5743     filename is an absolute name
5744    
5745     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
5746     unique filename to save to and use the correct relative filename
5747     in the expected output.
5748     (SaveSessionTest.test_dbf_table): Use the correct relative
5749     filename in the expected output.
5750    
5751     * test/test_layer.py (TestLayer.test_raster_layer): Update the
5752     test to check whether the filename is absolute.
5753    
5754 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
5755    
5756     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
5757    
5758 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
5759    
5760 bh 1594 Change the way shapes are returned by a shape store. The
5761     ShapesInRegion method returns an iterator over actual shape
5762     objects instead of a list of shape ids.
5763    
5764     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
5765     id.
5766     (ShapefileStore.ShapesInRegion): Return an iterator over the
5767     shapes which yields shape objects instead of returning a list of
5768     shape ids
5769     (ShapefileStore.AllShapes): New. Return an iterator over all
5770     shapes in the shape store
5771     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
5772    
5773     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
5774     doc-string.
5775    
5776     * Thuban/UI/baserenderer.py
5777     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
5778     layer_shapes and make it return an iterator containg shapes
5779     instead of a list of ids.
5780     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
5781     layer_shapes() change
5782    
5783     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
5784     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
5785    
5786     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
5787     changes in the ShapesInRegion return value.
5788     (ViewPort._get_hit_tester): Remove commented out code
5789    
5790     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
5791     new return value.
5792     (SimpleShapeStore.AllShapes): New. Implement this method too.
5793    
5794     * test/test_layer.py (TestLayer.test_arc_layer)
5795     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5796     (TestLayer.test_point_layer_with_projection)
5797     (TestLayer.test_derived_store): Adapt to changes in the
5798     ShapesInRegion return value.
5799    
5800     * test/test_shapefilestore.py
5801     (TestShapefileStoreArc.test_shapes_in_region)
5802     (TestShapefileStorePolygon.test_shapes_in_region)
5803     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
5804     in the ShapesInRegion return value.
5805     (TestShapefileStorePoint.test_all_shapes)
5806     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
5807     methods
5808    
5809     * test/test_derivedshapestore.py
5810     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
5811     the ShapesInRegion return value.
5812     (TestDerivedShapeStore.test_all_shapes)
5813     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
5814     methods
5815    
5816     2003-08-15 Bernhard Herzog <[email protected]>
5817    
5818 bh 1592 Make the renderers deal correctly with raw vs. python level
5819     representation of shape geometries
5820    
5821     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
5822     Return a flag useraw in addition to the callable and the parameter
5823     to indicate whether the callable can deal with the raw shape data
5824     or uses the higher level python lists of coordinates. The callable
5825     now should accept either the raw data or the return value of the
5826     shape's Points() method.
5827     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
5828     change
5829     (BaseRenderer.projected_points): Instead of the shape id use the
5830     points list as parameter.
5831     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
5832     (BaseRenderer.draw_point_shape): Adapt to projected_points()
5833     change and accept the points list as parameter instead of the
5834     shape id.
5835    
5836     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
5837     the useraw flag as required by the BaseRenderer
5838     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
5839     changes.
5840    
5841     * test/test_baserenderer.py
5842     (TestBaseRenderer.test_point_with_classification): New test for
5843     rendering a map with classifications.
5844    
5845     2003-08-15 Bernhard Herzog <[email protected]>
5846    
5847 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5848     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
5849     (ViewPort._get_hit_tester, ViewPort.projected_points)
5850     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
5851     (ViewPort._find_label_at): Split the find_shape_at method into
5852     several new methods and use the functions in the hit-test module.
5853    
5854     * Thuban/UI/hittest.py: New module with Python-level hit-testing
5855     functions
5856    
5857     * test/test_hittest.py: New. Test for the new hittest module
5858    
5859     2003-08-15 Bernhard Herzog <[email protected]>
5860    
5861 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
5862     projection to all corners of the bounding box to get a better
5863     approximation of the projected bounding box
5864    
5865     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
5866     New. Test coordinate handling of a layer with a projection.
5867     Catches the bug fixed in Layer.ShapesInRegion
5868    
5869     2003-08-15 Bernhard Herzog <[email protected]>
5870    
5871 bh 1586 Move some of the mock objects in test_baserenderer into their own
5872     module so they can easily be used from other tests
5873    
5874     * test/mockgeo.py: New test helper module with some mock objects
5875     for geometry related things like shapes, shapestores and
5876     projections.
5877    
5878     * test/test_mockgeo.py: New. Tests for the new helper module
5879    
5880     * test/test_baserenderer.py: Some of the mock-objects are in
5881     mockgeo now.
5882    
5883 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
5884    
5885     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
5886    
5887 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
5888    
5889 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
5890    
5891     2003-08-12 Bernhard Herzog <[email protected]>
5892    
5893 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
5894     strings have to be one string literal.
5895    
5896 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
5897    
5898 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
5899     New. This method was used in various derived classes, but it's
5900     better to have it here.
5901    
5902     * test/test_shapefilestore.py
5903     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
5904     FloatComparisonMixin
5905    
5906     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
5907     It's now in FloatComparisonMixin
5908    
5909     * test/test_derivedshapestore.py
5910     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
5911     in FloatComparisonMixin
5912    
5913     2003-08-11 Bernhard Herzog <[email protected]>
5914    
5915 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
5916     error message
5917    
5918 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
5919    
5920 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
5921     with version number.
5922     Changed title to reflect version number of Thuban.
5923    
5924     2003-08-08 Jan-Oliver Wagner <[email protected]>
5925    
5926 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
5927     the list corresponds to the "About" web page.
5928    
5929 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
5930    
5931     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
5932     Make sure translated strings are recognized as one string literal.
5933    
5934     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
5935     Make sure translated strings are recognized as one string literal.
5936    
5937     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
5938     translated strings are recognized as one string literal.
5939    
5940     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5941     sure translated strings are recognized as one string literal.
5942    
5943 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
5944    
5945 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
5946     Simply delegates to the original shapestore.
5947    
5948     * test/test_derivedshapestore.py
5949     (TestDerivedShapeStore.test_raw_format): New. Test case for
5950     DerivedShapeStore.RawShapeFormat
5951    
5952     2003-08-07 Bernhard Herzog <[email protected]>
5953    
5954 bh 1561 Add raw data interface to shape objects.
5955    
5956     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
5957     class to ShapefileShape which now holds shapefile specific
5958     information.
5959     (ShapefileShape.compute_bbox): Simplified to not cache any
5960     information. The way this method is used that shouldn't matter
5961     performance wise.
5962     (ShapefileShape.RawData): New. Return the shapeid which is the raw
5963     data format for shapes from shapefiles.
5964     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
5965     in the shape objects returned by a shapestore. For a
5966     ShapefileStore this is always RAW_SHAPEFILE.
5967     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
5968     method.
5969    
5970     * test/test_shapefilestore.py
5971     (TestShapefileStore.test_raw_format): New test to test the raw
5972     format feature of shapes.
5973    
5974 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
5975     data. It was only there for interface compatibility but it's not
5976 bh 1561 used inside of Thuban and the generic Shape class has gone away.
5977 bh 1560
5978 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
5979     the raw data format and only use an optimized version of its a
5980     shapefile.
5981    
5982 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
5983    
5984 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
5985     tests.
5986     (SimpleShapeStore.Shape): Use SimpleShape instead of
5987     Thuban.Model.data.Shape to make the tests independed of the coming
5988     changes.
5989    
5990     2003-08-07 Bernhard Herzog <[email protected]>
5991    
5992 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
5993     (ThubanTestProgram): New classes that extend the respective
5994     classes from unittest. These new version support skipping tests
5995     under certain expected conditions. In the Thuban test suite we
5996     uses this for tests that require the optional gdal support.
5997     (run_tests): Use ThubanTestProgram instead of the unittest.main()
5998    
5999     * test/runtests.py (main): Use the new ThubanTestRunner instead of
6000     the normal one from unittest
6001    
6002     * test/test_layer.py (TestLayer.test_raster_layer): If this test
6003     is not run because gdal support isn't available report this to the
6004     runner.
6005    
6006     * test/test_baserenderer.py
6007     (TestBaseRenderer.test_raster_no_projection): Do not run this test
6008     if gdal support isn't available and report this to the runner.
6009    
6010 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
6011    
6012     Rearrange the renderers a bit, partly in preparation for changes
6013     required for the postgis merge, partly to make it more testable.
6014     Also make the representation of coordinates in Shapes more
6015     consistent.
6016    
6017     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
6018     this class is now in BaseRenderer. This class is now practically
6019     only a specialization of BaseRenderer for rendering to an actual
6020     wx DC.
6021     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
6022     to get the shapetype specific rendering functions.
6023    
6024     * Thuban/UI/baserenderer.py: New file with the basic rendering
6025     logic. The code in this file is completely independend of wx.
6026     (BaseRenderer): Class with the basic rendering logic
6027    
6028     * test/test_baserenderer.py: New. Test cases for BaseRenderer
6029    
6030     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6031     error_on_redraw to guard agains endless loops and stack overflows
6032     when there's a bug in the rendering code that raises exceptions.
6033     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
6034     rendering into a separate method _do_redraw so that error handling
6035     is a bit easier. When an exception occurs, set error_on_redraw to
6036     true. When it's true on entry to OnIdle do nothing and return
6037     immediately.
6038    
6039     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
6040     Shape object will always have the coordinates as a list of list of
6041     coordinate pairs (tuples).
6042     (Shape.compute_bbox): Adapt to new representation.
6043    
6044     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
6045     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
6046     Shape objects.
6047    
6048     * test/test_shapefilestore.py
6049     (ShapefileStoreTests.assertFloatTuplesEqual)
6050     (ShapefileStoreTests.assertPointListEquals): Rename to
6051     assertPointListEquals and change purpose to checking equality of
6052     the lists returned by Shape.Points().
6053     (TestShapefileStoreArc.test_shape)
6054     (TestShapefileStorePolygon.test_shape)
6055     (TestShapefileStorePoint.test_shape): Use the new
6056     assertPointListEquals instead of assertFloatTuplesEqual
6057    
6058     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
6059     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
6060     and change purpose to checking equality of the lists returned by
6061     Shape.Points().
6062     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
6063     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
6064     (TestLayer.test_derived_store): Use the new assertPointListEquals
6065     instead of assertFloatTuplesEqual
6066    
6067     * test/test_derivedshapestore.py
6068     (TestDerivedShapeStore.assertFloatTuplesEqual)
6069     (TestDerivedShapeStore.assertPointListEquals): Rename to
6070     assertPointListEquals and change purpose to checking equality of
6071     the lists returned by Shape.Points().
6072     (TestDerivedShapeStore.test_shape): Use the new
6073     assertPointListEquals instead of assertFloatTuplesEqual
6074    
6075 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
6076    
6077     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
6078     a bounding box. A dialog is raised in case, no bounding box
6079     is found. This fixes bug #2043:
6080     https://intevation.de/rt/webrt?serial_num=2043
6081    
6082 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
6083    
6084     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
6085     object look like a Color instantiation. Formerly it looked like a
6086     tuple.
6087    
6088     * test/test_color.py (TestColor.test_repr)
6089     (TestColor.test_equality, TestColor.test_inequality): New. test
6090     some more apects of the Color class
6091     (TestTransparent.test_repr, TestTransparent.test_hex)
6092     (TestTransparent.test_equality): New. Test cases for the
6093     Transparent object.
6094    
6095 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
6096    
6097     * Doc/manual/thuban-manual.xml: a number of small improvements.
6098     The resulting file is the version submitted for GREAT-ER II.
6099    
6100 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
6101    
6102 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
6103     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
6104     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
6105    
6106     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
6107     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
6108     (ThubanEndBusyCursor): Add doc-strings
6109    
6110     2003-08-01 Bernhard Herzog <[email protected]>
6111    
6112 bh 1540 First step towards PostGIS integration. More abstraction by movin
6113     more code from the layer to the shapestore. More methods of the
6114     layer are now simply delegated to the equivalent method of the
6115     shapestore. The SHAPETYPE_* constants are now in data not in
6116     layer.
6117    
6118     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6119     (SHAPETYPE_POINT, Shape): Move these constants and classes from
6120     layer.py to data.py
6121     (ShapefileStore.__init__): More Initialization for the new methods
6122     and functionality.
6123     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
6124     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
6125     (ShapefileStore.Shape): New methods that were formerly implemented
6126     in the layer.
6127     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
6128     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
6129     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
6130     equivalents of the new shape methods. These versions are simply
6131     delegated to the original shapstore.
6132    
6133     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6134     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
6135     (Layer.SetShapeStore): Removed the initializatin of instance
6136     variables that were needed for the stuff that's now in
6137     ShapefileStore
6138     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
6139     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
6140     shapestore.
6141    
6142     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
6143     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
6144     instead of layer.
6145    
6146     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
6147    
6148     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
6149    
6150     * test/test_layer.py: Import the SHAPETYPE_* constants from data
6151     instead of layer.
6152     (TestLayer.test_derived_store): Remove the test for the exception
6153     when instantiating the DerivedShapeStore with an incompatible
6154     table which is now in test_derivedshapestore.py. Add some more
6155     tests of the layer methods to determine whether they work for a
6156     DerivedShapeStore as well.
6157    
6158 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
6159    
6160     * Doc/manual/thuban-manual.xml: Fix the list of required packages
6161     by just listing the name and where they can be found.
6162    
6163 frank 1532 2003-07-31 Frank Koormann <[email protected]>
6164    
6165     * Doc/manual/thuban-manual.xml:
6166     Changed the screenshot elements to figure.
6167     Changed some variablelist elements to itemizedlist.
6168     Added section on GDAL formats.
6169    
6170 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
6171    
6172     * Doc/manual/thuban-manual.xml: Added a few sentences about
6173     the Fix Border Color option when generating classes.
6174    
6175 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
6176    
6177     * Thuban/Model/classgen.py: Add docstrings. Rename specific
6178     Ramp instances to use lower_case_style.
6179    
6180     * Thuban/UI/classgen.py: Use renamed Ramp instances.
6181    
6182     * Thuban/UI/classifier.py: Add docstrings.
6183    
6184     * Thuban/UI/dock.py: Add docstrings.
6185    
6186     * test/test_classgen.py: Use renamed Ramp instances.
6187    
6188 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
6189    
6190 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
6191     was never used in Thuban.
6192    
6193     2003-07-30 Bernhard Herzog <[email protected]>
6194    
6195 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
6196     method directly instead of going through the transient_table
6197     method. This faster because transient_table may force the copy of
6198     a DBF file into the transient database and setting a table's title
6199     doesnm't affect the title of the associated transient table, so
6200     this fixes RT #2042
6201    
6202     * Thuban/UI/main.py (__version__): Don't import the already
6203     removed show_exception_dialog.
6204    
6205 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
6206    
6207 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6208     Put back this method and remove the equivalent function since we
6209     are setting the exception hook from within this class (OnInit).
6210    
6211     2003-07-29 Jonathan Coles <[email protected]>
6212    
6213 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
6214     Doc/manual/images/5_2_quantiles.png,
6215     Doc/manual/images/5_2_uniform_dist.png,
6216     Doc/manual/images/5_2_unique_values.png,
6217     Doc/manual/images/8_int_error.png: New screen shots.
6218    
6219     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
6220     some points, and added more screen shots.
6221    
6222 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
6223    
6224 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
6225    
6226     2003-07-29 Bernhard Herzog <[email protected]>
6227    
6228 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
6229     deprecated since before the 0.8 release and isn't used in Thuban
6230     itself anymore.
6231    
6232 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
6233    
6234 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
6235 jonathan 1506
6236     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
6237     python exception hook here so that we are sure to catch any
6238     Thuban exception that happen during initialization.
6239    
6240     * Thuban/UI/main.py (main): Don't set the exception hook here,
6241     it will get set in ThubanApplication.OnInit.
6242    
6243     2003-07-29 Jonathan Coles <[email protected]>
6244 jonathan 1503
6245     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6246     Removed and called it show_exception_dialog() so that the exception
6247     handler can be set before the class is created.
6248    
6249     * Thuban/UI/main.py (main): Install the exception handler before
6250     a ThubanApplication is created.
6251    
6252 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
6253    
6254     * po/it.po: New. Italian translation by Maurizio Napolitano
6255    
6256     * po/ru.po: New. Russian translation by Alex Shevlakov
6257    
6258 frank 1497 2003-07-29 Frank Koormann <[email protected]>
6259    
6260 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
6261     projections.
6262    
6263     2003-07-29 Frank Koormann <[email protected]>
6264    
6265 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
6266    
6267 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
6268    
6269 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
6270     on white background.
6271    
6272     2003-07-29 Jonathan Coles <[email protected]>
6273    
6274 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
6275     descriptions for the legend toolbar.
6276    
6277     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
6278     cursor from dialog box.
6279    
6280     2003-07-28 Jonathan Coles <[email protected]>
6281    
6282     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
6283    
6284     * Doc/manual/images/2_4_session_tree.png,
6285     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
6286     Doc/manual/images/4_2_layer_properties.png,
6287     Doc/manual/images/4_2_raster_layer_properties.png,
6288     Doc/manual/images/5_3_genclass.png,
6289     Doc/manual/images/5_classification.png,
6290     Doc/manual/images/6_projection.png,
6291     Doc/manual/images/7_1_table_view.png,
6292     Doc/manual/images/7_2_5_join.png: New screenshots.
6293    
6294     2003-07-24 Jonathan Coles <[email protected]>
6295    
6296     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
6297    
6298     2003-07-24 Jonathan Coles <[email protected]>
6299    
6300     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
6301     chapter on Layer Management.
6302    
6303     * Doc/manual/Makefile: New. Makefile to generate all formats for the
6304     manual and images.
6305    
6306 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
6307    
6308     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
6309     it annoys lintian which warns about these files not being
6310 jan 1767 executable. The #! isn't necessary here since if you absolutely
6311 bh 1483 must execute them you can always say "python <filename>".
6312    
6313     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
6314     superfluous code to set brush and pen for point shapes
6315    
6316     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
6317     belong in viewport anyway
6318    
6319 frank 1479 2003-07-24 Frank Koormann <[email protected]>
6320    
6321     * Doc/manual/thuban-manual.xml: Added section on table management.
6322    
6323 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
6324    
6325     * test/runtests.py (main): Recognize the long "verbose" option
6326     correctly.
6327    
6328 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
6329    
6330     * Doc/manual/thuban-manual.xml: Continue to write first revision
6331     of the manual.
6332    
6333     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
6334     with Begin/EndDrawing() calls to ensure we aren't doing to
6335     many updates to the dc during rendering.
6336     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
6337     a pen and brush argument so they need to be passed to the function.
6338    
6339     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
6340     Calculates the minimum and maximum scale values. Factored out
6341     of set_view_transform so that it could be used to zoom all the
6342     way into a single point.
6343     (ViewPort.set_view_transform): Call calc_min_max_scales().
6344     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
6345     if only a single point is selected.
6346    
6347     * Doc/manual/images/1_2_legend_close.png,
6348     Doc/manual/images/1_2_legend_dock.png,
6349     Doc/manual/images/1_2_mainwindow.png,
6350     Doc/manual/images/1_2_mainwindow.ps,
6351     Doc/manual/images/1_2_mainwindow.sk,
6352     Doc/manual/images/3_2_fullextent.png,
6353     Doc/manual/images/3_2_fulllayerextent.png,
6354     Doc/manual/images/3_2_fullshapeextent.png,
6355     Doc/manual/images/3_2_pan.png,
6356     Doc/manual/images/3_2_zoomin.png,
6357     Doc/manual/images/3_2_zoomout.png,
6358     Doc/manual/images/3_3_identify.png,
6359     Doc/manual/images/3_3_label.png,
6360     Doc/manual/images/3_5_invisible.png,
6361     Doc/manual/images/3_5_movedown.png,
6362     Doc/manual/images/3_5_moveup.png,
6363     Doc/manual/images/3_5_props.png,
6364     Doc/manual/images/3_5_tobottom.png,
6365     Doc/manual/images/3_5_totop.png,
6366     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
6367    
6368 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
6369    
6370 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
6371    
6372     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
6373     after the new map has been assigned
6374    
6375     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
6376     Delegate MAP_REPLACED to the canvas too
6377     (MainWindow.prepare_new_session): Removed. Thanks to the new
6378     MAP_REPLACED message it's no longer needed
6379     (MainWindow.OpenSession, MainWindow.NewSession):
6380     prepare_new_session has been removed.
6381    
6382     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
6383     MAP_REPLACED so that we can close the dialog if a new map is set.
6384     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
6385     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
6386     dialog
6387    
6388     * test/test_viewport.py (SimpleViewPortTest)
6389     (SimpleViewPortTest.test_default_size): Add doc-strings
6390     (ViewPortTest.setUp): Bind map to self.map so we can use it in
6391     tests. Subscribe to MAP_REPLACED messages too.
6392     (ViewPortTest.tearDown): No need to explicitly unsubscribe
6393     (ViewPortTest.test_set_map): New test for the SetMap method.
6394    
6395     2003-07-18 Bernhard Herzog <[email protected]>
6396    
6397 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
6398     Move this test from ViewPortTest.setUp to this new separate test
6399     case. setUp is not the place for the actual tests.
6400     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
6401     more of the test from setUp to the new test test_inital_settings.
6402     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
6403     (ViewPortTest.test_proj_conv): Split test_proj_conv into
6404     test_win_to_proj and test_proj_to_win and make the tests easier to
6405     understand
6406     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
6407     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
6408     (ViewPortTest.test_unprojected_rect_around_point)
6409     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
6410     Reformat to increase readability.
6411    
6412     2003-07-18 Bernhard Herzog <[email protected]>
6413    
6414 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
6415    
6416     2003-07-18 Bernhard Herzog <[email protected]>
6417    
6418 bh 1459 * test/runtests.py: The test suite can now be run without an X
6419     connection. To make sure this remains true, remove the DISPLAY
6420     environment variable so that an error occurs if the wxGTK is
6421     imported accidentally
6422    
6423     2003-07-18 Bernhard Herzog <[email protected]>
6424    
6425 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
6426    
6427     * Thuban/UI/view.py: Remove unused imports
6428    
6429     2003-07-18 Bernhard Herzog <[email protected]>
6430    
6431 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
6432     function is now in viewport.py and is called output_transform
6433     (TestScalebar.test_output_transform)
6434     (TestScalebar.test_OutputTransform): Renamed to
6435     test_output_transform and updated to use output_transform instead
6436     of OutputTransform
6437    
6438     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
6439     renamed.
6440     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
6441     renamed to output_transform
6442    
6443     * Thuban/UI/viewport.py (OutputTransform, output_transform):
6444     Rename to output_transform
6445    
6446     2003-07-18 Bernhard Herzog <[email protected]>
6447    
6448 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
6449     classificationField to classificatin_column and init it here so
6450     that it can be used in SetClassificationColumn
6451     (Layer.GetClassificationColumn, Layer.GetClassificationField):
6452     Rename to GetClassificationColumn.
6453     (Layer.SetClassificationColumn, Layer.SetClassificationField):
6454     Rename to SetClassificationColumn and issue a LAYER_CHANGED
6455     message if the column changes.
6456     (Layer._classification_changed, Layer.ClassChanged): Rename to
6457     _classification_changed. Update the callers.
6458     (Layer.SetShapeStore): Further field->column renames.
6459    
6460     * Thuban/Model/load.py (SessionLoader.start_classification)
6461     (SessionLoader.start_clpoint): Updates because of
6462     field->column method name changes in the Layer class
6463    
6464     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
6465     because of field->column method name changes in the Layer class
6466    
6467     * Thuban/UI/classifier.py (Classifier.__init__)
6468     (Classifier._OnTry, Classifier._OnRevert): Updates because of
6469     field->column method name changes in the Layer class
6470    
6471     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
6472     because of field->column method name changes in the Layer class
6473    
6474     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
6475     of field->column method name changes in the Layer class
6476    
6477     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
6478     (SaveSessionTest.testClassifiedLayer): Update because of
6479     field->column method name changes in the Layer class
6480    
6481     * test/test_layer.py (SetShapeStoreTests.setUp)
6482     (SetShapeStoreTests.test_sanity): Update because of field->column
6483     method name changes in the Layer class
6484     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
6485     (TestLayerModification.test_sanity)
6486     (TestLayerModification.test_initial_settings): remove unsued code
6487     and rename to test_sanity.
6488     (TestLayerModification.test_set_classification): New test for
6489     SetClassification and SetClassificationField.
6490    
6491     2003-07-18 Bernhard Herzog <[email protected]>
6492    
6493 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
6494     the non-fixed values as well. The old test would have accepted a
6495     fixed ramp that only returnes the fixed properties
6496    
6497 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
6498    
6499     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
6500     shots for the manual. The XCF file is the source image and
6501     has additional layers to support changes.
6502    
6503     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
6504    
6505     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
6506     Return both the new class and the field name.
6507    
6508     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
6509     fit the map to the window as this changes any zoom level that
6510     the user may have set.
6511    
6512 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
6513    
6514     * Thuban/Model/classgen.py (generate_singletons,
6515     generate_uniform_distribution, generate_quantiles): Remove
6516     fixes parameter, but maintain the same functionality by having
6517     the calling function pass a FixedRamp object for the ramp.
6518     (FixedRamp): New. Adapts a ramp to have fixed property values.
6519    
6520     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
6521     (Classification): Inherit from Publisher.
6522     (Classification.__init__): Remove the layer parameter.
6523     Classifications no longer need to have a parent layer.
6524     (Classification.GetField, Classification.GetFieldType,
6525     Classification.SetFieldInfo): Removed. The field name is stored
6526     in the layer, and the type can be retreived by calling
6527     Layer.GetFieldType().
6528     (Classification._set_layer, Classification.GetLayer): Removed.
6529     Classifications no longer have a parent layer.
6530    
6531     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
6532     classification.
6533     (Layer.SetShapeStore): Reset the classification first while
6534     we still have the old shape store to work with.
6535     (Layer.GetClassificationField, Layer.SetClassificationField):
6536     New. Method for getting/setting the field to classify on.
6537     (Layer.SetClassification): Simplified now that the layer
6538     simply has to hold a reference to the classification and not
6539     tell the classification who owns it.
6540     Fixes RTbug #2023.
6541    
6542     * Thuban/Model/load.py (SessionLoader.start_classification):
6543     Set the field name on the layer, not the classification.
6544    
6545     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
6546     classification is modified.
6547    
6548     * Thuban/Model/save.py (SessionSaver.write_classification):
6549     Get the field name and type from the layer.
6550    
6551     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
6552     parameter records to rows and add docstring. Fixes RTbug #1997.
6553    
6554     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
6555     ramp when we need to fix certain values of a ramp rather than
6556     using the old fixes parameter. Fixes RTbug #2024.
6557    
6558     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
6559     parameter.
6560     (ClassTable.Reset): Add fieldType parameter and use it, rather
6561     than asking the classification.
6562     (Classifier.__init__): Remember the original class's field
6563     and ask the layer for the field type, rather than the classification.
6564     (Classifier.__SetGridTable): Retrieve the field and field type
6565     for the table because they are not in the classification.
6566     (Classifier._OnTry, Classifier._OnRevert): Set the classification
6567     field on the layer in addition to the classification itself.
6568    
6569     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
6570     classification field from layer.
6571    
6572     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
6573     classification field from layer. Split up tests and remove
6574     *-imports. Fixes RTbug #1992.
6575    
6576     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
6577    
6578     * test/test_classification.py
6579     (TestClassification.test_classification): Remove tests for methods
6580     that no longer exist.
6581    
6582     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
6583     __init__ no longer has a field parameter, use SetClassificationField.
6584     (SetShapeStoreTests.test_sanity): Use layer object to get class
6585     field info.
6586    
6587     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
6588     SetClassificationField on layer to set class field info.
6589    
6590     * test/test_viewport.py: Renamed from test/test_view.py.
6591    
6592 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
6593    
6594     * Doc/manual/thuban-manual.xml: Added authors and an initial
6595     coarse structure.
6596    
6597 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
6598    
6599 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
6600     and therefore should not be derived from any other class.
6601    
6602     * test/test_range.py (RangeTest): FloatComparisonMixin is a
6603     mix-in, so derive from TestCase as well.
6604    
6605     2003-07-15 Bernhard Herzog <[email protected]>
6606    
6607 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
6608     draw_func handling a bit to remove one layer of indirection. This
6609     makes the renderer about 10% faster in the non-classifying case
6610     and the code a bit cleaner
6611     (MapRenderer.draw_point_shape): Add the pen and brush parameters
6612     and set them in the dc. Now the draw_point_shape method and
6613     wxproj's draw_polygon_shape function have basically the same
6614     signature so that both can be directly used as draw_func
6615    
6616     2003-07-15 Bernhard Herzog <[email protected]>
6617    
6618 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
6619     string values (in addition to the labels) as UTF 8
6620    
6621     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
6622     values if the field type is string
6623    
6624     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
6625     saving a session with non-ascii string classification values.
6626    
6627     * test/test_load.py (TestClassification.file_contents)
6628     (TestClassification.test): Check for non-ascii values in string
6629     classifications
6630    
6631 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
6632    
6633     * test/test_view.py: New. Tests for ViewPort.
6634    
6635 frank 1409 2003-07-14 Frank Koormann <[email protected]>
6636    
6637     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
6638     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
6639    
6640 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
6641     unicode strings from session file: session title, map title and
6642     projection name.
6643    
6644 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
6645    
6646 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
6647     drag_stop, not drag_move when the mouse is released.
6648    
6649     2003-07-10 Jonathan Coles <[email protected]>
6650    
6651 jonathan 1403 The most important part of this is the seperation of view.py into
6652     two pieces. viewport.py now has a class called ViewPort which
6653     contains all the non-wx parts of view.py and can therefore be
6654     tested. view.py contains only the wx-specific parts and is fairly
6655     simple.
6656    
6657     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
6658     RTTbug #1992.
6659     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
6660     RTTbug #1992.
6661    
6662     * Thuban/Model/classgen.py (generate_singletons,
6663     generate_uniform_distribution, generate_quantiles):
6664     Added 'fixes' parameter so that property attributes can
6665     be held constant over the generated classification groups.
6666     (CustomRamp.GetProperties): Remove unused variables.
6667    
6668     * Thuban/Model/map.py (Map.SetProjection): Send the old
6669     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
6670     event.
6671    
6672     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
6673     parameter which is a list of records that restricts which
6674     records are saved. Fixes RTbug #1997.
6675    
6676     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6677     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
6678    
6679     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
6680     to allow the user to fix line color/width on generated groups.
6681     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
6682     functions to optionally fix group properties.
6683    
6684     * Thuban/UI/main.py (main): Set exception hook to the
6685     ShowExceptionDialog. Fixes RTbug #1993.
6686    
6687     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
6688     the table window when it is selectd to be shown.
6689    
6690     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
6691     Export Selection button and move the export buttons underneath
6692     the table.
6693     (QueryTableFrame.UpdateStatusText): Added event argument so
6694     that it can respond to grid selection events. The status text
6695     is now updated even when the table is not associated with a
6696     layer as was previously assumed.
6697     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
6698     UpdateStatusText responds to these events.
6699     (QueryTableFrame.OnSaveAs): Renamed to doExport.
6700     (QueryTableFrame.doExport): Helper function that saves the
6701     entire table, or selected rows, to a file.
6702     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
6703     Respond to export button events and call doExport.
6704    
6705     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
6706     the function doesn't return NULL without first setting a Python
6707     Error.
6708    
6709     * test/runtests.py (main): Only print "Unknown option" for
6710     unsupported options.
6711    
6712     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
6713     optional epsilon argument to specify floating point accuracy.
6714     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
6715     for each item test.
6716    
6717     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
6718     tests for saving selected records.
6719    
6720     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6721     tests for saving selected records.
6722    
6723     * test/test_map.py (TestMapWithContents.test_set_projection):
6724     MAP_PROJECTION_CHANGED events send the old projection.
6725    
6726     * test/test_session.py
6727     (TestSessionWithContent.test_forward_map_projection):
6728     MAP_PROJECTION_CHANGED events send the old projection.
6729    
6730     * test/test_table.py (TableTest): Update tests to use non-deprecated
6731     functions.
6732    
6733 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
6734    
6735 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
6736     constants in the column objects are the standard ones defined in
6737     the table module.
6738    
6739     * test/test_transientdb.py
6740     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
6741     exporting transient tables as DBF works. This should catch the bug
6742     just fixed in TransientTableBase.Width.
6743    
6744     2003-07-08 Bernhard Herzog <[email protected]>
6745    
6746 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
6747     interpolated colors correctly.
6748    
6749     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
6750     New. Test case for the fix in classgen.py
6751    
6752     2003-07-08 Bernhard Herzog <[email protected]>
6753    
6754 bh 1378 * test/runtests.py (main): Make the default output less verbose
6755     and add a verbosity option (-v) to get the old output
6756    
6757     2003-07-08 Bernhard Herzog <[email protected]>
6758    
6759 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
6760     0.9.
6761    
6762     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
6763     New. Return the join type
6764    
6765     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
6766     DTD
6767     (SessionSaver.write_data_containers): Save the join type for
6768     joined tables
6769    
6770     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
6771     namespace
6772     (SessionLoader.start_jointable): Handle the jointype attribute
6773    
6774     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
6775     as of Thuban 0.8. These are now tests to determine whether Thuban
6776     can still read files generated by Thuban 0.8
6777    
6778     * test/test_load.py (LoadSessionTest.dtd)
6779     (TestSingleLayer.file_contents)
6780     (TestLayerVisibility.file_contents, TestLabels.file_contents)
6781     (TestLayerProjection.file_contents)
6782     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
6783     (TestJoinedTable.file_contents)
6784     (TestLoadError.file_contents): Update for new DTD
6785     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
6786     for new join type attribute
6787    
6788     * test/test_save.py (SaveSessionTest.dtd)
6789     (SaveSessionTest.testEmptySession)
6790     (SaveSessionTest.testSingleLayer)
6791     (SaveSessionTest.testLayerProjection)
6792     (SaveSessionTest.testRasterLayer)
6793     (SaveSessionTest.testClassifiedLayer)
6794     (SaveSessionTest.test_dbf_table)
6795     (SaveSessionTest.test_joined_table): Update for new DTD
6796     (SaveSessionTest.test_joined_table): Add test for new join type
6797     attribute
6798    
6799 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
6800    
6801     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
6802     function for table_to_dbf
6803     (table_to_dbf): Deal with names longer than the 10 character limit
6804    
6805     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6806     doc-string
6807     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
6808     long column names
6809    
6810 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
6811    
6812 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
6813    
6814     2003-07-03 Bernhard Herzog <[email protected]>
6815    
6816 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
6817     for the Thuban manual and README with some basic information about
6818     the manual
6819    
6820     2003-07-03 Bernhard Herzog <[email protected]>
6821    
6822 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6823     Update doc-string
6824     (TransientJoinedTable.create): Do not modify the column objects of
6825     the input tables in place and copy all columns of the input tables
6826     into the joined table after all.
6827    
6828     * test/test_transientdb.py
6829     (TestTransientTable.test_transient_joined_table_same_column_name):
6830     Update to reflect the new behavior
6831     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6832     Update to reflect the new behavior
6833     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
6834     New test case for a bug which modified the column objects in place
6835    
6836 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
6837 jonathan 1349
6838 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
6839     generate_uniform_distribution, generate_quantiles,
6840 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
6841     one, otherwise we could divide by zero.
6842    
6843     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
6844     ClassGenTest.doClassSingleTest): Call doBoundsTest to
6845     check the end classification groups against the
6846     proper property values.
6847     (ClassGenTest.doBoundsTest): New. Checks the first and
6848     last classification groups to make sure their properties
6849     are the correct upper and lower bounds for a color ramp.
6850    
6851     2003-07-02 Jonathan Coles <[email protected]>
6852    
6853     * Thuban/Model/classgen.py (generate_singletons,
6854     generate_uniform_distribution, generate_quantiles,
6855 jonathan 1360 GenQuantiles0): The denominator was one to high when
6856     calculating the index for the ramp causing the index
6857     to never to reach one.
6858    
6859     2003-07-02 Jonathan Coles <[email protected]>
6860    
6861 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
6862     ClassGroupRange.SetRange() so that the min/max values are
6863     passed as a tuple. This makes a better calling scheme for
6864     when a Range object is passed instead.
6865    
6866     * Thuban/Model/classgen.py: Fixed parameters to
6867     ClassGroupRange constructor.
6868    
6869     * Thuban/Model/classification.py (ClassGroupRange.__init__):
6870     Consolidate the min/max parameters into a single _range which
6871     can either be a tuple or a Range object.
6872     (ClassGroupRange.SetRange): Consolidate the min/max parameters
6873     into a single _range which can either be a tuple or a Range object.
6874    
6875     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
6876     call to ClassGroupRange constructor to use a tuple.
6877    
6878     * Thuban/Model/layer.py (Layer.SetClassification): Switch
6879     the classification instance variable to the new class
6880     before calling _set_layer otherwise subscribers to a
6881     LAYER_CHANGED event will not see any difference.
6882    
6883     * test/test_classification.py: Fix tests of ClassGroupRange
6884     so that they use the new signature.
6885    
6886     * test/test_load.py: Fix use of ClassGroupRange so that it
6887     uses the new signature.
6888    
6889     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
6890     uses the new signature.
6891    
6892     * test/test_save.py: Fix use of ClassGroupRange so that it
6893     uses the new signature.
6894    
6895    
6896     2003-07-01 Jonathan Coles <[email protected]>
6897    
6898 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
6899     Import used objects/class from color.
6900     (generate_singletons): We don't
6901     need the numGroups parameter anymore because we are using
6902     the new ramps with GetProperties().
6903     (generate_uniform_distribution): Use new ramp method
6904     GetProperties().
6905     (generate_quantiles, GenQuantiles0): Use new ramp method
6906     GetProperties().
6907     (CustomRamp.SetNumGroups): Removed. The ramps now map
6908     a value from 0 to 1 to class properties so the number
6909     of groups is not needed ahead of time.
6910     (CustomRamp.next): Removed. CustomRamp does not support
6911     interation anymore.
6912     (CustomRamp.GetProperties): Returns a ClassGroupProperties
6913     object based on the index value from 0 to 1 that is
6914     passed to it.
6915     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
6916     Made into instances of Monochromatic class instread of
6917     deriving from it.
6918     (HotToCold.SetNumGroups): Removed. See CustomRamp.
6919     (HotToCold.next): Removed. See CustomRamp.
6920    
6921     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
6922     (Classification.SetField, Classification.SetFieldType):
6923     Replaced with SetFieldInfo.
6924     (Classification.SetFieldInfo): New. Does a better job of
6925     what SetField and SetFieldType used to do by combining
6926     their function since they should really always be done
6927     at the same time.
6928     (Classification.SetLayer): Renamed to _set_layer.
6929     (Classification._set_layer): Should only be called from
6930     Layer's SetClassification. This does not cause a recursive
6931     call as SetLayer did because we know that Layer knows about
6932     the classification.
6933    
6934     * Thuban/Model/color.py: Fixes RTbug #1971.
6935     (_Transparent): Renamed from Transparent so it doesn't
6936     conflict with the module variable.
6937     (Transparent, Black): Renamed from Color.Transparent,
6938     Color.Black so they are not class variables.
6939    
6940     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
6941     (Layer.Destroy): We don't need to call SetClassification
6942     anymore to clear out the back reference in the classifcation
6943     to the layer. It's better to set it to None using _set_layer,
6944     and we won't be creating another clas object too.
6945     (Layer.SetClassification): Classification._set_layer is not
6946     recursive so remove all the locking variables. Also clean
6947     up the code so that it remains unchanged if something fails.
6948    
6949     * Thuban/Model/load.py: Fixes RTbug #1971.
6950     (SessionLoader.start_classification): Call
6951     Classification.SetFieldInfo().
6952    
6953     * Thuban/Model/save.py: Removed import of Color which wasn't
6954     being used.
6955    
6956     * Thuban/UI/classgen.py: Fixes RTbug #1972.
6957     (ClassGenDialog.__init__): Color ramps are now instances
6958     already so we don't need to create any new objects.
6959     (ClassGenDialog.OnOK): Check for numGroups is no longer
6960     necessary because we never use it.
6961    
6962     * Thuban/UI/classifier.py: Fixes RTbug #1971.
6963     (Classifier.__BuildClassification, Classifier.__SetGridTable):
6964     Call Classification.SetFieldInfo() instead of SetFieldType.
6965    
6966     * Thuban/UI/renderer.py: Fixes RTbug #1971.
6967    
6968     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
6969     (MapCanvas.__init__): Subscribe to the idle time event. Set
6970     background color to white.
6971     (MapCanvas.OnPaint): Set a flag indicating that we should
6972     render the map during idle time. If we already have a bitmap
6973     just draw it now.
6974     (MapCanvas.OnIdle): New. Render the map only during idle time.
6975     This also fixes a problem with the busy cursor under gtk.
6976    
6977     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
6978     Fix calls to generate_singletons because the signature changed.
6979    
6980     * test/test_classification.py: Fix color references and
6981     change calls to Classification.[SetField|SetFieldType] to
6982     SetFieldInfo.
6983    
6984     * test/test_load.py: Fix color references.
6985    
6986     * test/test_load_0_2.py: Fix color references.
6987    
6988     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
6989     Change calls to Classification.[SetField|SetFieldType] to
6990     SetFieldInfo.
6991    
6992 frank 1334 2003-07-01 Frank Koormann <[email protected]>
6993    
6994     MERGE from the greater-ms3 branch.
6995    
6996     * test/test_transientdb.py
6997     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6998     New. Test join of two tables with partly equal column names.
6999    
7000     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
7001     If duplicates in left and right tables column names are found,
7002     append '_' (underscores) to the name until it is unique.
7003     Create always new internal names for the resulting table and reference
7004     columns in the join statement with <table>.<column>
7005    
7006 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
7007    
7008     * test/test_transientdb.py
7009     (TestTransientTable.test_transient_joined_table_same_column_name):
7010     New. Test whether joining on columns with the same names in both
7011     tables works.
7012 frank 1334
7013 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
7014     sure to use the right internal names even when joining on field
7015     with the same names in both tables. Also, detect duplicate names
7016     in the joined table correctly.
7017    
7018 frank 1325 2003-07-01 Frank Koormann <[email protected]>
7019    
7020     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
7021     Reverse List of layers to render in same order as in desktop legend.
7022    
7023 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
7024    
7025 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
7026     and splits it into a tuple of at most three integers.
7027     Used make_tuple() to make tuple versions of the version
7028     numbers.
7029    
7030     * Thuban/UI/about.py: Add Thuban email addresses.
7031    
7032     2003-06-30 Jonathan Coles <[email protected]>
7033    
7034 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
7035     were too high.
7036    
7037     2003-06-30 Jonathan Coles <[email protected]>
7038    
7039 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
7040    
7041     * MANIFEST.in: Added Projections so that default.proj is
7042     included.
7043    
7044 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
7045    
7046     New About box with lots more information including library
7047     versions and credits. More/better version checking before
7048     Thuban starts.
7049    
7050     * Thuban/UI/about.py: New. New About box that displays
7051     library version information and credits.
7052    
7053     * Thuban/version.py: Added new 'versions' dictionary which
7054     contains the verions of various libraries which are checked
7055     when the module loads.
7056     (verify_versions): Check all version numbers and returns
7057     a list of errors.
7058    
7059     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
7060     Reset the status of the buttons as the situation warrants,
7061     but in a better more reliable way by not relying on the
7062     current status to determine what needs to change.
7063    
7064     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
7065     (verify_versions): Remove most of the code since it is
7066     now in Thuban.version.verify_versions.o
7067    
7068     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
7069     About box in Thuban.UI.about.
7070    
7071     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
7072     Returns the version of gdal library being used as a string.
7073    
7074     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
7075     Removed.
7076     (get_proj_version): Return the version of PROJ that the file
7077     was compiled with.
7078     (get_gtk_version): Return th version of GTK that the file
7079     was compiled with.
7080    
7081 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
7082    
7083     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
7084     of the SelectPropertiesDialog should be self so the window
7085     appears on top.
7086     (ClassGroupPropertiesCtrl.DoEdit): The parent
7087     of the SelectPropertiesDialog should be self so the window
7088     appears on top.
7089    
7090     * Thuban/UI/resource.py: Cleaned up how we determine file
7091     extensions.
7092     (GetImageResource): Return an wxImage from our Resources.
7093    
7094 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
7095    
7096     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
7097     Check that a layer has a classification before trying
7098     to get it. Raster layers don't have classifications.
7099    
7100 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
7101 jonathan 1297
7102     * setup.py: Add Resources/XML to resource list.
7103    
7104     2003-06-23 Jonathan Coles <[email protected]>
7105 jonathan 1286
7106 jonathan 1297 * setup.cfg: Fix copyright dates
7107    
7108     2003-06-23 Jonathan Coles <[email protected]>
7109    
7110 jonathan 1294 * MANIFEST.in: Update with Resources/XML
7111    
7112     * setup.py: Don't include Locale resources yet as we don't
7113     have any and it causes problems building the distribution
7114     for Windows. Update version to 0.8.0.
7115    
7116     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
7117    
7118     * Thuban/UI/mainwindow.py: Add blank line at the end because
7119     file was not being read correctly building the Windows
7120     distribution.
7121    
7122     2003-06-23 Jonathan Coles <[email protected]>
7123    
7124 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
7125    
7126     * Thuban/version.py: Temporarily update longversion for
7127     the 0.8 release so that it doesn't have the cvs revision.
7128    
7129     2003-06-23 Jonathan Coles <[email protected]>
7130    
7131 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
7132     to make sure that we don't create reentrant possibilities with
7133     wxYield.
7134    
7135     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
7136     directly to avoid the wxSafeYield() call which generates an
7137     OnPaint event causing infinite recursion. Don't try to catch
7138     exception anymore. This was for before there were limits on map
7139     scaling.
7140    
7141 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
7142    
7143     Bug fix for RT #1961:
7144    
7145     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
7146     Register DerivedShapestores with the session
7147    
7148     * Thuban/Model/session.py (Session.Tables): Make sure each table
7149     is only listed once.
7150    
7151     * test/test_load.py (TestJoinedTable.test): Add check_format call.
7152     Update file contents to match the one written out.
7153    
7154 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
7155    
7156     * test/xmlsupport.py (SaxEventLister.startElementNS)
7157     (SaxEventLister.endElementNS): Do not include the qname. Python
7158     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
7159     is (presumably incorrectly) None, whereas it's a string with the
7160     element name in the later versions.
7161    
7162     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
7163     (TestEventList.test_even_list_namespace): Update tests to reflect
7164     the new behaviour
7165     (TestEventList.test_even_list_id_normalization): Fix doc-string
7166    
7167 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
7168    
7169 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
7170     by deriving classes to determine if that layer supports shapes.
7171     (Layer): Override HasShapes and return true.
7172    
7173     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
7174     instead of a direct call to wx[Begin|End]CusyCursor().
7175     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
7176     table data.
7177    
7178     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
7179     New. Wrappers around the wxWindows functions that allow us to
7180     make additional calls such as wxYield which gives the native
7181     system a chance to update the cursor correctly.
7182    
7183     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
7184     instead of a direct call to wx[Begin|End]CusyCursor().
7185    
7186     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
7187     instead of a direct call to wx[Begin|End]CusyCursor().
7188     (MapCanvas.find_shape_at): Check if the current search layer
7189     support shapes, otherwise go on to the next layer.
7190    
7191     * test/test_layer.py: Add tests in each type of layer for
7192     HasClassification() and HasShapes()
7193    
7194     2003-06-20 Jonathan Coles <[email protected]>
7195    
7196 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
7197     turning on the busy cursor to allow the system to change the
7198     cursor before we begin painting. This fixes a problem that
7199     was occuring only under GTK. Fixes RTbug #1840.
7200    
7201 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
7202    
7203     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
7204     version.
7205    
7206     * Thuban/Model/save.py (sort_data_stores): New. Make topological
7207     sort of the data sources so they can be written with sources that
7208     data sources that depend on other data sources come after the
7209     sources they depend on.
7210     (SessionSaver.__init__): Add idmap instance variable to map from
7211     objects to the ids used in the file.
7212     (SessionSaver.get_id, SessionSaver.define_id)
7213     (SessionSaver.has_id): New. Methods to manage the idmap
7214     (SessionSaver.write): Use thuban-0.8.dtd
7215     (SessionSaver.write_session): Add a namespace on the session and
7216     write out the data sources before the maps.
7217     (SessionSaver.write_data_containers): New. Write the data
7218     containers.
7219     (SessionSaver.write_layer): Layer elements now refer to a
7220     shapestore and don't contain filenames anymore.
7221    
7222     * Thuban/Model/load.py (LoadError): Exception class to raise when
7223     errors in the files are discovered
7224     (SessionLoader.__init__): Define dispatchers for elements with a
7225     thuban-0.8 namespace too.
7226     (SessionLoader.check_attrs): New helper method to check and
7227     convert attributes
7228     (AttrDesc): New. Helper class for SessionLoader.check_attrs
7229     (SessionLoader.start_fileshapesource)
7230     (SessionLoader.start_derivedshapesource)
7231     (SessionLoader.start_filetable, SessionLoader.start_jointable):
7232     Handlers for the new elements in the new fileformat
7233     (SessionLoader.start_layer): Handle the shapestore attribute in
7234     addition to filename.
7235     (SessionLoader.start_table, SessionLoader.end_table): Removed.
7236     They were never used in the old formats and aren't needed for the
7237     new.
7238    
7239     * Thuban/Model/session.py (Session.DataContainers): New method to
7240     return all "data containers", i.e. shapestores and tables
7241    
7242     * test/xmlsupport.py (SaxEventLister.__init__)
7243     (SaxEventLister.startElementNS, sax_eventlist): Add support to
7244     normalize IDs.
7245    
7246     * test/test_xmlsupport.py
7247     (TestEventList.test_even_list_id_normalization): New test case for
7248     id normalization
7249    
7250     * test/test_load.py (LoadSessionTest.check_format): Use ID
7251     normalization
7252     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
7253     class atrributes used for ID normalization
7254     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
7255     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
7256     file format
7257     (TestJoinedTable): New test for loading sessions with joined
7258     tables.
7259     (TestLoadError): New. Test whether missing required attributes
7260     cause a LoadError.
7261    
7262     * test/test_save.py (SaveSessionTest.thubanids)
7263     (SaveSessionTest.thubanidrefs): New class attributes for ID
7264     normalization in .thuban files.
7265     (SaveSessionTest.compare_xml): Use id-normalization.
7266     (SaveSessionTest.testEmptySession)
7267     (SaveSessionTest.testLayerProjection)
7268     (SaveSessionTest.testRasterLayer)
7269     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
7270     (SaveSessionTest.testLayerProjection): The filename used was the
7271     same as for testSingleLayer. Use a different one.
7272     (SaveSessionTest.test_dbf_table)
7273     (SaveSessionTest.test_joined_table): New test cases for saving the
7274     new data sources structures.
7275     (TestStoreSort, MockDataStore): Classes to test the sorting of the
7276     data stores for writing.
7277    
7278     * test/runtests.py: Add CVS keywords
7279    
7280 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
7281    
7282 jonathan 1267 * test/test_session.py
7283     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
7284     Use the cultural_landmark-point.dbf file for the store so that
7285     the table rows and shape count match.
7286    
7287     2003-06-20 Jonathan Coles <[email protected]>
7288    
7289 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
7290     an exception if the number of shapes is different from the
7291     number of rows in the table. Address RTbug #1933.
7292    
7293     * test/test_layer.py (TestLayer.test_derived_store): Add
7294     a test for the new exception in DerivedShapeStore.__init__.
7295    
7296     * test/support.py (FloatTestCase): Removed since there is
7297     already FloatComparisonMixin. Fixes RTbug #1954.
7298     (FloatComparisonMixin.assertFloatEqual): Include test for
7299     infinity that was part of FloatTestCase.
7300    
7301     * test/test_range.py (RangeTest): Inherit from
7302     support.FloatComparisonMixin now that we don't have
7303     support.FloatTestCase.
7304    
7305 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
7306    
7307 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
7308     the implementation in xmlsupport instead.
7309     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
7310    
7311     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
7312     of test_save
7313    
7314     2003-06-20 Bernhard Herzog <[email protected]>
7315    
7316 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
7317     method to make sure the test files we load might have been written
7318     by the current thuban version.
7319     (ClassificationTest.TestLayers, TestSingleLayer.test)
7320     (TestLayerVisibility.test, TestClassification.test)
7321     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
7322     Add check_format() calls and fix the thuban data to match the data
7323     that would be written by saving the session loaded from it.
7324    
7325     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
7326     the same class and function in test_save.
7327    
7328     * test/test_xmlsupport.py (TestEventList): New. test cases for
7329     sax_eventlist
7330    
7331     2003-06-20 Bernhard Herzog <[email protected]>
7332    
7333 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
7334     Thuban are covered by this DTD
7335     (map): Fix content model for layers and raster layers. There can
7336     be any number or layers and raster layers in any order.
7337    
7338 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
7339    
7340 jonathan 1265 This is mainly about fixing RTbug #1949.
7341    
7342 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
7343     import statement since python 2.2 is the earliest supported
7344     version.
7345    
7346     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
7347     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
7348     depending on the units this projection *forwards* into.
7349    
7350     * Thuban/Model/save.py (SessionSaver.write_classification):
7351     Remove unnecessary use of lambdas and nested functions.
7352    
7353     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
7354     adjustment here if the map projection uses degrees.
7355    
7356     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
7357     scale adjust code since it is now done before calling
7358     this method. Don't do anything if the map projection
7359     is None.
7360    
7361 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
7362    
7363 bh 1248 Move version specific load tests to their own file.
7364    
7365     * test/test_load.py: Expand the doc-string to explain a bit how to
7366     handle file format changes.
7367     (TestClassification.test): Update the docstring as this test is
7368     not about Thuban 0.2 anymore.
7369    
7370     * test/test_load_0_2.py: New file with the load tests for thuban
7371     files created with Thuban 0.2 and earlier.
7372    
7373     2003-06-19 Bernhard Herzog <[email protected]>
7374    
7375 bh 1246 Add XML validation to some of the tests. Validation will only be
7376     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
7377     To make the DTD available to the test cases it's moved into
7378     Resources/XML
7379    
7380     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
7381     for versions up to and including 0.2. Two slight changes: added an
7382     encoding specification and fixed the comment which refered to
7383     GRASS, not Thuban
7384    
7385     * test/xmlsupport.py: New support module for tests involving XML.
7386     Currently there's a mix-in class for XML validation.
7387    
7388     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
7389    
7390     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
7391     so that we can validate the
7392     (SaveSessionTest.testEmptySession)
7393     (SaveSessionTest.testSingleLayer)
7394     (SaveSessionTest.testSingleLayer)
7395     (SaveSessionTest.testLayerProjection)
7396     (SaveSessionTest.testRasterLayer)
7397     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
7398    
7399     * test/runtests.py (main): Call print_additional_summary instead
7400     of print_garbage_information
7401    
7402     * test/support.py (resource_dir): New function to return the
7403     "Resource" subdirectory
7404     (print_additional_summary): New function to combine several
7405     summary functions
7406     (run_tests): Use print_additional_summary instead of calling
7407     print_garbage_information directly
7408    
7409     2003-06-19 Bernhard Herzog <[email protected]>
7410    
7411 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
7412     the classification element.
7413     (projection): Add the "name" attribute
7414    
7415 frank 1242 2003-06-19 Frank Koormann <[email protected]>
7416    
7417     MERGE from the greater-ms3 branch.
7418    
7419     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
7420     scale if projection is latlong to get better estimate.
7421    
7422     Fix problem of hidden properties dialog under windows after double
7423     click on layer tree:
7424     The tree control always gets an Expanded / Collapsed event after
7425 joey 2162 the ItemActivated on double click, which raises the main window again.
7426     We add a second ItemActivated event to the queue, which simply
7427 frank 1242 raises the already displayed window.
7428    
7429     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
7430     raiseProperties initialized to prevent endless loops
7431     (LegendTree._OnItemActivated): Depending on self.raiseProperties
7432     simply raise the properties or open the dialog and issue a second
7433     event.
7434    
7435 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
7436    
7437 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
7438    
7439     2003-06-18 Jonathan Coles <[email protected]>
7440    
7441 jonathan 1235 When Thuban loaded the map was redrawn twice because the
7442     legend was being opened after the mainwindow was created
7443     and not during its creation. This meant the map was drawn
7444     initially and then had to be redrawn when the legend
7445     caused the display to change. Now the legend is opened
7446     in the mainwindow constructor which resolves this issue.
7447    
7448     Also, although we were checking for the existence of
7449     gdal and gdalwarp modules, the gdalwarp extension was
7450     still being compiled (which may fail if the system doesn't
7451     have gdal installed). the build_ext command to setup.py
7452     now accepts the flags --with-gdal and --without-gdal.
7453     If --without-gdal is specified setup.py will try to
7454     use the gdal parameters specified by gdal-config. Under
7455     windows, those parameters have to be set in setup.py
7456     as with proj4 an wxWindows.
7457    
7458     * setup.py: Use a list instead of seperate variables for
7459     extension parameters so we can create a generic function
7460     that runs an appropriate *-config script.
7461     (run_cs_script): Renamed from run_wx_script and modified
7462     to accept a second argument which is a list of lists to
7463     be filled in by the values returned from running the command.
7464     (thuban_build_ext): New. Extends the build_ext command and
7465     provides the options --with-gdal/--without-gdal which then
7466     optionally includes the gdalwarp extension.
7467    
7468     * Thuban/Model/resource.py: First check if we can import
7469     the gdalwarp Thuban extension before checking for gdal.
7470     Also added some comments.
7471    
7472     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
7473     the map is None which may be the case if none has been loaded
7474     yet.
7475    
7476     * Thuban/UI/main.py (main): Remove call to ShowLegend.
7477    
7478     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
7479    
7480     * Thuban/UI/renderer.py: Check for gdal support before importing
7481     gdalwarp.
7482     (MapRenderer.render_map): Only try to optimize if we have gdal
7483     support otherwise nothing will get drawn.
7484    
7485 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
7486     during startup before a map has been created. Check if map is None
7487     before using it and do nothing if it is.
7488    
7489 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
7490    
7491     Fix the problem with raster layers under Windows that caused
7492     Thuban to crash. The view should respond to layer projection
7493     changed events to update the display. Changes to a projection
7494     should not cause the map to be set to full extent.
7495    
7496     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7497     current_map_proj to remember the current map projection so that
7498     when the projection changes we know what the previous projection
7499     was.
7500     (MapCanvas.SetMap): Unsubscribe and subscribe to
7501     LAYER_PROJECTION_CHANGED events.
7502     (MapCanvas.projection_changed): Split into two methods that respond
7503     to map and layer projection changes.
7504     (MapCanvas.map_projection_changed): New. Takes the current view and
7505     projects it using the new projection. This does not cause the
7506     map to be redrawn at full extent.
7507     (MapCanvas.layer_projection_changed): New. Cause a redraw which
7508     will draw each layer in its new projection.
7509    
7510     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
7511     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
7512     under Windows.
7513    
7514     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
7515     to twice sizeof(void*) because there are two digits for each
7516     hex byte.
7517    
7518 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
7519    
7520     Update to the layer interface: Direct access to the table,
7521     shapetable, shapefile and filename attributes is now actively
7522     deprecated by issuing deprecation warnings for all places where
7523     this happens.
7524    
7525     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
7526     to the instance variables table, shapetable, shapefile and
7527     filename via __getattr__ so that we can issue a deprecation
7528     warning.
7529     (Layer.SetShapeStore): Don't set the deprecated instance variables
7530     any more
7531     (Layer.SetShapeStore): Don't use deprecated layer instance
7532     variables
7533     (Layer.Destroy): No need to explicitly remove the instance
7534     variables any more
7535     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
7536     instance variables
7537    
7538     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7539     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
7540     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
7541     use deprecated layer instance variables
7542    
7543     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
7544     deprecated layer instance variables
7545    
7546     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7547     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
7548     instance variables
7549    
7550     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
7551     deprecated layer instance variables
7552    
7553     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
7554     deprecated layer instance variables
7555    
7556     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
7557     deprecated layer instance variables
7558    
7559     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
7560     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
7561     variables
7562    
7563     * test/runtests.py (main): Turn Thuban's deprecation warnings into
7564     errors so that they're cought by the tests
7565    
7566     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
7567     layer instance variables
7568    
7569 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
7570    
7571     Fix a problem under Windows whereby if the user double-clicks on a
7572     layer in the legend that tree item will expand or collapse as well
7573     as open the layer properties dialog. The state of the tree item
7574     should not be affected.
7575    
7576     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
7577     preventExpandCollapse and subscribe to expanding and collapsing
7578     events.
7579     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
7580     collapsing events and will veto the event if it has been triggered
7581     by the user double clicking on a layer.
7582     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
7583     that an expanding/collapsing event should be vetoed.
7584    
7585 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
7586    
7587     * Thuban/UI/classifier.py (Classifier.OnClose)
7588     (Classifier.map_layers_removed)
7589     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
7590     in OnClose and not in map_layers_removed or
7591     layer_shapestore_replaced to make sure it always happens when the
7592     dialog is closed
7593    
7594 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
7595    
7596 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
7597     the background of the table view appears correctly.
7598    
7599     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
7600     object that can be used by derived classes to place any
7601     controls (including the grid) onto.
7602     (QueryTableFrame.__init__): Use the panel as the parent window
7603     for all the controls. Reparent the grid so that the panel is
7604     the parent. Call UpdateStatusText() to correctly initialize
7605     the status bar.
7606    
7607     2003-06-13 Jonathan Coles <[email protected]>
7608    
7609 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
7610     from wxFrame (as opposed to wxDialog like the other classes)
7611     but otherwise behaves like the other classes. This is needed
7612     for the TableView which isn't really a dialog and needs to
7613     have a status bar and control buttons.
7614    
7615     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
7616     instance variable to keep track of how many rows are selected.
7617     Subscribe once to the the events we are interested in.
7618     (ThubanGrid.OnRangeSelect): Only handle event if event handling
7619     hasn't been turned off.
7620     (ThubanGrid.OnSelectCell): Only handle event if event handling
7621     hasn't been turned off.
7622     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
7623     as an event listener (which changes the event handler stack)
7624     simply set an instance variable to False. This is checked in
7625     the event handlers.
7626     (ThubanGrid.GetNumberSelected): Return the number of currently
7627     selected rows.
7628     (TableFrame): Inherit from ThubanFrame so we can have a
7629     status bar and control buttons.
7630     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
7631     Explicitly set which items are selected in the operator choice and
7632     action choice so there is always a valid selection. Fixes RTbug #1941.
7633     Subscribe to grid cell selection events so we can update the
7634     status bar.
7635     (QueryTableFrame.UpdateStatusText): Update the status bar with
7636     how many rows are in the grid, how many columns, and how many
7637     rows are selected.
7638     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
7639     Call UpdateStatusText when cells are (de)selected.
7640     (QueryTableFrame.OnQuery): Use the string value in the value
7641     combo if either the selected item index is 0 or if the string
7642     cannot be found in the predefined list (this happens if the
7643     user changes the text). Fixes RTbug #1940.
7644     Only turn off the grid event listeners if there a query comes
7645     back with a none empty list of ids. in the case that the list
7646     is empty this causes a grid.ClearSelection() call to actually
7647     clear the grid selection which causes the selected items in
7648     the map to be deselected. Fixes RTbug #1939.
7649    
7650     * test/test_save.py (XMLWriterTest.Encode): Check return values.
7651     Fixes RTbug #1851.
7652    
7653 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
7654    
7655     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
7656     self.selected_shape with the current selection to make sure the
7657     contents of the dialog are up to date when it's shown for the
7658     first time.
7659     The dialog used to work without this by luck. The recent fix to
7660     the connector module 'broke' a 'feature' the identify view was
7661     relying on, i.e that subscribing to a message in response to
7662     receiving a message of that type would mean that the new
7663     subscriber would also be called for the same message.
7664    
7665 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
7666 jonathan 1175
7667 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
7668     the image is rendered. Fixes RTbug #1937.
7669    
7670     2003-06-12 Jonathan Coles <[email protected]>
7671    
7672 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
7673 jonathan 1193 user directory if it doesn't exist on a posix system.
7674     Fixes RTbug #1815.
7675 jonathan 1191
7676     * Thuban/Model/resource.py (get_user_proj_files): Moved the
7677     called to get_application_dir here, so that the directory
7678     will only be called if this method is invoked.
7679    
7680     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
7681     the projfilepath if no projection is selected.
7682    
7683     2003-06-12 Jonathan Coles <[email protected]>
7684    
7685 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
7686     the scalebar if the current map has no projection set.
7687    
7688     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
7689     projfilepath label to just the basename of the projection file
7690     rather than include the entire path.
7691    
7692     * Thuban/Model/resource.py: Fix missed proj functions that
7693     needed to be renamed.
7694    
7695     2003-06-12 Jonathan Coles <[email protected]>
7696    
7697 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
7698     tested if the variable was an instance of Color.
7699    
7700     * Thuban/Model/color.py (Color): Remove commented code that isn't
7701     used.
7702     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
7703     Fixes RTbug #1835.
7704     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
7705     Needed now that the class doesn't inherit from Color.
7706    
7707     2003-06-12 Jonathan Coles <[email protected]>
7708    
7709 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
7710     check unicode strings.
7711    
7712     * test/test_layer.py: Check for existence of gdal.
7713    
7714     2003-06-12 Jonathan Coles <[email protected]>
7715 jonathan 1172
7716     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
7717     that was in load.py
7718 jonathan 1169
7719 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
7720     that was in save.py
7721    
7722     2003-06-12 Jonathan Coles <[email protected]>
7723    
7724 jonathan 1169 This is largely a collection of bug fixes. We also handle the
7725     case where gdal is not on the system. The XMLReader and XMLWriter
7726     classes were moved into there own files to resolve some circular
7727     import references and because they shouldn't really be in the
7728     file that is dediciated to reading/writing session files since
7729     they are also used elsewhere.
7730    
7731     * Thuban/Model/classgen.py: Renamed functions to follow the
7732     function_names_with_underscores style. Fixes RTbug #1903.
7733     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7734    
7735     * Thuban/Model/layer.py: Import gdal only if it available.
7736     (RasterLayer): Handle the case where the gdal library is unavailable.
7737     Addresses RTbug #1877.
7738    
7739     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7740     xmlreader.py.
7741    
7742 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
7743    
7744     This is largely a collection of bug fixes. We also handle the
7745     case where gdal is not on the system. The XMLReader and XMLWriter
7746     classes were moved into there own files to resolve some circular
7747     import references and because they shouldn't really be in the
7748     file that is dediciated to reading/writing session files since
7749     they are also used elsewhere.
7750    
7751     * Thuban/Model/classgen.py: Renamed functions to follow the
7752     function_names_with_underscores style. Fixes RTbug #1903.
7753     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7754    
7755     * Thuban/Model/layer.py: Import gdal only if it available.
7756     (RasterLayer): Handle the case where the gdal library is unavailable.
7757     Addresses RTbug #1877.
7758    
7759     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7760     xmlreader.py.
7761    
7762 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
7763     file xmlwriter.py.
7764    
7765     * Thuban/Model/resource.py: Renamed functions to following the
7766     function_names_with_underscores style.
7767     (has_gdal_support): New function that returns true if the gdal
7768     library is available. Addresses RTbug #1877.
7769    
7770     * Thuban/UI/application.py (ThubanApplication.OpenSession):
7771     Display a message box if the gdal library is not available, but
7772     only if there are any layers that would use it. Addresses RTbug #1877.
7773    
7774     * Thuban/UI/classgen.py: Use renamed projection resource functions.
7775     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
7776     when using integers versus floats.
7777    
7778     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
7779     determine if the "Add Image Layer" menu option should be
7780     greyed out or not. Addresses RTbug #1877.
7781    
7782     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
7783    
7784     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
7785     optimize if a raster layer is visible. Fixes RTbug #1931.
7786     Only draw the raster layer if the gdal library is available.
7787     Addresses RTbug #1877.
7788    
7789     * test/test_classgen.py: Add tests for generate_singletons,
7790     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
7791     (test_calculate_quantiles): Fix some tests to catch the new
7792     ValueError that is raised.
7793    
7794     * test/test_proj.py: Use renamed projection resource functions.
7795    
7796     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
7797     test for saving classified layers. Fixes RTbug #1902.
7798     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
7799    
7800 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
7801    
7802     Fix for http://intevation.de/rt/webrt?serial_num=1900.
7803    
7804     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
7805    
7806     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
7807     multiplechoicedialog.py rather than from the wxPython library.
7808    
7809 frank 1151 2003-06-11 Frank Koormann <[email protected]>
7810    
7811 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
7812     update.
7813    
7814     2003-06-11 Frank Koormann <[email protected]>
7815    
7816 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
7817     determine the absolute .thuban/thuban directory under
7818     "posix" (os.expanduser) and "nt" (read AppData registry key).
7819    
7820     * Thuban/Model/resource.py: Use get_application_dir
7821    
7822     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7823     Use get_application_dir.
7824    
7825 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
7826    
7827 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
7828     the messages MAP_LAYERS_REMOVED messages
7829     (LayerTableFrame.OnClose): Unsubscribe from it.
7830     (LayerTableFrame.map_layers_removed): New. Receiver for
7831     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
7832     dialog is showing is removed.
7833    
7834     2003-06-10 Bernhard Herzog <[email protected]>
7835    
7836 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
7837     of the receivers list so that unsubscribing in a receiver doesn't
7838     modify it while iterating over it.
7839    
7840     * test/test_connector.py
7841     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
7842     unsubscribing in a receiver works correctly. See docstring for
7843     details
7844    
7845     2003-06-10 Bernhard Herzog <[email protected]>
7846    
7847 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
7848     message.
7849    
7850     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
7851     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
7852     LAYER_CHANGED will still be sent if the classification changes.
7853    
7854     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
7855     parameter so we can subscribe to some of its messages
7856     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
7857     and the layer's LAYER_SHAPESTORE_REPLACED
7858     (Classifier.unsubscribe_messages): New. Unsubscribe from message
7859     subscribed to in __init__
7860     (Classifier.map_layers_removed)
7861     (Classifier.layer_shapestore_replaced): receivers for the messages
7862     subscribed to in __init__. Unsubscribe and close the dialog
7863    
7864     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
7865     the map to the Classifier dialog
7866    
7867     * test/test_layer.py (SetShapeStoreTests): Derive from
7868     SubscriberMixin as well so we can test messages
7869     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
7870     messages
7871     (SetShapeStoreTests.tearDown): Clear the messages again
7872     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
7873     for the modified flag too
7874     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
7875     to check whether SetShapeStore sets the modified flag
7876     (SetShapeStoreTests.test_set_shape_store_different_field_name)
7877     (SetShapeStoreTests.test_set_shape_store_same_field)
7878     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
7879     Add tests for the messages. This checks both the new
7880     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
7881    
7882 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
7883    
7884     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
7885     the menu items.
7886    
7887 frank 1134 2003-06-05 Frank Koormann <[email protected]>
7888    
7889 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7890     Layout reimplemented without panel. Make life easier to fit the list
7891     in the dialog.
7892    
7893     2003-06-05 Frank Koormann <[email protected]>
7894    
7895 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
7896     once on initialisation (Former implementation resulted in multiple
7897     entries for each projection).
7898     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
7899     if set, select the projection found under the specified name. This
7900     overwrites any other selection estimate.
7901     Removed projchoice filling from this method.
7902     (ProjFrame._OnSave, ProjFrame._OnAddToList):
7903     Updated call of ProjFrame.__FillAvailList
7904     (LCCPanel._DoLayout): Moved parameter controls in more common order.
7905    
7906     * Resources/Projections/defaults.proj: Extended defaults representing
7907     various common European projections.
7908    
7909     2003-06-05 Frank Koormann <[email protected]>
7910    
7911 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7912     Use ListCtrl instead of GridCtrl
7913    
7914     * Thuban/Model/resource.py:
7915     Guess location of .thuban directory from tempdir parent directory.
7916    
7917     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7918     Guess location of .thuban directory from tempdir parent directory.
7919    
7920 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
7921    
7922     Do not cache the values returned by the tree widget's
7923     GetFirstChild and GetNextChild methods because it led to lots of
7924     segfaults. The new way requires more brute force but is more
7925     reliable.
7926    
7927     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
7928     variable layer2id
7929     (LegendTree.find_layer): New method to do with brute force what
7930     layer2id tried to accomplish
7931     (LegendTree._OnMsgLayerChanged)
7932     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
7933     Use find_layer instead of layer2id
7934     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
7935     update layer2id anymore
7936     (LegendTree._OnMsgMapLayersRemoved)
7937     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
7938    
7939 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
7940    
7941     * Thuban/Model/classgen.py (GenQuantiles0): New function.
7942    
7943 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
7944    
7945 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
7946     New commands.
7947     (main_menu): Add the new commands.
7948     (MainWindow.TableRename): New. Implementation of the table_rename
7949     command.
7950     (MainWindow.RenameLayer): New. Implementation of the layer_rename
7951     command.
7952    
7953     * Thuban/Model/session.py (Session.AddTable): call self.changed to
7954     set the modified flag
7955    
7956     * test/test_session.py (TestSessionSimple.test_add_table): Test
7957     whether the modified flag is set properly
7958    
7959     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
7960     instead of issue so that the modified flags get updated.
7961    
7962     * test/test_base.py (SomeTitledObject): Derive from Modifiable
7963     instead of Publisher to reflect reality better and to accomodate
7964     the fact that SetTitle now calls changed instead of issue
7965    
7966     2003-06-02 Bernhard Herzog <[email protected]>
7967    
7968     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
7969     acquisition has to happen before the try in a try-finally.
7970    
7971     2003-06-02 Bernhard Herzog <[email protected]>
7972    
7973 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
7974     possible that a layer is removed that is not currently selected in
7975     the legend so don't check for this.
7976    
7977 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
7978    
7979 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
7980     variables to None that have direct or indirect references to
7981     shapefiles or dbf files to make sure that they do go away and the
7982     files are closed.
7983    
7984     2003-05-30 Bernhard Herzog <[email protected]>
7985    
7986 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
7987     availImgListIndices when a new image list is created
7988    
7989     2003-05-30 Bernhard Herzog <[email protected]>
7990    
7991 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
7992     changing_selection to indicate whether the LegendTree code itself
7993     is currently changing the selection
7994     (LegendTree.normalize_selection): New method to normalize the
7995     selection by selecting the layer item even if the user clicked on
7996     the classification.
7997     (LegendTree._OnSelChanged): normalize the selection. This works
7998     around a bug in wx which doesn't keep track of the selection
7999     properly when subtrees are deleted.
8000    
8001     2003-05-30 Bernhard Herzog <[email protected]>
8002    
8003 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
8004     maximum and minimum scale factors.
8005    
8006     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
8007     changes in classgen.py
8008    
8009 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
8010    
8011     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
8012     all the methods functions. Fixes RTBug #1903.
8013    
8014     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
8015     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
8016     RTBug #1907.
8017    
8018     * Thuban/UI/classgen.py: Use classgen functions that were part
8019     of the ClassGenerator class. Put try/finally blocks around
8020     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
8021     RTBug #1904.
8022    
8023     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
8024    
8025     * Thuban/UI/legend.py: The legend was cleared and repopulated any
8026     time something changed which caused some state to be lost such
8027     as which children were expanded or collapsed. Fixes RTBug #1901.
8028     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
8029     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
8030     the legend but not in the map.
8031     (LegendTree.__FillTree): Move main functionality out into smaller
8032     methods that can be used by other methods.
8033     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
8034     if they are available.
8035     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
8036     that we override the wxTreeCtrl method. Iterate over children
8037     and call __RemoveLayer.
8038     (LegendTree.__AddLayer): New. Add a new layer to the legend.
8039     (LegendTree.__RemoveLayer): Remove a layer from the legend.
8040     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
8041     Should only be called with the id of a layer branch.
8042     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
8043     Returns the root item or creates one if necessary.
8044    
8045     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
8046     ProjectRasterFile with tuple arguments instead of strings.
8047    
8048     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
8049     with try/finally. Fixes RTBug #1904.
8050    
8051     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
8052     with try/finally. Fixes RTBug #1904.
8053     (MapCanvas.FitSelectedToWindow): If a single point is selected
8054     simply center it on the display. Fixes RTBug #1849.
8055    
8056     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
8057     to be compiled as a standalone app. Now the code can only be
8058     called from Python which simplifies the parameter passing.
8059     (ProjectRasterFile): Handle Python arguments. Remove code that
8060     checks for a destination dataset. Add more clean up code.
8061    
8062     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
8063     TestMapWithContents.test_lower_layer_bottom):
8064     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
8065     Fixes RTBug #1907.
8066    
8067     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
8068     extent to the map when the legend is toggled. Fixes RTBug #1881.
8069    
8070 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
8071    
8072     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
8073     unsubscribes all that is subcribed in __init__.
8074    
8075 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
8076    
8077 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
8078     (MainWindow.CanDuplicateLayer): New methods to implement the
8079     Layer/Duplicate command.
8080     (layer_duplicate command): New.
8081     (main_menu): Add layer_duplicate to the Layer menu.
8082    
8083     2003-05-28 Bernhard Herzog <[email protected]>
8084    
8085 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
8086     renderer so that NULL/None values get displayed differently (by a
8087     gray rectangle).
8088     (TableGrid.__init__): Override the default renderers
8089    
8090     2003-05-28 Bernhard Herzog <[email protected]>
8091    
8092 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
8093     classification to "None" if the type of the field has changed.
8094    
8095     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
8096     test for the Layer.SetShapeStore method
8097    
8098 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
8099 jan 1085
8100 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
8101     does not necessarily have a filename).
8102    
8103     2003-05-28 Jan-Oliver Wagner <[email protected]>
8104    
8105 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
8106     sort the selection list for the dialog.
8107    
8108 frank 1083 2003-05-28 Frank Koormann <[email protected]>
8109    
8110     * extensions/thuban/wxproj.cpp
8111     (project_point): Removed cast to int for projected point coordinates.
8112     (shape_centroid): Return last point if all polygon vertices fall
8113     to one point.
8114    
8115 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
8116    
8117 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
8118     with layers that don't have shapestores, i.e. raster layers.
8119    
8120     2003-05-28 Bernhard Herzog <[email protected]>
8121    
8122 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
8123     when determining the title from the filename.
8124    
8125     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
8126     reflect changes in the way the title is derived from the filename
8127    
8128 frank 1077 2003-05-28 Frank Koormann <[email protected]>
8129    
8130     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
8131     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
8132    
8133 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
8134    
8135 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
8136     delegate SelectedLayer.
8137     (MainWindow.LayerUnjoinTable): Implement.
8138     (_can_unjoin): New. Helper function for the sensitivity of the
8139     layer/unjoin command.
8140    
8141     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
8142     (DerivedShapeStore.OrigShapeStore): New. Return the original
8143     shapestore. Used to figure out how to unjoin.
8144     (DerivedShapeStore.Shapefile): Fix a typo.
8145    
8146     2003-05-27 Bernhard Herzog <[email protected]>
8147    
8148 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
8149     well
8150     (JoinDialog.__init__): Use the layer parameter and only build the
8151     left choice when a layer is given
8152     (JoinDialog.OnJoin): Handle layer joins as well
8153     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
8154     that the user selects the "Select..." item. The sensitivitly
8155     updating is now in update_sensitivity
8156     (JoinDialog.y): New method to refactor the sensitivity update of
8157     the join button into its own method.
8158    
8159     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
8160    
8161     2003-05-27 Bernhard Herzog <[email protected]>
8162    
8163 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
8164     iff there are unreferenced tables in the session
8165    
8166     2003-05-27 Bernhard Herzog <[email protected]>
8167    
8168 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
8169    
8170     * Thuban/Model/session.py (Session.UnreferencedTables): New method
8171     to return tables that are not referenced by other tables or shape
8172     stores and can be removed.
8173     (Session.RemoveTable): Issue a TABLE_REMOVED message after
8174     removing the table
8175    
8176     * Thuban/UI/mainwindow.py: Remove unused imports
8177     (MainWindow.TableClose): Implement.
8178    
8179     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
8180     messages so that the frame will be automatically closed when a new
8181     session is opened or the table is removed.
8182     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
8183     __init__
8184     (TableFrame.close_on_session_replaced)
8185     (TableFrame.close_on_table_removed): New. Subscribers that close
8186     the window
8187    
8188     * test/test_session.py (TestSessionMessages.test_remove_table)
8189     (TestSessionSimple.test_remove_table): Move the test to
8190     TestSessionSimple and add test for the TABLE_REMOVED message
8191     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
8192     (TestSessionSimple.test_unreferenced_tables) New. Test for the
8193     UnreferencedTables method.
8194     (UnreferencedTablesTests): New. Class with some more sophisticated
8195     tests for UnreferencedTables.
8196    
8197 frank 1065 2003-05-27 Frank Koormann <[email protected]>
8198    
8199 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
8200     display has some unwanted side effects. Removed again.
8201    
8202     2003-05-27 Frank Koormann <[email protected]>
8203    
8204 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
8205    
8206     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
8207    
8208 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
8209    
8210 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
8211     Menu.RemoveItem().
8212 jan 1062
8213 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
8214     the menu.
8215 jan 1062
8216 frank 1059 2003-05-27 Frank Koormann <[email protected]>
8217    
8218     Nonmodal dialogs without parent (i.e. they can fall behind the main
8219     window)
8220    
8221     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
8222     all dialogs in the dialogs dictionary and the canvas.
8223    
8224     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
8225     parent, i.e. can fall behind other windows.
8226     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
8227     dictionary before removing it.
8228    
8229     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
8230    
8231     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
8232     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
8233     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
8234    
8235 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
8236    
8237 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
8238     tableview dialog
8239     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
8240     Also, don't use the table's titles as the dialog names. The titles
8241     aren't guaranteed to be unique.
8242     (MainWindow.TableOpen): Open a table view dialog after opening the
8243     table
8244    
8245     2003-05-27 Bernhard Herzog <[email protected]>
8246    
8247 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
8248     effect can be achieved by simply closing the window showing the
8249     table.
8250     (MainWindow.TableHide): Removed.
8251     (main_menu): Removed "table_hide"
8252    
8253 frank 1051 2003-05-27 Frank Koormann <[email protected]>
8254    
8255     Fix legend tree display problems under Win32
8256    
8257     * Thuban/UI/legend.py: BMP_SIZE_W = 15
8258     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
8259     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
8260    
8261     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
8262    
8263 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
8264    
8265     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
8266     'after' now allows to insert separators almost anywhere in the menu.
8267    
8268 frank 1046 2003-05-27 Frank Koormann <[email protected]>
8269    
8270     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
8271     "S" of selection box label to hint on hot key (Alt-S). Works under
8272     Win32 but is ignored under GTK.
8273    
8274     2003-05-26 Frank Koormann <[email protected]>
8275    
8276     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
8277     Center Choices.
8278    
8279 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
8280    
8281 bh 1044 Remove the Precision methods again. They're too DBF specific to be
8282     part of the table interface and they're only used in table_to_dbf
8283     anyway.
8284    
8285     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
8286     fixed precision of 12 for doubles.
8287     (TransientTableBase.Precision): Removed
8288     (AutoTransientTable.Width): Delegate to self.table.
8289    
8290     * Thuban/Model/table.py (DBFTable.Precision)
8291     (MemoryTable.Precision): Removed.
8292     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
8293     (table_to_dbf): Use a fixed precision of 12 for floats unless the
8294     column object specifies something else.
8295    
8296     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
8297     test for table_to_dbf
8298    
8299     2003-05-26 Bernhard Herzog <[email protected]>
8300    
8301     * test/test_transientdb.py
8302     (TestTransientTable.run_iceland_political_tests): Fix a comment.
8303    
8304     2003-05-26 Bernhard Herzog <[email protected]>
8305    
8306 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
8307     implementation. Mark parts of the file format strings for
8308     localization.
8309    
8310     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
8311     file and add the table to the tables managed by the session
8312    
8313 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
8314     New. test case for OpenTableFile
8315    
8316 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
8317    
8318 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
8319     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
8320     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
8321     Replace the true/false of wxWindows by True/False of Python 2.2.1.
8322    
8323     2003-05-26 Jan-Oliver Wagner <[email protected]>
8324    
8325 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
8326     already a selection present, update the grid accordingly.
8327 jan 1033
8328     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
8329     resizeable and increase its initial size.
8330    
8331 frank 1030 2003-05-26 Frank Koormann <[email protected]>
8332    
8333     Table export functionality
8334    
8335     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
8336     Return width (in characters) for a column.
8337     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
8338     (table_to_dbf): Write table to dbf file.
8339     (table_to_csv): Write table to csv file.
8340    
8341     * Thuban/Model/transientdb.py (TransientTableBase.Width,
8342     TransientTableBase.Precision): Return column width and precision.
8343    
8344     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
8345     or table_to_csv depending on file selection.
8346    
8347     * test/test_dbf_table.py:
8348     Test table_to_dbf (extension of former part of test).
8349    
8350     * test/test_csv_table.py:
8351     Test table_to_csv.
8352    
8353 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
8354    
8355 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
8356     Use QueryTableFrame instead of TableFrame.
8357 jan 1021
8358 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
8359     table window with 'Layer Table:' instead of 'Table:'.
8360    
8361     2003-05-23 Jan-Oliver Wagner <[email protected]>
8362    
8363     Give all tables a title via mix-in TitledObject.LayerShowTable
8364    
8365 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
8366     only if it exists.
8367    
8368     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
8369     and call its init-method with a default title. Remove Title() method.
8370    
8371     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
8372     AutoTransientTable): mix-in TitledObject and call its init-method with
8373     a default title. Remove Title() method.
8374    
8375 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
8376    
8377     * Thuban/Model/session.py (Session.AddShapeStore): Define
8378     AddShapeStore analogously to AddTable.
8379    
8380     * test/test_session.py (TestSessionSimple.test_add_shapestore):
8381     New. Test for AddShapeStore
8382    
8383 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
8384    
8385     Introducing QueryTableFrame and a very coarse ShowTable implementation.
8386    
8387     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
8388     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
8389     The latter implements the selection GUI without dependency on a layer.
8390     LayerTableFrame now is derived from QueryTableFrame and connects
8391     to a layer.
8392    
8393     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
8394     implementation that still needs work.
8395    
8396     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
8397    
8398 frank 1011 2003-05-22 Frank Koormann <[email protected]>
8399    
8400     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
8401     Added "outer_join = False" as optional parameter.
8402     (TransientJoinedTable.create): If outer join is true, perform a
8403     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
8404     the left table. Records not matching are filled with 0 / None.
8405    
8406     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
8407     (JoinDialog.OnJoin): Consider outer join check box.
8408    
8409 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
8410    
8411 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
8412     somewhat safer way. Storing the traceback in a local variable can
8413     lead to memory leaks
8414    
8415     2003-05-22 Bernhard Herzog <[email protected]>
8416    
8417 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
8418     the wxMessageDialog's Destroy() method.
8419    
8420 frank 1004 2003-05-22 Frank Koormann <[email protected]>
8421    
8422     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
8423     TransientTable.Title()
8424    
8425     2003-05-22 Frank Koormann <[email protected]>
8426    
8427     Join Dialog, initial version.
8428    
8429     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
8430    
8431     * Thuban/UI/join.py (JoinDialog): Functional implementation of
8432     former framework. Renamed Table1/Table2 to LeftTable/RightTable
8433     in all occurences.
8434    
8435     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
8436     Typo fixed.
8437    
8438 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
8439    
8440 bh 999 Give the tables titles so that the GUI can display more meaningful
8441     names. For now the titles are fixed but depend on e.g. filenames
8442     or the titles of the joined tables.
8443    
8444     * Thuban/Model/transientdb.py (TransientTable.Title)
8445     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
8446    
8447     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
8448    
8449     * test/test_transientdb.py
8450     (TestTransientTable.test_auto_transient_table_title): New. Test
8451     for the Title method
8452     (TestTransientTable.test_transient_joined_table)
8453     (TestTransientTable.test_transient_table): Add test for the Title
8454     methods
8455    
8456     * test/test_memory_table.py (TestMemoryTable.test_title): New.
8457     Test for the Title method
8458    
8459     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
8460     the Title method
8461    
8462     2003-05-22 Bernhard Herzog <[email protected]>
8463    
8464 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8465     Provide a better way to destroy the layers
8466     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
8467     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8468     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
8469     the new way to destroy the layers.
8470     (TestLayer.test_derived_store): New. Test for using a layer with a
8471     DerivedShapeStore
8472    
8473     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
8474     filename if the shape store actually has one.
8475    
8476     2003-05-22 Bernhard Herzog <[email protected]>
8477    
8478 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
8479     for the filename
8480    
8481     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
8482     for the FileName method
8483     (TestDBFTableWriting.test_write): Fix spelling of filename
8484    
8485 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
8486    
8487     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
8488     from SciParam that now really is immutable.
8489    
8490 frank 992 2003-05-22 Frank Koormann <[email protected]>
8491    
8492     Layer Top/Bottom placement added to legend.
8493    
8494     * Thuban/UI/legend.py
8495     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
8496     bound to tool events.
8497     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
8498     New, methods binding the event methods with the map methods.
8499    
8500     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
8501     layer at top/bottom of layer stack.
8502    
8503     * Resources/Bitmaps/top_layer.xpm: New button icon.
8504    
8505     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
8506    
8507 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
8508    
8509     * Thuban/Model/session.py (Session.RemoveTable): New method to
8510     remove tables
8511    
8512     * test/test_session.py (TestSessionSimple.test_remove_table): New.
8513     Test for RemoveTable
8514    
8515 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
8516    
8517     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
8518     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
8519    
8520 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
8521    
8522 bh 985 Implement a way to discover dependencies between tables and
8523     shapestores.
8524    
8525     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
8526     (TransientJoinedTable.Dependencies)
8527     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
8528     interface
8529     (TransientJoinedTable.__init__): Keep tack of the original table
8530     objects in addition to the corresponding transient tables.
8531    
8532     * Thuban/Model/table.py (DBFTable.Dependencies)
8533     (MemoryTable.Dependencies): New. Implement the dependencies
8534     interface
8535    
8536     * Thuban/Model/data.py (ShapeTable): New. Helper class for
8537     ShapefileStore
8538     (ShapefileStore.__init__): Use ShapeTable instead of
8539     AutoTransientTable
8540     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
8541     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
8542     methods for filename and type
8543     (ShapefileStore.Dependencies): New. Implement the dependencies
8544     interface
8545     (DerivedShapeStore): New class to replace SimpleStore. The main
8546     difference to SimpleStore is that it depends not on a shapefile
8547     but another shapestore which expresses the dependencies a bit
8548     better
8549     (SimpleStore.__init__): Add deprecation warning.
8550    
8551     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
8552     Test for the Dependencies method.
8553    
8554     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
8555     New. Test for the Dependencies method.
8556    
8557     * test/test_transientdb.py
8558     (TestTransientTable.test_auto_transient_table_dependencies): New.
8559     Test for the Dependencies method.
8560     (TestTransientTable.test_transient_joined_table): Add test for the
8561     Dependencies method.
8562    
8563     * test/test_session.py (TestSessionSimple.setUp)
8564     (TestSessionSimple.tearDown): New. Implement a better way to
8565     destroy the sessions.
8566     (TestSessionSimple.test_initial_state)
8567     (TestSessionSimple.test_add_table): Bind session to self.session
8568     so that it's destroyed by tearDown
8569     (TestSessionSimple.test_open_shapefile): New. Test for
8570     OpenShapefile and the object it returns
8571    
8572     2003-05-22 Bernhard Herzog <[email protected]>
8573    
8574 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
8575     register tables with the session.
8576     (Session.Tables): Return the tables registered with AddTable too.
8577    
8578     * test/test_session.py (TestSessionSimple.test_add_table): New.
8579     Test case for the AddTable method
8580    
8581 frank 981 2003-05-22 Frank Koormann <[email protected]>
8582    
8583     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
8584     lower right corner, center labels for selections, initialize controls
8585     in reasonable order for keyboard navigation.
8586    
8587     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
8588     (ProjFrame.__DoOnProjAvail): Determine position of current projection
8589     using the wxListBox.FindString() method. Still a problem (#1886)
8590    
8591     * Thuban/UI/classifier.py
8592     (Classifier.__init__, SelectPropertiesDialog.__init__)
8593    
8594     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
8595     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
8596     different classification types from here to __init__.
8597     (GenUniquePanel.__init__): Set the column width of the first field
8598     in the Field ListCtrl to the full width.
8599    
8600     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
8601     Button to 'Export'. Center Buttons in Selection Box, set Focus to
8602     Grid.
8603     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
8604     changes focus to the Selection when pressing "Alt-S".
8605    
8606     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
8607     the text if not visible. The italic font sometimes exceeds the
8608     rendering area.
8609    
8610 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
8611 jonathan 971
8612 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
8613     to OnClose so that Thuban closes correctly.
8614    
8615     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
8616     DockFrame.OnClose, not DockFrame._OnClose.
8617    
8618     2003-05-21 Jonathan Coles <[email protected]>
8619    
8620 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
8621     references to 'inf' and use new Range __init__ to pass floats
8622     directly rather than converting them to strings first.
8623     Fixes RTBug #1876.
8624    
8625     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
8626     Use new Range ___init__ to pass floats.
8627    
8628     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
8629     filename is a valid image file. Throw IOError otherwise.
8630    
8631     * Thuban/Model/range.py: Brought over new Range from SciParam that
8632     is immutable and has an __init__ which can accept floats.
8633    
8634     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
8635     into try block. AddLayer doesn't throw any exceptions anymore.
8636     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
8637     try block.
8638    
8639     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
8640     the first item in choices. Fixes RTBug #1882.
8641    
8642     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
8643     has gone to 0 which is a serious problem. abort.
8644     (MapRenderer.draw_raster_layer): Catch IOError seperately and
8645     print the error from GDAL.
8646    
8647     * Thuban/UI/tableview.py (TableGrid.__init__): Call
8648     ToggleEventListeners to turn on listening.
8649     (TableGrid.ToggleEventListeners): New. Turns event listening on
8650     and off so as to prevent excessive messages.
8651     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
8652     to suppress excessive messages when selecting many rows.
8653     Fixes RTBug #1880.
8654    
8655     * Thuban/UI/view.py: Added checks against if scale == 0. This
8656     is a serious problem that can occur when an image without
8657     geo data is loading and causes the map projection bounds to
8658     go to infinity. Right now, the solution is to simply try
8659     to recover.
8660    
8661     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
8662     to set the MFILEReceiver attributes even if the data is NULL.
8663    
8664     * extensions/thuban/gdalwarp.cpp: Improved the error handling
8665     and passed GDAL messages back up to the Python layer. Also
8666     tried to fix some memory leaks that were present in the original
8667     utility but didn't matter because the program aborted.
8668    
8669     * test/test_range.py: Copied over tests from SciParam. Removed
8670     tests against importing. Fixes RTBug #1867.
8671    
8672 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
8673    
8674     * test/test_load.py: Remove unused imports and restructure the
8675     test code
8676     (LoadSessionTest): Split into one class for each test and turn
8677     LoadSessionTest itself into the base class for all such session
8678     tests.
8679     (ClassificationTest): New base class for load tests that test
8680     classifications
8681     (TestSingleLayer, TestLayerVisibility, TestClassification)
8682     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
8683     for the individual tests
8684    
8685     * test/support.py (FileLoadTestCase.filename): New base class for
8686     file loading tests
8687    
8688 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
8689    
8690     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
8691     Mercator' to 'UTM Zone 32' as a more convenient example.
8692     Added 'Gauss Krueger Zone 6'.
8693    
8694     * Data/iceland_sample_raster.thuban: political polygon now
8695     filled transparent to have the raster image visible at once.
8696    
8697 frank 952 2003-05-21 Frank Koormann <[email protected]>
8698    
8699     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
8700     OnClose() to keep in sync with extensions. Internally Thuban
8701     still uses "underscored" names.
8702    
8703 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
8704    
8705     This puts back Raster layer support. These layers support projections
8706     through the GDAL library. Currently, the CVS version is being used.
8707     There are no Debian packages available although this may change soon.
8708     A GDAL driver was extended to support writing to memory rather to
8709     files.
8710    
8711     There is still some work that needs to be done, such as some error
8712     handling when loading invalid images or when there is a problem
8713     projecting the image. This putback simply checks in the majority
8714     of the work.
8715    
8716     * setup.py: Add gdalwarp library extension.
8717    
8718     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
8719     Defaults to False, but can be overridden by subclasses if they
8720     support classification.
8721     (RasterLayer): New. Defines a new layer that represents an
8722     image.
8723    
8724     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
8725     tag handler.
8726     (SessionLoader.start_layer): Encode the filename.
8727     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
8728     New. Supports reading a rasterlayer tag.
8729    
8730     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
8731    
8732     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
8733     get a string in Latin1. If we get such as string convert it to
8734     unicode first, otherwise leave if alone before encoding.
8735     (SessionSaver.write_layer): Add support for writing both Layers
8736     and RasterLayers.
8737    
8738     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8739     The right argument may not be a string, it could also be a Column.
8740    
8741     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
8742     Make initial window size 600x400. Fixes RTBug #1872.
8743    
8744     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
8745     the dialog is constructed so that we can support layers that
8746     do not have classifications.
8747     (Classifier._OnTry): Only build a classification if the layer
8748     supports one.
8749    
8750     * Thuban/UI/legend.py: Change all checks that a layer is an
8751     instance of Layer into checks against BaseLayer.
8752     (LegendTree.__FillTreeLayer): Only add children to a branch if
8753     the layer supports classification.
8754    
8755     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
8756     MainWindow.OpenSession): Don't proceed with an action if the
8757     user chooses Cancel when they are asked to save changes.
8758     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
8759     user to select an image file. Create a new RasterLayer and add
8760     it to the map.
8761    
8762     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
8763     for rendering RasterLayer layers.
8764     (MapRenderer.draw_raster_layer): Actually method that calls
8765     the GDALWarp python wrapper and constructs an image from the
8766     data returned.
8767    
8768     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
8769     Choices symbols to match those used in the table query method.
8770     Replace deprecated method calls on table with new method names.
8771    
8772     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
8773     how small the scale can get. This still needs more testing.
8774    
8775     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
8776     Provides a driver to output in .bmp format.
8777    
8778     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
8779     New. Provides IO routines which write to memory, rather than a file.
8780    
8781     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
8782     of the gdalwarp utility provided in GDAL. Added function calls
8783     that can be accessed from python.
8784    
8785     * Data/iceland_sample_raster.thuban: New. Sample file that uses
8786     a raster layer.
8787    
8788     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
8789     layer image data.
8790    
8791     * Doc/thuban.dtd: Added rasterlayer attribute definition.
8792    
8793     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
8794     tests associated with the raster layer code.
8795    
8796     * test/test_transientdb.py
8797     (TestTransientTable.test_auto_transient_table_query): Added a test
8798     for using a Column object as the "right" parameter to a query.
8799    
8800 frank 924 2003-05-19 Frank Koormann <[email protected]>
8801    
8802 frank 927 * Thuban/version.py (get_changelog_date):
8803     Catch exceptions if ChangeLog does not exist.
8804    
8805     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
8806    
8807     2003-05-19 Frank Koormann <[email protected]>
8808    
8809 frank 924 Extended version information for Thuban
8810    
8811     * Thuban/version.py: New, version information for Thuban: Last
8812     modification date and last ChangeLog entry date.
8813    
8814     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
8815     information: Display Thuban, wxPython and Python version.
8816    
8817 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
8818    
8819 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
8820     __future__ import for nested_scopes as Thuban relies on Python 2.2
8821     now.
8822     (XMLWriter.encode): Remove the special case for a None argument.
8823     In the saver encode is always called with a string argument.
8824    
8825     2003-05-16 Bernhard Herzog <[email protected]>
8826    
8827 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
8828     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
8829     of the bug was that e.g. float("1.2") would fail. Thuban now
8830     requires 2.4.x.
8831    
8832 frank 917 2003-05-16 Frank Koormann <[email protected]>
8833    
8834     Printing enhancement and WMF export (under Win32)
8835    
8836     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
8837     ScreenRenderer. Renders Map, Legend and Scalebar for export.
8838     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
8839     PrintRender.
8840    
8841     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
8842     to fullfil information needed for PrinterRenderer.
8843     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
8844     (MapCanvas.Print): Adapted to new MapPrintout.
8845     (OutputTransform): General calculations to transform from canvas
8846     coordinates to export/printing devices.
8847    
8848     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
8849     new method_command to call ExportMap, with platform dependency (only
8850     __WXMSW__)
8851    
8852     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
8853     of scalebar drawing area as new parameters.
8854    
8855     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
8856    
8857     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
8858     Update to extended scalebar.DrawScalebar header.
8859    
8860     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
8861    
8862     * test/test_scalebar.py: Made test executable as standalone.
8863    
8864 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
8865    
8866     * Thuban/Model/table.py (Table): Remove this compatibility alias
8867     for DBFTable.
8868    
8869     * test/test_table.py: Import DBFTable as Table because that alias
8870     doesn't exist anymore.
8871    
8872     * Thuban/UI/classgen.py: Remove some unused imports
8873    
8874 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
8875    
8876     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
8877     Fix docstring.
8878     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
8879     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
8880     values of the supplied range to determine the beginning and end
8881     bounds of the generated classes.
8882    
8883     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
8884     do not have a leading 0 (.5 is now accepted as well as 0.5).
8885    
8886     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
8887     call to ClassGenerator.GenUniformDistribution.
8888    
8889     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
8890     layout bug with the 'Projection' label.
8891    
8892     * test/support.py (FloatTestCase): New. Needed for the Range tests.
8893    
8894     * test/test_range.py: New. Imported from SciParam.
8895    
8896 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
8897    
8898 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
8899     to table.UniqueValues() with calls that retrieve all the values
8900     from the table. This will need to be replaced by a method on table
8901     which can simply return the list (perhaps more efficiently).
8902    
8903     2003-05-12 Jonathan Coles <[email protected]>
8904    
8905 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
8906     Refer to the documentation for details.
8907    
8908     * test/test_classgen.py: Modified Quantile tests to use the
8909     new return values.
8910    
8911     * Thuban/Model/classgen.py
8912     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
8913     use new return values from CalculateQuantiles to produce the correct
8914     range bounds in the Classification.
8915     (ClassGenerator.CalculateQuantiles): Add more comments describing
8916     the return values and parameters. Make minor adjustments to improve
8917     the legibility of the code. Fix problem with adjusted not being set
8918     in most cases.
8919    
8920 frank 893 2003-05-12 Frank Koormann <[email protected]>
8921    
8922     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
8923     and latin1. Fixes #1851 finally.
8924    
8925 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
8926    
8927 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
8928    
8929     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
8930     Clean up debugging statement, add comments, fix a small bug in the
8931     returned adjusted percentiles.
8932    
8933     2003-05-09 Jonathan Coles <[email protected]>
8934    
8935 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
8936     and such ranges can now be saved and loaded from disk.
8937    
8938     Quantiles are now available in the Classification Generator.
8939    
8940     Initial support for building Queries on a table. Doesn't do anything
8941     but run some tests.
8942    
8943     * Thuban/Model/classification.py: Explicit imports.
8944     (ClassGroupRange): Use the Range class to store the underlying
8945     range information. The interface remains the same, except for
8946     GetRange(), and you can also supply a Range object as the min
8947     parameter to SetRange or __init__.
8948    
8949     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
8950     string appropriately for use in Thuban. Fixes RTbug #1851.
8951     (SessionLoader.end_projection): Handle the context of the
8952     projection tag a bit better by looking at what objects are not
8953     None. There was an assumption that a projection tag for a map
8954     could occur before any layers.
8955     (SessionLoader.start_clrange): Provide backward compatibility for
8956     reading min/max values as well as the new range parameter.
8957    
8958     * Thuban/Model/map.py: Explicit imports.
8959    
8960     * Thuban/Model/resource.py: Import _.
8961     (ProjFileSaver.write): write header using projfile.dtd.
8962    
8963     * Thuban/Model/save.py: Explicit imports.
8964     (XMLWriter.encode): New. Encode the given string from a format
8965     used by Thuban into UTF-8. Fixes RTbug #1851.
8966    
8967     * Thuban/UI/classgen.py: Explicit imports.
8968     (ClassGenDialog.__init__): Clean up the code and add support
8969     for Quantiles.
8970     (ClassGenDialog.OnOK): Add support for Quantiles.
8971     (GenQuantilesPanel): New. Input panel for Quantiles.
8972     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
8973     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
8974    
8975     * Thuban/Model/classgen.py: New. Contains all the classes named above.
8976    
8977     * Thuban/UI/classifier.py: Explicit imports.
8978     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
8979     ClassTable.SetValueAsCustom): Reworked to use new Range class.
8980    
8981     * Thuban/UI/legend.py: Explicit imports.
8982    
8983     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
8984     a Table menu and associated method calls.
8985     (MainWindow.choose_color): Removed. No longer needed.
8986    
8987     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
8988     should be disabled if no projection is selected in the available
8989     list.
8990    
8991     * Thuban/UI/renderer.py: Explicit imports.
8992    
8993     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
8994     with correctly selecting the rows and issuing the right events.
8995     Be sure to call Skip() to allow the grid to do some of its own
8996     handling which allows the rows to actually be selected.
8997     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
8998     selecting multiple shapes.
8999     (LayerTableFrame): Support for building Queries.
9000     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
9001    
9002     * Thuban/UI/tree.py: Explicit imports.
9003    
9004     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
9005     table view can call it.
9006    
9007     * test/test_classification.py: Explicit imports.
9008     (TestClassification.test_ClassGroupRange): Fix test for new
9009     Range class.
9010    
9011     * Doc/thuban.dtd: Add range parameter for clrange.
9012    
9013     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
9014     object in ClassGroupRange, and also uesd for inputting ranges in
9015     the classifer table and elsewhere.
9016    
9017     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
9018     yet.
9019    
9020 frank 872 2003-05-09 Frank Koormann <[email protected]>
9021    
9022     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
9023    
9024 frank 860 2003-05-08 Frank Koormann <[email protected]>
9025    
9026 frank 870 Coding style updates
9027    
9028     * test/test_scalebar.py: Replaced tab indentation by spaces.
9029    
9030     * Thuban/UI/scalebar.py: Explicit imports.
9031    
9032     2003-05-08 Frank Koormann <[email protected]>
9033    
9034 frank 867 * Thuban/UI/scalebar.py
9035     (ScaleBar.DrawScalebar): Format string bug fixed.
9036    
9037     2003-05-08 Frank Koormann <[email protected]>
9038    
9039 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
9040    
9041     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
9042     (deriveInterval):
9043     Calculate scalebar interval and unit which fits in width for scale.
9044     (roundInterval): Round float.
9045    
9046     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
9047    
9048     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
9049    
9050     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
9051    
9052     2003-05-08 Frank Koormann <[email protected]>
9053    
9054 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
9055     Initialize ScaleBar with canvas.map
9056    
9057     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
9058     round intervals to display smarter lengths
9059     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
9060     layer. If the maps has no projection applied grey the scalebar.
9061    
9062 frank 857 2003-05-07 Frank Koormann <[email protected]>
9063    
9064     Basic Scalebar features added.
9065    
9066     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
9067    
9068     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
9069     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
9070     and the renderer.
9071    
9072     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
9073    
9074     * Thuban/UI/messages.py: SCALE_CHANGED added.
9075    
9076 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
9077    
9078 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
9079     variable shapestores to hold a list of all open shapestore objects
9080     (Session.ShapeStores): New. Accessor method for the shapestores
9081     list.
9082     (Session._add_shapestore, Session._clean_weak_store_refs): New.
9083     Internal methods to maintain the shapestores list.
9084     (Session.Tables): New. Return all tables open in the session.
9085     (Session.OpenShapefile): Insert the new ShapeStore into the
9086     shapestores list.
9087    
9088     * test/test_session.py (TestSessionSimple.test_initial_state): Add
9089     tests for ShapeStores and Tables
9090     (TestSessionWithContent.test_shape_stores)
9091     (TestSessionWithContent.test_tables): New. Test cases for
9092     ShapeStores and Tables
9093    
9094     2003-05-07 Bernhard Herzog <[email protected]>
9095    
9096 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
9097     Add comments about the optimizations used.
9098     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
9099     Implement the ReadValue table interface method.
9100    
9101     * test/test_transientdb.py
9102     (TestTransientTable.run_iceland_political_tests)
9103     (TestTransientTable.test_transient_joined_table): Add tests for
9104     ReadValue
9105    
9106 frank 848 2003-05-07 Frank Koormann <[email protected]>
9107    
9108     * Resources/Bitmaps/fulllayerextent.xpm,
9109     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
9110     new icons.
9111    
9112 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
9113    
9114 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
9115     New. Simply delegate to the transient table's version.
9116    
9117     * test/test_transientdb.py
9118     (TestTransientTable.test_auto_transient_table_query): New. Test
9119     case for AutoTransientTable's SimpleQuery
9120    
9121     2003-05-06 Bernhard Herzog <[email protected]>
9122    
9123 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
9124     Implement a simple query method for the query dialog
9125     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
9126     the row index or shapeid.
9127     (TransientTable.create): Insert the right value of the row index
9128     (TransientJoinedTable.create): Copy the row index of the left
9129     table to the joined result table
9130    
9131     * test/test_transientdb.py
9132     (TestTransientTable.test_transient_table_read_twice): Fix
9133     doc-string
9134     (TestTransientTable.test_transient_table_query): New. Test for the
9135     SimpleQuery method
9136    
9137     2003-05-06 Bernhard Herzog <[email protected]>
9138    
9139 bh 840 Convert all table users to use the new table interface. This only
9140     covers Thuban itself, not GREAT-ER or other applications built on
9141     Thuban yet, so the compatibility interface stays in place for the
9142     time being but it now issues DeprecationWarnings.
9143    
9144     Finally, the new Table interface has a new method, HasColumn.
9145    
9146     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
9147     issue deprecation warnings when they're. The warnings refer to the
9148     caller of the method.
9149     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
9150     for the deprecation warnings
9151    
9152     * test/test_table.py: Ignore the deprecation warnings for the old
9153     table in the tests in this module. The purpose of the tests is to
9154     test the old interface, after all.
9155    
9156     * test/test_transientdb.py
9157     (TestTransientTable.run_iceland_political_tests): Use the
9158     constants for the types. Add a test for HasColumn
9159     (TestTransientTable.test_transient_joined_table): Adapt to new
9160     table interface. Add a test for HasColumn
9161     (TestTransientTable.test_transient_table_read_twice): Adapt to new
9162     table interface
9163    
9164     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
9165     Adapt to new table interface
9166    
9167     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
9168     new table interface
9169    
9170     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
9171     (RecordTable.SetTable): Adapt to new table interface
9172    
9173     * Thuban/UI/classifier.py (Classifier.__init__)
9174     (Classifier.__init__): Adapt to new table interface
9175    
9176     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
9177     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
9178     to new table interface
9179    
9180     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
9181     (AutoTransientTable.HasColumn): Implement the new table interface
9182     method
9183     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
9184     (AutoTransientTable.UniqueValues): Adapt to new table interface
9185    
9186     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
9187     Adapt to new table interface
9188    
9189     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
9190     simplify opening shapefiles a bit easier.
9191     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9192     (TestLayer.test_point_layer): Use the new helper method
9193     (TestLayer.test_get_field_type): New. Test for the GetFieldType
9194     method
9195    
9196     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
9197     the new table method
9198    
9199     * test/test_memory_table.py (TestMemoryTable.test_has_column):
9200     Test for the new table method HasColumn
9201    
9202 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
9203    
9204     Addresses the "Selection Extent" wish of RTbug #1787.
9205    
9206     * Resources/Bitmaps/fulllayerextent.xpm,
9207     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
9208     extent. These are just place holders for the real bitmaps.
9209    
9210     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
9211     calculate the bounding box once (the first time compute_bbox() is
9212     called).
9213     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
9214     the bounding box for the shapes in lat/long coordinates.
9215    
9216     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
9217     option.
9218     (MainWindow.has_selected_shapes): New. Returns true if there are
9219     any selected shapes.
9220     (MainWindow.FullSelectionExtent): New. Calls
9221     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
9222     (_has_selected_shapes): New. Returns true if there are any
9223     selected shapes.
9224    
9225     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
9226     true if there are any selected shapes.
9227    
9228     * Thuban/UI/view.py (MapCanvas): Added delegated method
9229     HasSelectedShapes.
9230     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
9231     shapes on the canvas using the map projection (if any).
9232    
9233     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
9234     for Layer.ShapesBoundingBox().
9235    
9236 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
9237    
9238     * Resources/Projections/defaults.proj: Fix spelling of Mercator
9239    
9240 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
9241    
9242     Addresses the "Full Layer Extent" wish of RTbug #1787.
9243    
9244     * Resources/Projections/defaults.proj: Added UK National Grid.
9245    
9246     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
9247     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
9248     when the user selects the menu option.
9249    
9250     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
9251     scales the given layer on the canvas using the map projection.
9252    
9253 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
9254    
9255     Convert the table implementations to a new table interface. All
9256     tables use a common mixin class to provide backwards compatibility
9257     until all table users have been updated.
9258    
9259     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
9260     provide backwards compatibility for table classes implementing the
9261     new interface
9262     (DBFTable, MemoryTable): Implement the new table interface. Use
9263     OldTableInterfaceMixin as base for compatibility
9264     (DBFColumn, MemoryColumn): New. Column description for DBFTable
9265     and MemoryTable resp.
9266    
9267     * test/test_dbf_table.py: New. Test cases for the DBFTable with
9268     the new table interface.
9269    
9270     * test/test_memory_table.py: New. Test cases for the MemoryTable
9271     with the new table interface.
9272    
9273     * test/test_table.py: Document the all tests in this file as only
9274     for backwards compatibility. The equivalent tests for the new
9275     interface are in test_memory_table.py and test_dbf_table.py
9276     (MemoryTableTest.test_read): field_info should be returning tuples
9277     with four items
9278     (MemoryTableTest.test_write): Make doc-string a more precise.
9279    
9280     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
9281     table interface. Derive from from OldTableInterfaceMixin for
9282     compatibility.
9283     (TransientTableBase.create): New intance variable column_map to
9284     map from names and indices to column objects
9285     (TransientTable.create): Use the new table interface of the input
9286     table
9287     (AutoTransientTable): Convert to new table interface. Derive from
9288     from OldTableInterfaceMixin for compatibility.
9289     (AutoTransientTable.write_record): Removed. It's not implemented
9290     yet and we still have to decide how to handle writing with the new
9291     table and data framework.
9292    
9293     * test/test_transientdb.py
9294     (TestTransientTable.run_iceland_political_tests)
9295     (TestTransientTable.test_transient_joined_table): Use the new
9296     table interface
9297    
9298 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
9299    
9300     This is namely a collection of UI updates to improve user interactivity.
9301     Tabbing between controls now exists and you can use ESC to close dialog
9302     boxes; ENTER will active the default button.
9303    
9304     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
9305     order that the controls are created so that tabbing works correctly.
9306     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
9307     wxDialog can handle the default button correctly.
9308     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
9309     same reasons as for OnOK.
9310     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
9311     when we ask the table for the maximum/minimum values of a field
9312     which could take a very long time.
9313    
9314     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
9315     order that the controls are created so that tabbing works correctly.
9316     (SelectPropertiesDialog.__init__): Rearrange the order that the
9317     controls are created so that tabbing works correctly.
9318    
9319     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
9320     to derive from a wxDialog but behave like the original implementation
9321     which was derived from a wxFrame. wxDialog provides useful key
9322     handling functionality like ESC calling OnCancel and ENTER calling
9323     OnOK which is lost with wxFrame.
9324    
9325     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
9326     new dialogs.
9327    
9328     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
9329     order that the controls are created so that tabbing works correctly.
9330     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
9331     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
9332     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
9333     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
9334     can provide the "UK National Grid" as a default projection.
9335     (UTMPanel.__init__): Rearrange the order that the controls are
9336     created so that tabbing works correctly.
9337    
9338 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
9339    
9340 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
9341     (project_point): If a map projection but no layer projection is
9342     given, convert degrees to radians before applying the map
9343     projection.
9344    
9345 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
9346     (TableGrid.allow_messages): New methods to make it possible to
9347     inhibit message sending.
9348     (TableGrid.issue): Only send the message if not inhibited.
9349     (LayerTableGrid.select_shape): Use the new methods to make sure
9350     that no ROW_SELECTED message is sent while we're updating the
9351     selected rows to match the selected shapes.
9352    
9353 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
9354    
9355     Implementation of MemoryTable.
9356    
9357     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
9358     implementation that operates on a list of tuples. All of the data
9359     are kept in the memory.
9360    
9361     * test/test_table.py (MemoryTableTest): New.
9362    
9363     * test/test_transientdb.py (SimpleTable): Removed.
9364     (TestTransientTable.test_transient_joined_table,
9365     (TestTransientTable.test_transient_table_read_twice): Replaced
9366     SimpleTable by MemoryTable.
9367    
9368 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
9369    
9370 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
9371     for each of the layers.
9372    
9373     * Resources/Projections/defaults.proj: Geographic projection
9374     contains unit conversion parameter.
9375    
9376     2003-04-30 Jonathan Coles <[email protected]>
9377    
9378 jonathan 793 The most important part of this putback is the projection changes.
9379     It should now be possible to specify the projection that a layer
9380     is in and then specify a different projection for the map. The
9381     projection dialog has an extra parameter for a geographic projection
9382     which lets the user select if the input is in degrees or radians.
9383    
9384     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
9385     to say that the parameter is a tuple of unprojected
9386     points (which is what the callers to this method were assuming).
9387     Also, since the points are unprojected we need to projected them.
9388    
9389     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
9390     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
9391     groups are selected, move the layer up/down. Fixes RTbug #1833.
9392    
9393     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
9394    
9395     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
9396     parameter in call to SetClientData.
9397     (GeoPanel): Add support for selecting the units that the
9398     source data is in (Radians or Degrees).
9399    
9400     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
9401     the rendering loop by reducing the number of if's, removing the
9402     unnecessary try/except block, and checking if the old group
9403     is the same as the new one (which happens a lot if there is
9404     no classification, or lots of shapes are in the same group).
9405    
9406     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
9407     around the redraw routine to try to catch problems that the user
9408     may create by selecting invalid projections for the data set and
9409     map. Clears the display if there are any problems and prints the
9410     error.
9411     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
9412     rectangle.
9413    
9414     * extensions/thuban/wxproj.cpp (project_point): First invert the
9415     supplied point (which should be in projected coordinates) using
9416     the layer's projection and then project the point using the
9417     map's projection.
9418     (project_points): Use project_point() to project each point.
9419    
9420 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
9421    
9422     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
9423     don't set the Classification to None if the classfication field
9424     is None (ie only a DEFAULT).
9425    
9426 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
9427    
9428 bh 790 * Thuban/UI/view.py: Fix some typos.
9429    
9430 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
9431     not pop up the dialog if the selection becomes empty (this could
9432     happen if e.g. a new selection is opened while the identify tool
9433     is active and dialog had been closed)
9434    
9435     2003-04-30 Bernhard Herzog <[email protected]>
9436    
9437 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
9438     instance variable read_record_last_result
9439     (TransientTableBase.read_record): Make sure reading the same
9440     record twice works. The implementation uses the new instance
9441     variable read_record_last_result
9442    
9443     * test/test_transientdb.py
9444     (TestTransientTable.test_transient_table_read_twice): New test
9445     case for the above bug-fix.
9446    
9447 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
9448    
9449     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
9450    
9451     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
9452    
9453     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
9454     (ClassTable.SetValueAsCustom): Rename keyword argument in
9455     ClassGroup* constructors to match argument name.
9456    
9457 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
9458    
9459     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
9460     transient DB if it exists to make sure it doesn't leave a journal
9461     file in the temp directory.
9462    
9463     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
9464     self.conn to None after closing the connection to make sure it's
9465     not closed twice
9466    
9467 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9468    
9469 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
9470     "true". If anything other than "false" is specified we also assume
9471 jonathan 776 "true". Addresses RTbug #1025.
9472 jonathan 769
9473     * Doc/thuban.dtd: Add visible parameter to a layer.
9474    
9475     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
9476     of visible from 1 to True.
9477     (Layer.__init__): Change default value of visible from 1 to True.
9478    
9479     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
9480     parameter.
9481    
9482     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
9483     parameter.
9484    
9485     * test/test_load.py: Add new test data contents_test_visible.
9486     (LoadSessionTest.setUp): save test data.
9487     (LoadSessionTest.testLayerVisibility): Test if the visible flag
9488     is loaded correctly.
9489    
9490     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
9491     for saving an invisible layer.
9492    
9493     2003-04-29 Jonathan Coles <[email protected]>
9494    
9495 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
9496     legend dialog box and tell it to change its map to the one
9497     supplied to SetMap(). Fixes RTbug #1770.
9498    
9499 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
9500    
9501 bh 766 Next step of table implementation. Introduce a transient database
9502     using SQLite that some of the data is copied to on demand. This
9503     allows us to do joins and other operations that require an index
9504     for good performance with reasonable efficiency. Thuban now needs
9505     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
9506     haven't tested that.
9507    
9508     * Thuban/Model/transientdb.py: New. Transient database
9509     implementation.
9510    
9511     * test/test_transientdb.py: New. Tests for the transient DB
9512     classes.
9513    
9514     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
9515     classes to help automatically remove temporary files and
9516     directories.
9517     (Session.__init__): New instance variables temp_dir for the
9518     temporary directory and transient_db for the SQLite database
9519     (Session.temp_directory): New. Create a temporary directory if not
9520     yet done and return its name. Use AutoRemoveDir to have it
9521     automatically deleted
9522     (Session.TransientDB): Instantiate the transient database if not
9523     done yet and return it.
9524    
9525     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
9526     AutoTransientTable so that data is copied to the transient DB on
9527     demand.
9528     (SimpleStore): New class that simply combines a table and a
9529     shapefile
9530    
9531     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
9532     DBFTable and update its doc-string to reflect the fact that this
9533     is only the table interface to a DBF file. Table is now an alias
9534     for DBFTable for temporary backwards compatibility.
9535    
9536     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
9537     the last reference to the session goes away so that the temporary
9538     files are removed properly.
9539    
9540     * test/test_load.py (LoadSessionTest.tearDown): Remove the
9541     reference to the session to make sure the temporary files are
9542     removed.
9543    
9544     2003-04-29 Bernhard Herzog <[email protected]>
9545    
9546 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
9547     the __parser instance variable into a normal local variable in
9548     read. It's only used there and read will never be called more than
9549     once. Plus it introduces a reference cycle that keeps can keep the
9550     session object alive for a long time.
9551    
9552 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9553 jonathan 735
9554 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
9555     Projection an immutable item. Fixes RTbug #1825.
9556     (Projection.__init__): Initialize instance variables here.
9557     (ProjFile.Replace): New. Replace the given projection object with
9558     the new projection object. This solves the problem of needing the
9559     mutator Projection.SetProjection() in the ProjFrame class and
9560     allows a projection to change parameters without changing its
9561     location in the file.
9562    
9563     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
9564     be of type wxSAVE and should verify overwriting a file.
9565    
9566     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
9567     ProjFile.Replace() method instead of the mutator
9568     Projection.SetProjection(). Also requires that we reassign the
9569     client data to the new projection.
9570    
9571     * test/test_proj.py (TestProjection.test): Test GetName() and
9572     GetAllParameters()
9573     (TestProjFile.test): Remove tests for Set*() methods. Add tests
9574     for Replace().
9575    
9576     2003-04-25 Jonathan Coles <[email protected]>
9577    
9578 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
9579     to save the name of the projection.
9580    
9581     * test/test_save.py (SaveSessionTest.testLayerProjection): New
9582     test to verify layer projections are saved correctly.
9583    
9584     2003-04-25 Jonathan Coles <[email protected]>
9585    
9586 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
9587     to "Unknown" if name is None.
9588     (Projection.SetAllParameters): New. Set the projection's
9589     parameter list to the one supplied.
9590     (Projection.SetProjection): New. Set the projection's
9591     properties to those of the supplied Projection.
9592    
9593     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
9594     the dialog title to include the map's title.
9595     (MainWindow.LayerProjection): Set the dialog title to include
9596     the layer's title.
9597    
9598     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
9599     error dialogs into a single method call.
9600     (ProjFrame.__VerifyButtons): Add more states to check.
9601     (ProjFrame.__GetProjection): Return the current state of an
9602     edited projection or None.
9603     (ProjFrame.__FillAvailList): Remove checks for states that
9604     shouldn't exist.
9605     (ProjFrame._OnNew): Clear all selected items and supply
9606     a projection panel if necessary.
9607    
9608     * test/test_proj.py (TestProjFile.test): Add tests for
9609     ProjFile.SetAllParameters, ProjFile.SetProjection,
9610     ProjFile.SetName.
9611    
9612     2003-04-25 Jonathan Coles <[email protected]>
9613    
9614 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
9615     takes an optional argument to select the current projection.
9616     This does not guarantee that the item is visible due to
9617     limited wxWindows functionality. Fixes RTBug #1821.
9618    
9619     2003-04-25 Jonathan Coles <[email protected]>
9620    
9621 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
9622     the projection name and use it when constructing the Projection
9623     object.
9624    
9625     * Thuban/Model/proj.py (Projection.__init__): Change the default
9626     value for 'name' to None and then test if name is equal to None
9627     in the body of the constructor. This way the caller doesn't have to
9628     know what the default value should be. Namely, useful in load.py
9629     where we have to pick a default value if the 'name' parameter
9630     doesn't exist in the XML file.
9631    
9632     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
9633     Tests a file where a layer has a projection.
9634    
9635     2003-04-25 Jonathan Coles <[email protected]>
9636    
9637 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
9638     tree for projection information.
9639    
9640     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
9641     XMLReader.GetFileName.
9642     (SessionLoader): Added support for loading projection tags that
9643     appear inside a layer.
9644    
9645     * Thuban/Model/proj.py (ProjFile): Document the class. Move
9646     back to using a list because the order of the projections in
9647     the file is important to maintain. Fixes RTbug #1817.
9648    
9649     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
9650     to ProjFile.GetFilename.
9651    
9652     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
9653     information.
9654    
9655     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
9656     ProjFrame._OnSaveAs. Removed old dead code from previous
9657     implementation.
9658     (ProjFrame._OnExport): Add support for exporting more than one
9659     projection to a single file.
9660     (ProjFrame.__FillAvailList): use string formatting (% operator)
9661     to build strings that are (partly) translated. Fixes RTbug #1818.
9662    
9663     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
9664     class.
9665    
9666 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
9667    
9668     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
9669    
9670     * po/fr.po: New. French translation by Daniel Calvelo Aros
9671    
9672     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
9673     empty strings.
9674    
9675 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
9676 jonathan 724
9677     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
9678     implement the interface that the ProjFrame dialog expects.
9679    
9680     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
9681     name of the projection to be changed.
9682     (ProjFile): Use a dictionary instead of a list so that removing
9683     projections is easier and we are sure about uniqueness.
9684     (ProjFile.Remove): Remove the given projection object.
9685    
9686     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
9687     Return a list with only one projection file instead of searching for
9688     any projection file. This simplifies many things if the user can
9689     only have one system file and one user file.
9690    
9691     * Thuban/UI/classgen.py: Change all references to
9692     genCombo to genChoice.
9693    
9694     * Thuban/UI/mainwindow.py: Add a Projection option under the
9695     layer menu.
9696     (MainWindow.LayerProjection): New. Open up a projection window
9697     for a layer.
9698    
9699     * Thuban/UI/projdialog.py: Large changes to how the dialog is
9700     laid out. Use three panels instead of one. One for the list of
9701     projections, one for the edit controls, and one for the buttons.
9702     Fixed resizing problems so that the dialog resizes correctly
9703     when the projection panel changes. Added import/export, save, and
9704     new buttons/functionality.
9705    
9706 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
9707    
9708     First step towards table management. Introduce a simple data
9709     abstraction so that we replace the data a layer uses more easily
9710     in the next step.
9711    
9712     * Thuban/Model/data.py: New file with a simple data abstraction
9713     that bundles shapefile and dbffile into one object.
9714    
9715     * Thuban/Model/session.py (Session.OpenShapefile): New method to
9716     open shapefiles and return a shape store object
9717    
9718     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
9719     object instead of a shapefile filename. This introduces a new
9720     instance variable store holding the datastore. For intermediate
9721     backwards compatibility keep the old instance variables.
9722     (open_shapefile): Removed. No longer needed with the shape store.
9723     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
9724     get the shape store used by a layer.
9725     (Layer.Destroy): No need to explicitly destroy the shapefile or
9726     table anymore.
9727    
9728     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
9729     (MainWindow.AddLayer): Use the session's OpenShapefile method to
9730     open shapefiles
9731    
9732     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
9733     session's OpenShapefile method to open shapefiles
9734    
9735     * test/test_classification.py
9736     (TestClassification.test_classification): Use the session's
9737     OpenShapefile method to open shapefiles and build the filename in
9738     a more platform independed way
9739    
9740     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
9741     Implement to have a session to use in the tests
9742     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9743     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
9744     session's OpenShapefile method to open shapefiles
9745     (TestLayerLegend.setUp): Instantiate a session so that we can use
9746     it to open shapefiles.
9747     (TestLayerLegend.tearDown): Make sure that all references to
9748     layers and session are removed otherwise we may get a resource
9749     leak
9750    
9751     * test/test_map.py (TestMapAddLayer.test_add_layer)
9752     (TestMapWithContents.setUp): Instantiate a session so that we can
9753     use it to open shapefiles.
9754     (TestMapWithContents.tearDown): Make sure that all references to
9755     layers, maps and sessions are removed otherwise we may get a
9756     resource leak
9757     ("__main__"): use support.run_tests() so that more info about
9758     uncollected garbage is printed
9759    
9760     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
9761     session's OpenShapefile method to open shapefiles
9762     ("__main__"): use support.run_tests() so that more info about
9763     uncollected garbage is printed
9764    
9765     * test/test_selection.py (TestSelection.tearDown): Make sure that
9766     all references to the session and the selection are removed
9767     otherwise we may get a resource leak
9768     (TestSelection.get_layer): Instantiate a session so that we can
9769     use it to open shapefiles.
9770     ("__main__"): use support.run_tests() so that more info about
9771     uncollected garbage is printed
9772    
9773     * test/test_session.py (TestSessionBase.tearDown)
9774     (TestSessionWithContent.tearDown): Make sure that all references
9775     to the session and layers are removed otherwise we may get a
9776     resource leak
9777     (TestSessionWithContent.setUp): Use the session's OpenShapefile
9778     method to open shapefiles
9779    
9780 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
9781    
9782     * Thuban/Model/load.py (XMLReader.read): Should have been checking
9783     if the file_or_filename object had the 'read' attribute.
9784    
9785 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
9786    
9787 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
9788     (ReadProjFile): Add documentation about which exceptions are raised.
9789     Always pass the exceptions up to the caller.
9790     (GetProjFiles): If the directory can't be read return an empty list.
9791     If any of the proj files can't be read skip that file and go
9792     on to the next one.
9793    
9794     * test/test_proj.py: Added test cases to handle nonexistent files,
9795     unreadable files, and files that don't parse correctly.
9796    
9797     2003-04-23 Jonathan Coles <[email protected]>
9798    
9799 jonathan 716 Projection dialog. Allows the user to select from a list
9800     of projection templates and optionally edit them and save new ones.
9801    
9802     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
9803     (ProjPanel): Base class for projection specific panels.
9804     (TMPanel): Projection panel for Transverse Mercartor.
9805     (UTMPanel): Projection panel for Universal Transverse Mercartor.
9806     (LCCPanel): Projection panel for Lambert Conic Conformal.
9807     (GeoPanel): Projetion panel for Geographic Projection.
9808    
9809     2003-04-23 Jonathan Coles <[email protected]>
9810    
9811 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
9812     promote symmetry. There now exists XMLReader and XMLWriter.
9813     (XMLReader.read): New. Call to read the given file descriptor or
9814     filename.
9815     (XMLReader.close): New. Make sure the file is closed.
9816     (XMLReader.GetFileName): New. Return just the file name that is being
9817     read from.
9818     (XMLReader.GetDirectory): New. Return just the directory of the file
9819     that is being read.
9820     (XMLReader.AddDispatchers): New. Take a dictionary which contains
9821     the names of functions to call as the XML tree is parsed.
9822     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
9823     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
9824     (SessionLoader): Removed class variables start_dispatcher and
9825     end_dispatcher since this functionality is now part of a class
9826     instance. Fixes RTbug #1808.
9827     (SessionLoader.__init__): Add dispatcher functions.
9828     (load_xmlfile): Code was moved into the XMLReader.read().
9829     (load_session): Use modified SessionLoader.
9830    
9831     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
9832     map's projection.
9833    
9834     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
9835     GetAllParameters.
9836     (Projection.GetParameter): Returns the value for the given parameter.
9837    
9838     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
9839     (GetProjFiles): Renamed from GetProjections. Now returns a list
9840     of ProjFile objects.
9841     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
9842     a list of ProjFile objects whose files are not user defined.
9843     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
9844     list of ProjFile objects whose files are user defined.
9845     (ProjFileReader): Extend new XMLReader.
9846    
9847     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
9848     promote symmetry.
9849    
9850     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
9851     control instead of a wxComboBox. wxChoice controls do not generate
9852     events as the uses highlights possible choices which fixes problems
9853     with resizing the dialog when the use selects an option.
9854    
9855     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
9856     control instead of a wxComboBox.
9857    
9858     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
9859     dialog.
9860    
9861     * test/test_proj.py (TestProjection.test): New tests for GetParameter
9862     method.
9863    
9864 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
9865    
9866 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
9867     constants
9868    
9869 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
9870     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
9871    
9872 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
9873    
9874 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
9875     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
9876     anymore.
9877     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
9878     (Layer.ShapeType, Layer.Shape): No need to call
9879     self.open_shapefile since it's always called in __init__
9880    
9881 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
9882     In wxPython 2.4 there's no need to extend MainLoop anymore since
9883     wxPython itself makes sure OnExit is called.
9884    
9885 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
9886    
9887 jonathan 693 Initial putback of projection management code. Includes new
9888     classes to read and write projection files. The current load
9889     and save classes were abstracted a bit so they could be reused.
9890     The Projection class was extended to provide new methods and
9891     have a name.
9892    
9893     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
9894     general XML reading methods that were part of ProcessSession.
9895    
9896     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
9897     name.
9898     (ProjFile): New. Represents a file that contains projection
9899     information.
9900    
9901     * Thuban/Model/resource.py: New. Contains general utilities
9902     for read and writing projection files.
9903    
9904     * Thuban/Model/save.py (XMLSaver): New. Contains all the
9905     general XML writing methods that were part of SessionSaver.
9906     (SessionSaver): Renamed from Saver.
9907    
9908     * test/test_proj.py: New test cases for the projection
9909     file read and write functions.
9910    
9911     2003-04-16 Jonathan Coles <[email protected]>
9912    
9913 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
9914     in the ClassGroup*.__repr__() methods so it is clearer when
9915     a value is a string and when it is a number.
9916    
9917     * test/test_load.py: Rework the classification test to test
9918     that we can load old files.
9919     (testLabels): Test a file where the groups have labels.
9920    
9921 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
9922    
9923     Safer implementation of the performance enhancements of the
9924     low-level renderer:
9925    
9926     * extensions/thuban/wxproj.cpp (extract_projection)
9927     (extract_pointer): Rename extract_projection to extract_pointer
9928     and redefine its purpose to return the pointer stored in a CObject
9929     returned by the object's cobject method. Update all callers.
9930     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
9931     handling of these low-level parameters so that each s_draw_info
9932     instance is handled as a CObject at python level that also
9933     contains real references to the actual python objects which
9934     contain the values in the struct. Add free_draw_info as the
9935     destructor.
9936     (draw_polygon_shape): Add the py_draw_info parameter which must a
9937     cobject containing an s_draw_info pointer.
9938    
9939     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
9940     method to instantiat the low-level render parameter
9941     (MapRenderer.draw_shape_layer): Use the new method. Remove some
9942     commented out code.
9943     (MapRenderer.draw_polygon_shape): Make the first parameter not the
9944     layer but the low-level render parameter
9945     (ScreenRenderer.draw_shape_layer): Use the low-level render
9946     parameter.
9947    
9948 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
9949    
9950 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
9951     the ClassGroup* classes to make debugging a bit easier.
9952     (ClassGroup.SetLabel): Check that the string is an instance
9953     of StringTypes not StringType. Accounts for Unicode strings.
9954    
9955     * Thuban/Model/color.py: Implemented __repr__ to make
9956     debugging a bit easier.
9957    
9958     * Thuban/Model/save.py (Saver.write_classification): Need to
9959     save the group label.
9960    
9961     * test/test_load.py (testClassification): New. Loads the
9962     iceland_sample_test.thuban file and checks if it was loaded
9963     correctly.
9964    
9965     2003-04-15 Jonathan Coles <[email protected]>
9966    
9967 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
9968     to improve rendering performance by initializing the variables
9969     that are not change each time draw_polygon_shape() is called.
9970     The values are stored in a global struct draw_info.
9971     (draw_polygon_shape): Removed initialization code that is
9972     now in draw_polygon_init().
9973    
9974     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
9975 jonathan 674 drawing initialization call to draw_polygon_init()
9976     (MapRenderer.draw_polygon_shape): Use new signature of
9977     draw_polygon_shape.
9978 jonathan 673
9979 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
9980     weirdness by setting the range to (1, maxint).
9981 jonathan 673
9982 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
9983     instance variables private and optimize comparison operator
9984     by first checking if the color references are the same.
9985     (ClassGroupSingleton): Make instance variables private.
9986     (ClassGroupRange): Make instance variables private.
9987 jonathan 673
9988 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
9989    
9990 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
9991    
9992     First stab at internationalized messages:
9993    
9994     * Thuban/__init__.py (_): Implement the translation function for
9995     real using the python gettext module.
9996    
9997     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
9998     translate empty strings.
9999    
10000     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
10001     Add a missing space to a warning message
10002    
10003     * po/README: New. Notes about the management of the translation
10004     files.
10005    
10006     * po/Makefile: New. Makefile to help manage the translation files.
10007    
10008     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
10009    
10010     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
10011     translations and support files in po/
10012    
10013     * setup.py (data_files): Add the *.mo files to the data_files too
10014    
10015     * README: Add note about the translations when building from CVS
10016    
10017 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
10018    
10019     * Thuban/UI/dock.py: Fixes some window resizing problems most
10020     noticable under windows. Always assume the button bitmaps will
10021     be there. Code clean up.
10022     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
10023     images for the dock/undock button to the same images.
10024     Work around for RTbug #1801.
10025    
10026     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
10027     be allowed to grow within the sizer. Fixes a bug under Windows
10028     where the toolbar wasn't being drawn.
10029    
10030 frank 664 2003-04-14 Frank Koormann <[email protected]>
10031    
10032     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
10033     Updated design to try to make the button functionality more
10034     transparent.
10035    
10036 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
10037    
10038     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
10039     finalize the intialization of the panel.
10040    
10041     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
10042     creation of the panel. Should be the last thing called in the
10043     initializer of a subclass.
10044    
10045     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
10046     set the current selections in the combo boxes. This is needed
10047     under Windows.
10048    
10049     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
10050     level panel to the dialog so that the background colors are
10051     consistent under Windows.
10052    
10053 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
10054    
10055 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
10056     not black.
10057    
10058     * Thuban/UI/legend.py: Enable/disable the legend buttons when
10059     the legend changes. Fixes RTbug #1793.
10060    
10061     * test/test_classification.py: Added test for copying of
10062     classifications.
10063    
10064     2003-04-11 Jonathan Coles <[email protected]>
10065    
10066 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
10067     such as bitmaps.
10068    
10069     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
10070     added images to the move buttons, added 'reverse' button.
10071     (CustomRampPanel.__init__): Added images to the move buttons.
10072     (GreyRamp): New. Generates a ramp from white to black.
10073     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
10074    
10075     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
10076     ID_PROPERTY_*.
10077     (Classifier.__init__): Minor changes to the layout.
10078     (Classifier._OnTitleChanged): Listen for when the user edits the
10079     title and update the dialog's title and the layer's title.
10080    
10081     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
10082    
10083     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
10084     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
10085     if the layer's title changes.
10086    
10087     * Thuban/UI/mainwindow.py: Added new menu item and associated code
10088     to open a dialog to rename the map.
10089     (MainWindow): Use new resource class to import bitmaps.
10090    
10091     2003-04-11 Jonathan Coles <[email protected]>
10092    
10093 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
10094 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
10095     Resources/Bitmaps/group_use_none.xpm,
10096     Resources/Bitmaps/group_use_not.xpm,
10097     Resources/Bitmaps/hide_layer.xpm,
10098     Resources/Bitmaps/layer_properties.xpm,
10099     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
10100     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
10101     New.
10102 jonathan 646
10103 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
10104    
10105 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
10106     Should pass group to ClassGroup constructor.
10107    
10108     2003-04-10 Jonathan Coles <[email protected]>
10109    
10110 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
10111     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
10112     here. Implement SetVisible(), IsVisible().
10113     (ClassGroup.__init__): Add group parameter which acts as a copy
10114     constructor.
10115    
10116     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
10117     "Visible" check boxes.
10118     (Classifier): Rename the buttons and refactor the code to match
10119     the new labels.
10120    
10121     * Thuban/UI/legend.py: Classify button is now called "Properties".
10122     Refactored the code to change variable names.
10123     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
10124    
10125     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
10126     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
10127     renamed to MainWindow.LayerEditProperties.
10128     (MainWindow.ToggleLegend): Don't include map name in legend title.
10129     (MainWindow.SetMap): Added the map name to the window title.
10130     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
10131     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
10132     Functionality is found in the layer properties dialog.
10133    
10134     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10135     draw visible groups.
10136    
10137 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
10138    
10139 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
10140     addition and selection of new color schemes.
10141     (MonochromaticRamp): New. Generates a ramp between two colors.
10142     (RedRamp): New. Generates a ramp of all red.
10143     (GreenRamp): New. Generates a ramp of all green.
10144     (BlueRamp): New. Generates a ramp of all blue.
10145    
10146     2003-04-09 Jonathan Coles <[email protected]>
10147    
10148 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
10149     Need to copy over field and fieldType attributes.
10150    
10151     * Thuban/Model/table.py (Table.field_range): New. Retrive the
10152     maximum and minimum values over the entire table for a given
10153     field.
10154     (Table.GetUniqueValues): New. Retrieve all the unique values
10155     in the table for a given field.
10156    
10157     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
10158     (GenUniquePanel): New. Controls to allow the user to select
10159     which unique field values they would like in the classification.
10160     (CustomRampPanel): Code that was in ClassGenDialog that allows
10161     the user to select the properties for a custom ramp.
10162     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
10163    
10164     * Thuban/UI/classifier.py: Removed a lot of debugging code.
10165     (Classifier._SetClassification): Callback method so that the
10166     class generator can set the classification in the grid.
10167     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
10168     editing of a group properties class into a wxWindows control.
10169    
10170     * Thuban/UI/dock.py: It was decided that if the user closes
10171     a dockable window the window should simply hide itself. That
10172     way if the user wants to show the dock again it appears in the
10173     same place as it was when it was closed.
10174     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
10175     (DockableWindow._OnButtonClose): Hide the window instead of
10176     destroying it.
10177     (DockableWindow._OnClose): Hide the window instead of
10178     destroying it.
10179    
10180     * Thuban/UI/legend.py (LegendTree): Use a private method to
10181     consistently set the font and style of the text. Fixes RTbug #1786.
10182    
10183     * Thuban/UI/mainwindow.py: Import just the Classifier class.
10184    
10185 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
10186    
10187 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
10188     to the map module
10189    
10190     2003-04-07 Bernhard Herzog <[email protected]>
10191    
10192 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
10193     favor of ToggleSessionTree
10194     (MainWindow.ToggleSessionTree): New method to toggle visibility of
10195     the session tree.
10196     (MainWindow.SessionTreeShown): New method to return whether the
10197     session tree is currently shown.
10198     (MainWindow.ToggleLegend): New method to toggle visibility of the
10199     legend
10200     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
10201     LegendShown
10202     (MainWindow.LegendShown): New method to return whether the legend
10203     is currently shown.
10204     (_method_command): Add checked parameter so we can define check
10205     menu items
10206     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
10207     mainwindow methods.
10208     (show_session_tree, show_legend commands): Removed.
10209     (toggle_session_tree, toggle_legend commands): New commands to
10210     toggle the visibility of the dialogs
10211    
10212 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
10213    
10214 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
10215    
10216     * Thuban/UI/dock.py: Fix Windows problem.
10217    
10218     * Thuban/UI/mainwindow.py: Use False instead of false.
10219     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
10220    
10221     2003-04-07 Jonathan Coles <[email protected]>
10222    
10223 jonathan 612 Since we now say that the order of the groups in a classification
10224     matters, it makes sense to be able to manipulate that order. Most
10225     of the changes to Thuban/Model/classification.py are to that end.
10226    
10227     * Thuban/Model/classification.py (Classification.AppendGroup,
10228     Classification.InsertGroup, Classification.ReplaceGroup,
10229     Classification.RemoveGroup, Classification.GetGroup): Do as the
10230     names imply.
10231     (Classification.FindGroup): This was called GetGroup, but GetGroup
10232     takes an index, while FindGroup takes a value.
10233     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
10234     REFERENCE. Currently there is a cyclic reference between the layer
10235     and its classification. If the classification doesn't need to know
10236     its owning layer we can change this, since it may make sense to be
10237     able to use the same classification with different layers.
10238    
10239     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
10240    
10241     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
10242     not AddGroup()
10243    
10244     * Thuban/UI/classifier.py: Now that we can depend on the order in
10245     a Classification and have methods to manipulate that order we don't
10246     need to use our own data structures in the grid. We can simply make
10247     the grid/table access the information they need from a copy of
10248     the classification object.
10249     (Classifier._OnCloseBtn): Event handler for when the user clicks
10250     'Close'. This is needed so if the user applies changes and then
10251     continues to change the table the user has the option of discarding
10252     the most recent changes and keeping what they applied.
10253    
10254     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
10255     into the same group.
10256    
10257     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
10258     with a really old version of proj, PJ_VERSION won't even be defined.
10259     If it isn't defined then just compile so that the function always
10260     returns Py_False.
10261    
10262     * test/test_classification.py: Fix tests to use the renamed methods.
10263     Still need to write tests for the new methods.
10264    
10265 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
10266 jonathan 608
10267 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
10268     call to SetSelection out of the method and before the call
10269     to __SelectField in __init__. This prevents a recursion of events
10270     when _OnFieldSelect is triggered by the user.
10271    
10272     2003-04-04 Jonathan Coles <[email protected]>
10273    
10274 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
10275     Color.Transparent.
10276     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
10277     Don't bother copying the color, since Colors are immutable.
10278    
10279     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
10280     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
10281     Thuban/UI/renderer.py, Thuban/UI/view.py:
10282     Rename Color.None to Color.Transparent.
10283    
10284     * test/test_classification.py, test/test_load.py: Rename Color.None
10285     to Color.Transparent.
10286    
10287     2003-04-04 Jonathan Coles <[email protected]>
10288 jonathan 603
10289     * Thuban/Model/classification.py: Fix assert calls.
10290     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
10291     Copy the color parameter rather than hold onto a reference.
10292 jonathan 601
10293 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
10294     the color object.
10295     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
10296     are sure there exists only one refernce to Color.None in the system.
10297     This allows us to use 'is' rather than the comparision functions.
10298    
10299     * Thuban/Model/save.py: Fix assert calls.
10300    
10301     * Thuban/UI/classifier.py: Fix assert calls.
10302     (ClassGrid._OnCellDClick): Call up to the classifier to open the
10303     dialog to edit the groups properties.
10304     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
10305     correctly if a cell is resized.
10306     (ClassTable.SetClassification): New. Changes the classification
10307     that is in the table.
10308     (ClassTable.__SetRow): Allow groups to be prepended.
10309     (Classifier): New code for opening the EditProperties and
10310     GenerateRanges dialogs.
10311     (SelectPropertiesDialog.__GetColor): Only set the color in the
10312     color dialog if the current color is not None.
10313    
10314     * Thuban/UI/dock.py: Fix assert calls.
10315    
10316     * Thuban/UI/legend.py: Fix assert calls.
10317    
10318     * Thuban/UI/renderer.py: Fix assert calls.
10319    
10320     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
10321     classifications.
10322     (GenRangePanel): Panel specific to range generation.
10323     (GenSingletonPanel): Panel specific to singleton generation.
10324     (ClassGenerator): Class responsible for actually generating
10325     the classification from the data gathered in the dialog box.
10326     (PropertyRamp): Generates properties whose values range from
10327     a starting property to an ending property.
10328 jonathan 601
10329 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
10330    
10331     * test/support.py (print_garbage_information): New function that
10332     prints information about still connected messages and memory
10333     leaks.
10334     (run_suite): Removed.
10335     (run_tests): New function for use as a replacement of
10336     unittest.main in the test_* files. This one calls
10337     print_garbage_information at the end.
10338    
10339     * test/runtests.py (main): Use support.print_garbage_information
10340    
10341     * test/test_layer.py: Use support.run_tests instead of
10342     unittest.main so we get memory leak information
10343     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
10344     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
10345     (TestLayerLegend.test_visibility): Call the layer's Destroy method
10346     to fix a memory leak.
10347    
10348     * test/test_classification.py: Use support.run_tests instead of
10349     unittest.main so we get memory leak information
10350     (TestClassification.test_classification): Call the layer's Destroy
10351     method to fix a memory leak.
10352    
10353 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
10354    
10355 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
10356     Handle the reference counts of the return value and errors in
10357     PyArg_ParseTuple correctly.
10358    
10359 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
10360     sure the filename is absolute to avoid problems when saving the
10361     session again
10362    
10363 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
10364    
10365 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
10366    
10367 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
10368 jonathan 587 that there actually are points in the returned list of points
10369     before trying to index into the list. The list may be empty if
10370     the shape is a Null Shape.
10371    
10372 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
10373    
10374     * test/test_map.py: Don't use from <module> import *
10375    
10376 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
10377    
10378     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
10379     LAYER_LEGEND_CHANGED
10380    
10381     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
10382     self.Destroy() to close the window after yesterday's changes.
10383    
10384     * test/test_map.py, test/test_session.py: Fix messages that
10385     are sent from maps and layers.
10386    
10387 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
10388    
10389     * Thuban/UI/classifier.py: Commented out some debugging statements.
10390     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
10391     RTbug #1769.
10392    
10393     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
10394     position (although position doesn't work yet under GTK).
10395     (DockableWindow.Destroy): New. Called when the window must be
10396     closed. Namely needed when the DockFrame closes and must close
10397     its children.
10398     (DockFrame): Listen for EVT_CLOSE and destroy all children.
10399    
10400     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
10401     when then window is told to close.
10402     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
10403     comment in source for more info.
10404    
10405     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
10406    
10407     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
10408     symmetry with other such methods.
10409     (MainWindow.ShowLegend): Show the legend docked by default.
10410    
10411 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
10412    
10413     * Thuban/UI/classifier.py: Support for highlighting a specific
10414     group within the grid when the classification dialog is opened.
10415     Also contains a lot of debugging printouts which will later
10416     be removed.
10417    
10418     * Thuban/UI/dock.py: Complete rework on the dock code so that
10419     that it is fairly removed from the rest of the Thuban application.
10420     It is easy to add new docks which the rest of the program having
10421     to be aware of them.
10422    
10423     * Thuban/UI/legend.py: Modifications to support selecting a
10424     specific group in the classification dialog. Changed how layers
10425     are drawn when the layer is visible/invisible.
10426    
10427     * Thuban/UI/mainwindow.py: Removed legend specific code and
10428     replaced it with calls to the new dock code.
10429    
10430     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
10431     to check if scale > 0. Trying to track down a divide by zero.
10432    
10433 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
10434    
10435 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
10436     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
10437     now part of DockableWindow.
10438     (LegendPanel.DoOnSelChanged): Select the current layer in the
10439     map.
10440     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
10441     with the selected layer and/or group.
10442    
10443     2003-03-26 Jonathan Coles <[email protected]>
10444    
10445 jonathan 557 This putback contains the code for dockable windows. There is
10446     no support in wxWindows as of this date for windows that can
10447     attach themselves to other windows.
10448    
10449     The current model contains a DockableWindow which has a parent
10450     window for when it is detached and a dock window that it puts
10451     its contents in when it is docked. The contents of a DockableWindow
10452     must be a DockPanel. DockPanel itself derives from wxPanel.
10453    
10454     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
10455     message, not a LAYER_LEGEND_CHANGED message.
10456    
10457     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
10458    
10459     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
10460     as one of the style properties for the fieldTypeText item to
10461     be sure that its size is correct when the text changes.
10462    
10463     * Thuban/UI/dock.py: New. Classes for the DockPanel and
10464     DockableWindow.
10465    
10466     * Thuban/UI/legend.py: Added some more buttons and made the
10467     LegendPanel a DockPanel.
10468    
10469     * Thuban/UI/mainwindow.py: Added sash windows to the main window
10470     and supporting functions for manipulating the sashes.
10471     (MainWindow.ShowLegend): Create a DockableWindow with the
10472     LegendPanel as the contents.
10473    
10474     * Thuban/UI/messages.py: Added DOCKABLE_* messages
10475    
10476     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
10477     not LAYER_LEGEND_CHANGED, messages.
10478    
10479 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
10480    
10481     * setup.py: Added custom script bdist_rpm_build_script so that
10482     when the rpm is built the path to wx-config is correct.
10483    
10484     * setup.cfg: Added line saying to use the custom build script
10485    
10486 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
10487    
10488     Initial implementation of the Legend.
10489    
10490     * Thuban/UI/legend.py: New. Creates a window that shows the map's
10491     Legend information and allows the user to add/modify classifications
10492     and how the layers are drawn on the map.
10493    
10494     * setup.py: New command 'build_docs' which currently uses
10495     happydoc to generate html documentation for Thuban.
10496    
10497     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
10498     Returns a string which is appropriately describes the group.
10499    
10500     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
10501     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
10502    
10503     * Thuban/Model/map.py (Map): Rename messages and use new, more
10504     specific, messages.
10505    
10506     * Thuban/Model/messages.py: New message to indicate that a layer's
10507     data has changed (LAYER_CHANGED). New map messages to indicate
10508     when layers have been added/removed/changed or if the stacking order
10509     of the layers has changed.
10510    
10511     * Thuban/Model/session.py: Rename and use new messages.
10512    
10513     * Thuban/UI/classifier.py: Remember if any changes have actually
10514     been applied so that if the dialog is cancelled without an application
10515     of changes we don't have to set a new classification.
10516     (ClassDataPreviewer): Pulled out the window specific code and put it
10517     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
10518     symbols on any DC.
10519    
10520     * Thuban/UI/mainwindow.py: New code to open the legend.
10521    
10522     * Thuban/UI/view.py: Use new message names.
10523    
10524 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
10525    
10526     * Thuban/UI/main.py (verify_versions): New. Checks the versions
10527     of Python, wxPython, and some other libraries.
10528    
10529     * extensions/thuban/wxproj.cpp (check_version): Checks the given
10530     version against what wxproj was compiled with.
10531     (check_version_gtk): If wxproj was compiled with gtk then check
10532     the given version against the version of the gtk library
10533     currently being used.
10534    
10535 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
10536    
10537     * test/test_command.py: Run the tests when the module is run as a
10538     script
10539    
10540     2003-03-14 Bernhard Herzog <[email protected]>
10541    
10542     Implement selection of multiple selected shapes in the same layer:
10543    
10544     - Introduce a new class to hold the selection. This basically
10545     replaces the interactor which was nothing more than the
10546     selection anyway. A major difference is of course that the new
10547     selection class supports multiple selected shapes in one layer
10548    
10549     - Move the object that represents the selection from the
10550     application to the canvas. The canvas is a better place than the
10551     application because the selection represents which shapes and
10552     layer of the map displayed by the canvas are selected and
10553     affects how the map is drawn.
10554    
10555     - Make the selection and its messages publicly available through
10556     the mainwindow.
10557    
10558     - The non-modal dialogs do not get a reference to the interactor
10559     anymore as they can simply refer to their parent, the
10560     mainwindow, for the what the interactor had to offer.
10561    
10562     * Thuban/UI/selection.py: New module with a class to represent the
10563     selection.
10564    
10565     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
10566     these unused messages
10567    
10568     * Thuban/UI/application.py (ThubanApplication.OnInit)
10569     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
10570     interactor is gone now.
10571     (ThubanApplication.CreateMainWindow): There is no interactor
10572     anymore so we pass None as the interactor argument for now for
10573     compatibility.
10574    
10575     * Thuban/UI/view.py (MapCanvas.delegated_messages)
10576     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
10577     Unsubscribe, delegate messages according to the delegated_messages
10578     class variable.
10579     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
10580     attributes from instance variables as described with the
10581     delegated_methods class variable.
10582     (MapCanvas.__init__): New instance variable selection holding the
10583     current selection
10584     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
10585     pass them on to the renderer
10586     (MapCanvas.SetMap): Clear the selection when a different map is
10587     selected.
10588     (MapCanvas.shape_selected): Simple force a complete redraw. The
10589     selection class now takes care of only issueing SHAPES_SELECTED
10590     messages when the set of selected shapes actually does change.
10591     (MapCanvas.SelectShapeAt): The selection is now managed in
10592     self.selection
10593    
10594     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
10595     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
10596     Unsubscribe, delegate messages according to the delegated_messages
10597     class variable.
10598     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
10599     attributes from instance variables as described with the
10600     delegated_methods class variable.
10601     (MainWindow.__init__): The interactor as ivar is gone. The
10602     parameter is still there for compatibility. The selection messages
10603     now come from the canvas.
10604     (MainWindow.current_layer, MainWindow.has_selected_layer):
10605     Delegate to the the canvas.
10606     (MainWindow.LayerShowTable, MainWindow.Classify)
10607     (MainWindow.identify_view_on_demand): The dialogs don't need the
10608     interactor parameter anymore.
10609    
10610     * Thuban/UI/tableview.py (TableFrame.__init__)
10611     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
10612     (LayerTableFrame.row_selected): The interactor is gone. It's job
10613     from the dialog's point of view is now done by the mainwindow,
10614     i.e. the parent. Subscribe to SHAPES_SELECTED instead
10615     of SELECTED_SHAPE
10616    
10617     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
10618     is gone. It's job from the dialog's point of view is now done by
10619     the mainwindow, i.e. the parent.
10620    
10621     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
10622     gone. It's job from the dialog's point of view is now done by the
10623     mainwindow, i.e. the parent.
10624    
10625     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
10626     gone. It's job from the dialog's point of view is now done by the
10627     mainwindow, i.e. the parent.
10628     (SessionTreeCtrl.__init__): New parameter mainwindow which is
10629     stored as self.mainwindow. The mainwindow is need so that the tree
10630     can still subscribe to the selection messages.
10631     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
10632     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
10633     selection is now accessible through the mainwindow. Subscribe to
10634     SHAPES_SELECTED instead of SELECTED_SHAPE
10635    
10636     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
10637     SHAPES_SELECTED message now.
10638     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
10639     so deal with multiple shapes
10640     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
10641     gone. It's job from the dialog's point of view is now done by the
10642     mainwindow, i.e. the parent.
10643    
10644     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
10645     parameter is now a list of shape ids.
10646     (RecordTable.SetTable): The second parameter is now a list of
10647     indices.
10648    
10649     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
10650     selected_shape parameter and ivar to selected_shapes. It's now a
10651     list of shape ids.
10652     (MapRenderer.draw_label_layer): Deal with multiple selected
10653     shapes. Rearrange the code a bit so that the setup and shape type
10654     distinctions are only executed once.
10655    
10656     * test/test_selection.py: Test cases for the selection class
10657    
10658 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
10659    
10660     * Thuban/Model/load.py: Temporary fix so that the xml reader
10661     doesn't cause Thuban to crash.
10662    
10663     * Thuban/Model/layer.py: Handle the cyclic references between
10664     a layer and its classification better, and be sure to disconnect
10665     the classification from the layer when the layer is destroyed
10666     so that we don't maintain a cyclic reference that may not be
10667     garbage collected.
10668    
10669     * Thuban/Model/classification.py: See comment for layer.py.
10670    
10671 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
10672    
10673     * HOWTO-Release: New. Information on the steps for releasing
10674     a new version of Thuban.
10675    
10676 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
10677    
10678     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
10679     Use True instead of true.
10680     (Classifier): Should have a single panel in which all the controls lie.
10681    
10682     * Thuban/UI/proj4dialog.py: Add normal border.
10683    
10684     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
10685    
10686     * Thuban/UI/mainwindow.py: Use True instead of true.
10687    
10688     * setup.py: Update some definitions to use wxWindows2.4 files
10689    
10690     * Data/iceland_sample_class.thuban: Fixed file so that the
10691     field_type information is present.
10692    
10693 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
10694    
10695 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
10696     field type label grow so that when the text changes the
10697     size is updated correctly. This may be a wxWindows bug.
10698    
10699     2003-03-10 Jonathan Coles <[email protected]>
10700    
10701 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
10702     SESSION_REPLACED.
10703    
10704     * Thuban/UI/classifier.py: Wrap text with _().
10705     (ClassGrid.CreateTable): Set dimensions and size hints here,
10706     instead of in Reset, so we only set the size once.
10707    
10708     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
10709    
10710     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10711     Call Close() instead of Shutdown().
10712    
10713     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10714    
10715     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10716     Go back to using OnClose() instead of Shutdown().
10717    
10718     2003-03-10 Jonathan Coles <[email protected]>
10719    
10720 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
10721     to know the old field index as well as the new one.
10722    
10723     2003-03-10 Jonathan Coles <[email protected]>
10724    
10725 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
10726     to correctly set the table information and call this from
10727     __init__ and from _OnFieldSelect so that all the information
10728     is up to date when the dialog opens and when a field is changed.
10729    
10730     2003-03-10 Jonathan Coles <[email protected]>
10731    
10732 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
10733     layer's message function directly, use the ClassChanged() method
10734     when then classification changes. SetField/SetFieldType/SetLayer
10735     must keep the information about field name and field type in
10736     sync when an owning layer is set or removed.
10737    
10738     * Thuban/Model/layer.py: Added ClassChanged() so that the
10739     classification can tell the layer when its data has changed.
10740     (Layer.SetClassification): Accepts None as an arguement to
10741     remove the current classification and correctly handles
10742     adding a new classification.
10743    
10744     * Thuban/Model/load.py: Comment out print statement
10745    
10746     * test/test_classification.py, test/test_save.py: New and
10747     improved tests.
10748    
10749 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
10750    
10751     * Thuban/Model/classification.py: Implemented __copy__ and
10752     __deepcopy__ for ClassGroup* and ClassGroupProperites so
10753     they can easily be copied by the classifier dialog.
10754     (ClassGroupProperites.__init__): The default line color should
10755     have been Color.Black.
10756    
10757     * Thuban/UI/classifier.py: Setting and Getting table values now
10758     uses a consistent set of functions.
10759     (Classifier): Now non-modal. Has field type label which changes
10760     as the field changes. Keep track of buttons in a list so that
10761     we can enable/disable the buttons when the None field is selected.
10762     (SelectPropertiesDialog): Add buttons to make the colors transparent.
10763    
10764     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
10765     does what OnClose did, but can be called by the application to
10766     close a window. Needed when a session changes, and we have to
10767     close the classifier windows.
10768    
10769     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10770     Shuts down open dialogs. Used when a new session is created
10771     or a session is opened.
10772     (MainWindow.SaveSession): Should only call application.SaveSession()
10773     if we don't call SaveSessionAs first.
10774     (MainWindow.Classify): Allow different classifier dialogs for
10775     different layers.
10776    
10777     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
10778     the parent class handle it. Add Shutdown() to unsubscibe from
10779     event notification and call the parent Shutdown(). This was
10780     necessary so the application can close the tree window.
10781    
10782 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
10783    
10784     * Thuban/Model/classification.py: Minor documentation changes,
10785     Addition of __eq__ and __ne__ methods.
10786     (Classification.SetLayer): prevent recursion between this method
10787     and Layer.SetClassification().
10788    
10789     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
10790    
10791     * Thuban/Model/layer.py (SetClassification): prevent recursion
10792     between this method and Classification.SetLayer().
10793    
10794     * test/test_classification.py, test/test_load.py,
10795     test/test_session.py: Fixed and added tests for the classification
10796     classes.
10797    
10798 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
10799    
10800     * Thuban/UI/classifier.py (ClassGrid.__init__)
10801     (ClassGrid.CreateTable): Move the SetSelectionMode call to
10802     CreateTable because otherwise it triggers an assertion in
10803     wxPython/wxGTK 2.4.
10804    
10805 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
10806    
10807 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
10808 jonathan 471
10809 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
10810 jonathan 471
10811 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
10812 jonathan 471
10813 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
10814 jonathan 471
10815     2003-03-05 Jonathan Coles <[email protected]>
10816    
10817 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
10818     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
10819     Store just the groups in the table and generate the other
10820     column information when it is requested. Add "None" field
10821     to pull-down to select no classification.
10822    
10823     * Thuban/common.py: Moved FIELDTYPE constants from table.py
10824     (Str2Num): Only catch ValueError exceptions.
10825    
10826     * Thuban/Model/classification.py: Class documentation. Renaming
10827     of methods with Stroke to Line. Groups are stored in a single
10828     list with the default as the first element. Groups are searched
10829     in the order they appear in the list.
10830    
10831     * Thuban/Model/color.py: Documentation.
10832    
10833     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
10834     the kind of data represented by a field.
10835    
10836     * Thuban/Model/load.py (ProcessSession): Use proper string
10837     conversion function; fixes RTbug #1713.
10838    
10839     * Thuban/Model/save.py (Saver): Store field type information.
10840    
10841     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
10842     (Table): Add field_info_by_name() to retrieve field information
10843     by specifying the field name, not the number.
10844    
10845     * Thuban/UI/mainwindow.py: Function name changes.
10846    
10847     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10848     get the layer classification once. Don't try to classify
10849     values when the field is None: just use the default properties.
10850    
10851     * Thuban/UI/view.py: Function name changes.
10852    
10853     * Doc/thuban.dtd: Add field_type attribute to a classification.
10854    
10855 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
10856    
10857 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
10858     the fill and stroke layer attributes optional with suitable
10859     default values. Add the stroke_width layer attribute. Use correct
10860     syntax for empty elements. Make the attribute list for labels
10861     refer to the label element.
10862    
10863     2003-03-04 Bernhard Herzog <[email protected]>
10864    
10865 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
10866     Python 2.3 containing some of the functionality we implement in
10867     setup.py ourselves.
10868    
10869     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
10870     before the selection mode. Doing it the other way round triggers
10871     an assertion in wxWindows.
10872    
10873     * Thuban/Model/save.py (escape): Fix typo in doc-string
10874    
10875     * Thuban/Model/classification.py: Remove unnecessary wxPython
10876     import
10877    
10878 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
10879    
10880     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
10881     Parameter 'value' should default to None.
10882    
10883     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
10884     the class attribute __classification is now private.
10885    
10886     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
10887     Classifier to ClassGrid. Added support for removing selected rows,
10888     which including code for keeping track of when cells are selected,
10889     and deselected.
10890     (ClassTable): Support for added/removing rows. Fixed a problem
10891     with __ParseInput whereby it would not allow strings (only numbers)
10892     to be entered.
10893     (Classifier): Added button and supporting code for removing
10894     selected rows.
10895    
10896 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
10897 jonathan 434
10898     * Thuban/common.py: Moved color conversion functions into
10899     Thuban/UI/common.py.
10900     (Str2Num): Now converts the float (not the string) to a long/int
10901     so that an exception isn't thrown.
10902    
10903     * Thuban/UI/common.py: Common functions used in several UI modules
10904    
10905     * Thuban/Model/classification.py: Changed the class hierarchy
10906     so that a Classification consists of Groups which return
10907     Properties when a value matches a Group.
10908    
10909     * Thuban/Model/layer.py: Fixed name resolution problem.
10910    
10911     * Thuban/Model/load.py: Use new Classification and Group functions.
10912    
10913     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
10914     failure.
10915     (Saver.write_classification): Use new Classification and Group
10916     functions.
10917    
10918     * Thuban/UI/classifier.py: Changes to use new Classification and Group
10919 jonathan 445 functions. Fix to create a tuple with a single value instead of
10920     simply returning the value.
10921 jonathan 434
10922     * Thuban/UI/renderer.py: Use new Classification and Group functions.
10923     Use common.py functions.
10924    
10925 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
10926 jonathan 447
10927     * test/test_classification.py: Use new Classification and Group
10928     classes.
10929 jonathan 434
10930 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
10931    
10932     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
10933     functions from Thuban color objects to wxWindow colour objects.
10934    
10935     * Thuban/Model/classification.py (Classification): Renamed
10936     GetProperties() to GetClassData(). Used the new iterator
10937     in TreeInfo().
10938     (ClassIterator): Iterator implementation to iterate over the
10939     ClassData objects in a classification object.
10940    
10941     * Thuban/Model/save.py (Saver.write_classificaton): Uses
10942     the new iterator to save the classification information.
10943    
10944     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
10945     for changing the stroke and fill colors and previewing the
10946     changes.
10947    
10948     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
10949     MainWindow.SaveSessionAs): Text string changes so the dialogs
10950     have more meaningful titles.
10951    
10952     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
10953     Classification method name from GetProperties to GetClassData.
10954    
10955     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
10956     instead of accessing now non-existent class variables.
10957    
10958 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
10959    
10960     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
10961     unneeded Shape() call. Rendering is substantially faster without
10962     it and it avoids some problems with broken shape files.
10963    
10964 frank 423 2003-02-20 Frank Koormann <[email protected]>
10965    
10966     Force minimal size of identify and label dialogs. The autosizing
10967     looked too ugly.
10968    
10969     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
10970     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
10971     Set size of listctrl.
10972     * Thuban/UI/identifyview.py (IdentifyView.__init__):
10973     Set size of dialog.
10974    
10975 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
10976    
10977     * test/test_classification.py, test/test_layer.py,
10978     test/test_load.py, test/test_map.py, test/test_session.py:
10979     Updated the tests to use the new functions that are in the
10980     respective classes.
10981    
10982     * Thuban/Model/classification.py (Classification):
10983     Uses the new ClassData* classes. Modification messages are
10984     passed up to the parent layer (if it exists).
10985     (ClassData): New class to encapsulate the common data in each
10986     classification property.
10987     (ClassDataDefault): Represents the Default class. data.
10988     (ClassDataPoint): Represents a single class. data point
10989     (ClassDataRange): Represents a class. range
10990     (ClassDataMap): Represents a class. map (unused).
10991    
10992     * Thuban/Model/color.py: Added Color.None to represent something
10993     with no color. Color.Black represents the color black.
10994     (NoColor): Helper class derived from Color to represent something
10995     with no color.
10996    
10997     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
10998     stroke_width attributes. Made the 'classification' attribute private.
10999     New methods for setting/getting the classification.
11000    
11001     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
11002     to get the classifcation and use the new ClassData* classes to
11003     hold the classification data. Use Str2Num to convert numbers
11004     properly.
11005    
11006     * Thuban/Model/save.py (Saver): Use new Color and Classification
11007     methods
11008    
11009     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
11010     custom grid.
11011     (ClassTable): Support for editing Values and Labels and for
11012     changing what type (point or range) of data is stored in each
11013     property based on how the user enters the data.
11014     (Classifier): Support for saving the new classifications and
11015     launching the dialog to edit a property.
11016     (SelectPropertiesDialog): New class for editing the visual
11017     properties of a classification (stroke color, width, and fill color)
11018     (ClassPreviewer): Took the Draw method from ClassRenderer and
11019     made most of it into this new class. Intend to use this class in
11020     the SelectPropertiesDialog for previewing changes.
11021    
11022     * Thuban/UI/renderer.py: Use new Color and Classification methods.
11023    
11024     * Thuban/UI/tree.py: Formatting changes.
11025    
11026     * Doc/thuban.dtd: Add 'label' element
11027    
11028     * Thuban/common.py: New. Contains common routines used throughout
11029     the code.
11030     (Str2Num): Takes a string and converts it to the "best" type of
11031     number.
11032    
11033 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
11034    
11035     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
11036     dragging flag is always set to 0 even when the tool implementation
11037     raises an exception
11038    
11039 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
11040    
11041     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
11042     method to create a splash screen.
11043     (ThubanApplication.ShowMainWindow): New. Show the main window.
11044     Needed so the splash screen can display the mainwindow
11045     (ThubanApplication.OnInit): Call the
11046     new splash_screen method to determine whether the application
11047     should display a splash screen. If it displays a splash screen do
11048     not immediately show the main window.
11049    
11050 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
11051    
11052     * Thuban/Model/classification.py: Added import line to fix
11053     feature conflicts between running on python2.2 and python2.1.
11054    
11055     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
11056     onto the clinfo parameter, so removed the deepcopy().
11057    
11058 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
11059    
11060 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
11061 jonathan 396 Added element_open variable to track opening and closing of tags
11062     so that tags that don't span more than one line are closed with
11063     /> instead of </tag_name>. Use the GetDefault*() methods of
11064     the Classification class.
11065    
11066     * Thuban/Model/classification.py (Classificaton): Added set and
11067     get methods for the default data. The class also takes a layer
11068     reference so that modification messages can be sent. Fixed the
11069     methods to use the new ClassData class.
11070     (ClassData): New class to encapsulate the classification data
11071    
11072     * Thuban/Model/layer.py (Layer): Remove the
11073 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
11074 jonathan 396 SetDefault*() methods on the layer's classification object.
11075 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
11076 jonathan 396 Classification class.
11077    
11078     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
11079     object instead of a dictionary.
11080    
11081 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
11082 jonathan 396 draw the classifications in the dialog box's table.
11083     (Classifier): Modified to use the ClassRenderer class.
11084    
11085 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
11086     methods of the Classification class.
11087 jonathan 396
11088     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
11089     of the ClassData class.
11090    
11091     * test/test_classification.py, test/test_layer.py,
11092     test/test_map.py, test/test_session.py: Fix the tests to work
11093     with the above code changes.
11094    
11095 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
11096    
11097     * Thuban/Model/classification.py (Classification): Added getNull()
11098     to return the NullData reference
11099    
11100     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
11101     Layer.SetStrokeWidth): Modified these functions to change the
11102     null data in the classification rather than keep these values
11103     directly in the Layer class. Menu options to change these values
11104     work again.
11105    
11106 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
11107    
11108 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
11109 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
11110 jonathan 380 classification data.
11111    
11112 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
11113     Colors in the tree view.
11114    
11115     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
11116     the tree info for classifications. Commented out unnecessary lines.
11117    
11118     * Thuban/Model/classification.py (Classification.TreeInfo): New
11119     function to add information about the classification into the
11120     tree view.
11121    
11122 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
11123 jan 375
11124 tkoester 403 * Thuban/__init__.py (_): New.
11125 jan 375
11126     * Thuban/Model/classification.py, Thuban/Model/extension.py,
11127     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
11128 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
11129     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
11130     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
11131     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
11132     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
11133     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
11134 jan 375
11135 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
11136    
11137 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
11138 jonathan 370
11139 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
11140     a layer classification. Supports specific data points and
11141     ranges.
11142 jonathan 370
11143 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
11144     information.
11145 jonathan 370
11146 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
11147     information.
11148 jonathan 370
11149 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
11150     specifying classification information.
11151 jonathan 370
11152 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
11153     dialog.
11154 jonathan 370
11155 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
11156     classification information.
11157 jonathan 370
11158 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
11159     classification data.
11160 jonathan 370
11161 tkoester 403 * test/test_classification: Tests for the Classification class.
11162 jonathan 370
11163 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
11164    
11165 bh 361 * test/test_command.py: New. Tests for the command classes.
11166    
11167 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
11168     (Command.IsTool): New method to distinguish between command
11169     switching tools and other commands.
11170    
11171     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
11172     the tool to avoid direct assignments to instance variables
11173     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
11174     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
11175     change the tool
11176    
11177     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
11178     active tool's command turns insensitive, disable the tool.
11179     (_tool_command): Use the new ToolCommand class
11180    
11181     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
11182     SelectTool method to change the tool
11183     (iconfile): Use the ToolCommand class
11184    
11185 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
11186    
11187     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
11188     the case of selected items that are not children of Layers or Maps
11189     properly. Previously this bug would trigger an assertion in
11190     wxWindows.
11191    
11192 frank 352 2002-11-06 Frank Koormann <[email protected]>
11193    
11194 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
11195     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
11196     Full Extent).
11197 tkoester 403
11198 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
11199    
11200     * setup.py (setup call): version now 0.1.3
11201    
11202     * MANIFEST.in: Add the files in test/
11203    
11204     * test/README: Add note about tests requiring the iceland data
11205    
11206     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
11207     copyright notice.
11208    
11209 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
11210    
11211     * test/test_map.py
11212     (TestMapWithContents.test_projected_bounding_box): Use an explicit
11213     epsilon.
11214    
11215     * test/support.py (FloatComparisonMixin.assertFloatEqual)
11216     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
11217     message if the assertion fails and don't return the return value
11218     of self.assert_. In assertFloatSeqEqual the return meant that not
11219     all items of the sequence were compared.
11220    
11221 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
11222    
11223 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
11224    
11225     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
11226    
11227 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
11228     the string with the bounding box on the fly because of platform
11229     differences in the way %g is handled.
11230    
11231     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
11232     DBFfile too because Thuban layers can't yet cope missing DBF
11233     files.
11234    
11235     2002-09-20 Bernhard Herzog <[email protected]>
11236    
11237 bh 326 * test/test_menu.py: Use initthuban instead of
11238     add_thuban_dir_to_path to initialize Thuban.
11239    
11240     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
11241     Mixin class for float comparisons
11242     (SubscriberMixin): New. Mixin class to test messages sent through
11243     the Connector class
11244    
11245     * test/README: Fix a typo and add the -v flag to the command for
11246     individual tests
11247    
11248 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
11249    
11250     * test/test_proj.py: New. Test cases for Thuban.Model.proj
11251    
11252     * test/test_map.py: New. Test cases for Thuban.Model.map
11253    
11254     * test/test_layer.py: New. Test cases for Thuban.Model.layer
11255    
11256     * test/test_label.py: New. Test cases for Thuban.Model.label
11257    
11258     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
11259    
11260     * test/test_color.py: New. Test cases for Thuban.Model.color
11261    
11262     * test/test_base.py: New. Test cases for Thuban.Model.base
11263    
11264 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
11265    
11266     * Thuban/Model/session.py (Session.forwarded_channels): Forward
11267     the CHANGED channel too.
11268    
11269     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
11270     CHANGED channel too.
11271     (Map.__init__): Call the Modifiable constructor as well.
11272    
11273     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
11274     event if the modified flag changes.
11275     (Modifiable.changed): Tweak the doc-string.
11276    
11277     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
11278     (MainWindow.set_position_text): Put the code that puts the text
11279     with the mouse position into the status bar into the new method
11280     set_position_text so that it can overwritten in derived classes.
11281    
11282 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
11283    
11284     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
11285     message box on the main window.
11286    
11287 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
11288    
11289     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
11290     the 'E' because it's less likely to interfere with other menu
11291     entries.
11292 bh 315 (MainWindow.build_menu): remove an incorrect comment.
11293 bh 313
11294 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
11295    
11296     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
11297     (_tool_command): Add sensitive parameter
11298     (_has_visible_map): Sensitivity callback to tools and other
11299     commands that require a visible map. Use it in map_zoom_in_tool,
11300     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
11301     and map_full_extent
11302    
11303 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
11304    
11305     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
11306     VIEW_POSITION
11307    
11308 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
11309 frank 306
11310     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
11311    
11312 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
11313    
11314 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
11315     wxWindows already and our implementation doesn't work correctly
11316     with wxGTK 2.3:
11317     (MapCanvas.__init__): Remove the instance variable
11318     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
11319     be drawin
11320     (MapCanvas.OnIdle): Removed.
11321    
11322 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
11323     a parameter to determine the size of the rectangle.
11324     (MapCanvas.find_shape_at): Create the box around the point on a
11325     layer by layer basis and make the size depend on the shape type.
11326     This solves a problem with the selection of point shapes at the
11327     border of the layer's bounding box
11328    
11329 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
11330    
11331 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
11332     for the sensitivity of remove layer.
11333     (_can_remove_layer): New. Sensitivity callback for remove layer
11334     (Command layer_remove): Use _can_remove_layer
11335    
11336     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
11337     determine whether a given layer can be deleted.
11338    
11339 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
11340     (MapCanvas.do_redraw): Get rid of the unused update_region
11341     instance variable
11342    
11343 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
11344    
11345 bh 292 * test/: new subdirectory with a bunch of unit tests.
11346    
11347     * test/README, test/test_table.py, test/test_save.py,
11348     test/test_menu.py, test/test_load.py: Initial set of tests and
11349     brief instructions on how to run them
11350    
11351 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
11352    
11353 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
11354     arcs with multiple parts.
11355    
11356 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
11357     Handle degenrate rectangles.
11358    
11359 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
11360     (Table.__init__): Keep track of whether the DBF is open for
11361     writing
11362     (Table.write_record): Open the DBF file for writing when necessary
11363    
11364 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
11365    
11366     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
11367     dbf files only for reading by default. Use a new writable dbf
11368     object for writing.
11369    
11370 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
11371    
11372 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
11373     (MainWindow.Context): New method to return a context
11374     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
11375     new method
11376    
11377 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
11378     layer table specific code from TableGrid into LayerTableGrid
11379     (TableFrame, LayerTableFrame): Split the layer table specific code
11380     from TableFrame into LayerTableFrame
11381 bh 280 (LayerTableGrid.select_shape): Remove a debug print
11382 bh 278
11383     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
11384     LayerTableFrame
11385    
11386 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
11387    
11388     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
11389     absolute filename.
11390    
11391 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
11392    
11393 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
11394     records.
11395 tkoester 403 (Table.__init__): Open the DBF file for writing too.
11396 bh 275
11397     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
11398     into the underlying table.
11399    
11400     * extensions/shapelib/shapefil.h (DBFCommit),
11401     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
11402     commit any changes made to the DBF file.
11403    
11404 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
11405     (_tool_command): Put the code that generates the "checked"
11406     callback into a separate function so that we can reuse it
11407     elsewhere
11408    
11409 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
11410     session into an XML file. The main reason to introduce a class is
11411     that applications built on Thuban can derive from it so that they
11412     can save additional information in a session file.
11413     (save_session): Delegate almost all the work to the Saver class.
11414     Rename the filename argument to file because it may be a file like
11415     object now.
11416    
11417     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
11418     code. Remove the little test code which would be executed when the
11419     module is run as a script which didn't work anymore since it can't
11420     import the other Thuban modules.
11421     (ProcessSession, load_session): Refactor the ProcessSession to
11422     have one method for each element start and end tag so that derived
11423     classes can easily override the processing of individual tags.
11424     Also, always parse with namespaces enabled because applications
11425     built on top of Thuban will likely use namespaces if they extend
11426     the session file format.
11427    
11428 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
11429    
11430     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
11431     because thubaninit_contents will do it for us.
11432    
11433 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
11434 jan 265
11435     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
11436     tree window already open
11437    
11438 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
11439    
11440 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
11441     with self.
11442    
11443     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
11444     when we have actually captured it.
11445    
11446 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
11447     shapefile and destroy the table.
11448    
11449     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
11450    
11451 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
11452    
11453 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
11454     instance variable columns
11455     (RecordTable.GetTypeName): row and col may be negative in some
11456     cases.
11457    
11458 bh 254 * setup.py (InstallLocal.initialize_options)
11459     (InstallLocal.finalize_options, InstallLocal.user_options): New
11460     option create-init-file to build a thubaninit.py when running
11461     install_local
11462     (InstallLocal.run): Create the thubaninit.py module when requested
11463     (thubaninit_contents): Split the template into several parts and
11464     create a new function thubaninit_contents that creates the
11465     contents of a thubaninit module.
11466     (ThubanInstall.run): Use the new function to create the thubaninit
11467     module.
11468    
11469 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
11470    
11471     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
11472     cleanup.
11473     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
11474    
11475     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
11476     direct base class' Destroy method.
11477    
11478     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
11479     layers.
11480     (Map.Destroy): Destroy the label_layer as well and call the
11481     inherited Desatroymethod first so that no more messages are
11482     issued.
11483     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
11484     message if the stacking order actually has changed. Add
11485     doc-strings.
11486     (Map.BoundingBox): Correct the doc-string.
11487     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
11488     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
11489    
11490     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
11491     all labels.
11492    
11493 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
11494    
11495     * Thuban/Model/map.py (Map.subscribe_layer_channels)
11496     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
11497     to a layer's channels into separate methods.
11498     (Map.RemoveLayer, Map.AddLayer): Call the new methods
11499     (Map.Destroy): Unsubscribe from a layer's channels before
11500     destroying it.
11501    
11502     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
11503     selected_layer parameter to searched_layer which is the layer to
11504     search in.
11505     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
11506     search to that layer. Return the selected layer and shape.
11507    
11508     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
11509     typo
11510    
11511 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
11512    
11513 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
11514     Extend the doc string.
11515     (ThubanApplication.subscribe_session)
11516     (ThubanApplication.unsubscribe_session): New methods to
11517     subscribe/unsubscribe to/from session channels.
11518     (ThubanApplication.SetSession): Call the new methods here.
11519     (ThubanApplication.maps_changed, ThubanApplication.set_map):
11520     Renamed set_map to maps_changed. Its now a subscriber for
11521     MAPS_CHANGED.
11522    
11523     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
11524     x-coordinate in case of simple clicks
11525    
11526     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
11527     don't pass it as a parameter
11528    
11529     * Thuban/Model/session.py (Session.RemoveMap): New
11530    
11531 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
11532     window size into a parameter.
11533    
11534 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
11535    
11536 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
11537     just commands.
11538    
11539 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
11540     parameter list a bit to allow setting the window title and the
11541     initial message in the status bar. Update the callers.
11542    
11543     * Thuban/UI/application.py (ThubanApplication.OnInit)
11544     (ThubanApplication.CreateMainWindow): Put the mainwindow
11545     instantiation into a separate method so that it can be overridden
11546     by a subclass.
11547    
11548 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
11549    
11550 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
11551     another changed message is issued to make it easier to get
11552     notified of changes.
11553     (Session): Update the doc string
11554     (Session.forward): Issue changed-events as CHANGED as well.
11555     (Session.changed): Overwrite the inherited version to issue
11556     CHANGED events as well.
11557    
11558     * Thuban/UI/tree.py: We can now simply subscribe to the session's
11559     CHANGED channel to be informed of changes.
11560     (SessionTreeCtrl.session_channels): Not needed any longer.
11561 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
11562 bh 234 Only have to (un)subscribe CHANGED
11563    
11564     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
11565    
11566 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
11567     for the wxPython locale bug to __init__.py so that it's
11568     automatically executed by anybody using UI code from Thuban.
11569    
11570 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
11571    
11572 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
11573    
11574     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
11575     as parameter and store it in an instance variable
11576     (MainWindow.invoke_command, MainWindow.update_command_ui)
11577     (MainWindow.save_modified_session, MainWindow.NewSession)
11578     (MainWindow.OpenSession, MainWindow.SaveSession)
11579     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
11580     application object.
11581    
11582     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
11583     the main window with self.
11584    
11585 bh 225 * Thuban/UI/context.py: New module with the context class
11586    
11587     * Thuban/UI/command.py (Command): Update doc string.
11588    
11589     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
11590     MainWindow.update_command_ui): Pass an instance of the context
11591     class to the command's methods
11592     (check_current_tool, call_method): Handle the new context
11593     implementation
11594    
11595     * Examples/simple_extensions/simple_tool.py (simple_tool,
11596     check_simple_tool): Handle the new context implementation
11597    
11598     * Examples/simple_extensions/simple_command.py (simple_command):
11599     Handle the new context implementation. Update the comments about
11600     the context.
11601    
11602     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
11603     doc-string
11604     (ThubanApplication.Session): New method to return the session
11605     object
11606    
11607     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
11608     interactor's selected_layer may not be a layer of the current
11609     session when the tree is updated while a new session is being set.
11610    
11611 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
11612    
11613     * Thuban/UI/tree.py (color_string): Removed. No longer used.
11614     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
11615     update_tree into update_tree and add_items. The tree now uses a
11616     more generic way to display the contents of the tree.
11617     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
11618    
11619     * Thuban/Model/layer.py (Layer.TreeInfo),
11620     Thuban/Model/extension.py (Extension.TreeInfo),
11621     Thuban/Model/map.py (Map.TreeInfo),
11622 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
11623 bh 217 Add TreeInfo methods to implement the new tree view update scheme
11624    
11625 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
11626    
11627     * Thuban/UI/application.py: Don't use "import from" for the
11628     MainWindow. It can't always be resolved.
11629     (ThubanApplication.OnInit): change reference to MainWindow
11630     accordingly.
11631    
11632     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
11633     completely
11634    
11635 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
11636    
11637     * setup.py (create_init_module): New configurable variable whose
11638     default depends on the platform we're running on.
11639     (ThubanInstall.initialize_options): Initialize
11640     self.create_init_module from the global create_init_module
11641     (ThubanInstall.user_options): indictate that the options
11642     create-init-module and init-module-dir have arguments.
11643    
11644     * setup.py: In the setup call change the version number to include
11645     cvs.
11646    
11647     * MANIFEST.in: Add the files in Examples
11648    
11649 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
11650    
11651 bh 210 * setup.py: In the setup call, use the thuban homepage as the
11652     value of the url parameter.
11653    
11654 bh 208 * Examples: New subdirectory for examples.
11655    
11656     * Examples/simple_extensions/simple_tool.xpm,
11657     Examples/simple_extensions/simple_tool.py,
11658     Examples/simple_extensions/simple_command.py,
11659     Examples/simple_extensions/README: Simple examples showing how to
11660     add new commands and tools.
11661    
11662 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
11663     bdist_rpm that we also have an install script.
11664     (bdist_inno): Add 2002 to the copyright notice.
11665    
11666 bh 205 * setup.py: Create a file in python's site-packages directory to
11667     make installation of Thuban as a library easier.
11668     (ThubanInstall.user_options): Add two new options,
11669     create-init-module and init-module-dir
11670     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
11671     filenames for installation in the default directories.
11672     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
11673     the inherited methods to capture some filenames before they're
11674     transformed too much by distutils.
11675     (ThubanInstall.run): Create the init module if requested.
11676     (ThubanInstall.thuban_init_filename): New method to return the
11677     full name of the init module.
11678     (ThubanInstall.get_outputs): Append the filename of the init
11679     module.
11680    
11681 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
11682    
11683 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
11684     handle the prefix properly which means that the default for the
11685     installation prefix should be /usr for RPMs and /usr/local when
11686     doing a normal source install.
11687     (bdist_rpm_install_script): Script to override the default install
11688     commands in the specfile generated by the bdist_rpm command.
11689     (thuban_bdist_rpm.user_options): Add a prefix option
11690     (thuban_bdist_rpm.initialize_options): Init the prefix option.
11691     Create the script files for the spec files as empty files here
11692     (thuban_bdist_rpm._make_spec_file): Override the inherited method
11693     to fill the script files with content.
11694    
11695 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
11696     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
11697     argument. save_session now automatically uses this version,
11698     solving a problem when saving to a relative filename.
11699    
11700     * setup.py: In the setup call, make sure that the library
11701     directories are under $prefix/lib not directly under $prefix.
11702    
11703 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
11704 jan 199
11705     * Thuban/Model/extension.py: new module to handle extension objects.
11706     * Thuban/Model/messages.py: new messages for extensions.
11707     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
11708     Session.AddExtension): new for handling extensions.
11709     Also some other minor changes to round up extension handling.
11710     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
11711     of Extension titles and title and names of its objects.
11712    
11713 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
11714    
11715     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
11716 bh 202 the events for a command.
11717 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
11718     Call bind_command_events to bind the events. add_toolbar_command
11719     can now bind events too so that it's possible to have commands
11720     that are only available through the toolbar.
11721     (MainWindow.init_ids): New instance variable events_bound to keep
11722     track of for which commands events have been bound.
11723    
11724 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
11725    
11726     * Thuban/UI/menu.py: New module to build and manage menus.
11727    
11728     * Thuban/UI/mainwindow.py: Remove some unused imports.
11729     (MainWindow.__init__, main_menu): move the definition of the main
11730     menu from __init__ to the Menu instance main_menu.
11731     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
11732     build the menu bar and sub-menus from a menu description.
11733    
11734     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
11735     startup file
11736     (ThubanApplication.read_startup_files): New method to run
11737     ~/.thuban/thubanstart.py
11738    
11739 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
11740     Move the toolbar definition to the Menu instance main_toolbar.
11741     (MainWindow.build_toolbar): New method to build the toolbar
11742     similar to the build_menu methods
11743    
11744 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
11745    
11746 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
11747     layer_outline_color. Fix it in the definition of the command too.
11748    
11749 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
11750    
11751 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
11752    
11753     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
11754     in the docstring
11755    
11756 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
11757    
11758 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
11759     when the shapefile is empty.
11760     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
11761     now return None for empty shapefiles. Update doc-strings.
11762    
11763     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
11764     the layer's bbox being None.
11765    
11766     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
11767     layer's bbox being None.
11768    
11769 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
11770     necessary.
11771     (MapCanvas.__init__): New instance variables, last_selected_layer
11772     and last_selected_shape to determine how the selection has
11773     changed.
11774    
11775     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
11776     AutoSizeColumns because it will cause a traversal of the entire
11777     table which for large .dbf files will take a very long time.
11778    
11779 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
11780    
11781     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
11782     maximum depth for the tree than shapelib does by default.
11783    
11784 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
11785    
11786     * setup.py (py_modules): The shptree modules doesn't have a
11787     wrapper, so don't include it in the py_modules
11788    
11789 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
11790    
11791     * extensions/shapelib/shptree.c (compare_ints): Make arguments
11792     const void * as in the qsort prototype
11793     (SHPTreeFindLikelyShapes): Remove some unused variables.
11794    
11795     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
11796     maintains to redraw the window during a drag.
11797     (MapCanvas.unprojected_rect_around_point): New method to determine
11798     a small region around a point for hit-testing.
11799     (MapCanvas.find_shape_at): Only test the shapes in a small region
11800     around the point.
11801    
11802     * setup.py: Increment the version to 0.1.2
11803    
11804     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
11805     debug print and set session to None after unsubscribing
11806    
11807 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
11808    
11809 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
11810     the file to have a .thuban extension.
11811    
11812 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
11813     all the session channels to subscribe to to update the tree
11814     (SessionTreeCtrl.session_changed): Remember the session so that we
11815     can unsubscribe properly. Use the new class constant to
11816     unsubscribe from the old session and subscribe to the new one.
11817     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
11818     subscriptions of the SessionTreeCtrl.
11819     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
11820    
11821     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
11822     Session Tree" command to the file menu.
11823    
11824     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
11825     as update_region to the renderer.
11826    
11827     * Thuban/UI/renderer.py
11828     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
11829     update box is now directly a tuple, not a wxRect anymore.
11830    
11831     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
11832     prints.
11833    
11834     2002-05-07 Bernhard Herzog <[email protected]>
11835    
11836 bh 146 * setup.py: Add the shptree extension module. See
11837     extensions/pyshapelib/ChangeLog for more details.
11838    
11839     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
11840     extensions/shapelib/dbfopen.c: Really update to the versions of
11841     shapelib 1.2.9. For some reason it wasn't really done on
11842     2002-04-11.
11843    
11844     * extensions/shapelib/shptree.c: Modified version of shptree.c of
11845     shapelib 1.2.9. The only real difference is the use of qsort
11846     instead of a bubble sort implementation
11847    
11848     * Thuban/Model/layer.py (Layer.__init__): New instance variable
11849     shapetree to hold the shapelib quadtree for the shapefile
11850     (Layer.open_shapefile): Create the quad tree.
11851     (Layer.ShapesInRegion): New method to return the ids of shapes in
11852     a given region using the quad tree.
11853    
11854     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
11855     comment
11856     (draw_polygon_shape): Accept both arcs and polygons.
11857     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
11858     the api.
11859    
11860     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
11861     return the shape ids to be rendered in a given layer.
11862     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
11863     ids. Use draw_polygon_shape to draw arc shapes as well.
11864     (ScreenRenderer.RenderMap): New parameter for the rectangle that
11865     has to be updated
11866     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
11867     calling it's ShapesInRegion method.
11868    
11869     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
11870     update_region for the update region.
11871     (MapCanvas.OnPaint): Maintain the update region
11872     (MapCanvas.do_redraw): Pass the bounding box of the update_region
11873     to the renderer when drawing the bitmap. Reset the update_region.
11874    
11875 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
11876    
11877 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
11878     MainWindow.OpenSession): Change the file extension of the session
11879     files to .thuban
11880    
11881 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
11882     Move the map channels to be forwarded by the session into the
11883 bh 146 class constant with forwarded_channels. Also add
11884     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
11885     forwarded_channels
11886 bh 129
11887     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
11888     typo and some rewording).
11889    
11890 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
11891    
11892     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
11893     around to speed up most redraws:
11894     (MapCanvas.__init__): New instance variable bitmap which holds the
11895     bitmap
11896     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
11897     self.bitmap to draw.
11898     (MapCanvas.full_redraw): New method to force a full redraw
11899     including the bitmap
11900     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
11901     make sure the bitmap is redrawn.
11902     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
11903     MapCanvas.shape_selected): Call full_redraw instead of readraw to
11904     make sure the bitmap is redrawn.
11905     (MapCanvas.OnSize): New method to handle size events so that the
11906     bitmap can be redrawn.
11907    
11908 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
11909    
11910     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
11911     canvas' VIEW_POSITION event
11912     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
11913     Update the text in the status-bar accordingly.
11914    
11915     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
11916     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
11917     called.
11918     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
11919     current_position
11920     (MapCanvas.set_current_position): New method to set
11921     current_position. Issue a VIEW_POSITION event
11922     (MapCanvas.CurrentPosition): New public method to return the value
11923     of current_position. Should be called when the VIEW_POSITION event
11924     is processed.
11925     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
11926     Update the position.
11927     (MapCanvas.OnLeaveWindow): Set the position to None.
11928    
11929     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
11930     position in the statusbar
11931    
11932 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
11933 frank 120
11934     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
11935    
11936 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
11937    
11938 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
11939    
11940     * Resources/Bitmaps/fullextent.xpm: new
11941 jan 116
11942 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
11943 jan 116
11944 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
11945     box
11946 jan 114
11947 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
11948    
11949 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
11950    
11951     * Thuban/UI/tree.py (update_tree): added added map extent
11952    
11953     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
11954 tkoester 403 icon; added map_full_extend as tool
11955 jan 114
11956 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
11957 jan 107
11958     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
11959     saving _new_ sessions
11960    
11961     * Thuban/Model/session.py (create_empty_session): new session
11962     don't have a filename (set to None)
11963    
11964     * Thuban/UI/tree.py (update_tree): added filename and modified flag
11965    
11966     * Thuban/Model/load.py (ProcessSession): convert projection
11967     parameters from unicode to regular string
11968    
11969     * Data/iceland_sample.session: Added UTM Zone 26 projection.
11970    
11971 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
11972    
11973     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
11974     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
11975     1.2.9
11976    
11977     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
11978     the pyshapelib directoy into the list of include dirs, so that
11979     pyshapelib_api.h can be found.
11980    
11981     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
11982     holds the pyshapelib C-API
11983     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
11984     pyshapelib_api to access the shapelib functions.
11985     (initwxproj): Import the c_api from the shapelib module and
11986     initialize pyshapelib_api.
11987    
11988 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
11989    
11990 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
11991     initialize_options to create the scripts for the rpm.
11992    
11993 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
11994    
11995 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
11996    
11997 bh 87 * setup.py: Increment version to 0.1.1
11998    
11999 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
12000     Layer" and "Remove Layer" commands from the layer menu to the map
12001     menu
12002    
12003 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
12004    
12005     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
12006     argument (python <= 1.5.2 erroneously accepted multiuple
12007     arguments)
12008    
12009 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
12010    
12011     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
12012     RecordGrid in the identifyview.
12013     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
12014     IdentifyListCtrl. The grid allows editing of the values.
12015    
12016     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
12017     implementing a grid for a single row of a thuban table.
12018    
12019     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
12020     layers by default. Easier to use than the previous default of only
12021     searching through the select layer which meant that if no layer
12022     was selected, you couldn't select a shape.
12023    
12024     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
12025    
12026     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
12027     stroke_width attribute
12028    
12029     * Thuban/Model/save.py (save_session): Write the new stroke_width
12030     attribute
12031    
12032     * Thuban/Model/load.py (ProcessSession.startElement): Read the
12033     stroke_width attribute
12034    
12035     * Thuban/Model/layer.py (Layer.__init__): New parameter and
12036     instance variable stroke_width
12037     (Layer.SetStrokeWidth): Set the stroke_width.
12038    
12039 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
12040    
12041     * extensions/thuban/wxproj.cpp (project_points): Fix two
12042     off-by-one errors in the last loop that joins the various parts
12043     together.
12044    
12045 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
12046    
12047     * setup.py (data_dist.make_distribution): Fix some typos
12048    
12049 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
12050    
12051     * README: Slight tweaking in preparation for the 0.1 release
12052    
12053     * setup.cfg: Add section for sdist to create both tgz and zip
12054     archives
12055    
12056     * setup.py: increase version number to 0.1
12057     (data_dist): New command class for data distribution
12058    
12059 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
12060    
12061 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
12062     Handle the case of no layer (i.e. layer is None) properly.
12063    
12064 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
12065 bh 70 Set the initial selection of the combo boxes to reflect the
12066     projection we're starting with in a way that works on windows,
12067     too.
12068    
12069 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
12070     puiblisher's ids in hex to make it easier to compare them to the
12071     standard repr of python methods
12072    
12073     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
12074     messages
12075    
12076 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
12077    
12078 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
12079     deselect the layer if no layer is selected
12080    
12081 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
12082     idle time when there actually is something to draw. If there's
12083     nothing to draw simply clear the window
12084     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
12085     (MapCanvas.SetMap): force a redraw in all cases because
12086     FitMapToWindow doesn't always do it.
12087     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
12088     specify the point to move into the center of the window
12089     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
12090     dragged, zoon in/out by a factor of 2
12091 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
12092     index, i.e. reversed drawing order) so that objects appearing to
12093     be in from of others are selected first. This is probably mostly
12094     relevant for point shapes where the symbols used may overlap
12095 bh 59
12096     * Thuban/Model/session.py (create_empty_session): Unset the
12097     modified bit before returning it
12098    
12099     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
12100     create_empty_session session to create the new, empty session.
12101    
12102     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
12103     the tool bitmaps.
12104     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
12105     the code that asks whether the session should be saved into the
12106     new method save_modified_session.
12107     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
12108     method to save modified session here too.
12109    
12110 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
12111    
12112     * setup.py (InnoIconItem): fix typo
12113    
12114     (thuban_bdist_inno.run):
12115     (bdist_inno.run): Move the decision not to create symlinks on
12116     non-nt platforms to thuban_bdist_inno and do it unconditinally
12117     since we never want to create the symlinks here
12118    
12119 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
12120    
12121 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
12122     identify view immediately
12123    
12124     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
12125     and SelectableRecordListCtrl that implement the code shared by the
12126     identify view and the label dialog
12127    
12128     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
12129     new class RecordListCtrl
12130    
12131     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
12132     return value of GetValue is None instead of using it as a boolean
12133     directly so that Zero numbers are handled properly.
12134     (LabelListCtrl): Derive from the new class
12135     SelectableRecordListCtrl
12136    
12137 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
12138     (Proj4Dialog.dialogLayout): Make the window resizable and set the
12139     size of the text control explicitly to make the sizers work on
12140     both Windows and X.
12141    
12142 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
12143    
12144     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
12145     that can limit the search to the currently selected layer.
12146     (MapCanvas.SelectShapeAt): Make sure that the currently selected
12147     layer stays selected even when no shape is found
12148 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
12149     height do nothing (avoids zero division errors)
12150 bh 44
12151 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
12152    
12153 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
12154     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
12155     convenient :-)
12156     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
12157     a new instvar layer_to_item to map layers to tree items
12158     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
12159     to match the current selection in the interactor
12160    
12161 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
12162     (Interactor.HasSelectedLayer): New methods to query the current
12163     selection
12164    
12165     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
12166     (MainWindow.has_selected_layer): Simply call the appropriate
12167     interactor method
12168    
12169     * Thuban/UI/mainwindow.py (MainWindow.__init__):
12170     (MainWindow.LayerShowTable):
12171     (MainWindow.identify_view_on_demand): Store the interactor in an
12172     instvar and use that reference instead of going through main.app
12173    
12174 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
12175     * Thuban/UI/application.py (ThubanApplication.OnInit):
12176 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
12177     with the new mainwindow method ShowSessionTree and not directly
12178     the application's OnInit method
12179    
12180     * Thuban/UI/tree.py (myTreeCtrlPanel):
12181     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
12182     TreeCtrl isntead of a panel. This affects most method since we now
12183     refer to self instead of self.tree
12184     (SessionTreeView): New class implementing a non-modal dialog
12185     showing the session tree.
12186    
12187 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
12188     layer to the tableview dialog.
12189    
12190     * Thuban/UI/tableview.py: Add some doc-strings
12191 tkoester 403 (TableGrid):
12192 bh 35 (TableGrid.OnRangeSelect):
12193     (TableGrid.OnSelectCell):
12194     (TableFrame.__init__):
12195     (TableFrame.row_selected):
12196     Selecting rows in the grid view now updates the selected shapes
12197     through the TableFrame. To achieve this we derive TableGrid from
12198     Publisher and introduce the message type ROW_SELECTED which the
12199     TableFrame subscribes to and which is issued by OnRangeSelect and
12200     OnSelectCell
12201    
12202     (DataTable.SelectRow): Removed because it's no longer needed in
12203     the row/shape selection scheme
12204    
12205 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
12206     dialogs
12207    
12208     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
12209     the SELECTED_SHAPE message anymore. This is now handled by the
12210     parent.
12211     (TableGrid.select_shape): Only update the selection if the shape
12212     is not None.
12213     (TableFrame): Inherit from the new NonModalDialog class.
12214     (TableFrame.__init__, TableFrame.select_shape): Handle the
12215     SELECT_SHAPE message.
12216     (TableFrame.OnClose): Extend the inherited method to unsubscribe
12217     SELECT_SHAPE
12218    
12219     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
12220     (MainWindow.add_dialog):
12221     (MainWindow.dialog_open):
12222     (MainWindow.remove_dialog):
12223     (MainWindow.get_open_dialog): New methods to maintain a dictionary
12224     of opened non-modal dialogs.
12225    
12226     (MainWindow.__init__): Initialize the new non-modal dictionary
12227     management code
12228     (MainWindow.LayerShowTable): maintain separate dialogs for each
12229     table using the non-modal dialog management code to only open a
12230     view once for each table.
12231    
12232     (MainWindow.IdentifyTool):
12233     (MainWindow.__init__):
12234     (MainWindow.identify_view_on_demand): Don't open the identify view
12235     in IdentifyTool anymore. This will be done automatically by the
12236     new method identify_view_on_demand which handles the
12237     SELECTED_SHAPE message so that the identify view will be opened on
12238     demand
12239    
12240     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
12241     the interactor argument. The SELECTED_SHAPE message is now handled
12242     by the parent.
12243     (IdentifyView.__init__): Add the interactor argument so that we
12244     can handle the SELECTED_SHAPE message here
12245     (IdentifyView.selected_shape): New method to handle the
12246     SELECTED_SHAPE messages
12247    
12248     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
12249     NonModalDialog class
12250     (IdentifyView.OnClose): Extend the inherited version to
12251     unsubscribe SELECT_SHAPE
12252    
12253     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
12254    
12255 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
12256    
12257     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
12258 tkoester 403
12259 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
12260     interactor to pass through to the MapCanvas
12261 tkoester 403
12262 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
12263     argument to the MainWindow constructor to get rid of the ugly hack
12264     that made main.app available early just so that the mapcanvas
12265     could access the interactor object.
12266    
12267 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
12268    
12269 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
12270     that runs a modal message box
12271     (MainWindow.OnClose): Use the new method
12272     (MainWindow.RemoveLayer): Just do nothing in case no layer is
12273     selected. The command should be grayed out anyway, so there's no
12274     need to pop up a message box.
12275     (MainWindow.AddLayer): Pop up a message box with an error message
12276     if the shape file can't be opened
12277    
12278     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
12279     immediately. This will cause an exception in case the file can't
12280     be opened and we can display an appropriate message.
12281    
12282 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
12283    
12284     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
12285     specific bdist_rpm command.
12286    
12287     * Thuban/UI/main.py: Catch ImportError exceptions when importing
12288     the locale module because it may not be available on some
12289     installations.
12290    
12291     * extensions/pyprojection/LICENSE: Copy of the license text in
12292     Projection.i. Having it in a separate file makes it easier to
12293     refer to license text in e.g. RPMs
12294    
12295 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
12296    
12297 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
12298     more generic
12299    
12300     * setup.py (ThubanInstall.get_outputs): Add the symlink in
12301     <prefix>/bin to the outputs
12302     (ThubanInstall.link_file): New method to link files. We need this
12303     because the standard copy_files refuses to link non-existing
12304     files.
12305     (ThubanInstall.run): Remove the leading install root from the
12306     script filename if an install root was specified and use the new
12307     link_file method
12308 tkoester 403
12309 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
12310     the window when the first layer is added to the map.
12311    
12312     * setup.py (ThubanInstall.run): Honor the build root (self.root)
12313     when linking thuban.py to <prefix>/bin
12314    
12315 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
12316    
12317     * setup.py: In the setup call, the install parameters shouldn't
12318     have trailing slashes because distutils on non-posix platforms
12319     doesn't like that. The same applies to other directories like
12320     "Resources/Bitmaps"
12321    
12322     In the configuration section for nt, move the wxWindows directory
12323     optins into the part clearly marked as editable.
12324    
12325     (InstallLocal.initialize_options):
12326     (InstallLocal.user_options): remove the currently unused debug
12327     flag
12328     (thuban_build_py.find_all_modules): Add this method so that it
12329     works for our case of having packages and modules in one
12330     distribution as well.
12331     (ThubanInstall.initialize_options):
12332     (ThubanInstall.finalize_options):
12333     (ThubanInstall.user_options):
12334     (ThubanInstall.boolean_options): Add new options, do-symlink and
12335     extra files. Since these are the first ThubanInstall specific
12336     options, override user_options and boolean_options
12337     (ThubanInstall.run): Honor the new do-symlink and extra-files
12338     options.
12339     (ThubanInstall.get_outputs): Add to override the base-class's
12340     version and add the extra-files to the outputs
12341     (bdist_inno): New class for windows distributions with Inno Setup
12342     (InnoIconItem): Helper class for bdist_inno
12343     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
12344     this together with the appropriate parameters, to the setup call.
12345 tkoester 403
12346 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
12347     installer
12348    
12349     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
12350     changing_selection to avoid recursive selection events when
12351     modifying the selection in response to a selection event.
12352     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
12353     changing the tree's selection.
12354     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
12355     we're not being called indirectly from normalize_selection.
12356    
12357     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
12358     event.Check only if the command is actuall checkable.
12359     (MainWindow.__init__): Call the toolbar's Realize method to make
12360     sure that the items are actually shown
12361    
12362 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
12363    
12364 bh 9 * setup.py: Fix some doc strings
12365    
12366 bh 7 * ChangeLog: started
12367    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26