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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2755 - (hide annotations)
Thu Apr 12 09:21:58 2007 UTC (17 years, 10 months ago) by dpinte
File size: 480360 byte(s)
2007-04-12 Didrik Pinte <dpinte@itae.be>

   * Removed workaround for file encoding in the Thuban code


1 dpinte 2755 2007-04-12 Didrik Pinte <[email protected]>
2    
3     * Removed workaround for file encoding in the Thuban code
4    
5 bramz 2742 2007-03-14 Bram de Greve <[email protected]>
6    
7     * setup.py : updated in order to use the new dbflib C module in place
8     of the old SWIG one
9    
10 dpinte 2737 2007-03-12 Didrik Pinte <[email protected]>
11 bernhard 2731
12 dpinte 2737 * setup.py : updated in order to use the new pyshapelib C module in place
13     of the old SWIG one
14    
15     2007-02-26 Bernhard Reiter <[email protected]>
16    
17 bernhard 2733 * MANIFEST.in: Added *.xmi to Doc so that ThubanModel.xmi is included.
18    
19 bernhard 2732 * Extensions/svgexport/TODO: Added findings about how to write raster
20     in SVG.
21    
22     * Extensions/svgexport/svgmapwriter.py: untabified two lines.
23     Fixed a typo.
24    
25 bernhard 2731 * Doc/ThubanModel.xmi: Updated the format of the umbrello file.
26     Loaded and saved with umbrello 1.3.2, manually changed the
27     codegeneration tag to be empty again and change the XMI.model
28     to not contain a local path.
29     Now umbrello 1.5.5 also opens the file without crashing.
30     Thanks to Philippe LeGrand who discovered the problem and the
31     solution and filed report 141279 on bugs.kde.org for this umbrello
32     problem.
33    
34 dpinte 2730 2007-02-21 Didrik Pinte <[email protected]>
35    
36     * Extensions/umn_mapserver/__init__.py : UTF8 locales bugfix
37    
38 bernhard 2723 2007-02-20 Bernhard Reiter <[email protected]>
39    
40 bernhard 2729 * Thuban/version.py, setup.py: Getting ready for release 1.2.0.
41     Using this version number.
42    
43 bernhard 2728 * Doc/README: fixed a typo.
44    
45     * Doc/technotes/release_process.txt: Updated. Reference platform
46     is Debian Etch now. If windows, it should be window XP.
47     Marked a few entries in the instructions as "Old:".
48    
49     * README: Bumped requirements to wxWidgets 2.6.3.2 and gdal 1.3.2..
50     Added urls for homepage and infrastructure on wald. Fixed a typo.
51    
52 bernhard 2733 * MANIFEST.in: Added subdir "packaging" which should be in the tarball.
53 bernhard 2728
54     * NEWS: Completed changes from 1.1.0 until today as gathered from
55     the Changelog entries. Added small section about OGR known problems
56     because we do not have a release-notes file so far.
57    
58 bernhard 2727 * Doc/manual/thuban-manual.xml: Removed the installation instructions
59     as they are outdated and they should be only in one place.
60     Bumped version number of the document to 1.2.0. Marked it as Draft
61     in the title.
62    
63 bernhard 2726 * Extensions/svgexport/: Get ready for release. Bump version
64     number to 1.0.1. Adjusted numbers in TODO.
65    
66 bernhard 2725 * Thuban/UI/about.py: Reworked the about text. It shows now
67     when somebody was active on Thuban. Added a list of maintainers.
68     Bernhard Reiter is the current maintainer, following up on Bernhard
69     Herzog.
70    
71 bernhard 2724 * Extensions/export_shapefile/export_shapefile.py: untabify.
72 bernhard 2723
73 bernhard 2724 * test/README: Added example how to set the PATH for postgis on
74     Debian Etch.
75    
76 dpinte 2721 2007-01-13 Didrik Pinte <[email protected]>
77    
78     bboxdump, gns2shp, importAPR, mouseposition, ogr, profiling, svgexport
79     extensions migrated to wxPython 2.6
80    
81     * Extensions/bboxdump/bboxdump.py:
82     updated wx statements
83    
84     * Extensions/gns2shp/gns2shp.py:
85     updated wx statements
86    
87     * Extensions/importAPR/importAPR.py:
88     updated wx statements
89    
90     * Extensions/mouseposition/mouseposition.py:
91     updated wx statements
92    
93     * Extensions/ogr/
94     ogrdialog.py, ogrstart.py:
95     updated wx statements
96    
97     * Extensions/profiling/profiling.py:
98     updated wx statements
99    
100     * Extensions/svgexport/
101     maplegend.py, svgsaver.py:
102     updated wx statements
103    
104    
105 dpinte 2719 2007-01-08 Didrik Pinte <[email protected]>
106    
107 dpinte 2720 export_shapefile extension migrated to wxPython 2.6
108    
109     * Extensions/export_shapefile/export_shapefile.py:
110     updated wx statements, changed the FileDialog to wx.SAVE (was wx.OPEN)
111    
112     2007-01-08 Didrik Pinte <[email protected]>
113    
114 dpinte 2719 umn_mapserver extension migrated to wxPython 2.6
115    
116     * Extensions/umn_maserver/
117     mf_handle.py, mf_import.py, mf_export.py:
118     update wx imports to 2.6 policy
119    
120 dpinte 2718 2007-01-06 Didrik Pinte <[email protected]>
121    
122 bernhard 2722 UTF-8 locales support reading non utf-8 files.
123     This is a workaround and not a real bugfix. See
124     http://wald.intevation.org/tracker/index.php?func=detail&aid=118
125     for more details
126 dpinte 2718
127 bernhard 2722 * Thuban/UI/tableview.py, controls.py, baserenderer.py, view.py:
128     decode text from iso-8859-1 encoding.
129 dpinte 2718
130 bernhard 2717 2007-01-01 Bernhard Reiter <[email protected]>
131 bernhard 2722
132 bernhard 2717 * test/postgissupport.py, test/test_postgis_db.py: adding an
133     explicit WITH OIDS to the create table commands. This fixes tests
134     that rely on an oid column to be present for postgresql >=8.0.
135     Thanks for Frank Koormann for the hint.
136    
137 dpinte 2716 2006-11-06 Didrik Pinte <[email protected]>
138    
139     * libraries/thuban/wxproj.cpp: bugfix - allow compilation with
140     msvc++ toolkit 2003
141    
142 bernhard 2714 2006-11-06 Bernhard Reiter <[email protected]>
143    
144 bernhard 2715 Made it easier to run PostGIS test on Debian Etch. Improving
145     https://wald.intevation.org/tracker/index.php?func=detail&aid=173 .
146 bernhard 2714
147     * test/postgissupport.py: Taking pg_ctl and initdb commands
148     from internal variables now. Adding deactivated example values
149     for Debian Etch.
150     find_postgis_sql(): Added special line for Debian Etch postgresql-8.1.
151     Added copyright year 2006.
152    
153 bernhard 2713 2006-10-25 Bernhard Reiter <[email protected]>
154    
155     Moved ogr Extension to Extension menu.
156    
157     * Extensions/ogr/
158     __init__.py, ogrstart.py, ogrshapes.py, ogrdialog.py
159     test/test_OGRShapestore.py, test/__init__.py:
160     adding encoding information and made sure Autor's names
161     with an umlaut are actually written with an umlaut.
162    
163     * Extensions/ogr/ogrstrat.py: now registering in menu "Extensions",
164     having a "(testing)" string before the submenu to prepare for 1.2.0
165     release. Bumped copyright year to 2006.
166    
167 bernhard 2712 2006-10-15 Bernhard Reiter <[email protected]>
168    
169     * Thuban/UI/renderer.py: Added module variable verbose and
170     added verbose output before doing a raster projection.
171     Minor: Added (c) year 2006.
172    
173     * test/test_baserenderer.py: Added new function
174     test_projected_raster_decimalcommalocale()
175     Added new author Bernhard Reiter and new copyright year 2006.
176    
177     * libraries/thuban/gdalwarp.cpp(ProjectRasterFile): Adding
178     switching to LC_NUMERIC "C" and back before calling GDAL functions -
179     only #if python >=2.4 .
180    
181 dpinte 2710 2006-10-10 Didrik Pinte <[email protected]>
182 dpinte 2711
183     Win32 build updates
184    
185     * setup.py :
186     - update to the latest libs for win32 setup tasks
187     - added gdal and Lib content to the inno setup build task
188     - added stable and experimental extensions to setup packages
189    
190     * thuban.py :
191     - gdal support for win32 inno installation
192    
193     2006-10-10 Didrik Pinte <[email protected]>
194    
195 dpinte 2710 * Thuban/Model/layer.py (Layer.GetLabelPosFromShape): new method
196     extracted from Thuban/UI/viewport.py
197     * Thuban/UI/viewport.py (Viewport.LabelShapeAt): uses new method
198    
199 dpinte 2709 2006-09-28 Didrik Pinte <[email protected]>
200    
201     * Thuban/UI/classgen.py: bugfix due to wx2.6 update
202    
203     * Thuban/UI/view.py: removed non needed declaration
204    
205     * Thuban/UI/selection.py : typo correction
206    
207 bernhard 2705 2006-09-24 Bernhard Reiter <[email protected]>
208    
209 bernhard 2708 * Thuban/Model/proj.py(_do_we_have_to_work_around_broken_proj):
210     Making the test more robust for observed python 2.3 problems
211     with setlocale().
212    
213 bernhard 2705 * test/runtests.py: Added new option ---setdecimalcommalocale
214 bernhard 2712 to run all tests with an LC_NUMERIC that uses comma as decimal_point.
215 bernhard 2705 Minor: Added (c) year 2006. Fixed typo in a docstring.
216    
217     * test/test_transientdb.py: Minor: Added (c) year 2006. Fixed typo in
218     a docstring.
219    
220 bernhard 2702 2006-09-23 Bernhard Reiter <[email protected]>
221    
222     * Extensions/ogr/test/test_OGRShapestore.py: fixed skip_if_no_ogr()
223     and added it to TestOGRTable.setUp() so that all tests get skipped
224     if ogr cannot be imported. Added (c) year 2006.
225    
226 dpinte 2701 2006-09-18 Didrik Pinte <[email protected]>
227    
228     * wxPython 2.6 update : wx 2.4 syntax has been updated to 2.6
229    
230 bernhard 2696 2006-09-18 Bernhard Reiter <[email protected]>
231    
232 bernhard 2698 Fixed proj behaviour with python >=2.4 when decimal_point != '.'.
233    
234 bernhard 2697 * Thuban/UI/application.py: Fixed warning dialog when gdal is missing.
235    
236     * test/test_proj.py: new test_lc_numeric_robustness(). Added author
237     Bernhard Reiter and new copyright year 2006.
238    
239 bernhard 2698 * Thuban/Model/proj.py: New _do_we_have_to_work_around_broken_proj()
240     and Projection.assuregoodlocale(), Projection.assureinitlocale().
241     Added author Bernhard Reiter and (c) 2006.
242    
243 bernhard 2694 2006-09-15 Bernhard Reiter <[email protected]>
244 bernhard 2692
245     * README: added RXP and pyRXP as optional for tests.
246 bernhard 2697
247 bernhard 2694 * test/localessupport.py: New. Contains a helper function
248     to find a locale with comma used as decimal_point.
249 bernhard 2692
250 bernhard 2690 2006-08-31 Bernhard Reiter <[email protected]>
251 bernhard 2691
252 bernhard 2690 * README: fixed URLs to sqlite and pysqlite.
253 bernhard 2697
254 bernhard 2691 * Thuban/UI/about.py: Added Didrik Pinte as contributor. Extended
255     copyright range to include 2006.
256 bernhard 2690
257 dpinte 2689 2006-06-29 Didrik Pinte <[email protected]>
258    
259     * Thuban/UI/main.py: circular import fix.
260    
261 frank 2688 2006-06-27 Frank Koormann <[email protected]>
262    
263     New Classification "Pattern": Classify text attributes by regexp.
264    
265     * Thuban/Model/classification.py (class ClassGroupPattern):
266     New, group is associated with a regular expression.
267     (Classification._compile_classification): Store compiled regexp and
268     original group for pattern.
269     (Classification.FindGroup): Added pattern.
270    
271     * Thuban/UI/classifier.py
272     (ClassGrid._OnLabelRightClicked, ClassGrid.labelPopup):
273     New, add popup to select singleton/pattern.
274     (ClassTable.GetRowLabelValue, ClassTable.GetValueAsCustom,
275     ClassTable.SetValueAsCustom): Added pattern.
276     (ClassTable.__ParseInput): Autodetect singleton/pattern.
277    
278     * Thuban/Model/save.py (SessionSaver.write_classification):
279     Added pattern.
280    
281     * Thuban/Model/load.py (SessionLoader.start_clpattern,
282     SessionLoader.end_clpattern): New, process pattern elements.
283    
284     * test/test_classification.py (class TestClassGroupPattern): New.
285     (TestClassification.test_add_pattern,
286     TestClassification.test_multiple_groups_textual,
287     TestClassification.test_deepcopy_textual): New.
288     (TestClassification.test_multiple_groups_numerical):
289     Renamed test_multiple_groups.
290     (TestClassification.test_deepcopy_numerical): Renamed test_deepcopy.
291    
292     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
293     Added pattern.
294    
295     * test/test_load.py (ClassificationTest.TestLayers, TestClassification):
296     Added pattern.
297    
298     * test/test_layer.py
299     (TestLayerModification.test_set_classification_textual): New
300     (TestLayerModification.test_set_classification_numerical):
301     Renamed test_set_classification.
302    
303     * Doc/manual/thuban-manual.xml: Added pattern to layer classification
304     description.
305    
306     * Resources/XML/thuban-1.1.dtd: Added clpattern element and attribs.
307    
308 dpinte 2687 2006-06-29 Didrik Pinte <[email protected]>
309    
310     * Thuban/version.py: Bugfix determination of SQLite, the wright one !
311    
312 dpinte 2685 2006-06-28 Didrik Pinte <[email protected]>
313    
314 dpinte 2686 * packaging/windows/thubanstart.py: sample file loading all the stable
315     extensions
316    
317     2006-06-28 Didrik Pinte <[email protected]>
318    
319 dpinte 2685 * Thuban/version.py: Bugfix determination of SQLite on old and recent
320     systems (support pysqlite1 and pysqlite2)
321    
322 frank 2684 2006-06-27 Frank Koormann <[email protected]>
323    
324     * Thuban/version.py: Bugfix determination of SQLite on old systems.
325    
326 dpinte 2683 2006-05-17 Didrik Pinte <[email protected]>
327     * Extensions/ogr/__init__.py : updated test for win32 and correct
328     imports
329    
330 dpinte 2680 2006-05-15 Didrik Pinte <[email protected]>
331 dpinte 2682 Ashamed ... still some tabs in the files
332    
333 bernhard 2722 * Thuban/version.py : tabs removed
334     * Thuban/Model/transientdb.py : tabs removed
335 dpinte 2682
336     2006-05-15 Didrik Pinte <[email protected]>
337    
338 bernhard 2722 * Thuban/version.py : coding style correction
339     * Thuban/Model/transientdb.py : coding style correction
340 dpinte 2681
341     2006-05-15 Didrik Pinte <[email protected]>
342 dpinte 2682
343 bernhard 2722 * Thuban/version.py : Updated imports to support pysqlite2
344 dpinte 2682
345 bernhard 2722 * Thuban/Model/transientdb.py : Updated imports to support pysqlite2
346 dpinte 2680 Patched the querying system to support the param style of pysqlite2
347    
348 dpinte 2679 2006-04-24 Didrik Pinte <[email protected]>
349 bernhard 2722
350     * Extensions/svgexport/__init__.py: The extension now works on win32
351 dpinte 2679 architecture. Bug #87 corrected.
352    
353 bernhard 2678 2006-04-20 Bernhard Reiter <[email protected]>
354 bernhard 2722
355 bernhard 2678 * Doc/technotes/coding_guidelines.txt: Changed text from CVS to SVN.
356     Removed emacs specific hint and replaced it with a general hint
357     that editors might support writing changelogs.
358    
359 bernhard 2677 2006-04-12 Bernhard Reiter <[email protected]>
360 bernhard 2678
361 bernhard 2677 * Thuban/version.py: Changed thuban_release mechanism to use "svn"
362     instead of "cvs".
363    
364 bernhard 2676 2006-03-31 Bernhard Reiter <[email protected]>
365    
366     * libraries/thuban/wxproj.cpp: including proj_api.h instead of
367     projects.h now. According the Frank Warmerdam and man pj_init
368     this is the public interface to proj. Thus I have changed PJ to projPJ.
369     And I could remove the hack to avoid clashes with typedef PVALUE
370     and #define LP in projects.h clashing with symbols when trying to
371     build on windows. The file is cleaner and nicer now.
372    
373 bernhard 2675 2006-03-29 Bernhard Reiter <[email protected]>
374 bernhard 2678
375 bernhard 2675 * libraries/thuban/wxproj.cpp: undef LP to avoid clash when
376     trying to build with mingw.
377    
378 bernhard 2673 2005-10-18 Bernhard Reiter <[email protected]>
379    
380 bernhard 2674 * Thuban/UI/about.py: remove unused import of getdefaultlocale.
381     Added display of internal encoding to the about dialog text.
382    
383     * Extensions/svgexport/__init__.py: changed version to "1.0.0+cvs".
384    
385     2005-10-18 Bernhard Reiter <[email protected]>
386    
387 bernhard 2673 Startup improved: We fail right away if the internal encoding could
388     not be determined.
389    
390     * Thuban/__init__.py (get_internal_encoding): new.
391    
392     * test/test_stringrepresentation.py (class TestInternalEncoding):
393     Preserve the internal encoding for the tests in this class.
394    
395 bernhard 2671 2005-10-17 Bernhard Reiter <[email protected]>
396    
397 bernhard 2672 * test/test_stringrepresentation.py: New file, for now testing
398     that set_internal_coding() is throwing an exception for bad exceptions.
399    
400     * Thuban/__init__.py (set_internal_encoding): added a forwards
401     and backward translation, so that we fail early if the
402     internal_encoding is bad.
403    
404     2005-10-17 Bernhard Reiter <[email protected]>
405    
406 bernhard 2671 svgexport 1.0.0cvs: Fixed ARC layer writing: No filling is done.
407     You could actually get polylines with filling in between,
408     when the classification for the lines had a fill color.
409     E.g. this happens when you generate a classification from a ramp.
410    
411     * Extensions/svgexport/test/test_svgmapwriter.py:
412     New test_export_arc_no_fill(). Extend copyright notice to 2005.
413    
414     * Extensions/svgexport/svgmapwriter.py
415     (SVGRenderer.draw_shape_layer_incrementally()):
416     Setting TRANSPARENT_BRUSH for shaptype ARC.
417     Extend copyright notice to 2005.
418    
419     * Extensions/svgexport/__init__.py: Extend copyright notice to 2005.
420    
421 frank 2670 2005-09-08 Frank Koormann <[email protected]>
422    
423     * Doc/manual/thuban-manual.xml (Map Management): Fixed typo reported
424     by Erik (sigra.at.home.se)
425    
426 jan 2669 2005-08-18 Jan-Oliver Wagner <[email protected]>
427    
428     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
429     Call the right method for the default size.
430    
431 jan 2667 2005-08-11 Jan-Oliver Wagner <[email protected]>
432    
433     * Extensions/export_shapefile: New.
434    
435     * Extensions/export_shapefile/__init__.py: New. Initialize
436     the export_shapefile extension.
437    
438     * Extensions/export_shapefile/export_shapefile.py: New.
439     Exports a layer as a Shapefile.
440    
441 jan 2664 2005-08-08 Jan-Oliver Wagner <[email protected]>
442    
443     * po/de.po: String fixes. This fixes Debian bug #313843.
444    
445 jan 2660 2005-07-27 Jan-Oliver Wagner <[email protected]>
446    
447     Remove the attributes from the layer element in
448     .thuban files for the save routine.
449     This also solves RT bug #3149,
450     https://intevation.de/rt/webrt?serial_num=3149
451    
452     * test/test_load.py: (TestSingleLayer, TestNonAsciiColumnName,
453     TestLayerVisibility, TestSymbolSize, TestClassification, TestLabels,
454     TestLayerProjection, TestJoinedTable, TestLabelLayer): Removed
455     attributes from layer element to classification clnull element.
456    
457     * test/test_save.py (SaveSessionTest.testSingleLayer,
458     SaveSessionTest.testLayerProjection,
459     SaveSessionTest.testClassifiedLayer,
460     SaveSessionTest.test_joined_table, SaveSessionTest.test_save_postgis):
461     Removed attributes from layer element to classification clnull element.
462     (test_save_postgis.NonConnectionStore._fetch_table_information):
463     added pretending to have a shape_type.
464    
465     * Resources/XML/thuban-1.1.dtd: Make the attributes field
466     and field_type of classification optional.
467    
468     * Thuban/Model/classification.py (Classification.TreeItem.build_info):
469     Added output of size.
470    
471     * Thuban/Model/load.py (SessionLoader.start_classification):
472     Change attribute 'field' and 'field_type' from obligatory to
473     optional to allow empty classes (ie. only with a default=clnull).
474    
475     * Thuban/Model/save.py (SessionSaver.write_layer): Don't write
476     any attributes anymore for the layer element.
477     (SessionSaver.write_classification): Even if there is no
478     classification field, still write the classification because
479     the clnull (default) symbol will not be defined anymore as
480     part of the layer element.
481    
482 bh 2643 2005-07-05 Bernhard Herzog <[email protected]>
483    
484 bh 2652 * setup.py (setup call): Version 1.1.0
485    
486     * NEWS: Update for 1.1.0
487    
488     * MANIFEST.in: Add *.txt to files taken from Doc. Otherwise the
489     technores won't be included
490    
491     * Thuban/UI/about.py (About.__init__): Extend copyright notice to
492     2005
493    
494     * po/de.po: Updated.
495    
496     2005-07-05 Bernhard Herzog <[email protected]>
497    
498 bh 2645 * README: gdal 1.1.8 is too old. 1.2.5 works.
499    
500     2005-07-05 Bernhard Herzog <[email protected]>
501    
502 bh 2650 * Resources/XML/thuban-1.1.dtd (rasterlayer): Add the opacity and
503     masktype attributes.
504    
505     2005-07-05 Bernhard Herzog <[email protected]>
506    
507 bh 2644 * Thuban/Model/layer.py (Layer.__mangle_bounding_box)
508     (Layer.ClipBoundingBox): Rename ClipBoundingBox to
509     __mangle_bounding_box. See the comments in the code and RT #2845
510    
511     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
512     Remove the explicit test of ClipBoundingBox. The method isn't
513     public anymore and the direct call in the test wasn't necessary in
514     the first place. If ClipBoundingBox (now __mangle_bounding_box)
515     isn't called, the return value of ShapesInRegion will be
516     different.
517    
518     2005-07-05 Bernhard Herzog <[email protected]>
519    
520 bh 2643 * Thuban/UI/viewport.py (ViewPort.set_view_transform): Handle
521     ZeroDivisionError exceptions. I don't know when they happen
522     exactly. It probably happens when the projections aren't set
523     properly.
524    
525 bh 2642 2005-07-01 Bernhard Herzog <[email protected]>
526    
527     First step towards unicode. With this roughly we're at step 1
528     string_representation.txt
529    
530     * Doc/technotes/string_representation.txt: New. Document how
531     strings are represented in Thuban and how to get to a Unicode
532     Thuban.
533    
534     * Thuban/__init__.py (set_internal_encoding)
535     (unicode_from_internal, internal_from_unicode): New. The first few
536     functions for the internal string representation
537    
538     * Thuban/UI/about.py (unicodeToLocale): Removed. Use
539     internal_from_unicode instead.
540    
541     * Thuban/UI/__init__.py (install_wx_translation): Determine the
542     encoding to use for the internal string representation. Also,
543     change the translation function to return strings in internal
544     representation even on unicode builds of wxPython
545    
546     * Thuban/Model/load.py (SessionLoader.check_attrs): Decode
547     filenames too.
548     (SessionLoader.start_clrange): Use check_attrs to decode and check
549     the attributes.
550    
551     * Thuban/Model/xmlreader.py (XMLReader.encode): Use
552     internal_from_unicode to convert unicode strings.
553    
554     * Thuban/Model/xmlwriter.py (XMLWriter.encode): Use
555     unicode_from_internal when applicable
556    
557     * test/runtests.py (main): New command line option:
558     internal-encoding to specify the internal string encoding to use
559     in the tests.
560    
561     * test/support.py (initthuban): Set the internal encoding to
562     latin-1
563    
564     * test/test_load.py (TestSingleLayer.test, TestClassification.test)
565     (TestLabelLayer.test): Use the internal string representation when
566     dealing with non-ascii characters
567    
568     * test/test_load_1_0.py (TestSingleLayer.test)
569     (TestClassification.test, TestLabelLayer.test): Use the internal
570     string representation when dealing with non-ascii characters
571    
572     * test/test_load_0_9.py (TestSingleLayer.test)
573     (TestClassification.test): Use the internal string representation
574     when dealing with non-ascii characters
575    
576     * test/test_load_0_8.py (TestUnicodeStrings.test): Use the
577     internal string representation when dealing with non-ascii
578     characters
579    
580     * test/test_save.py (XMLWriterTest.testEncode)
581     (SaveSessionTest.testClassifiedLayer): Use the internal string
582     representation when dealing with non-ascii characters where
583     applicable
584    
585 bh 2638 2005-06-30 Bernhard Herzog <[email protected]>
586    
587 bh 2641 * test/runtests.py: Untabify.
588    
589     2005-06-30 Bernhard Herzog <[email protected]>
590    
591 bh 2639 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
592     untabify.
593    
594     2005-06-30 Bernhard Herzog <[email protected]>
595    
596 bh 2638 * Extensions/ogr/test/__init__.py: Add missing coding directive
597    
598 jan 2631 2005-06-28 Jan-Oliver Wagner <[email protected]>
599    
600 jan 2636 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
601     Use the default size for rendering selected items of default type.
602     Fixes part 2 of https://intevation.de/rt/webrt?serial_num=3149
603    
604     2005-06-28 Jan-Oliver Wagner <[email protected]>
605    
606 jan 2631 * Extensions/importAPR/apr.py (APR_BShSym): Extend by 'Stripple'.
607     (APR_TClr.GetThubanColor): Fix bug in color interpretation.
608     Thanks to Frank Koormann who identified this problem.
609    
610     * Extensions/importAPR/importAPR.py (APR_VShSym): New. Just
611     another symbol identified.
612    
613 jan 2628 2005-06-27 Jan-Oliver Wagner <[email protected]>
614    
615     * Doc/manual/thuban-manual-de.xml: More translations.
616    
617 jonathan 2626 2005-05-12 Jonathan Coles <[email protected]>
618    
619     * Thuban/UI/projdialog.py: Add missing import, which led to an
620     exception when opening a layer's projection.
621    
622 bh 2623 2005-05-09 Bernhard Herzog <[email protected]>
623    
624 bh 2624 * test/support.py (FileLoadTestCase.filename): Fix doc-string.
625    
626     2005-05-09 Bernhard Herzog <[email protected]>
627    
628 bh 2623 * Thuban/Model/postgisdb.py (PostGISConnection.connect): Set the
629     connection to autoconnect. Fixes RT#3148.
630    
631     * test/test_postgis_db.py
632     (TestPostGISSpecialCases.test_simple_error_handling): New test
633     that attempts to reproduce RT#3148.
634    
635 jonathan 2622 2005-05-06 Jonathan Coles <[email protected]>
636    
637     Add support for saving and loading the opacity and mask type
638     properties of RasterLayers. Also add support for proper use
639     of alpha information while drawing images not in 'RAW' format.
640     If transparency in an image format (e.g, PNG) is supported by
641     wxWidgets then the image would previously have been draw with
642     transparent regions, but the opaque regions would have been
643     unaffected by a change in the layer's opacity. This patch
644     corrects the problem.
645    
646     * Thuban/Model/layer.py (RasterLayer): Added opacity and
647     masktype parameters to the constructor, and set the
648     appropriate variables to those values.
649    
650     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Added
651     code to read the opacity and mask type of the layer and construct
652     a new layer with the additional parameters.
653    
654     * Thuban/Model/save.py (SessionSaver.write_layer): Added code
655     to save the opacity and mask type of a layer.
656    
657     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
658     the opacity of the layer to draw_raster_data rather than the layer.
659     (BaseRenderer.draw_raster_data): Remove the layer parameter because
660     the function doesn't need to know about the layer. Add the optional
661     opacity parameter whose default is 1.0. Add 'PNG' as a supported
662     graphics format.
663    
664     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Fixed
665     signature to match that in BaseRenderer. Use the new opacity argument
666     in place of calling layer.Opacity(). In the case where the
667     format is not 'RAW', alpha_data is None and the loaded image has
668     alpha information, use the file's alpha information. This is
669     still subject to the layer's opacity setting.
670    
671     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
672     Fixed signature to match that in BaseRenderer.
673    
674     * test/test_load.py (TestRasterLayer): Change file_contents to
675     include opacity and masktype variables.
676     (TestRasterLayer.test): Include tests for opacity and masktype
677     changes.
678    
679     * test/test_save.py (SaveSessionTest.testRasterLayer): Restructure
680     test to cover a variety of combinations of masktype and opacity
681     settings.
682    
683 jan 2612 2005-05-02 Jan-Oliver Wagner <[email protected]>
684    
685     * debian/rules: add --use-wx-python-swig-hack
686     to the build command.
687     Thanks to Moritz Lennert for pointing this out.
688    
689 jan 2610 2005-04-28 Jan-Oliver Wagner <[email protected]>
690    
691     Introduce OGRFileShapeStore in ogr extension.
692     This allows at least that loaded shapefile shape stores
693     can be saved correctly in the thuban session file
694     and reloaded again (reload is via core shapefile
695     routine, not OGR). For other types, .thuban files
696     can not be reloaded for the time being.
697    
698     * Extensions/ogr/ogrshapes.py (OGRFileShapeStore): New. This
699     class ist to be used for any file-based shape stores
700     accessed through OGR.
701    
702     * Extensions/ogr/ogrstart.py (open_with_ogr): Added
703     forgotten _ for i18n. Adapted call OpenFileShapestore
704     regarding new parameter.
705     (OpenFileShapestore): Use OGRFileShapeStore instead of
706     OGRShapeStore. Fix return value (None instead of null).
707     Add new parameter "mainwindow" to avoid accessing global
708     context.
709    
710 jan 2607 2005-04-27 Jan-Oliver Wagner <[email protected]>
711    
712     Introduce FileShapeStore as generalization for
713     file-based shape stores. In a first instance
714     this allows additional modules to handle shapefile
715     format as well, namely the OGR extension.
716    
717     * Thuban/Model/data.py: Various small fixes in doc-strings.
718     (FileShapeStore): New class.
719     (ShapefileStore): Derive from FileShapeStore.
720     (ShapefileStore.__init__): Call __init__ of FileShapeStore,
721     rename self.table to self._table, initialize self._bbox
722     (ShapefileStore._open_shapefile): Use self._bbox instead of self.bbox
723     and self.FileName() instead of self.filename.
724     (ShapefileStore.Table): Use self._table instead of self.table.
725     (ShapefileStore.FileName): Removed (moved to FileShapeStore).
726     (ShapefileStore.BoundingBox): Use self._bbox instead of self.bbox.
727    
728     * Thuban/Model/save.py: Replace ShapefileStore by FileShapeStore.
729     (SessionSaver.write_data_containers): Only use methods of the
730     base class FileShapeStore.
731    
732 joey 2604 2005-04-26 Martin Schulze <[email protected]>
733    
734     * Extensions/wms/wms.py (render_wms_layer): Adjusted the render
735     function to the modified render engine
736    
737     2005-04-25 Martin Schulze <[email protected]>
738    
739     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
740     Added a description according to the CVS log message
741    
742     2005-04-23 Martin Schulze <[email protected]>
743    
744     * Thuban/UI/renderer.py: Added a missing import
745    
746 russell 2600 2005-04-23 Russell Nelson <[email protected]>
747    
748 russell 2613 * Thuban/UI/view.py (MapCanvas.OnMiddle{Up,Down}): Changed the
749     way the previous tool is remembered, so that middle-button
750     panning works even if you haven't selected a tool.
751 russell 2600
752 bh 2598 2005-04-11 Bernhard Herzog <[email protected]>
753    
754     * libraries/thuban/wxproj.cpp: Move the compatibility code that
755     deals with the wxPython 2.4 version of wxPython.h into the #ifdef
756     branch that includes wxPython.h because it's only needed when
757     wxPython.h is used. Also, it won't compile when
758     USE_WX_PYTHON_SWIG_HACK is set otherwise.
759    
760 bh 2597 2005-04-07 Bernhard Herzog <[email protected]>
761    
762     * Thuban/UI/classifier.py (ClassGrid.__init__): Use -1 as the ID.
763     (ID_CLASS_TABLE): Removed. It wasn't used anywhere except in
764     ClassGrid.__init__ and it's value is outside of the valid
765     range (must be < 32768). wxPython 2.5 complains about it with an
766     exception.
767    
768 jan 2596 2005-04-05 Jan-Oliver Wagner <[email protected]>
769    
770     * Doc/manual/thuban-manual-de.xml: More translations.
771    
772 bh 2590 2005-04-05 Bernhard Herzog <[email protected]>
773    
774 bh 2591 * libraries/thuban/wxproj.cpp: Make it work with a wxPython.h from
775     wxPython 2.4 as well. Also, remove a now obsolete comment.
776    
777     2005-04-05 Bernhard Herzog <[email protected]>
778    
779 bh 2590 Use wxPython.h by default but provide a workaround when it isn't
780     available.
781    
782     * setup.py (wxproj_extension): New variable. Assign the Extension
783     instance for Lib.wxproj to this variable instead of putting it
784     directly into the listso that it can be accessed by other code
785     later.
786     (thuban_build_ext.user_options): Added boolean option
787     --use-wx-python-swig-hack.
788     (thuban_build_ext.initialize_options): Initialize the new option
789     to False.
790     (thuban_build_ext.finalize_options): If the new option was given,
791     define the preprocesser macro USE_WX_PYTHON_SWIG_HACK.
792     (thuban_build_ext): Update the doc-string
793    
794     * libraries/thuban/wxproj.cpp: Normally we use
795     wx/wxPython/wxPython.h now. Only if USE_WX_PYTHON_SWIG_HACK is
796     defined, use swigPtrConvertHack.h instead.
797    
798     * libraries/thuban/swigPtrConvertHack.h: Remove the code that was
799     copied over from wxPython.h.
800     (decode_pointer_new): New. Equivalent of decode_pointer for
801     wxPython 2.5.
802     (wxPyConvertSwigPtr): Modified to cope with wxPython 2.5 as well.
803    
804     * README: Add section on potential build problems which explains
805     how the work-around for a missing wxPython.h is activated.
806    
807 bh 2588 2005-03-29 Bernhard Herzog <[email protected]>
808    
809 bh 2589 * test/postgissupport.py (find_postgis_sql): Added yet another
810     potential location for (lw)postgis.sql because the file has moved
811     again in postgis 1.0.0 rc4.
812    
813     2005-03-29 Bernhard Herzog <[email protected]>
814    
815 bh 2588 * Thuban/UI/legend.py (BMP_SIZE_W, BMP_SIZE_H): Set both to 16 to
816     match the site of the legend_icon_layer icon. Otherwise wxpython
817     2.5 complains when the legend is created with the error:
818    
819     PyAssertionError: C++ assertion "(bitmap.GetWidth() == m_width &&
820     bitmap.GetHeight() == m_height) || (m_width == 0 && m_height ==
821     0)" failed in ./src/generic/imaglist.cpp(81): invalid bitmap size
822     in wxImageList: this might work on this platform but definitely
823     won't under Windows.
824    
825 jonathan 2587 2005-03-23 Jonathan Coles <[email protected]>
826    
827     These changes add support for adjusting the opacity of a raster layer.
828    
829     * Thuban/Model/layer.py (RasterLayer.Opacity): Replaces AlphaOpacity.
830     (RasterLayer.SetOpacity): Replaces SetAlphaOpacity. Also triggers
831     a LAYER_CHANGED event if the opacity actually changes.
832    
833     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_data): Added
834     layer parameter needed in the implementation of this method in
835     renderer.py.
836    
837     * Thuban/UI/layerproperties.py (LayerProperties.dialog_layout): Fixed
838     typo 00 -> 0.
839    
840     * Thuban/UI/rasterlayerproperties.py (RasterLayerProperties): Added
841     control to adjust opacity.
842    
843     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Scale the
844     alpha data based on the opacity level of the layer.
845    
846     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Now
847     accepts a layer parameter.
848    
849     * test/test_layer.py (TestLayerModification.test_raster_layer):
850     Rename opacity method calls and add test for LAYER_CHANGED.
851    
852 bh 2586 2005-03-16 Bernhard Herzog <[email protected]>
853    
854     * test/test_connector.py (DeletionTestMixin.check_deletions)
855     (DeletionTestMixin.check_deletetions): renamed to check_deletions.
856     update the callers.
857    
858 jan 2585 2005-03-14 Jan-Oliver Wagner <[email protected]>
859    
860     * Doc/manual/thuban-manual-de.xml: More translations.
861    
862 jan 2584 2005-03-10 Jan-Oliver Wagner <[email protected]>
863    
864     Introducing initialization callbacks for extensions.
865    
866     * Thuban/UI/extensionregistry.py (ExtensionDesc.__init__): Added
867     optional parameter init_callback.
868     (ExtensionDesc.init_ext): New. Executes the callback and sets
869     a status.
870    
871     * Thuban/UI/application.py (ThubanApplication.OnInit): Add the
872     initialization of the extensions.
873     (ThubanApplication.init_extensions): Init all extensions.
874    
875     * Thuban/UI/about.py (About.__init__): Added status of the extensions
876     to the about text.
877    
878     * Extensions/gns2shp/__init__.py: Added init method for Extension
879     description.
880     (init): New. Contains the initialization of the module.
881    
882 nhueffme 2577 2005-03-04 Nina Hüffmeyer <[email protected]>
883    
884     * Extensions/ogr/ogrdialog.py: Added a dialog, which asks for
885     OGRConnection to open a datasource. Removed dialog to display all
886     available drivers. Added some doc strings.
887    
888     * Extensions/ogr/ogrstart.py: Added menu entry for opening an
889     OGRDatasource with a string. Added two opening methods which return an
890     OGRDatasource (either data from file or from DB).
891    
892     * Extensions/ogr/ogrshapes.py: Added class OGRGeometry, which
893     represents a geometry reference of an OGRFeature. OGRShape now has a
894     list of referenced geometry objects (important for geometry
895     collections).
896     For OGRShapeStores loaded from a DB an ID column can be specified now.
897    
898 jan 2576 2005-02-22 Jan-Oliver Wagner <[email protected]>
899    
900     * test/test_map.py (TestMapWithContents.test_tree_info):
901     Added label layer for comparison.
902    
903 jonathan 2574 2005-02-18 Jonathan Coles <[email protected]>
904    
905     * libraries/thuban/gdalwarp.cpp (GetImageData): Optimize the loop
906     which builds a mask. Handle the majority of an image in a loop,
907     creating 8 bits at a time. Later, handle the edge case where less
908     than 8 bits are packed.
909    
910 bh 2573 2005-02-18 Bernhard Herzog <[email protected]>
911    
912     * test/test_baserenderer.py (TestBaseRenderer.setUp): Fix
913     doc-string
914    
915 jonathan 2571 2005-02-18 Jonathan Coles <[email protected]>
916    
917 jonathan 2572 * setup.py: Remove wx_cs_params from gdal compile options.
918    
919     2005-02-18 Jonathan Coles <[email protected]>
920    
921 jonathan 2571 Refactored baserenderer.py and renderer.py to remove baserenderer.py's
922     dependencies on wxPython. Added a new method projected_raster_layer()
923     that returns a raster layer image in projected space. This must be
924     implemented in classes derived from BaseRenderer. This also eliminates
925     the dependency on gdal in baserenderer.py.
926    
927     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
928     new projected_raster_layer() to get projected raster image instead
929     of directly calling ProjectRasterFile().
930     (BaseRenderer.projected_raster_layer): New. This must be implemented
931     by derived classes. It takes almost the same arguments as ProjectRasterFile
932     did and returns a projected image with mask and alpha data (if requested).
933     (BaseRenderer.render_map_incrementally): Remove the check for gdal since
934     that check will be done in MapRenderer.projected_raster_layer(). This
935     also allows other implementations to use different projection code.
936    
937     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
938     Implementation of BaseRenderer.projected_raster_layer. Checks for
939     gdal support and wxPython version. Also handles exceptions from
940     ProjectRasterFile.
941    
942     * libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
943     and added a variable which can be set through the options argument
944     of ProjectRasterFile.
945    
946     * test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
947     Calls ProjectRasterFile and returns the result.
948     (TestBaseRenderer.test_projected_raster_layer): New. Tests the results
949     of calling projected_raster_layer() with different options.
950     (TestBaseRenderer.test_raster_no_projection): Removed tests based on
951     wxPython version and all tests of masks and alpha channels. These are
952     now in test_projected_raster_layer().
953    
954 jan 2565 2005-02-17 Jan-Oliver Wagner <[email protected]>
955    
956 jan 2570 * Thuban/Model/map.py, Thuban/Model/label.py: Fixed
957     doc-strings to comply with coding_guidelines.
958    
959     2005-02-17 Jan-Oliver Wagner <[email protected]>
960    
961 jan 2565 Docstring improvements and minor fixes for labellayer.
962    
963     * Thuban/Model/map.py:
964     (Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
965     Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
966     Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
967     Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
968     doc string.
969     (Map.BoundingBox): Removed superfluous test for label_layer
970     and improved doc string.
971     (Map.TreeInfo): Added label_layer and improved sdo string.
972    
973     * Thuban/Model/label.py: Added import of _.
974     (Label, Label.__init__): Improved/added doc string.
975     (LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
976     LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
977     Improved/added doc string.
978     (LabelLayer.AddLabel): Use already defined names for
979     align strings and improved doc string.
980     (LabelLayer.TreeInfo): New. Return the object data for
981     the tree view.
982    
983 jonathan 2562 2005-02-16 Jonathan Coles <[email protected]>
984    
985     Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
986     so that that wxproj doesn't crash. Added GUI support for selecting
987     alpha channel (opacity can't be selected yet).
988    
989     NOTE: If wxPython.h is including in future distribution packages
990     then it will not be necessary to have the files swigPtrConvertHack.h
991     and wxPython_int.h included with Thuban. This is hopefully
992     a temporary workaround.
993    
994     * setup.py (thuban_build_ext.finalize_options): gdalwarp needs
995     access to the macro wxCHECK_VERSION so that it will properly
996     generate a bit mask. There was a problem between wx2.4 and wx2.5
997     that this works around.
998    
999     * Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
1000     of RasterLayer.MaskType.
1001     (RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
1002     (RasterLayer.MaskType): New. Returns the type of mask to use. Can
1003     specify none, a bitmap, or an alpha channel.
1004     (RasterLayer.SetMaskType): New. Set what kind of mask to use.
1005    
1006     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
1007     Set the raster warping options for the mask based on the value
1008     of RasterLayer.MaskType.
1009    
1010     * Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
1011     deprecated calls to SetItemSelectedImage in favor of SetItemImage
1012     with wxTreeItemIcon_Selected.
1013    
1014     * Thuban/UI/rasterlayerproperties.py: Support selecting to use
1015     an alpha channel for the mask.
1016    
1017     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
1018     data if it is available and an alpha channel is supported under
1019     the current version of wxPython.
1020    
1021     * libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
1022     to select whether 1's or 0's select the desired portion of an image
1023     in the bit mask. wx2.4 has a bug where the documentation is the opposite
1024     from behavior.
1025     (ProjectRasterFile): Only generate an alpha channel if the version
1026     of wxPython is >= 2.5.3.
1027    
1028     * libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
1029     When wxPython >= 2.5.3 use the special swig functions to decode an
1030     object's address.
1031    
1032     * libraries/thuban/swigPtrConvertHack.h: Includes conditional code
1033     based on the version of wxPython. If >= 2.5.3 use the special swig
1034     functions from wxPython to decode wxPython objects, otherwise use
1035     the old method of retrieving the address from the object __repr__ string.
1036    
1037     * libraries/thuban/wxPython_int.h: Copied from wxPython source.
1038     Unnecessary code was removed to make it smaller.
1039    
1040     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1041     Add tests for returning an alpha channel.
1042    
1043     * test/test_layer.py (TestLayerModification.test_raster_layer): Fix
1044     tests that used removed functions UseMask and SetUseMask
1045    
1046    
1047 bh 2560 2005-02-08 Bernhard Herzog <[email protected]>
1048    
1049 bh 2561 More wxPython 2.5 changes. This time taken from a patch from
1050     Daniel Calvelo Aros.
1051    
1052     * Thuban/UI/tableview.py (QueryTableFrame.__init__)
1053     (QueryTableFrame.__init__): Pass the size of a spacer as a single
1054     item.
1055    
1056     * Thuban/UI/projdialog.py (ProjFrame.build_dialog)
1057     (ProjFrame.build_dialog): Pass the size of a spacer as a single
1058     item.
1059    
1060     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
1061     size of a spacer as a single item.
1062    
1063     * Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
1064     size of a spacer as a single item.
1065    
1066     2005-02-08 Bernhard Herzog <[email protected]>
1067    
1068 bh 2560 Compatibility with wxPython 2.5. The changes should make it work
1069     better with 2.5 while still keeping compatibility with 2.4. There
1070     are still problems with 2.5, though.
1071    
1072     * Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
1073     of a spacer as a single item.
1074    
1075     * Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
1076     from wxControl
1077    
1078     * Thuban/UI/legend.py (LegendTree): When running with wxPython <
1079     2.5, add an implementation of the GetFirstChild method that does
1080     not require the second parameter.
1081     (LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
1082     (LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
1083     (LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
1084     pass the second parameter to GetFirstChild
1085    
1086 nhueffme 2559 2005-02-08 Nina Hüffmeyer <[email protected]>
1087    
1088     * Extensions/ogr/ogrshapes.py: Removed some print commands.
1089    
1090     * Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
1091     additional menu but appears as a possibility in the menu Map.
1092    
1093 jonathan 2558 2005-02-07 Jonathan Coles <[email protected]>
1094     * libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
1095     and PYTHON_ERRF since they were no longer necessary.
1096    
1097 bernhard 2556 2005-02-07 Bernhard Reiter <[email protected]>
1098     * Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
1099     Enable translation for message string.
1100    
1101 joey 2555 2005-02-06 Martin Schulze <[email protected]>
1102    
1103     * Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
1104     the arguments of the contstructor to fit the global scheme
1105    
1106 nhueffme 2554 2005-01-31 Nina Hüffmeyer <[email protected]>
1107    
1108     * Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
1109     some dialogs needed to start ogr.
1110    
1111     * Extensions/ogr/__init__.py: Changed comments to avoid encoding
1112     warnings.
1113    
1114     * Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
1115     encoding warnings.
1116    
1117 jonathan 2552 2005-01-28 Jonathan Coles <[email protected]>
1118    
1119 jonathan 2553 * libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
1120     mask is packed into a bit array. It's now slightly faster.
1121    
1122     2005-01-28 Jonathan Coles <[email protected]>
1123    
1124 jonathan 2552 * Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
1125     default to true.
1126    
1127     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
1128     code that loads the state of the layer's use_mask flag. Its
1129     usefulness is still being debated.
1130    
1131     * Thuban/Model/save.py (SessionSaver.write_layer): Remove
1132     code that saves the state of the layer's use_mask flag. Its
1133     usefulness is still being debated.
1134    
1135     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
1136     options to ProjectRasterFile based on the state of layer.UseMask().
1137     Catch more exceptions from ProjectRasterFile so that Thuban doesn't
1138     quit is there is a problem projecting.
1139     (BaseRenderer.draw_raster_data): Change the documentation to
1140     describe the new format (XBM) that the mask data will be in.
1141    
1142     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
1143     data is in XBM format when format='RAW' which means it doesn't
1144     need to be converted to a wxImage before being used as a mask
1145     for a wxBitmap. Assume that if format != 'RAW' that the image
1146     data and mask data are in the same format.
1147    
1148     * libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
1149     and a mask is requested, convert the alpha band to a bit array in
1150     XBM format. if an alpha channel is requested, simply return the
1151     data in the alpha band. Provide better error handling by returning
1152     python error messages (also fixes RT #2947).
1153     (ProjectRasterFile): Support multiple mask options, rather than simply
1154     a flag indicating that a mask should or should not be used. Provide
1155     better error handling by returning python error messages.
1156    
1157     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1158     Add mask data to test.
1159    
1160     * test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
1161     should use the mask by default.
1162     (TestLayerModificaton.test_raster_layer): Test that a layer should use
1163     the mask by default.
1164    
1165     * test/test_load.py (TestRasterLayer.test): Remove testing for
1166     use_mask flag in file.
1167    
1168     * test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
1169     for use_mask in file.
1170    
1171     * test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
1172    
1173 jonathan 2551 2005-01-26 Jonathan Coles <[email protected]>
1174    
1175     Add a new dialog box for raster layers. The dialog box allows
1176     the user to toggle a mask that is generated by ProjectRasterFile
1177     and is used to only draw the real parts of the projected image.
1178    
1179     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
1180     Instruct the warping code to generate a mask if the raster layer
1181     requests one.
1182     (BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
1183    
1184     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
1185     obsolete optional mask argument.
1186    
1187     * Thuban/UI/classifier.py (Classifier): Change the parent class
1188     to LayerProperties and rework the code to support layout calls
1189     from the parent.
1190     (Classifier.dialog_layout): New. Layout the dialog box.
1191     (Classifier.map_layers_removed): Removed. Moved to parent class.
1192     (Classifier.map_replaced): Removed. Moved to parent class.
1193     (Classifier._OnTry): Renamed to OnTry to support parent class.
1194     (Classifier.OnClose): Removed. Supplied in parent class.
1195     (Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
1196     (Classifier._OnOK): Renamed to OnOK to support parent class.
1197     (Classifier._OnRevert): Renamed to OnRevert to support parent class.
1198    
1199     * Thuban/UI/layerproperties.py: New. Base class for layer properties
1200     dialog boxes.
1201    
1202     * Thuban/UI/rasterlayerproperties.py: New. Class for displaying
1203     raster layer properties.
1204    
1205     * libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
1206     with the non-simple version supplied with gdal. This allows added
1207     features such as creating an alpha band.
1208     (GetImageData): Generate a mask array from the alpha band that is
1209     generated by gdal if the user has selected it. Try to support images
1210     that have more than three bands, such as images with RGB plus an
1211     alpha band.
1212     (ProjectRasterFile): Convert python argument for mask and tell
1213     gdal to enable or disable an alpha band.
1214    
1215     * Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
1216     describing what kind of layer the class is. Defaults to "Unknown",
1217     but should be overridden by subclasses.
1218     (Layer.Type): New. Override base class method.
1219     (RasterLayer.__init__): Create a flag for using a mask. Record extra
1220     data from gdal for display in the properties dialog.
1221     (RasterLayer.Type): New. Override base class method.
1222     (RasterLayer.UseMask): New. Returns True if the mask should be used.
1223     (RasterLayer.SetUseMask): New. Set if the mask should be used.
1224     (RasterLayer.ImageInfo): New. Return extra information about the image.
1225    
1226     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
1227     the mask information.
1228    
1229     * Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
1230    
1231     * Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
1232     Classifier classes as dialogs to use with the proper layer types.
1233    
1234     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1235     Fix test.
1236    
1237     * test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
1238     (TestLayerModification.build_path): New. Support function.
1239     (TestLayerModification.test_raster_layer): New. Test new methods.
1240    
1241     * test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
1242    
1243     * test/test_load.py (TestRasterLayer): Add tests for mask.
1244    
1245     * test/test_load_1_0_1.py: New. Copied from test_load.py.
1246    
1247     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
1248     obsolete optional mask argument.
1249    
1250 nhueffme 2549 2005-01-26 Nina Hüffmeyer <[email protected]>
1251    
1252     * Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
1253     which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
1254     RowOrdinalToId() and ReadRowAsDict().
1255    
1256     * Extensions/ogr/ogrstart.py: Added menu item which opens database
1257     layers for existing database connections.
1258    
1259     * Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
1260    
1261    
1262 jan 2548 2005-01-26 Jan-Oliver Wagner <[email protected]>
1263    
1264     * Doc/manual/thuban-manual-de.xml: More translations.
1265    
1266 bh 2544 2005-01-24 Bernhard Herzog <[email protected]>
1267    
1268     Rework the status bar updates a bit to make sure the message about
1269     the projections is produced at the right times.
1270    
1271     * Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
1272     New class variable with messages that may require a status bar
1273     update.
1274     (MainWindow.view_position_changed)
1275     (MainWindow.update_status_bar): Rename from view_position_changed
1276     to update_status_bar. It's meaning has changed now that it may
1277     also generate messages about problems with projection settings.
1278     (MainWindow.__init__): Use the new update_status_bar_messages
1279     class variable to subscribe update_status_bar
1280     (MainWindow.set_position_text): Update doc-string. This method
1281     has to be renamed at some point. See doc-string and comments.
1282     (MainWindow.OnClose): Unsubscribe update_status_bar from all
1283     messages in update_status_bar_messages
1284    
1285     * Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
1286     class attribute. map messages to be forwarded by the viewport.
1287     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
1288     the messages in forwarded_map_messages
1289    
1290 bh 2543 2005-01-21 Bernhard Herzog <[email protected]>
1291    
1292     * test/postgissupport.py (PostGISDatabase.__init__): Tweak
1293     doc-string
1294     (find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
1295     different name for the initialization SQL file.
1296    
1297 jonathan 2537 2005-01-21 Jonathan Coles <[email protected]>
1298 jan 2542
1299     * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
1300     a projection and returns a formatted string representing the
1301     parameters to feed to gdalwarp. This function eliminates
1302     redundancy in draw_raster_layer().
1303     (BaseRenderer.render_map_incrementally): Removed the optimization which
1304     drew the top most raster layer first and then only those vector-
1305     based layers that are above it. With the support for transparency
1306     this optimization breaks correct behaviour.
1307     (BaseRenderer.draw_raster_layer): Reorganize code to support possible
1308     future enhancements to raster layer bounding box. The old behaviour has
1309     not changed. Also, change calling parameters to draw_raster_data()
1310     to specify new RAW data format and mask.
1311     (BaseRenderer.draw_raster_data): Change signature to include an optional
1312     parameter for mask information. Change documentation to mention
1313     support for new parameter and added option for RAW data format.
1314     The data argument is now a list of [width, height, data].
1315    
1316     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
1317     mask parameter. Add new condition for RAW format, which
1318     significantly reduces rendering time. Add condition for
1319     mask parameter.
1320    
1321     * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
1322 jonathan 2537 data array of RGB values from the projected image returned from
1323     the gdal warping functions. In the case of palette based images, it
1324 jan 2542 converts the NO_DATA index to the mask color.
1325     (ProjectRasterFile): Removed all custom memory driver references
1326     and replaced it with the standard in-memory dataset provided
1327     by gdal. The return data is no longer a BMP file, but an array
1328     of RGB values, one set triple per pixel.
1329 jonathan 2537
1330     * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
1331     * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
1332     * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
1333    
1334 jan 2542 * setup.py (thuban_build_ext.finalize_options): Removed mention
1335     of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
1336     files. These are obsolete with the new version of gdalwarp.cpp
1337    
1338     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
1339     Updated signature.
1340     (TestBaseRenderer.test_raster_no_projection): Changed the test
1341     data to be data in the uncompressed RAW format returned from
1342     ProjectRasterFile.
1343    
1344 jan 2535 2005-01-21 Jan-Oliver Wagner <[email protected]>
1345    
1346 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
1347     string available for i18n.
1348 jan 2535
1349 russell 2532 2005-01-20 Russell Nelson <[email protected]>
1350    
1351     * Resources/Projections/defaults.proj: Ruin the speling of the
1352 russell 2533 Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
1353     It's the wrong thing to do in the long run, but it's necessary for
1354     those users until that bug is fixed. Otherwise the projection
1355     dialog segfaults. Better to annoy some Lambert-93 users with a
1356     spelling mistake than every Fedora Core 3 user of Thuban-CVS.
1357 russell 2532
1358 bernhard 2531 2005-01-20 Bernhard Reiter <[email protected]>
1359    
1360 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
1361     docstring and comment that the warning code here is a hack.
1362 bernhard 2531
1363 russell 2529 2005-01-20 Russell Nelson <[email protected]>
1364    
1365 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
1366     user about misprojected layers when their lat/lon bounding
1367 russell 2529 box exceeds rational lat/lon values.
1368    
1369 bernhard 2525 2005-01-20 Bernhard Reiter <[email protected]>
1370    
1371 jan 2542 * Thuban/UI/about.py (unicodeToLocale): Improved:
1372 bernhard 2528 Use 'ascii' and then 'replace' for other characters
1373     when getdefaultlocale returns None. Thanks to Bernhard H. .
1374 jan 2542
1375 bernhard 2528 2005-01-20 Bernhard Reiter <[email protected]>
1376    
1377 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
1378 bernhard 2527 that OnRangeText might be called twice and using None as argument.
1379 jan 2542
1380 bernhard 2527 2005-01-20 Bernhard Reiter <[email protected]>
1381    
1382 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
1383     OnRangeText(0) to work around a different in wx Behaviour noticed
1384     on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
1385    
1386 bernhard 2526 2005-01-20 Bernhard Reiter <[email protected]>
1387    
1388     * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
1389 bernhard 2525 None. (Fixes rt#2910.)
1390    
1391 frank 2524 2005-01-18 Frank Koormann <[email protected]>
1392    
1393     New Extension: mouseposition
1394     Tool to collect mouse click positions (map coordinates) in a dialog.
1395    
1396     * Extensions/mouseposition/__init__.py: New, extension registration
1397    
1398     * Extensions/mouseposition/mouseposition.py: New, implements the
1399     dialog and adds a tool to Thuban mainwindow.
1400    
1401     * Extensions/mouseposition/position.xpm: New, icon for tool.
1402    
1403 jan 2522 2005-01-14 Jan-Oliver Wagner <[email protected]>
1404    
1405     * Doc/manual/thuban-manual-de.xml: More translations.
1406    
1407 frank 2520 2005-01-11 Frank Koormann <[email protected]>
1408    
1409     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1410     Fix indention bug.
1411    
1412 frank 2517 2005-01-09 Frank Koormann <[email protected]>
1413    
1414     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1415 frank 2520 BugFix 2901: Explicitly copy layers ClassificationColumn since it
1416 frank 2517 is not part of the layers Classification.
1417    
1418 frank 2515 2005-01-03 Frank Koormann <[email protected]>
1419    
1420 frank 2517 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
1421     BugFix 2883: Former implementation only worked on classified point
1422     layers: KeyError was raised, now use the default size if field is None.
1423 frank 2515
1424 bernhard 2513 2004-12-27 Bernhard Reiter <[email protected]>
1425    
1426     svgexport 1.0.0cvs: Fixed label export.
1427    
1428     * Extensions/svgexport/test/test_svgmapwriter.py:
1429     class TestSVGRenderer(): New class; new test test_label_font().
1430    
1431     * Extensions/svgexport/svgmapwriter.py
1432     (SVGRenderer.label_font()): initialised Font size with self.factor now,
1433     makes test_label_font happy.
1434    
1435     * Extensions/svgexport/TODO: crossed out fixed label export item.
1436     Added item for options.
1437    
1438     * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
1439    
1440 russell 2511 2004-12-27 Russell Nelson <[email protected]>
1441    
1442 jan 2512 Middle mouse button pans.
1443 russell 2511
1444 jan 2512 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
1445     OnMiddleDown and OnMiddleUp events.
1446     (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
1447     previously used tool.
1448     (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
1449     pressing the middle mouse button.
1450    
1451 jan 2509 2004-12-27 Jan-Oliver Wagner <[email protected]>
1452    
1453     * Doc/manual/thuban-manual-de.xml: More translations.
1454    
1455 jan 2506 2004-12-23 Jan-Oliver Wagner <[email protected]>
1456    
1457     * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
1458     \n to stderr after the warnings. Thanks to Russell Nelson.
1459    
1460 nhueffme 2493 2004-12-20 Nina Hueffmeyer <[email protected]>
1461    
1462     * Extensions/ogr/ogrshapes.py: Fixed some issues from
1463     Bernhard (coding guidelines etc.). Additionally it is now possible to
1464     display shapefiles containing feature collections (e.g.polygons
1465     with holes). Works with gdal 1.2.1 now.
1466    
1467     * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
1468     from Bernhard (coding guidelines etc.). If ogr can't be imported,
1469     tests are skipped now.
1470    
1471     * Extensions/ogr/ogrstart.py: Fixed some typings.
1472    
1473 bernhard 2490 2004-12-20 Bernhard Reiter <[email protected]>
1474    
1475     * Extensions/svgexport/TODO: updated to add support for
1476     raster layers and labels for 1.0.1.
1477    
1478     * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
1479     Issue a warning now.
1480    
1481 bernhard 2488 2004-12-19 Bernhard Reiter <[email protected]>
1482    
1483 bernhard 2489 * Extensions/svgexport/TODO: Added idea to support triggering
1484     the application down the pipe.
1485    
1486     2004-12-19 Bernhard Reiter <[email protected]>
1487    
1488 bernhard 2488 svgexport: Improved code quality, mainly by better naming.
1489    
1490     * Extensions/svgexport/svgmapwriter.py:
1491     DrawPath() renamed to DrawPolygonPath(),
1492     added documentation, improved comments and variable names.
1493    
1494     * Extensions/svgexport/svgmapwriter.py,
1495     Extensions/svgexport/test/test_svgmapwriter.py:
1496     All using DrawPolygonPath() now, the default parameter closed=True
1497     omitted.
1498    
1499     * Extensions/svgexport/test/test_svgmapwriter.py:
1500     renamed test_polygon_opened() to test_polyline()
1501     renamed test_transparent_polygon() to test_transparent_polyline()
1502    
1503 jan 2487 2004-12-18 Jan-Oliver Wagner <[email protected]>
1504    
1505     Some fixes of gns2shp extension.
1506    
1507     * Extensions/gns2shp/test/__init__.py: New. Make this directory a
1508     package.
1509    
1510     * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
1511     dynamically.
1512    
1513     * Extensions/gns2shp/test/README: Simplified description how to test.
1514    
1515     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
1516     fixed some dimensions of fields according to the GNS documentation
1517     which seems to change undocumented.
1518     Now killing trailing \n and/or \r from MODIFY_DATE.
1519     This fixes RT#2453.
1520    
1521 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
1522 bernhard 2480
1523 bernhard 2482 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
1524    
1525     * Extensions/svgexport/test/test_svgmapwriter.py:
1526     Added new tests: test_export_polygon_with_hole()
1527     and test_polygon_with_hole().
1528    
1529     * Extensions/svgexport/svgmapwriter.py
1530     (draw_polygon_shape()): Uses DrawPath correctly now.
1531    
1532     * Doc/manual/thuban-manual.xml: Added documentation for stable
1533     extention svgexport.
1534     * Doc/manual/thuban-manual-de.xml: Copied English section about
1535     svexport over.
1536    
1537 jan 2509 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
1538 bernhard 2482
1539     * Extensions/svgexport/svgsaver.py,maplegend.py:
1540     Moved from experimental to stable extension menu.
1541    
1542     * Extensions/svgexport/TODO: updated.
1543    
1544    
1545     2004-12-18 Bernhard Reiter <[email protected]>
1546    
1547 bernhard 2481 Added Extensions/svgexport/TODO
1548    
1549     2004-12-18 Bernhard Reiter <[email protected]>
1550    
1551 bernhard 2480 Refactored in svgexport:
1552     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
1553    
1554     * Extensions/svgexport/svgmapwriter.py
1555     Added verbosity level 3 to print out polygon points.
1556     (class Point): added __repr__
1557     (class Brush, __str__()): Added space after ,.
1558     (DrawPolygon): Renamed to DrawPath()
1559     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
1560     (DrawLines): Using DrawPath now.
1561    
1562     * Extensions/svgexport/test/test_svgmapwriter.py:
1563     Replaced DrawPolygon() calls with DrawPath() and put the first argument
1564     inside another list. Adapted test data with a newline before "M".
1565    
1566     2004-12-18 Bernhard Reiter <[email protected]>
1567 bernhard 2479
1568     Refactored svgexport tests: 9 double tests runs eliminated;
1569     code size reduced by 8 lines.
1570    
1571     * Extensions/svgexport/test/test_svgmapwriter.py:
1572     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
1573     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
1574     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
1575     this fixed the double running of the nine tests of TestVirtualDC.
1576     (class TestVirtualDC): Using self.dc and self.file from setUp().
1577    
1578 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
1579    
1580     Two windows specific fixes ported from thuban-1­0-branch:
1581    
1582     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
1583     instead of getlocale because getlocale doesn't return a usable
1584     encoding name on a german windows 2000
1585    
1586     * setup.py: windows build: Removed the absolute path names and
1587     made all prfixes relative to the directory containing setup.py.
1588     Makes it a little easier to adapt to a different system.
1589    
1590 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
1591    
1592 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
1593 bh 2472 Fixes RT#2299
1594    
1595     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
1596    
1597     * test/postgissupport.py
1598     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
1599     table to "roads-multi" because it now uses MULTILINESTRING
1600     geometries and introduce a new "roads" table that uses LINESTRING
1601     (coords_to_multilinestring): Make the doc string more precise
1602     (coords_to_linestring): New. Create a LINESTRING WKT
1603     representatin
1604     (wkt_converter): Add coords_to_linestring
1605     (upload_shapefile): Rephrase the doc-string a bit.
1606    
1607     * test/test_postgis_db.py (TestPostGISShapestoreArc)
1608     (LineStringTests)
1609     (TestPostGISShapestoreLineString)
1610     (TestPostGISShapestoreMultiLineString): Split
1611     TestPostGISShapestoreArc into a base class LineStringTests and two
1612     derived classes TestPostGISShapestoreLineString for LINESTRING
1613     geometries and TestPostGISShapestoreMultiLineString for
1614     MULTILINESTRING geometries. Most test methods are in the base
1615     class with the exception of tests that explicitly check the raw
1616     format.
1617    
1618     2004-12-16 Bernhard Herzog <[email protected]>
1619    
1620 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
1621    
1622     * test/postgissupport.py (find_postgis_sql): Different postgis
1623     versions put the postgis.sql file into slightly different places
1624     so we have to look in both. The updated doc string describes this
1625     is more detail.
1626    
1627     * test/test_postgis_db.py
1628     (TestPostGISSpecialCases.test_column_name_quoting): The return
1629     value of UniqueValues is unsorted, so it has to be sorted for
1630     comparison.
1631    
1632     2004-12-16 Bernhard Herzog <[email protected]>
1633    
1634 bh 2470 Fix for RT#2237
1635    
1636     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
1637     panel to be shown is the UnknownProjPanel disable the OK and Try
1638     buttons. Otherwise enable them.
1639     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
1640     the parameters. In that case __GetProjection also returns None
1641     now.
1642    
1643 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
1644    
1645 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
1646     minimum number of classes to 2. The calculate_quantiles needs at
1647     least two and raises an exception otherwise.
1648     Fixes RT#2549
1649    
1650     2004-12-15 Bernhard Herzog <[email protected]>
1651    
1652 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
1653     so that it returns a result for select statements.
1654     (PostgreSQLServer.server_version): New. Return the version of the
1655     server software.
1656     (PostgreSQLServer.require_authentication): The format of
1657     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
1658     server version and generate the file in the correct format
1659    
1660     2004-12-15 Bernhard Herzog <[email protected]>
1661    
1662 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
1663     in the doc string and rephrase it a little.
1664    
1665 frank 2457 2004-12-15 Frank Koormann <[email protected]>
1666    
1667     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
1668     session has been loaded successfully. The check is called by the relevant
1669     tests after executing load_session().
1670    
1671 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
1672    
1673 bh 2454 Make sure the region used to determine which shapes are visible
1674     actually matches the region on the printed page. If this isn't
1675     done properly some shapes might not be printed.
1676     Fixes RT #2692
1677    
1678     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
1679     renderer has to be at the same position as the mapregion
1680    
1681     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
1682     has to be moved by (self.shiftx, self.shifty) too.
1683    
1684     2004-12-13 Bernhard Herzog <[email protected]>
1685    
1686 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
1687     generated python code which leads to exception in the __del__
1688     method when the constructor fails. See the comments in the code
1689     for more details.
1690    
1691     * libraries/pyprojection/Projection.py: Updated from Projection.i
1692     with SWIG.
1693    
1694     2004-12-13 Bernhard Herzog <[email protected]>
1695    
1696 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
1697     (TestAltPath.test_02_path_error_fix_from_list)
1698     (TestAltPath.test_05_path_error_fix_from_list_changed)
1699     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
1700     is destroyed in tearDown, so there's no need to do it in a test
1701     case.
1702    
1703     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
1704     debug print
1705    
1706     2004-12-13 Bernhard Herzog <[email protected]>
1707    
1708 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
1709     (TestDrawSplines.setUp): Do not use super with the unittest
1710     classes because in Python 2.2 they're still old-style classes.
1711    
1712 frank 2448 2004-12-13 Frank Koormann <[email protected]>
1713    
1714     Alternative Path feature: When loading a (moved) session where
1715     shapefiles cannot be found, ask the user. Use the specified path
1716     if further shapefiles are missing. However, ask the usr for confirmation
1717     in such cases.
1718    
1719     * test/test_load.py (TestAltPath): New, tests for alternative path feature
1720     in load_session()
1721     (Shapefile_CallBack): Helper, implements controllable callback.
1722    
1723     * Thuban/UI/application.py (ThubanApplication.OnInit):
1724     Added "alt_path" to self.path
1725     (ThubanApplication.OpenSession): Added shapefile_callback as second
1726     callback similar to db_connection_callback.
1727     (ThubanApplication.run_alt_path_dialog): New, implementaion of
1728     shapefile_callback. In addition to raising the dialog the control of
1729     self.path('alt_path') is implemented here.
1730    
1731     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
1732     (SessionLoader.open_shapefile): Open shapefile, eventually with
1733     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
1734     formerly used in start_fileshapesource()/start_layer().
1735     (SessionLoader.start_fileshapesource): Call open_shapefile().
1736     (SessionLoader.start_layer): Call open_shapefile().
1737     (load_session): Added shapefile_callback.
1738    
1739     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
1740     feature (search / check).
1741    
1742     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
1743    
1744 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
1745    
1746 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
1747    
1748     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
1749     (def draw_point_shape): new parameter size defaults to 2 as before.
1750     (draw_shape_layer_incrementally): Moved draw_func log line higher.
1751     Added draw_func call with size when dealing with a point layer.
1752    
1753     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
1754    
1755     2004-12-11 Bernhard Reiter <[email protected]>
1756    
1757 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
1758     to raise the chance that the line length will be below 255 characters,
1759     as recommended by REC SVG 1.1 in section 8.3.1.
1760    
1761     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
1762     Adding \n before L's and changed whitespace handling.
1763    
1764     * Extensions/svgexport/test/test_svgmapwriter.py:
1765     Adapted tests to new whitespace handling of DrawPolygon.
1766    
1767     2004-12-11 Bernhard Reiter <[email protected]>
1768    
1769 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
1770    
1771     * Extensions/svgexport/test/test_svgmapwriter.py:
1772     Removed test_drawbezier in favour of new test_drawspline3 and
1773     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
1774     All only to test DrawSpline.
1775    
1776     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1777     New implementation now really using the strange algorithm of
1778     xfig 3.1's approximated splines and its conversion to postscript
1779     with one twist: SVG can do quadratic beziers, so skipped translation
1780     to cubic beziers.
1781     (TestWithDC): Typo in comment fixed.
1782    
1783 joey 2442 2004-12-09 Martin Schulze <[email protected]>
1784    
1785     * Thuban/Model/classgen.py: Added missing character encoding
1786    
1787     * Extensions/wms/properties.py (OpenWMSProperties): removed
1788    
1789     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
1790     support for get_srs_discrepancies() since there are no
1791     discrepancies anymore (was a thinko)
1792    
1793     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
1794     format priority now that more formats are supported globally by
1795     the render engine.
1796    
1797 silke 2437 2004-12-08 Silke Reimer <[email protected]>
1798     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
1799     because it is not available in all versions of ogr
1800    
1801 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
1802     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
1803     global tests until a real one is commited.
1804    
1805 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
1806    
1807     * /Extensions/ogr/: Adding a new extension to read shapefiles with
1808     ogr. It is planned to add other vector formats.
1809    
1810     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
1811    
1812 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
1813    
1814     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
1815     part of a (non-)fix to renable that the tests are always
1816     executed.
1817    
1818 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
1819    
1820     * Extensions/svgexport/test/test_svgmapwriter.py:
1821     Added test_drawbezier() to test DrawSpline().
1822    
1823     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1824     Really implemented bezier drawing.
1825    
1826     * Extensions/svgexport/__init__.py: Bumped version of svgexport
1827     to 0.9.1 because now the legend examples lines styles
1828     will be drawing with beziers.
1829    
1830 joey 2431 2004-12-05 Martin Schulze <[email protected]>
1831    
1832     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
1833     GIF as supported bitmap image formats (helpful for the WMS extension)
1834    
1835 joey 2430 2004-11-30 Martin Schulze <[email protected]>
1836    
1837     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
1838     Improved the test for the internal compare method
1839    
1840 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
1841    
1842     * Thuban/UI/about.py (About.__init__): Added
1843     Norbert Solymosi for hungarian translation and Ole Rahn
1844 bernhard 2722 as contributor. Moved Bernhard Reiter from Contributor
1845 jan 2429 to Developer.
1846    
1847 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
1848    
1849     * Extensions/svgexport/test/test_svgmapwriter.py:
1850     Removed Jan from author list as he did not change enough significant
1851     lines yet.
1852    
1853     * Extensions/svgexport/__init__.py: Added Bernhard as author
1854     of the Extension.
1855    
1856 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
1857    
1858     * po/hu.po: New. Hungarian translation. Contributed
1859     by Norbert Solymosi.
1860    
1861 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
1862    
1863     * Extensions/svgexport/test/test_svgmapwriter.py
1864     (Testobjectexport.test_transparent_polygon): Commented out some
1865     debug prints
1866    
1867 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
1868    
1869     Fix broken tests for svg extension and added svg legend
1870     to Experimental menu.
1871    
1872     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
1873     the test run correctly even if the extension is a package.
1874     Also removed the "import Thuban" which makes no sense.
1875    
1876     * Extensions/svgexport/__init__.py: Fix to have the extensions'
1877     test module also be executed from the global test routine.
1878     This is done by looking for the absense of the DISPLAY variable.
1879    
1880     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
1881     to Experimental menu since this module has yet not reached a stable
1882     status (ie. 1.0).
1883    
1884 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
1885    
1886     * Extensions/svgexport/svgmapwriter.py:
1887     Added verbose variable and some logging depending on it.
1888     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
1889     because counting i is not necessary.
1890     (class Pen, class Brush): Added simple __str__ methods.
1891     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
1892     not exported to svg file) Note: holes still unhandled.
1893    
1894     * Extensions/svgexport/test/test_svgmapwriter.py:
1895     Made a baseclass TestWithDC for test needed a DC.
1896     Added tests for bug #2698 (transparent polygons are not
1897     exported to svg file):
1898     Testobjectexport.test_transparent_polygon()
1899    
1900     * Thuban/Model/base.py (UnsetModified):
1901     Fixed some typos in docstring.
1902    
1903     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
1904     Added hints on the used algorithm for handling holes.
1905    
1906 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
1907    
1908 jan 2412 Some face lifting for the examples.
1909    
1910     * Examples/__init__.py: Make this directory a package.
1911    
1912     * Examples/simple_extensions/__init__.py: Make this directory a package.
1913    
1914     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
1915     menu to Examples menu.
1916    
1917     * Examples/simple_extensions/simple_command.py: Some more comments,
1918     minor changes.
1919    
1920     * Examples/simple_extensions/simple_tool.py: Minor changes.
1921    
1922     2004-11-20 Jan-Oliver Wagner <[email protected]>
1923    
1924 jan 2407 Changed way of extension registry for wms and added extension
1925     registry for umn_mapserver extension.
1926    
1927     * Extensions/wms/__init__.py: Added registry entry and the importing
1928     of the actual wms module. Included a test for the required PyOGCLib.
1929    
1930     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
1931    
1932     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
1933     importing of the actual umn mapserver management modules.
1934     Included a test for the required Python MapScript.
1935    
1936     2004-11-20 Jan-Oliver Wagner <[email protected]>
1937    
1938 jan 2403 Changed way of extension registry for importAPR, bboxdump
1939     and added extension registry for svgexport.extension registry for
1940     svgexport.
1941    
1942     * Extensions/importAPR/__init__.py: Added registry entry and the importing
1943     of the actual importAPR module.
1944    
1945     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
1946     __init__.py).
1947    
1948     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
1949     »···of the actual bboxdump module.
1950    
1951     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
1952     »···__init__.py).
1953    
1954     * Extensions/svgexport/__init__.py: Added registry entry and the importing
1955     of the svgsaver module.
1956    
1957     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
1958     to Experimental menu since this module has yet not reached a stable
1959     status (ie. 1.0).
1960    
1961 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
1962    
1963     Now the hit test considers the size of point symbols.
1964    
1965     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
1966     'size' defaulting to the previously fixed value 5.
1967     Extended doc-string.
1968     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
1969     for symbols.
1970     Now the size of the largest point symbol is determined to find out
1971     about whether the point has been hit.
1972     This fixes the problem that only clicks inside a fixed distance of
1973     5 where found.
1974    
1975 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
1976    
1977 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
1978 jan 2395 selected symbols.
1979    
1980     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
1981     Added consideration of the specific size of point symbols.
1982     The property for each point symbol is retrieved and the size applied
1983     for the rendering method.
1984     Added doc-string.
1985    
1986 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
1987    
1988     Changed way of Extension Registry for gns2shp and profiling.
1989    
1990     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
1991     __init__.py).
1992    
1993     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
1994     of the actual gns2shp module.
1995    
1996     * Extensions/profiling/profiling.py: Removed registry entry (moved to
1997     __init__.py).
1998    
1999     * Extensions/profiling/__init__.py: Added registry entry and the importing
2000     of the actual profiling module.
2001    
2002 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
2003    
2004     * Extensions/svgexport/: Minor improvements to doc strings.
2005    
2006 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
2007    
2008     Further elements for sizable point objects now
2009     making this feature usable though not yet complete.
2010    
2011     * Thuban/Model/save.py (SessionSaver.write_classification): Write
2012     attribute 'size' for cldata when the shape layer is of point type.
2013     This also now make the test_load.py tests happy.
2014    
2015     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
2016     gradient.
2017    
2018     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
2019     ID_SELPROP_SPINCTRL_LINEWIDTH.
2020     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
2021     (ID_SELPROP_SPINCTRL_SIZE): New Id.
2022     (SelectPropertiesDialog.__init__): Added a second spin control
2023     for the size in case the corresponding layer is of point type.
2024     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
2025     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
2026     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
2027     and refresh preview.
2028    
2029    
2030    
2031 joey 2381 2004-10-04 Martin Schulze <[email protected]>
2032    
2033     * Extensions/wms/test/test_parser.py
2034     (TestWMSCapabilitiesParser.test_compareLists): Added missing
2035     self-test for compareLists()
2036     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
2037     self-test for compareDicts()
2038 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
2039     to verify the test routine fails with non-equal arguments
2040     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
2041     to verify the test routine fails with non-equal arguments
2042 joey 2381
2043 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
2044    
2045 jan 2380 First elements for sizeable point objects.
2046    
2047     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
2048    
2049     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
2050    
2051     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
2052     of a corresponding argument is given.
2053     (TestSymbolSize): New. Test the size attribute of cldata.
2054    
2055     * Thuban/Model/classification.py: Removed some trailing whitespaces.
2056     (ClassGroupProperties.__init__): Set default size.
2057     (ClassGroupProperties.SetProperties): Set the size.
2058     (ClassGroupProperties.GetSize): New. Return the size.
2059     (ClassGroupProperties.SetSize): New. Set the size.
2060     (ClassGroupProperties__eq__): Compare also size.
2061     (ClassGroupProperties__repr__): Print also size.
2062    
2063     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
2064     the size attribute.
2065    
2066     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
2067     Also, now there is a return value that indicates whether the drawing
2068     size exceeded the given rect extent and if so the new extent.
2069     Finally, point objects are drawn depending on the size. If either
2070     the width or height is exceeded, the new extent is returned.
2071     (ClassRenderer.Draw): Now when calling the previewer drawing function,
2072     evaluate the return value and, if not None, adapt the grid widget size
2073     accordingly and redraw again.
2074    
2075     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
2076     If the draw function is for points, call it with the size as additional
2077     parameter.
2078     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
2079     the size. Compute the radius using the size.
2080    
2081     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
2082     that Thuban supports size, apply this correctly.
2083    
2084     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
2085    
2086     2004-10-03 Jan-Oliver Wagner <[email protected]>
2087    
2088 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
2089     Map chapter.
2090    
2091 joey 2368 2004-10-01 Martin Schulze <[email protected]>
2092    
2093     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
2094     argument for general use through properties-dialog selector
2095    
2096     * Thuban/UI/classifier.py: Register properties dialog classes for
2097     both provided layer classes/types.
2098    
2099     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
2100     map can be retrieved through the parent which is passed to the
2101     constructor anyway and doesn't require an argument of its own,
2102     required for the unification of arguments for general use through
2103     properties-dialog selector.
2104     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
2105     whether a dialog is already opened (and raising it to the users
2106     attention) and creating a new dialog into a function of its own
2107     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
2108     method
2109     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
2110     global registration of properties dialog classes (which are indeed
2111     layer-specific).
2112    
2113     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
2114     for general use through properties-dialog selector, the map can be
2115     retrieved through the parent and doesn't require an argument of
2116     its own.
2117    
2118     * Extensions/wms/wms.py: Register the properties dialog class for
2119     the provided WMS layer
2120    
2121 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
2122    
2123     New feature: Registry for Extensions.
2124    
2125     * Thuban/UI/extensionregistry.py: This module defines a registry for
2126     Extensions.
2127    
2128     * Thuban/UI/about.py (About.__init__): Added description
2129     of the registered extensions with all of the information.
2130    
2131     * Thuban/Model/extension.py (Extension): Improved doc-string.
2132    
2133     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
2134     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
2135     Extensions/wms/wms.py: Added registration of the extension.
2136    
2137 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
2138    
2139     More fixes to svgexport to make used ids unique and
2140     conforming to XML's Name production.
2141    
2142     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
2143     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
2144     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
2145     Added Bernhard R. as author.
2146     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
2147     concatenation char now (makes test_make_ide_nosetbaseid() valid).
2148     Also transform second id part with "%d" and catch the TypeError
2149     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
2150     Corrected typo inBernhard's author line.
2151     (SetBaseID): Return the transformed base id. Transform characters
2152     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
2153     import binascii. If to be set string starts with "xml" or so, add "t".
2154     (draw_shape_layer_incrementally): use the returned value of SetBaseID
2155     for used_baseids checks.
2156    
2157 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
2158    
2159     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2160     Remove a debug print and some tab characters.
2161    
2162 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
2163    
2164     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
2165     (SetBaseID, SetID, make_id): Improved docstring comments to explain
2166     the interaction of the three functions and the XML id contrains.
2167    
2168 bernhard 2352
2169 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
2170    
2171 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
2172     Module.
2173    
2174     * Doc/README: Added info on ThubanModel.xmi.
2175    
2176     2004-09-23 Jan-Oliver Wagner <[email protected]>
2177    
2178 jan 2346 * Doc/README: New. Some info about how to generate technical
2179     documentation from the source code.
2180     This text was send to the Thuban developer mailing list on
2181     September 21st 2004 by Bernhard Reiter.
2182    
2183 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
2184    
2185     Improved the svgexport to only use unique ids. Will issues
2186     an error message dialoge when two layer names are the same.
2187     ShapeIDs are now added with a dash within the svg ids.
2188    
2189     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
2190     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
2191     (TestSVGRenderer): New test class with test_make_in() and
2192     test_check_for_layer_name_clash()
2193     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
2194     and draw_shape_layer_incrementally() to not use a baseid twice,
2195     satisfying test_check_for_layer_name_clash()
2196     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
2197     test_make_in().
2198     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
2199     and wxICON_HAND.
2200     (write_to_svg): Put dc and rendering in a try statement and on
2201     catching SVGmapWriterError notify the user and delete the target file.
2202    
2203 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
2204    
2205     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
2206    
2207 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
2208    
2209     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
2210     small bug with the line color. Now the line color will now only set
2211     if it is set in Thuban an not Transparent.
2212    
2213     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
2214     deleting the layers from mapfile. Now all layers will delete backwards
2215     from the last.
2216    
2217 silke 2339 2004-08-20 Silke Reimer <[email protected]>
2218 silke 2338
2219 silke 2339 * Thuban/Model/layer.py:
2220     Fixes bug in projection handling: Otherwise very large region might not
2221     have valid values in the layer's projection.
2222    
2223     2004-08-20 Silke Reimer <[email protected]>
2224    
2225 silke 2338 * Thuban/UI/about.py:
2226     small changes to be consistent with coding style.
2227    
2228 joey 2337 2004-08-13 Martin Schulze <[email protected]>
2229    
2230     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
2231     Adjusted a comment
2232    
2233 silke 2335 2004-08-11 Silke Reimer <[email protected]>
2234 silke 2334
2235 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
2236     too many and too enhanced imports of locale
2237    
2238 silke 2334 2004-08-10 Silke Reimer <[email protected]>
2239    
2240     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
2241 silke 2339 function unicodeToLocale() to convert special characters to users
2242     locale encoding
2243 silke 2334
2244 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
2245    
2246     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
2247     lower case letter'
2248    
2249 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
2250    
2251     * ChangeLog: Rewrite the last ChangeLog entry to follow
2252     the standard way.
2253    
2254     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
2255     the function where it is needed, because it don't works if it stands
2256     at the beginning.
2257     (MF_Layer.__init__): Removed the extra numclassed variable. Now
2258     numclasses from the mapscript will be used.
2259     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
2260     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
2261     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
2262     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
2263     (MF_Map.create_new_layer): New. A new Layer is created and associated
2264     with the mapscript object.
2265     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
2266     the mapscript.
2267     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
2268     linked to the layer in thuban, else the layerobject linked to the
2269     thubanlayer will be used.
2270     AnnotationLayer will now store the filename of the shapefile.
2271     (MF_Map.remove_layer): If a layer is removed the associated object
2272     must be set new.
2273    
2274     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
2275     layers which are exists in thuban to the mapobj. All removed Layers
2276     will be removed from the mapobj.
2277     Added comments to all functions.
2278     (thuban_to_map): No layer will be removed here.
2279    
2280     * Extensions/umn_mapserver/mf_handle.py
2281     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
2282     Layersettings for the mapserver kann be edited.
2283    
2284     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
2285     imported, will be linked with the associated MF_Layer.
2286     (import_mapfile): All layers, which are not selected, will be removed.
2287     Disable the "import layer from mapfile" menu option.
2288    
2289     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
2290     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
2291     layer on permanently.
2292    
2293 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
2294    
2295 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
2296     New. This function removes all metadata
2297     (MF_Layer.set_group): New. Set the group setting.
2298     (MF_Layer.get_group): New. Get the group setting.
2299     (MF_Map): Removed the extra numlayers variable, used the mapscript
2300     parameter instead.
2301     (MF_Map.get_numlayers): New. This get numlayers.
2302     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
2303 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
2304     if the object is an instance. Also added the annotation layer here to
2305     export, but only the layer is created in the mapfile.
2306    
2307 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
2308     the check if a mapobj exist, because its not needed anymore. The
2309     export function is only available if a mapobj exist.
2310     Use the new function to remove all layers.
2311 jschuengel 2323
2312 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
2313     option and the metadata button. The layer dialog is temporary disabled.
2314     (Metadata_CustomDataTable): Added some functions to show the grid
2315 jschuengel 2323 correct.
2316    
2317 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
2318     the number of layer from import_mapfile to this function.
2319     (AnnotationLayer): New. This Class shows the Annotation layer in
2320     thuban. The layer don't do anything. It's only to show the layer
2321     and to save the layer order.
2322     (add_annotationlayer): New. Import an annotation layer to thuban.
2323     (select_layer2import): New. Import only layers to thuban and not
2324     the other settings like projection or scalebar.
2325     (create_new_mapfile): Moved the _has_umn_mapobj function and the
2326     create_new_mapfile functions from mf_handle.py to mf_import.py.
2327 jschuengel 2323
2328     * Extensions/umn_mapserver/sample/iceland.map: Added the group
2329     parameter to the roads and cultural layers. Also added a new
2330     Annotation Layer for the cultural points.
2331    
2332     * Extensions/umn_mapserver/sample/iceland.html: Added the select
2333     option for the annotation layer.
2334    
2335     * Extensions/umn_mapserver/sample/index.html: Added the start
2336     parameter for the annotation layer.
2337    
2338 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
2339    
2340     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
2341     translation completed.
2342    
2343     * Doc/manual/thuban-manual.xml (Chapter Session Management):
2344     Fixed unprecise description for Save Session.
2345    
2346 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
2347    
2348     Started translation of Users Manual into german.
2349    
2350     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
2351    
2352     * Doc/manual/Makefile: Added build instructions for german
2353     users manual.
2354    
2355     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
2356    
2357 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
2358    
2359     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
2360     functions. Now all metadata will handle by the function and its not
2361     needed to initialize it from outside. Therefor the associated mapobj
2362     will be stored in the Metadata Object. So we can use the special
2363     functions from the associated mapobj to get the Metadata.
2364     Therefor all initialization code for the metadata is removed from the
2365     other classes.
2366     (MF_Layer): Added a function to get the metadata object.
2367     (MF_Map): Added a function to set the mappath, the path where
2368     the mapfile ist stored.
2369    
2370     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
2371     to set the extent in the mapfile. Now the code is set by the displayed
2372     data in the Thuban-view.
2373     (export_mapfile): The shapepath is now set empty, until relative
2374     pathnames are supported.
2375    
2376     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
2377     metadata. Yet only mapfile metadata are supported. Layer and class
2378     supported are not implemented.
2379     Added a dialog to handle layer informations. The dialog only shows the
2380     selected layer at the moment.
2381    
2382     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
2383     code for setting the extent in thuban. Now the extent is set to the
2384     given extent from the mapfile.
2385     Fixed a logical mistake. Now the extent is set when realy a layer is
2386     loaded, and not if one is selected to load.
2387    
2388     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
2389     move the shown map in the browser.
2390    
2391     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
2392     line to the mapobj and added metadata to the political layer.
2393    
2394     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
2395     for Metadata.
2396    
2397 joey 2300 2004-07-26 Martin Schulze <[email protected]>
2398    
2399     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
2400     ClassMapper
2401    
2402     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
2403     case for the new ClassMapper
2404    
2405    
2406 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
2407    
2408 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
2409     visible extent of the map in projected coordinates
2410    
2411     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
2412     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
2413     tests.
2414     (SimpleViewPortTest.test_visible_extent): New. The real test for
2415     VisibleExtent()
2416    
2417     2004-07-22 Bernhard Herzog <[email protected]>
2418    
2419 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
2420     function when running asa script.
2421    
2422 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
2423    
2424     * Extensions/umn_mapserver/mf_export.py: Added "import os"
2425     Removed the old "import Thuban.UI.mainwindow" code.
2426     (tbextent_to_map): Removed the extra function and at the code direct
2427     to "thuban_to_map" function.
2428     (write_creatorcomment): Added. Now a short comment is added to the
2429     beginning of an generated mapfile.
2430     (export_mapfile): Now the Path and filename are saved in to variables,
2431     and not together in one variable. This is needed for the new
2432     write_creatorcomment function.
2433    
2434     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
2435     import module "re". Also added Range and the ClassGroupRange import
2436     from Thuban. Both are needed for the new range expression import.
2437     (create_rangeexpression): Added. Creates a Range Expression in Thuban
2438     style from a given mapfile expression.
2439     (added_rasterlayer): Make some small code changes. The shapepath is
2440     now stored in an extra variable and the clazz_name is set empty if no
2441     class name set in the mapfile.
2442     Changed the Error message for Range Expressions, becaus the new
2443     function create a error string which will be shown in the dialog.
2444    
2445     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
2446     range expression import.
2447 jan 2312
2448 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
2449    
2450     * Extensions/umn_mapserver/README: Added hint that
2451     installation as root can be avoided. Removed all tabs.
2452    
2453 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
2454    
2455     * test/test_viewport.py
2456     (ViewPortTest.test_changing_map_projection): Check that changing
2457     the projection of an empty map shown in a viewport doesn't lead to
2458     exceptions in the viewport's handler for the
2459     MAP_PROJECTION_CHANGED messages
2460    
2461     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
2462     try to keep the same region visible when the map actually contains
2463     something
2464    
2465 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
2466    
2467     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
2468     mappath directly from the mapobj. Is needed because of the changes
2469     in mf_import.py.
2470     (MF_Layer.add_thubanclass): Added a new comment.
2471     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
2472     mapobj is empty there is no extent get from thuban an so no one can
2473     set to th mapobj.
2474    
2475     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
2476     the discription.
2477     Split the funktion in to three smaller ones. The new functions are
2478     add_rasterlayer, add_polygonlayer and select_layer2import.
2479     Removed the mapfilepath and filepath initialisation, because its know
2480     include in the new functions.
2481     Now nothing will be imported if cancel is pressed in the
2482     layer choice dialog.
2483    
2484 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
2485    
2486     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
2487     import.
2488     (MF_Symbolset): Removed the extra variable for numsymbols.
2489     (MF_Class.__init__): Added a comment to the exception clause.
2490     Removed the extent init, because it was not needed anymore.
2491     (MF_Layer.add_thubanclass): Added the code to set the class name to
2492     the expression value from thuban if no label is defined.
2493     Added the code to export Range expressions from thuban to the mapfile.
2494     (MF_Map.set_extent): Removed the exception and replace it by some if
2495     code. If the size of a map is not defined the size will be set to 1,1.
2496     This is necessary because if the extent is set, mapscript checks if
2497     the size is greater than zero.
2498     (MF_Web): Added the get and set function for the template.
2499    
2500     * Extensions/umn_mapserver/mf_export.py: Added the function to check
2501     if a mapobject exists and used it to set the status of the menu items.
2502     If no mapfile exists the settings could not be edditied.
2503     Define after which menuitem the exportitem will include.
2504    
2505     * Extensions/umn_mapserver/mf_handle.py: Removed the import
2506     Thuban.UI.mainwindow clause, because it is not needed.
2507     Added the command Refresh() to all "OnChangeColor()" functions,
2508     because the color preview window was not updated on a color change.
2509     Added the function to check if a mapobject exists and used it to set the
2510     status of the menu items. If no mapobject exists the settings could not
2511     be edditied.
2512     (Map_Dialog): Moved the imagetype selector from the
2513     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
2514     (Web_Dialog): Removed the name label and added the template textbox.
2515    
2516     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
2517     the exception handling on loading the layers by an if statement. It
2518     is not necessary to us the exception there.
2519     The Filepath creation now use os.path.join to build the path.
2520    
2521     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
2522     definition from global to the setUp function. Now the testMap will
2523     initialize new on each test.
2524    
2525     * Extensions/umn_mapserver/sample/iceland.map: Include three new
2526     classes in the Line Layer, to test logical Expressions.
2527     Set the status of the class "Point9" in the Point Layer to off
2528    
2529 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
2530    
2531     * Thuban/UI/baserenderer.py
2532     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
2533     optimization that tries not to draw layers under a raster layer.
2534     The bug was harmless. All it effectively did was to produce The a
2535     strange messages about not being able to draw Layer instances for
2536     all vector layers below a raster layer which would be invisible
2537     anyway because the raster layer currently always covers the entire
2538     window
2539    
2540 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
2541    
2542     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
2543     a list of supported outputformats. This formats are not alle supported
2544     because there is no possibility to get the outputformat without the
2545     name known. Make some formal changes to the code.
2546     (MF_Map.set_name()): Fixed a bug if the name is None.
2547    
2548     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
2549     statement, because its not needed anymore. The Outputformat is now
2550     given as string from the object. Make some formal changes to the code.
2551    
2552     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
2553     most of the new setting which were added during the last changes.
2554     Removed the MF_Size Test.
2555    
2556     * Extensions/umn_mapserver/test/test.map: Added a new class to the
2557     cultural Layer to test expressions and the the status of that layer
2558     from on to default.
2559     Changed the data path the the correct Thuban Data
2560     Added the Outputformat Object and Symbol Object
2561    
2562 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
2563    
2564     * Extensions/umn_mapserver/mapfile.py: Added some new
2565     settings to edit (outputformat, label, imagetype)
2566    
2567     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
2568     the Label Dialog and add the OutputDialog.
2569     Make some changes to the code order.
2570    
2571 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
2572    
2573     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
2574     and line Obj and add the scalebar_status_type, scalebar_style_type and
2575     scalebar_position_type.
2576     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
2577     are only used to create a Symbol like the circle in Thuban.
2578     Added the scalebarObject (MF_Scalebar)
2579     (MF_Class): Added set_status and get_status.
2580     (MF_Layer.add_thubanclass): Added code to set the class status
2581     (MF_Map): Added code to handle the symbols and scalebar
2582     (MF_Label): Added the set_partials and get_partials functions
2583    
2584     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
2585     from mapfile. Added a function to create a circle object like the one
2586     from thuban if no one exists.
2587    
2588     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
2589     press ok in the assosiated dialog and not at the end of the
2590     colordialog.
2591     Added the Dialog for the Scalebar.
2592     (Label_Dialog): Added the offset option
2593    
2594     * Extensions/umn_mapserver/mf_import.py: Added code to import the
2595     status of the Classes.
2596     Fixed a bug with the projection. Now the to_meter parameter will be
2597     added to the Projection only if it doesn't exists.
2598    
2599 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
2600    
2601     Added the functionality to handle the content thuban is not
2602     able to handle directly.
2603    
2604     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
2605     Thuban with the possibility to edit the mapfile content.
2606    
2607     * Extensions/umn_mapserver/mf_import.py: Added the possibility
2608     to import mapfiles without any layer selected. So it is possible
2609     to edit the other settings in a mapfile.
2610     (import_mapfile): Added code to use the editing functions.
2611     Added the possibility to import the projection to a layer if one
2612     is defined.
2613     Status settings (On,Off) will now set in thuban (visible, invisible).
2614     fixed a bug with with classnames. If no classname is set in mapfile
2615     the value in Thuban will set to the expression.
2616    
2617     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
2618     possibility to save a new mapfile or use the old one which is
2619     imported or new created.
2620     Added code to use the editing functions.
2621     Remove some not needed import statements
2622    
2623     * Extensions/umn_mapserver/mapfile.py: Added new types which are
2624     need for the editing functions.
2625     Added needed set-functions for the editing functions.
2626     Added the possibility to export rasterimages.
2627     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
2628     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
2629     moment.
2630     (MF_Class.set_thubanstyle): Now point layers will set to a default
2631     symbol to show a circle in mapserver and not only a 1px dot.
2632     (MF_Style.__init__): Fixed a bug with the color. Color was not set
2633     correct before.
2634     (MF_Size): Removed, because it is not needed.
2635    
2636     * Extensions/umn_mapserver/README: Added the hints to use the
2637     export and editing functions, too.
2638    
2639     * Extensions/umn_mapserver/sample/iceland.map: Added the
2640     new parameter "UNITS METERS".
2641     Change the political layer to status OFF.
2642    
2643     * Extensions/umn_mapserver/sample/README: Added some
2644     more details to setup the sample in the MapServer.
2645    
2646 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
2647    
2648     * Extensions/svgexport/test/test_svgmapwriter.py:
2649     Removed class VFile and used standard StringIO instead.
2650    
2651 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
2652    
2653     Add the export function to the umn_mapserver extension.
2654    
2655     * Extension/umn_mapserver/mf_export.py: New. This module extents
2656     Thuban with the possibility to export the Thuban content.
2657    
2658     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
2659     with the export module. Especially added the possibility to
2660     add thuban objects directly to the map objects.
2661    
2662     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
2663     because of the hint from Bernhard Herzog.
2664     Corrected the handling of absolute pathnames.
2665     Changed the Text of the Menu-Item, now the beginning is upper case.
2666    
2667     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
2668    
2669 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
2670 jschuengel 2242
2671 jschuengel 2250 Add a sample and make some changes.
2672    
2673     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
2674     import from * to explicit used statements. Changed the
2675     Thuban.UI.mainwindow import phrase, too.
2676     (import_mapfile):Corrected a clerical mistake.
2677     Added wxCHANGE_DIR in OpenFile Dialog.
2678     Added a MultipleChoiceDialog, to select the layers to load from
2679     mapfile into thuban. Thereby the projection is only set if one layer
2680     is selected.
2681     Added the possibility to handle relative pathnames which uses
2682     up-level references.
2683     Removed some doubled code.
2684     Corrected an error with integer values used as label in thuban
2685     ClassGroup.
2686    
2687     * Extensions/umn_mapserver/sample: New.
2688    
2689     * Extensions/umn_mapserver/sample/README: New. Describes the
2690     usage of the sample files.
2691    
2692     * Extensions/umn_mapserver/sample/iceland.map: New. This is
2693     a suitable .map-file for the iceland data.
2694    
2695     * Extensions/umn_mapserver/sample/index.html: New. The template
2696     for the mapfile.
2697    
2698     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
2699     file for the Iceland Application on web.
2700    
2701     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
2702     some details.
2703    
2704     * Extensions/umn_mapserver/test/test_mapserver
2705     (mapserver_import_Test_generalClasses.test_MF_Color):
2706     Corrected the thubancolor test.
2707    
2708     2004-06-15 Jan Schüngel <[email protected]>
2709    
2710 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
2711    
2712 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
2713    
2714     * libraries/thuban/cpl_mfile.h: Added copyright header.
2715    
2716     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
2717     Free Software License so that it is most useful with gdalwarp
2718     and bmpdataset.
2719    
2720 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
2721    
2722     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
2723     import of wxPython.wx itself (as opposed to the contents of
2724     wxPython.wx). For some reason wxPython.wx is available as
2725     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
2726     wrt. wxPython 2.4.
2727    
2728 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
2729    
2730     Initial version of new extension "umn_mapserver". This extension aims
2731     to manage configuration for the UMN MapServer application. This
2732     inital version just imports the .map-files and displays all, Thuban is
2733     capable of.
2734    
2735     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
2736    
2737     * Extensions/umn_mapserver/test/README: New. Describes how to run the
2738     tests.
2739    
2740     * Extensions/umn_mapserver/test/test.map: New. This is a test
2741     .map-file for automated tests of the umn_mapserver extension of
2742     Thuban.
2743    
2744     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
2745     UMN Mapserver classes.
2746    
2747     * Extensions/umn_mapserver/__init__.py: New. Init to make this
2748     directory a package.
2749    
2750     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
2751     '.map'-file objects.
2752    
2753     * Extensions/umn_mapserver/mf_import.py: New. This module extends
2754     Thuban with the possibility to handle UMN MapServer mapfiles.
2755    
2756 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
2757    
2758     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
2759     to a tuple before using it as arguments to the % operator. This
2760     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
2761     reported today on thuban-list by Jan Schüngel
2762    
2763     * test/test_layer.py (TestLayerModification.setUp): Save the
2764     filename as an instance variable so we can refer to it in tests
2765     (TestLayerModification.test_tree_info): Uncomment this method
2766     again and make it work. This tests for the formatting issue
2767     filed in RT#2239 on 2004-01-13
2768    
2769 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
2770    
2771     * Thuban/UI/baserenderer.py: Fix some typos.
2772    
2773 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
2774    
2775     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
2776     by increasing a field size.
2777    
2778 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
2779    
2780     Update to newest shapelib and get rid of Thuban specific
2781     extensions, i.e. use the new DBFUpdateHeader instead of our
2782     DBFCommit kludge
2783    
2784     * libraries/shapelib/shpopen.c: Update to version from current
2785     shapelib CVS.
2786    
2787     * libraries/shapelib/shapefil.h: Update to version from current
2788     shapelib CVS.
2789    
2790     * libraries/shapelib/dbfopen.c: Update to version from current
2791     shapelib CVS.
2792     (DBFCommit): Effectively removed since shapelib itself has
2793     DBFUpdateHeader now which is better for what DBFCommit wanted to
2794     achieve.
2795     We're now using an unmodified version of dbfopen.
2796    
2797     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
2798     value '1' to the Lib.dbflibc extension. This simply reflects the
2799     shapelib and pyshapelib updates
2800    
2801 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
2802    
2803     Finished introduction of Menu.FindOrInsertMenu.
2804    
2805     * Extensions/drawshape/drawshape.py: Add the command
2806     to the experimental menu additionally to the toolbar.
2807    
2808     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
2809     finding menu on its own.
2810    
2811     * Doc/manual/thuban-manual.xml: updated sample file
2812     to use FindOrInsertMenu().
2813    
2814     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
2815     instead of finding menu on its own.
2816    
2817 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
2818    
2819     * test/test_menu.py (MenuTest.test): Added testing
2820     of method Menu.FindOrInsertMenu.
2821    
2822 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
2823    
2824     Introduce and use Menu.FindOrInsertMenu.
2825    
2826     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
2827     given menu or, if not found, insert it.
2828    
2829     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
2830     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
2831     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
2832     menu on its own.
2833    
2834 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
2835    
2836     Introduce a abstract ColorDialog class and remove
2837     and outdated file.
2838    
2839     * Thuban/UI/proj4dialog.py: Removed. It is has been
2840     replaced by projdialog for quite a while and is not used
2841     anymore.
2842    
2843     * Thuban/UI/colordialog.py: New. Abstraction for color selection
2844     dialog(s).
2845    
2846     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
2847     Now calls the abstract ColorDialog instead of wxColourDialog.
2848     This also removed the dependency to Color class conversion
2849     from this function.
2850    
2851 frank 2197 2004-05-04 Frank Koormann <[email protected]>
2852    
2853     * Extensions/bboxdump/__init__.py: Fixed string left over from
2854     copying.
2855    
2856     * Extensions/bboxdump/bboxdump.py (bboxdump):
2857     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
2858     xrange(layer.NumShapes()). Compile the bboxmessage from a list
2859     of formatted outputs (string.join) instead of appending to the
2860     message. Two progress bar dialogs to report progress on the sometimes
2861     lenghty processing.
2862    
2863 frank 2196 2004-04-22 Frank Koormann <[email protected]>
2864    
2865     New Extension to dump bounding boxes of all shapes of the selected
2866     layer. An optional column can be specified to group the objects,
2867     in this case the bounding box is a union of the separate boxes.
2868     Dump can be displayed in a ScrolledMessageDialog or written to file.
2869     The Extension is simply a combination of available and well tested
2870     Thuban functionality.
2871    
2872     * Extensions/bboxdump/__init__.py: New: Init to make this
2873     directory a package.
2874    
2875     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
2876     all shapes of the selected layer.
2877    
2878 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
2879    
2880     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
2881     strings to be i18n now.
2882    
2883 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
2884    
2885     Changing popup menu of legend from direct building
2886     to using the Menu construction as used for the mainwindow.
2887    
2888     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
2889     layer_to_bottom, layer_visibility
2890     (MainWindow.LayerToTop): New. Put current layer to the top.
2891     (MainWindow.LayerToBottom): New. Put current layer to bottom.
2892     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
2893     Replace 1,0 by True, False.
2894     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
2895     current layer.
2896     (MainWindow.LayerShowTable): Removed raising of dialog.
2897     (_has_selected_layer_visible): New. Support function.
2898    
2899     * Thuban/UI/legend.py: ID_POP_xxx: removed.
2900     (LegendPanel.__init__): Removed EVT_MENU bindings.
2901     (LegendTree._OnRightClick): Replace direct creation of
2902     menu via wx Classes by applying the menu definition
2903     as of Menu class of menu.py.
2904    
2905 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
2906    
2907     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
2908     button string to stronger clearify that Thuban will be closed when hitting
2909     the button.
2910    
2911     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
2912     Now for layers without a ShapeStore a corresponding message is given
2913     to the user, that this layer has no table to show.
2914    
2915 joey 2182 2004-04-15 Martin Schulze <[email protected]>
2916    
2917     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
2918     recalculate the format for the internal render engine as well.
2919    
2920     * Extensions/wms/properties.py (wmsProperties): First start for a
2921     properties dialog. It's functional for a first selection of
2922     layers, but still has some weired wxWidgets/GTK problems but
2923     beautification can be done later.
2924    
2925     * Extensions/wms/layer.py: Added more documentation
2926     (WMSLayer.getFormats): New: Return list of supported image formats
2927     by the WMS server
2928     (WMSLayer.getLayers): New: Return the list of layer names
2929     supported by the WMS server
2930     (WMSLayer.getLayerTitle): New: Return the title of the named layer
2931     (WMSLayer.getWMSFormat): New: Return the image format that is used
2932     for WMS GetMap requests
2933     (WMSLayer.setWMSFormat): New: Set the image format that is used
2934     for WMS GetMap requests
2935     (WMSLayer.__init__): Move away from using only one layer to using
2936     a list of layers (unsorted at the moment, though).
2937     (WMSLayer.getVisibleLayers): New: Return the list of names for all
2938     visible layers
2939     (WMSLayer.setVisibleLayers): New: Set the list of names for all
2940     visible layers
2941    
2942     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
2943     order to establish a clean structure.
2944    
2945     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
2946     own in order to establish a clean structure.
2947    
2948 joey 2174 2004-04-13 Martin Schulze <[email protected]>
2949    
2950     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
2951     support for oldstyle (WMS 1.0 apparently) image format
2952     specification.
2953    
2954     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
2955     supported graphic formats back to JPEG and BMP, PNG and others are
2956     too *cough* experimental... Sorry, I meant to filter this out
2957     before I committed this part. This should make the WMS extension
2958     run from CVS again.
2959     (wms_dialog): Reset an empty URL to None so that the subsequent
2960     program can depend on this, since the dialog will indeed return an
2961     empty URL, causing another declaration of love by Python.
2962    
2963     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
2964     Whenever a native BoundingBox request cannot be fulfilled, check
2965     whether the requested SRS is EPSG:3426, in which case return the
2966     LatLonBoundingBox values.
2967    
2968     * Extensions/wms/test/test_parser.py
2969     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
2970     ignoring AUTO:* SRS.
2971     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
2972     Added another test method to test whether the LatLonBoundingBox
2973     values will be returned if BoundingBox values are requested with
2974     SRS set to EPSG:3426.
2975    
2976     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
2977     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
2978     the moment by placing them into a variable which is currently
2979     unused. Also test whether the EPSG SRS is numerical as it should
2980     be and add an error message if it is not.
2981    
2982     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
2983     appear in the real world as well. Since we cannot handle them yet
2984     (OGCLib can't either), we will ignore them for the moment.
2985    
2986     * Extensions/wms/parser.py: Use a variable for denoting the sample
2987     filename
2988     (WMSCapabilitiesParser.peekLayers): Added support for error
2989     messages during grok(). They will be aggregated in an array and
2990     may be displayed later. We may have to add a classification
2991     "Warning" and "Error" to this. That requires more experience,
2992     though, since not every error may be lethal.
2993    
2994     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
2995     ShowTable() dialog/frame when the user attempts to display it
2996     while it has been opened before already and not closed again.
2997    
2998 joey 2161 2004-04-11 Martin Schulze <[email protected]>
2999    
3000     * Extensions/wms/infodialog.py: Adjusted the class documentation
3001    
3002     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
3003     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
3004     wxWidgets variants.
3005     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
3006    
3007     * Extensions/wms/infodialog.py: Added an information dialog that
3008     will display various information about the WMS current resource,
3009     so that additional information such as the title, the abstract,
3010     fees and access constraints can be displayed for the user if they
3011     are documented in the WMS XML.
3012    
3013 joey 2156 2004-04-10 Martin Schulze <[email protected]>
3014    
3015     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
3016     string handling. It's "foo".lower() and not lower(foo) without
3017     lower imported from strings or something.
3018    
3019     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
3020     from capabilities.py and parser.py. Implement priority list for
3021     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
3022     and GIF are supported here, but not yet by main Thuban. Hence,
3023     support for them may be removed later. Special contribution to
3024     usability: get wxWidgets to change the cursor when we're waiting
3025     for data from the network so the user won't start to worry. This
3026     causes a redrawing error/warning, though.
3027    
3028     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
3029     the DOM object.
3030    
3031     2004-04-01 Martin Schulze <[email protected]>
3032    
3033     * Extensions/wms/capabilities.py: Adjusted documentation
3034     (WMSCapabilities.__init__): Improved documentation, fixed syntax
3035     (WMSCapabilities.saveCapabilities): Only catch IOError when
3036     handling files
3037     (WMSCapabilities.loadCapabilities): Only catch IOError when
3038     handling files
3039     __main__: corrected variable naming
3040     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
3041     class a specialisation of WMSCapabilitiesParser as well. Also
3042     execute grok() after loading or fetching capabilities, if that
3043     went well, so that subsequent calls can already access the data.
3044     (WMSCapabilities.getVersion): Export the used version of the
3045     GetCapabilities request, so we can use it for subsequent calls,
3046     i.e. for GetMap requests.
3047     (WMSCapabilities.fetchCapabilities): Added proper error handling
3048     when the GetCapabilities request failed, so that the surrounding
3049     program can act accordingly.
3050    
3051 joey 2146 2004-03-30 Martin Schulze <[email protected]>
3052    
3053     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
3054     Adjusted the getLayerSRS method to return the list of SRSes
3055     extracted from <SRS> elements instead of <BoundingBox> elements.
3056     Added a bit of documentation as well.
3057     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
3058     since it was only implemented due to a misunderstanding.
3059    
3060     * Extensions/wms/test/test_parser.py
3061     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
3062     reflect the corrected interpretation of the standard: i.e. a layer
3063     does not have to define a BoundingBox for all SRSes it supports.
3064     Hence the <SRS></SRS> specification is authoritative, not the list
3065     of BoundingBoxes.
3066     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
3067     to ensure None is returned for a non-existing SRS.
3068     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
3069     since it is not applicable anymore. Listing more SRSes in <SRS>
3070     elements is valid according to the specs.
3071    
3072 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
3073 joey 2146
3074 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
3075     Reflected wxWidgets name change.
3076    
3077     * Thuban/UI/about.py: Extended copyright to 2004 and added
3078     information about the thuban-devel mailinglist.
3079    
3080 joey 2138 2004-03-24 Martin Schulze <[email protected]>
3081 joey 2120
3082 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
3083     'WMS', also added a linebreak where required
3084    
3085     * Extensions/wms/parser.py: Finally added the XML parser for the
3086     GetCapabilities response.
3087    
3088     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
3089     <SRS> elements match the <BoundingBox> elements, except for the
3090     layer 'beschriftung'.
3091    
3092     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
3093     since Python uses unicode strings internally, otherwise
3094     comparisons will fail. Removed tests for getLayerBBoxSRS() since
3095     the SRS will be calculated anyway and this method is obsoleted by
3096     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
3097     Move loading the sample file into the setUp method. Added a test
3098     for finding the integrity problem in the sample response.
3099     Improved formatting.
3100    
3101     * Extensions/wms/domutils.py: Added convenience routines for
3102     handling of Document Object Model (DOM) nodes.
3103    
3104     * Extensions/wms/test/test_domutils.py: Added a test for the
3105     domutils module
3106    
3107     2004-03-19 Martin Schulze <[email protected]>
3108    
3109 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
3110     Moved path detection and adding into a module of its own,
3111     adjustpath, which exports thubandir as main Thuban directory.
3112    
3113     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
3114     detection and adding into a module of its own, adjustpath, which
3115     exports thubandir as main Thuban directory. Reorganised the
3116     module in order to support the SkipTest feature for Thuban test
3117     cases.
3118    
3119     * Extensions/wms/test/adjustpath.py: Moved path detection and
3120     adding into a module of its own.
3121    
3122 joey 2115 2004-03-18 Martin Schulze <[email protected]>
3123    
3124     * Extensions/wms/test/test_parser.py: Added another test for
3125     checking whether the WMS XML parser (to be implemented) returns
3126     the information we expect. This requires a sample WMS WML file
3127     (sample.xml) which has been extracted from the frida server and
3128     "improved" manually.
3129    
3130     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
3131     main Thuban directory to the path in order to be able to import
3132     random modules. Adjusted the PyOGCLib detection to reuse the
3133     information gathered. Also added a note about the PYTHONPATH
3134     environment variable.
3135    
3136     * Extensions/wms/test/test_ogclib.py: The format specification is
3137     a mime-type, not a graphic format, hence image/jpeg wou ld be the
3138     proper format and not JPEG. We'll also have to take care of the
3139     encoding of / as %2F.
3140    
3141 joey 2111 2004-03-16 Martin Schulze <[email protected]>
3142    
3143     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
3144     comprehensive test for the getMapURL method, built compare URLs
3145     according to the documentation in OGC 01-068r3
3146    
3147     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
3148     class WMSCapabilities to manage capabilites, will incorporate
3149     parsing the capabilities response and provide details for other
3150     classes.
3151    
3152 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
3153    
3154 bh 2107 Support views in addition to normal tables in the postgis
3155     shapestore
3156    
3157     * Thuban/Model/postgisdb.py
3158     (PostGISShapeStore._fetch_table_information): Add a fallback for
3159     the case where the table name is not in the geometry_columns
3160     table. This is usually the case for views. Also, set
3161     self.shapestore here.
3162     (PostGISShapeStore.ShapeType): No need to query the database all
3163     the time. The shape type is now determined in
3164     _fetch_table_information
3165    
3166     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
3167     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
3168     New parameter to specify views.
3169     (PostGISDatabase.has_data): Also compare the views. New views
3170     parameter
3171     (PostGISDatabase.initdb): Create the views.
3172     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
3173     view
3174    
3175     * test/test_postgis_db.py
3176     (TestPostGISShapestorePointFromViews): New. Test a
3177     PostGISShapeStore with a view
3178     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
3179     the geometry_column explicitly to test whether that works
3180    
3181     2004-03-12 Bernhard Herzog <[email protected]>
3182    
3183 bh 2105 Final step for explicit id/geometry columns: Loading and saving
3184    
3185     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
3186     with the following changes:
3187     (dbshapesource): Two new attributes id_column and geometry_column
3188    
3189     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
3190     (SessionSaver.write_session): Use the new namespace
3191     (SessionSaver.write_data_containers): Write the new dbshapesource
3192     parameters
3193    
3194     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
3195     the new file format version
3196     (SessionLoader.start_dbshapesource): Handle the new db parameters
3197    
3198     * test/test_save.py: Update to the new dtd and namespace
3199     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
3200     mock object to provide a working IDColumn method.
3201    
3202     * test/test_load_1_0.py: New. Copy of the test_load.py before
3203     today's changes but with the round-trip tests removed.
3204    
3205     * test/test_load_0_9.py: Update doc-string.
3206    
3207     * test/test_load.py: Update all .thuban files to the new dtd and
3208     namespace.
3209     (TestPostGISLayer.file_contents): Add the new dbshapesource
3210     paramters
3211    
3212 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
3213    
3214 bh 2103 Next step for explicit id/geometry columns: User interaction
3215    
3216     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
3217     the dialog is constructed. Add combo boxes to select id and
3218     geometry column. Rename some instance variables.
3219     (ChooseDBTableDialog.GetTable): Return id and geometry column
3220     names
3221     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
3222     selections in the table list
3223    
3224     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
3225     and geometry_column
3226    
3227     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
3228     parameters for id_column and geometry column of PostGISShapeStore
3229     here as well.
3230    
3231     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
3232     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
3233     (PostGISConnection.GeometryTables): Use a better query to
3234     determine which relations in the database might be usable for
3235     shapestores. Now supports views as well but is more PostgreSQL
3236     specific
3237     (PostGISConnection.table_columns): New. Somewhat experimental
3238     method to let the db dialogs provide lists of columns to users so
3239     that they can select id and geometry columns.
3240     (PostGISTable.__init__): The default value of the id_column
3241     parameter is now None it still means "gid" effectively, though.
3242     (PostGISTable.IDColumn): New introspection method to return a
3243     column object for the id column
3244     (PostGISShapeStore.GeometryColumn): New introspection method to
3245     return a column object for the geometry column
3246    
3247     * test/test_postgis_db.py
3248     (TestPostGISConnection.test_gis_tables_non_empty):
3249     Removed. Subsumed by the new:
3250     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
3251     New. Tes the GeometryTables and table_columns methods with actual
3252     tables and views.
3253     (PointTests.test_id_column, PointTests.test_geometry_column):
3254     New. tests for the new methods.
3255     (TestPostGISShapestorePoint.setUp)
3256     (TestPostGISShapestorePointSRID.setUp)
3257     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
3258     instance variables needed by the new tests
3259    
3260     2004-03-11 Bernhard Herzog <[email protected]>
3261    
3262 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
3263     numbers given to ReadValue are ordinals.
3264    
3265     2004-03-11 Bernhard Herzog <[email protected]>
3266    
3267     Elimiate the requirement for PostGIS tables to have a column
3268     called "gid".
3269    
3270     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
3271     id_column to specify which column to use to identify rows. Also
3272     new instance variables id_column and quoted_id_column
3273     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
3274     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
3275     (PostGISTable.SimpleQuery): Use the id column name provided to the
3276     constructor instead of "gid"
3277     (PostGISShapeStore.__init__): New parameter id_column analogously
3278     to PostGISTable.__init__. This parameter is simply passed through
3279     to the base class constructor
3280     (PostGISShapeStore._create_col_from_description): Fix typo in
3281     doc-string
3282     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
3283     (PostGISShapeStore.ShapesInRegion): Use the id column name
3284     provided to the constructor instead of "gid"
3285    
3286     * test/postgissupport.py
3287     (PostgreSQLServer.get_default_static_data_db): New static table
3288     landmarks_point_id with an id column != "gid. Update the comments
3289     a bit.
3290     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
3291     doc-
3292     (upload_shapefile): New parameter gid_column to use a name other
3293     than "gid" for the column to store the shape ids
3294    
3295     * test/test_postgis_db.py (TableTests): New. Mixin-class
3296     containing all tests previously in TestPostGISTable. The actual
3297     tests are the same but the code is a bit more configurable to
3298     allow for different id columns etc.
3299     (TestPostGISTable): Derive from TableTests now for the actual
3300     tests.
3301     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
3302     except that it the landmarks_point_id table to test the id_column
3303     parameter
3304     (PointTests): Extend the doc-string
3305     (TestPostGISShapestorePointExplicitGIDColumn)
3306     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
3307     from PointTests to test the explicit id_column parameter. One
3308     tests with the name of the column holding the shape ids, the other
3309     uses PostgreSQL's OID column. For the latter a number of methods
3310     have to be overwritten to make them independent of the actual id
3311     values.
3312    
3313 silke 2095 2004-03-08 Silke Reimer <[email protected]>
3314    
3315     Update debian directory:
3316    
3317     * debian/changelog: Added new version.
3318     * deiban/rules: Updated management of patches (with cbds)
3319     * debian/control: Added cbds to dependencies
3320     * debian/patches/*: New. Adds better support for patches of thuban in
3321     debian
3322     * debian/menu: Syntax of menu changed slightly
3323     * debian/setup.py.patch: removed because it has been moved to
3324     debian/patechs/setup.py.patch
3325    
3326    
3327 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
3328    
3329     Create the Doc/technotes directory for text files with information
3330     for developers
3331    
3332     * Doc/technotes/README: New. README for the technotes
3333    
3334     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
3335     Thuban
3336    
3337     * Doc/technotes/release_process.txt: New. Used to be
3338     HOWTO-Release. Now slightly adapted to technote formatting style.
3339    
3340     * HOWTO-Release: Removed. It's contents are now in
3341     Doc/technotes/release_process.txt
3342    
3343 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
3344    
3345     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
3346     version of wxWindows the module was compiled with so we can check
3347     that against the wxPython version.
3348    
3349     * Thuban/version.py (thuban_branch, thuban_release): New variables
3350     controlling which and how Thuban versions are shown. See the
3351     comments for details.
3352     (verify_versions): Also check that the wx version that wxproj is
3353     compiled against matches that of the wxPython we use at runtime
3354    
3355 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
3356    
3357 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
3358     get_system_proj_file to read the epsg projections. The old way
3359     depended on the current directory being the top Thuban directory.
3360    
3361     2004-02-20 Bernhard Herzog <[email protected]>
3362    
3363 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
3364     (TestVirtualDC.test_clippath): Remove a debug print
3365    
3366     2004-02-20 Bernhard Herzog <[email protected]>
3367    
3368 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
3369     Extensions/svgexport into a package.
3370    
3371     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
3372     doc-string a bit. The doc-string must come first, otherwise it's
3373     not a doc-string. The __future__ import must be the first thing
3374     after the doc-string. Use only double quotes in doc-strings.
3375     Single quotes trip up emacs syntax highlighting if the text
3376     contains apostrophes.
3377    
3378     2004-02-20 Bernhard Herzog <[email protected]>
3379    
3380 bh 2080 * Extensions/svgexport/test/__init__.py,
3381     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
3382     suite for svgexport
3383    
3384     * test/runtests.py (find_test_modules): New. Function with the
3385     module finding code from main.
3386     (main): Use find_test_modules to figure out the default test
3387     modules and take modules from Extensions.svgexport.test too.
3388    
3389 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
3390    
3391 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
3392     the mainwindow has a reference to the map of the initial session.
3393     This fixes a bug introduced with the fix for RT#2245
3394    
3395     2004-02-19 Bernhard Herzog <[email protected]>
3396    
3397 bh 2075 * Extensions/svgexport/svgsaver.py,
3398     Extensions/svgexport/svgmapwriter.py,
3399     Extensions/svgexport/maplegend.py: Added again. This time in the
3400     correct place.
3401    
3402 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
3403    
3404 bh 2073 Fix for RT#2245
3405    
3406     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
3407     instance variables before trying to create any windows. Creating
3408     windows can start an event loop if e.g. message boxes are popped
3409     up for some reason, and event handlers, especially EVT_UPDATE_UI
3410     may want to access things from the application.
3411     (ThubanApplication.maps_changed): The mainwindow may not have been
3412     created yet, so check whether it has been created before calling
3413     its methods
3414    
3415     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
3416     have a map
3417    
3418     2004-02-17 Bernhard Herzog <[email protected]>
3419    
3420 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
3421     Extensions/svgmapwriter.py, Extensions/maplegend.py,
3422     extensions/svgexport/svgsaver.py,
3423     extensions/svgexport/svgmapwriter.py,
3424     extensions/svgexport/maplegend.py: Removed. These files were in
3425     the wrong places or didn't work at all.
3426    
3427 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
3428    
3429 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
3430     line
3431    
3432     2004-02-16 Bernhard Herzog <[email protected]>
3433    
3434 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
3435    
3436 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
3437    
3438     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
3439     to write a session to a file in SVG format.
3440     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
3441     to write a SVG map of a session.
3442     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
3443     in SVG format for the current session.
3444    
3445 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
3446    
3447     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
3448     can't be created, return immediately after displaying the error
3449     message.
3450    
3451 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
3452    
3453     Handle postgis tables with more than one geometry column.
3454    
3455     * Thuban/Model/postgisdb.py
3456     (PostGISTable._fetch_table_information): Delegate the creation of
3457     column objects to a different method so that we can extend that in
3458     derived classes
3459     (PostGISTable._create_col_from_description): New. Column object
3460     creation part of _fetch_table_information
3461     (PostGISShapeStore._create_col_from_description): New. Extend
3462     inherited method to handle geometry columns
3463     (PostGISShapeStore.__init__): New parameter geometry_column to
3464     specify which geometry column to use. Optional but mandatory for
3465     tables with more than one geometry column
3466     (PostGISShapeStore._fetch_table_information): Also use the name of
3467     the geometry column when looking for the srid
3468     (PostGISShapeStore.ShapeType): Also use the name of the geometry
3469     column when looking for the shape type
3470    
3471     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
3472     NonConnectionStore to changes in the PostGISShapeStore
3473    
3474     * test/test_postgis_db.py
3475     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
3476     PostGISShapeStore with tables having two geometry columns.
3477    
3478 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
3479    
3480     Fix some postgis problems. What remains to be done is real
3481     handling of SRIDs as they affect how reprojection is done
3482    
3483     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
3484     doc-string
3485     (PostGISShapeStore._fetch_table_information): New. Extend
3486     inherited method to retrieve srid
3487     (PostGISShapeStore.BoundingBox): Handle tables without data.
3488     extent yields NULL for those
3489     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
3490    
3491     * test/test_postgis_db.py
3492     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
3493     for the special case of a table without any data
3494     (TestPostGISShapestorePointSRID): New class with tests for a table
3495     that uses srids
3496     (PolygonTests): Fix a doc-string typo
3497    
3498     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
3499     reference_systems with a specification of spacial reference
3500     systems to create in the new db.
3501     (PostgreSQLServer.new_postgis_db)
3502     (PostgreSQLServer.get_static_data_db): New parameter
3503     reference_systems to be passed through ultimately to
3504     PostGISDatabase. In new_postgis_db also check whether an existing
3505     db already has the right srids
3506     (PostgreSQLServer.get_default_static_data_db): Add srids and a
3507     table that uses srids
3508     (PostGISDatabase.initdb): Create the entries for the reference
3509     systems
3510     (PostGISDatabase.has_data): Add reference_systems parameter to
3511     check for those too
3512     (upload_shapefile): New parameter srid to create tables with a
3513     specific srid
3514    
3515 frank 2055 2004-02-06 Frank Koormann <[email protected]>
3516    
3517     * po/pt_BR.po: Fixed charset
3518    
3519 frank 2054 2004-02-05 Frank Koormann <[email protected]>
3520    
3521     * po/pt_BR.po: Fixed format string for error message, missing %s
3522     added (Thuban/UI/application.py:273)
3523    
3524 frank 2053 2004-02-03 Frank Koormann <[email protected]>
3525    
3526     First version of Portuguese (Brazilian) translation
3527    
3528     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
3529     Brazilian Portuguese by Eduardo Patto Kanegae.
3530    
3531     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
3532     translators.
3533    
3534    
3535 frank 2052 2004-01-22 Frank Koormann <[email protected]>
3536    
3537     * Doc/manual/thuban-manual.xml: Added section on installation of
3538     Thuban under Win32 systems. Fixed image path references in the postgis
3539     section. Some minor source formattings.
3540    
3541 frank 2051 2004-01-21 Frank Koormann <[email protected]>
3542    
3543     Make Thuban remember path selections (at least for one application run).
3544    
3545     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
3546     attribute of application object. Path is a dictionary of
3547     strings, currently with the items "data" and "projection".
3548     (Application.SetPath): New, stores path for the specified item.
3549     (Application.Path): New, return path for the specified item.
3550    
3551     * Thuban/UI/mainwindow.py
3552     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
3553     MainWindow.AddLayer, MainWindow.AddRasterLayer,
3554     MainWindow.TableOpen): Access "data" path information of the
3555     application.
3556    
3557     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
3558     Access "projection" path information of the application.
3559    
3560 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
3561    
3562 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
3563    
3564     2004-01-05 Bernhard Herzog <[email protected]>
3565    
3566 bh 2048 * po/Makefile, po/README: Move the description of how to generate
3567     the translation statistics to the README.
3568    
3569 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
3570    
3571 bh 2045 * NEWS: Update for 1.0.0
3572    
3573     * po/it.po: Another update from Maurizio Napolitano
3574    
3575     2003-12-23 Bernhard Herzog <[email protected]>
3576    
3577 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
3578    
3579     2003-12-23 Bernhard Herzog <[email protected]>
3580    
3581     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
3582     for translation
3583    
3584     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
3585     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
3586     strings for translation
3587    
3588     * po/de.po: Update with the newly marked strings.
3589    
3590 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
3591    
3592 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
3593     updated
3594    
3595     2003-12-22 Bernhard Herzog <[email protected]>
3596    
3597 bh 2037 * setup.py (setup call): 1.0.0, yeah!
3598    
3599     * Thuban/version.py (longversion): 1.0.0, yeah!
3600    
3601     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3602     1.0.0 namespace too
3603    
3604     * Thuban/Model/save.py (SessionSaver.write_session): Save with
3605     1.0.0 namespace
3606    
3607     * test/test_load.py (LoadSessionTest.dtd)
3608     (TestSingleLayer.file_contents)
3609     (TestNonAsciiColumnName.file_contents)
3610     (TestLayerVisibility.file_contents)
3611     (TestClassification.file_contents, TestLabels.file_contents)
3612     (TestLayerProjection.file_contents)
3613     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3614     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
3615     (TestPostGISLayerPassword.file_contents)
3616     (TestLoadError.file_contents, TestLoadError.test): Update for
3617     1.0.0 namespace
3618    
3619     * test/test_save.py (SaveSessionTest.dtd)
3620     (SaveSessionTest.testEmptySession)
3621     (SaveSessionTest.testSingleLayer)
3622     (SaveSessionTest.testLayerProjection)
3623     (SaveSessionTest.testRasterLayer)
3624     (SaveSessionTest.testClassifiedLayer)
3625     (SaveSessionTest.test_dbf_table)
3626     (SaveSessionTest.test_joined_table)
3627     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
3628    
3629     2003-12-22 Bernhard Herzog <[email protected]>
3630    
3631 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
3632     alignment flags are byte strings not unicode and that they have
3633     valid values
3634    
3635     * test/test_load.py (TestLabelLayer): New. Test loading (and
3636     indirectly saving) of maps with labels.
3637    
3638     2003-12-22 Bernhard Herzog <[email protected]>
3639    
3640 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
3641     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
3642     unsubscribe all subscribers.
3643     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
3644     self.grid since it may already have been destroyed.
3645     Fixes RT #2256
3646    
3647 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
3648    
3649     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3650    
3651 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
3652 silke 2029
3653     * debian/bitmappath.patch, debian/setup.py.patch:
3654     added to ensure compliance with FHS for debian
3655     * debian/rules, debian/changelog:
3656     added patches in rules to ensure compliance with FHS for debian
3657 bh 2028
3658 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
3659    
3660 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
3661     statistics about the translations. Add a comment how produce even
3662     nicer statistics with sed.
3663    
3664 frank 2026 2003-12-09 Frank Koormann <[email protected]>
3665    
3666     * Resources/Projections/defaults.proj:
3667     French projection sample with correct accents (UNICODE).
3668    
3669 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
3670    
3671     * MANIFEST.in: Add the devtools directory
3672    
3673     * setup.py (setup call): Use license instead of licence. This
3674     silences a deprecation warning on Python 2.3
3675    
3676 frank 2022 2003-12-05 Frank Koormann <[email protected]>
3677    
3678 frank 2023 Documentation synced with 1.0rc1
3679    
3680     * Doc/manual/thuban-manual.xml:
3681     Minor formatting changes and references to database layers .
3682     Introduction.Internationalization: New section on i18n.
3683     MapManagement.AddingandRemovingLayers: Added item on database layers.
3684     MapManagement.TheLegend: Added section and screenshot on popup menu.
3685     ProjectionManagement: Updated screenshot and sentence on EPSG.
3686     Appendix.SupportedDataSources: Added PostGIS.
3687     Appendix.WorkingwithPostGIS: New section.
3688    
3689     * Doc/manual/images/6_projection.png: Updated screenshot including
3690     EPSG checkboxes.
3691    
3692     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
3693    
3694     * Doc/manual/images/app_postgis_add_layer.png,
3695     Doc/manual/images/app_postgis_db_add.png,
3696     Doc/manual/images/app_postgis_db_management.png:
3697     New screenshots focussing on database layers
3698    
3699     2003-12-05 Frank Koormann <[email protected]>
3700    
3701 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
3702     write warning to stderr instead of rising a warning dialog
3703    
3704 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
3705    
3706 bh 2021 Fix for RT #2243
3707    
3708 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
3709     New. Like has_selected_layer but for shape layers only
3710     (_has_selected_shape_layer): New. Like _has_selected_layer but for
3711     shape layers only
3712     (layer_show_table command, layer_jointable command): Use these
3713     commands should only be available for shape layers
3714    
3715     2003-12-03 Bernhard Herzog <[email protected]>
3716    
3717 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
3718     publishers that are wx objects and may have been destroyed by wx
3719     already. Fixes RT #2242.
3720    
3721     2003-12-03 Bernhard Herzog <[email protected]>
3722    
3723 bh 2016 * po/ru.po: Updates from Alex Shevlakov
3724    
3725 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
3726    
3727     * debian/control, debian/changelog: Added gdal-support to
3728     debian package, updated to new thuban version
3729    
3730    
3731 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
3732    
3733     * Thuban/Lib/version.py: New. Module for version number
3734     manipulations. The version of make_tuple here also deals better
3735     with more unusual version number strings, such as e.g.
3736     "1.2+cvs20031111"
3737    
3738     * Thuban/version.py (make_tuple): Removed. It's now in
3739     Thuban.Lib.version. Use that implementation instead.
3740    
3741     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
3742    
3743 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
3744    
3745 bh 2010 * MANIFEST.in: Add debian files
3746    
3747 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
3748     they're installed too
3749     (data_files): Add READMEs and sample data from some Extensions
3750    
3751     * NEWS: Add note about the extensions in binary packages
3752    
3753     2003-12-02 Bernhard Herzog <[email protected]>
3754    
3755 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
3756     with the thuban-1.0rc1
3757    
3758     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
3759     thuban-1.0rc1 namespace too
3760    
3761     * test/test_save.py (SaveSessionTest.dtd)
3762     (SaveSessionTest.testEmptySession)
3763     (SaveSessionTest.testSingleLayer)
3764     (SaveSessionTest.testLayerProjection)
3765     (SaveSessionTest.testRasterLayer)
3766     (SaveSessionTest.testClassifiedLayer)
3767     (SaveSessionTest.test_dbf_table)
3768     (SaveSessionTest.test_joined_table)
3769     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
3770     namespace
3771    
3772     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
3773     namespace
3774     (TestSingleLayer.file_contents)
3775     (TestNonAsciiColumnName.file_contents)
3776     (TestLayerVisibility.file_contents)
3777     (TestClassification.file_contents, TestLabels.file_contents)
3778     (TestLayerProjection.file_contents)
3779     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3780     (TestPostGISLayer.file_contents)
3781     (TestPostGISLayerPassword.file_contents)
3782     (TestLoadError.file_contents, TestLoadError.test): Update to
3783     thuban-1.0rc1 namespace
3784    
3785 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
3786    
3787 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
3788     nt to better match Intevation's current w32 setup
3789    
3790 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
3791    
3792     * MANIFEST.in: Add the Extensions
3793    
3794 bh 1998 * NEWS: Update for 1.0rc1
3795    
3796     2003-12-01 Bernhard Herzog <[email protected]>
3797    
3798 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
3799     cards for the dialog so that shapefiles ending in all uppercase
3800     SHP are listed too
3801    
3802 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
3803    
3804 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
3805    
3806     * setup.py (setup call): Update version to 1.0rc1. Use the
3807     [email protected] email address as author email instead of my
3808     personal one.
3809    
3810     2003-11-28 Bernhard Herzog <[email protected]>
3811    
3812 bh 1992 * po/de.po: Update german translation.
3813    
3814     2003-11-28 Bernhard Herzog <[email protected]>
3815    
3816 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
3817     files are more platform independend
3818    
3819     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
3820     that they can be used on both windows and unix
3821     (SessionSaver.prepare_filename): New. Handle all filename
3822     transformations for filenames stored in the thuban file
3823     (SessionSaver.write_data_containers, SessionSaver.write_layer):
3824     Use prepare_filename
3825    
3826     * test/test_save.py (SaveSessionTest.testSingleLayer)
3827     (SaveSessionTest.testLayerProjection)
3828     (SaveSessionTest.testRasterLayer)
3829     (SaveSessionTest.testClassifiedLayer)
3830     (SaveSessionTest.test_dbf_table)
3831     (SaveSessionTest.test_joined_table): Filenames are always stored
3832     with slashes on all currently supported platforms so adapt all
3833     tests to this
3834    
3835     * test/test_load.py (LoadSessionTest.filenames): With the new
3836     filename scheme the filenames in the tests should be
3837     understandable on all currently supported platforms so we turn
3838     this into an empty list because we don't have to normalize them
3839     anymore
3840    
3841     2003-11-28 Bernhard Herzog <[email protected]>
3842    
3843 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
3844     Add the ellipsoid to the projection since some Proj versions
3845     complain if it's missing.
3846    
3847 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
3848    
3849     Corect some bounding box projection problems
3850    
3851     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
3852     version of ForwardBBox
3853     (Projection._transform_bbox): New. common implementation of
3854     ForwardBBox and InverseBBox
3855     (Projection.ForwardBBox): Use _transform_bbox.
3856    
3857     * test/test_proj.py (TestProjection.test): Add test for
3858     InverseBBox
3859    
3860     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
3861     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
3862     new InverseBBox method to determine the unprojected bounding box
3863     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
3864     bbox.
3865    
3866     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3867     Removed.
3868     (TestLayer.test_arc_layer_with_projection): New. This test is
3869     better able to test whether bounding boxes are projected correctly
3870     than test_point_layer_with_projection
3871    
3872 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
3873     InverseBBox to unproject bboxes
3874    
3875 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
3876    
3877 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
3878     source code.
3879    
3880     2003-11-25 Bernhard Herzog <[email protected]>
3881    
3882 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
3883     there for backwards compatibility and all code relying on that
3884     should have been updated by now.
3885    
3886     2003-11-25 Bernhard Herzog <[email protected]>
3887    
3888 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
3889     round trip test.
3890     (TestClassification.file_contents): Update to the newest file
3891     format
3892    
3893     2003-11-25 Bernhard Herzog <[email protected]>
3894    
3895 bh 1975 Add very experimental (and possibly dangerous) extension to draw
3896     polygons:
3897    
3898     * Extensions/drawshape/README: New. Brief installation
3899     instructions
3900    
3901     * Extensions/drawshape/drawshape.py: New. Implementation of the
3902     drawshape extensions
3903    
3904     * Extensions/drawshape/patch.diff: Patch to apply before the
3905     extension can be used.
3906    
3907 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
3908    
3909 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
3910     (ShapefileStore.__init__): Factor opening the shapefile into a
3911     separate method (the new _open_shapefile). This makes the code a
3912     bit more readable but the real reason is that it makes some evil
3913     hacks easier. :-)
3914    
3915     2003-11-24 Bernhard Herzog <[email protected]>
3916    
3917 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
3918     converter is specified for an attribute assume it's a string
3919     containing only Latin1 characters. Update doc-string accordingly.
3920     This change should fix many places where unicode objects might
3921     accidentally enter Thuban.
3922    
3923     * test/test_load.py (TestNonAsciiColumnName): New test to check
3924     what happens with column names in DBF files that contain non-ascii
3925     characters
3926    
3927 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
3928    
3929     Enable the experimental attribute editing again and introduce a
3930     command line switch to actually activate it
3931    
3932     * Thuban/UI/main.py (options): New. Container for options set on
3933     the commmand line
3934     (main): Add the --enable-attribute-editing flag.
3935    
3936     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
3937     editing is enabled use the grid ctrl which allows editing of the
3938     values
3939    
3940     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
3941     New. Just delegate this to the underlying table.
3942    
3943 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
3944    
3945     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
3946     Skip this test if run under non-posix systems since it only works
3947     there
3948    
3949 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
3950    
3951 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
3952     determined so that we can give a reason in the about why gdal is
3953     not supported.
3954     (gdal_support_status): New. Variable holding a string with the
3955     reason for no gdal support
3956    
3957     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
3958     not supported to the message
3959    
3960     2003-11-19 Bernhard Herzog <[email protected]>
3961    
3962 bh 1963 Remove the old table interface and its test cases
3963    
3964     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
3965     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
3966     anymore
3967    
3968     * Thuban/Model/transientdb.py (TransientTableBase)
3969     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
3970     anymore
3971    
3972     * test/test_table.py: Removed since the old interface it tests is
3973     gone.
3974    
3975     * test/runtests.py (main): The old table interface is gone and
3976     with it the deprecation warnings so remove the code that turns
3977     these warnings into errors
3978    
3979     2003-11-19 Bernhard Herzog <[email protected]>
3980    
3981 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
3982     tests to use the new table interface is completely wrong since the
3983     whole purpose of the tests in this module is to test the old
3984     interface.
3985    
3986 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
3987    
3988 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
3989     New. Test whether the connection matches a set of connection
3990     parameters
3991    
3992     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
3993     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
3994     for existing connections with the same parameters and break out of
3995     the loop correctly.
3996    
3997     * test/test_postgis_db.py (TestBriefDescription)
3998     (TestPostGISSimple.test_brief_description): Rename
3999     TestBriefDescription to TestPostGISSimple and the test method to
4000     test_brief_description so that we can add more test methods.
4001     (TestPostGISSimple.test_matches_parameters): New. Test the new
4002     MatchesParameters method
4003    
4004     2003-11-18 Bernhard Herzog <[email protected]>
4005    
4006 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
4007 bh 1954 _was_destroyed, to indicate whether an publisher instance has
4008     already been destroyed.
4009     (Publisher.Unsubscribe): Only disconnect if the publisher has not
4010     been destroyed yet.
4011     (Publisher.Destroy): Set the _was_destroyed flag to true.
4012    
4013     * test/test_connector.py
4014     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
4015     calling Unsubscribe after Destroy doesn't raise an exception
4016    
4017 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
4018    
4019     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
4020     typo in doc-string
4021    
4022 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
4023    
4024     Quote table and column names properly for postgis.
4025    
4026     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
4027     quote an identifier for use in an sql statement
4028     (PostGISColumn.__init__): Add the quoted_name attribute
4029     (PostGISTable.__init__): New instance variable quoted_tablename
4030     (PostGISTable._fetch_table_information): Use the quoted table
4031     name. New isntance variable quoted_geo_col with a quoted version
4032     of geometry_column
4033     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
4034     (PostGISTable.RowOrdinalToId): Use the quoted table name
4035     (PostGISTable.ReadValue, PostGISTable.ValueRange)
4036     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
4037     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
4038     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
4039     Use quoted table and column names
4040    
4041     * test/test_postgis_db.py (TestPostGISSpecialCases)
4042     (TestPostGISIgnoredColumns): Rename the class to
4043     TestPostGISSpecialCases because that better describes the new
4044     cases
4045     (TestPostGISSpecialCases.test_unsupported_types)
4046     (TestPostGISSpecialCases.test): Rename the method to
4047     test_unsupported_types because we need a more descriptive name now
4048     that there are more methods
4049     (TestPostGISSpecialCases.test_table_name_quoting)
4050     (TestPostGISSpecialCases.test_column_name_quoting)
4051     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
4052     cases to test quoting of table and column names in PostGISTable
4053     and PostGISShapeStore
4054    
4055     * test/postgissupport.py
4056     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
4057     AddGeometryColumn desn't support table or column names with sapces
4058     or double quotes
4059    
4060 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
4061    
4062     * Extensions/wms/__init__.py: New: Init to make this
4063     directory a package.
4064    
4065     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
4066    
4067 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
4068    
4069 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
4070     Constant for the file woth deprecated epsg projections
4071     (get_system_proj_file): Update doc-string
4072    
4073     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
4074     above the EPS widgets, introduce a check box for the deprecated
4075     eps projections and a label for the epsg widgets
4076     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
4077     too
4078    
4079     2003-11-11 Bernhard Herzog <[email protected]>
4080    
4081 bh 1939 Avoid warnings when run under Python 2.3
4082    
4083     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
4084     (BaseRenderer.draw_label_layer): Coordinates must be ints.
4085    
4086     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
4087     real method so that we can convert to int.
4088     (MapRenderer.label_font): The font size mist be an int.
4089    
4090     * Thuban/UI/common.py (Color2wxColour): The color values must be
4091     ints. Also, remove the unnecessary asserts.
4092    
4093     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
4094     (TestUnicodeStrings.test): Python source code should not contain
4095     non-ascii characters unless an encoding is specified in the file.
4096     Therefore use \x escapes in the string literals for non-ascii
4097     characters.
4098    
4099     2003-11-11 Bernhard Herzog <[email protected]>
4100    
4101 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
4102     parameter so that this function can be used for all proj files in
4103     Resource/Projections
4104     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
4105     get_system_proj_file
4106    
4107     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
4108     ProjFile self.__sysProjFile use a dictionary of system ProjFile
4109     objects self._sys_proj_files
4110     (ProjFrame.build_dialog): Adapt to the new changes in the
4111     ProjectionList constructor. Add a check button to toggle whether
4112     EPSG projections are shown
4113     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
4114     events.
4115     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
4116     the busy cursor if the files have not yet been loaded by the
4117     dialog.
4118     (ProjFrame.load_system_proj): Add a parameter for the name of the
4119     proj file. Maintain the dictionary of system projections
4120     self._sys_proj_files
4121    
4122     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
4123     user_projs parameters into one parameter proj_files which is a
4124     list of proj files.
4125     (ProjectionList._subscribe_proj_files)
4126     (ProjectionList._unsubscribe_proj_files): New. Move
4127     subscription/unsubscription of projfile messages to separate
4128     methods
4129     (ProjectionList.Destroy): The unsubscribe is now done in
4130     _unsubscribe_proj_files
4131     (ProjectionList.update_projections): We now have a list of proj
4132     file objects
4133     (ProjectionList.SetProjFiles): New method to set a new list of
4134     proj file objects
4135    
4136     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
4137     Specify explicitly which system proj file to load.
4138    
4139     2003-11-11 Bernhard Herzog <[email protected]>
4140    
4141 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
4142     instance variables to cut cyclic references. The GC would have
4143     collected the loader eventually but it can happen that it doesn't
4144     run at all until thuban is closed (2.3 but not 2.2 tries a bit
4145     harder and forces a collection when the interpreter terminates)
4146     (load_session): Call the handler's Destroy method to make sure
4147     that it gets garbage collected early. Otherwise it will be
4148     collected very late if at all and it holds some references to e.g.
4149     shapestores and the session which can lead to leaks (of e.g. the
4150     temporary files)
4151    
4152     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
4153     resource leak in load_session
4154    
4155 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
4156    
4157     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
4158     extensions are to be rendered.
4159     (_renderer_extensions): New. List with renderer for layers in
4160     extensions
4161     (add_renderer_extension): New. Add a renderer extension
4162     (init_renderer_extensions): New. Init the renderer extensions
4163     (BaseRenderer.render_map_incrementally): Search
4164     _renderer_extensions for how to draw unknown layer types
4165     (BaseRenderer.draw_raster_data): Add format parameter so that
4166     formats other than BMP can be drawn
4167     (BaseRenderer.draw_raster_layer): Pass an explicit format to
4168     draw_raster_data
4169    
4170     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
4171     strings of the format parameter of draw_raster_data method to wx
4172     constants
4173     (MapRenderer.draw_raster_data): Add the format parameter and use
4174     raster_format_map to map it to the right wxwindows constant for
4175     wxImageFromStream
4176    
4177     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
4178     the format parameter and record it
4179     (TestBaseRenderer.test_raster_no_projection): check the format
4180     paramter of the draw_raster_data method
4181     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
4182     extension facility
4183    
4184 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
4185    
4186     Tweak the usage of the sqlite database to make common use cases
4187     more responsive. In most cases copying the data to the sqlite
4188     database takes so long that using sqlite doesn't have enough
4189     advantages.
4190    
4191     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
4192     comments about performance and query the min and max in separate
4193     statements because only that way will indexes be used.
4194     (TransientTableBase.UniqueValues): Add some comments about
4195     performance.
4196     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
4197     Do not copy the data to the transient DB but use the transient
4198     copy if it exists. See the new comments for the performance trade
4199     offs
4200    
4201     * test/test_transientdb.py
4202     (TestTransientTable.test_auto_transient_table): Make sure that the
4203     data is copied to the transient database at some point.
4204    
4205 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
4206    
4207 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
4208     globals to locals so that it's a bit faster
4209    
4210     2003-11-03 Bernhard Herzog <[email protected]>
4211    
4212 bh 1920 * Thuban/UI/baserenderer.py
4213     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
4214     method. ReadValue is faster than ReadRowAsDict since it only reads
4215     one cell especially now that the dbf file objects actually
4216     implement it.
4217    
4218     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
4219     read_attribute method of the dbf objects
4220    
4221     2003-11-03 Bernhard Herzog <[email protected]>
4222    
4223 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
4224     variable to indicate whether the result should be shown in a
4225     dialog box
4226     (profile_screen_renderer, time_screen_renderer): Only show a
4227     dialog box if popup_dialog_box is true.
4228     (profile_screen_renderer): Flush stdout after the printing the
4229     first part of the "profiling..." message
4230    
4231     * Thuban/UI/baserenderer.py
4232     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
4233     brushes for the groups so that they're not created over and over
4234     again
4235    
4236 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
4237     (Classification._compile_classification)
4238     (Classification._clear_compiled_classification): New. Methods to
4239     manage a 'compiled' representation of the classification groups
4240     which is created on demand
4241     (Classification.InsertGroup, Classification.RemoveGroup)
4242     (Classification.ReplaceGroup): reset the compiled representation
4243     (Classification.FindGroup): Use the compiled representation to
4244     find the matching group
4245     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
4246    
4247 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
4248    
4249 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
4250     Send a CLASS_CHANGED message
4251     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
4252     not return the removed group since it wasn't used.
4253    
4254     * test/test_classification.py
4255     (TestClassification.test_set_default_group): New. Test the
4256     SetDefaultGroup method
4257     (TestClassification.test_insert_group): New. Test the InsertGroup
4258     method
4259     (TestClassification.test_remove_group): New. Test the RemoveGroup
4260     method
4261     (TestClassification.test_replace_group): New. Test the
4262     ReplaceGroup method
4263    
4264     2003-10-31 Bernhard Herzog <[email protected]>
4265    
4266 bh 1908 * test/test_classification.py (TestClassification.setUp):
4267     Subscribe to the CLASS_CHANGED messages
4268     (TestClassification.tearDown): New. Destroy the classification
4269     properly
4270     (TestClassification.test_defaults): Add tests for the default line
4271     width and whether no messages were sent yet
4272     (TestClassification.test_set_default_properties): Add tests for
4273     messages and setting the default line width
4274     (TestClassification.test_add_singleton)
4275     (TestClassification.test_add_range)
4276     (TestClassification.test_multiple_groups): Add tests for messages
4277    
4278     2003-10-31 Bernhard Herzog <[email protected]>
4279    
4280 bh 1906 Some more refactoring in preparation for new tests:
4281    
4282     * test/test_classification.py (TestClassification.setUp): New.
4283     Instantiate the classification here. Update the test methods
4284     accordingly.
4285     (TestClassification.test_multiple_groups): Make sure that the two
4286     singletons matching 1 are considered different.
4287    
4288     2003-10-31 Bernhard Herzog <[email protected]>
4289    
4290 bh 1904 * test/test_classification.py (red, green, blue): New. These
4291     constants were used in several cases. Update the relevant methods.
4292     (TestClassification.test_defaults)
4293     (TestClassification.test_set_default_properties)
4294     (TestClassification.test_add_singleton)
4295     (TestClassification.test_add_range)
4296     (TestClassification.test_multiple_groups)
4297     (TestClassification.test_deepcopy): New. These were formerly all
4298     part of the single method test.
4299     (TestClassification.test_deepcopy): Removed.
4300     (TestClassIterator): Removed. The test case is now a method of
4301     TestClassification since it tests part of the public interface of
4302     Classification
4303     (TestClassification.test_iterator): New. Used to be
4304     TestClassIterator effectively
4305    
4306 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
4307    
4308     GUIfied the functions of the profiling extension.
4309    
4310     * /Extensions/profiling/__init__.py: New: Init to make this
4311     directory a package.
4312    
4313     * Extensions/profiling/profiling.py: Moved menu entries to
4314     the Extensions menu. Applied _() for strings.
4315     (profile_screen_renderer): Catch the detailed printout and present
4316     it in a dialog.
4317 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
4318 jan 1902 of printing it to stdout.
4319    
4320 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
4321    
4322 bh 1899 * test/test_classification.py (TestClassGroupProperties)
4323     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
4324     (TestClassGroupSingleton, TestClassIterator, TestClassification):
4325     Split TestClassification into several classes, one for each class
4326     being tested. TestClassification itself now only tests
4327     Classification. This split makes changes to the tests a bit easier
4328    
4329     2003-10-31 Bernhard Herzog <[email protected]>
4330    
4331 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
4332     Thuban performance
4333    
4334 frank 1895 2003-10-31 Frank Koormann <[email protected]>
4335    
4336     Added two items to legend popup menu: Remove Layer and Show Layer Table
4337    
4338     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
4339     LegendPanel._OnShowTable): New event handlers, call the corresponding
4340     mainwindow methods.
4341     (LegendTree._OnRightClick): Added items to popup menu.
4342    
4343 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
4344    
4345     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
4346     EVT_WINDOW_DESTROY
4347     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
4348     nothing but is convenient for the derived classes.
4349    
4350     * Thuban/UI/tableview.py
4351     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
4352     Unsubscribe the messages here not in OnClose because that might
4353     get called multiple times. Fixes RT #2196
4354     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
4355     anymore.
4356    
4357     * README: Update the minimum requirement for wxPython. Since we
4358     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
4359     the version in which that was introduced for all platforms
4360    
4361 frank 1890 2003-10-30 Frank Koormann <[email protected]>
4362    
4363     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
4364     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
4365     frame.
4366    
4367 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
4368    
4369     Improved APR import extension, added further EPSG definitions
4370     and some cleanup regarding string class.
4371    
4372     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
4373     Added test for alias 'longlat'.
4374    
4375     * Resources/Projections/epsg-deprecated.proj: New. Contains
4376     deprecated EPSG definitions.
4377    
4378     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
4379     the variable names for objects.
4380    
4381     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
4382     Copied from importAPR and provided with documentation.
4383    
4384     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
4385     Moved to apr.py.
4386     (APR_View): Added object ref 'ITheme'.
4387    
4388     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
4389     split function by corresponding use of the string class method.
4390    
4391     * Thuban/Model/xmlwriter.py: Replaced string replace function by
4392     corresponding string method.
4393    
4394 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
4395    
4396     * Thuban/UI/baserenderer.py
4397     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
4398     special case of a classification that only has the default group
4399    
4400 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
4401    
4402 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
4403    
4404 bh 1876 * po/de.po: Update.
4405    
4406     * Thuban/UI/application.py
4407     (ThubanApplication.ShowExceptionDialog): Handle translation of the
4408     dialog message properly
4409    
4410     2003-10-27 Bernhard Herzog <[email protected]>
4411    
4412 bh 1873 Rework how localization works so that we use wx's translation
4413     functions when running Thuban as a normal application but not when
4414     we don't need any UI, such as in the test suite. See the comment
4415     in Thuban/__init__.py for details
4416    
4417     * Thuban/__init__.py (_): Add one level of indirection to make the
4418     translation handling more flexible and to make it possible to use
4419     either wx's translation services or not.
4420     (gettext_identity, translation_function_installed)
4421     (install_translation_function): New function to help with this
4422    
4423     * Thuban/UI/__init__.py: Install the wx specific translation
4424     function if it's OK to do that
4425    
4426     * test/support.py (initthuban): Install a dummy translation
4427     function so that importing Thuban.UI doesn't install a wx specific
4428     one for which would need to import wxPython
4429    
4430     2003-10-27 Bernhard Herzog <[email protected]>
4431    
4432 bh 1870 * HOWTO-Release: Source archives should be created first and the
4433     binary packages should be created from the source archives.
4434     There's an official debian package now so there's no need to test
4435     the rpm on debian anymore
4436    
4437     2003-10-27 Bernhard Herzog <[email protected]>
4438    
4439 bh 1868 Several rendering changes:
4440    
4441     - Render the selection into a separate bitmap so that only that
4442     bitmap needs to be redrawn when the selection changes
4443    
4444     - Render incrementally showing previews and allowing interaction
4445     before rendering is complete
4446    
4447     - Update the renderer interface a bit. Most parameters of
4448     RenderMap are now parameters of the constructor
4449    
4450     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
4451     and the update region as parameters. Update the doc-string
4452     (BaseRenderer.render_map_incrementally): New. Generator function
4453     to renders the map incrementally
4454     (BaseRenderer.render_map): Remove the map argument (it's now in
4455     the constructor) and simply iterate over the
4456     render_map_incrementally generator to draw the map.
4457     (BaseRenderer.draw_shape_layer_incrementally)
4458     (BaseRenderer.draw_shape_layer): Renamed to
4459     draw_shape_layer_incrementally and changed into a generator that
4460     yields True every 500 shapes. Used by render_map_incrementally to
4461     render shape layers incrementally
4462    
4463     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
4464     map and region parameters which are now in the constructor
4465     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
4466     the inherited render_map_incrementally.
4467     (BaseRenderer.draw_shape_layer): Removed.
4468     (ScreenRenderer.draw_selection_incrementally): New. The selection
4469     drawing part of the removed draw_shape_layer as a generator
4470     (ScreenRenderer.layer_shapes): Update because of the region
4471     parameter change
4472     (ExportRenderer.__init__): New. Extend the inherited constructor
4473     with the destination region for the drawing
4474     (ExportRenderer.RenderMap): Removed the map and region parameters
4475     which are now in the constructor
4476    
4477     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
4478     bitmap suitable for a preview in a tool
4479     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
4480     bitmap
4481     (MapPrintout.draw_on_dc): Adapt to new renderer interface
4482     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
4483     exists
4484     (MapCanvas.OnIdle): Update the logic to deal with incremental
4485     rendering and the selection bitmap
4486     (MapCanvas._do_redraw): Handle the instantiation of the render
4487     iterator and the redraws during rendering
4488     (MapCanvas._render_iterator): New. Generator to incrementally
4489     redraw both bitmaps
4490     (MapCanvas.Export): Adapt to new renderer interface.
4491     (MapCanvas.full_redraw): Reset the selection bitmap and the
4492     renderer iterator too
4493     (MapCanvas.redraw_selection): New. Force a redraw of the selection
4494     bitmap
4495     (MapCanvas.shape_selected): Only redraw the selection bitmap
4496    
4497     * test/test_baserenderer.py
4498     (TestBaseRenderer.test_polygon_no_projection)
4499     (TestBaseRenderer.test_raster_no_projection)
4500     (TestBaseRenderer.test_point_map_projection)
4501     (TestBaseRenderer.test_point_layer_and_map_projection)
4502     (TestBaseRenderer.test_point_layer_projection)
4503     (TestBaseRenderer.test_point_with_classification): Adapt to new
4504     renderer interface
4505    
4506 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
4507    
4508     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
4509     (point_in_polygon_shape, shape_centroid): Raise an exception if
4510     the shape can't be read. Previously invalid shape ids would lead
4511     to a segfault.
4512    
4513     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
4514     New. test whether an exception is raised for invalid shape ids
4515    
4516 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
4517    
4518 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
4519     as alias for 'latlong'.
4520    
4521     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
4522     as alias for 'latlong'.
4523    
4524     2003-10-24 Jan-Oliver Wagner <[email protected]>
4525    
4526 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
4527     the projection even for the UnknownPanel.
4528     (UnknownProjPanel.__init__): Define the text and create the textctrl
4529     widget.
4530     (UnknownProjPanel._DoLayout): Replaced static text widget by the
4531     textctrl created in __init__.
4532     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
4533     including the parameters of the projection.
4534    
4535     2003-10-24 Jan-Oliver Wagner <[email protected]>
4536    
4537 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
4538     EPSG codes with parameters for proj. The list has been
4539     generated using devtools/create_epsg.py based on the
4540     file nad/epsg of the proj 4.4.7 package. Four projection
4541     definitions have been deleted as they are not accepted by proj:
4542     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
4543     and "HD72 / EOV".
4544    
4545 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
4546    
4547     Some more tweaks to the projection dialog which should fix RT
4548     #1886.
4549    
4550     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
4551     the ProjFile's messages and call the base class methods correctly
4552     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
4553     flag on the newly selected item too. Otherwise some other item is
4554     focused and the first time the focus is moved with the keyboard
4555     the selection moves in unexpected ways.
4556    
4557     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
4558     focus on the OK button, only on the projection list. That way the
4559     list really has the focus initially
4560     (ProjFrame.OnClose): Call the projection list's Destroy method to
4561     make it unsubscribe all messages
4562    
4563 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
4564    
4565 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
4566     and most of 2168
4567    
4568     * Thuban/UI/projlist.py: New. The class ProjectionList is a
4569     special wxListCtrl to show a list of projections in a more MVC
4570     fashion
4571    
4572     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
4573     throughout the class. The main change is to use the ProjectionList
4574     class instead of a normal wxListBox. Also, add an explicit
4575     "Unknown" projection to the projection choice control.
4576     (ProjPanel.__init__): Add an "unknown" ellipsoid
4577     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
4578     instantiation of the panel's controls to make the tab-order more
4579     natural
4580    
4581     2003-10-21 Bernhard Herzog <[email protected]>
4582    
4583 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
4584     (TestSingleLayer.test): Add non-ascii characters to the titles of
4585     session, map and layer. This is effectively a port of the
4586     TestUnicodeStrings test in test_load_0_8.py which for some reason
4587     was only added there.
4588    
4589     * test/test_load_0_9.py (TestSingleLayer.file_contents)
4590     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
4591     characters to the titles of session, map and layer,.
4592    
4593     2003-10-21 Bernhard Herzog <[email protected]>
4594    
4595 bh 1847 Add EPSG projection handling to .thuban files
4596    
4597     * test/test_save.py (SaveSessionTest.dtd)
4598     (SaveSessionTest.testEmptySession)
4599     (SaveSessionTest.testLayerProjection)
4600     (SaveSessionTest.testRasterLayer)
4601     (SaveSessionTest.testClassifiedLayer)
4602     (SaveSessionTest.test_dbf_table)
4603     (SaveSessionTest.test_joined_table)
4604     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
4605     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
4606     use a and epsg projection to test saving them
4607    
4608     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
4609     namespace
4610     (TestLayerVisibility.file_contents, TestLabels.file_contents)
4611     (TestLayerProjection.file_contents)
4612     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4613     (TestPostGISLayer.file_contents)
4614     (TestPostGISLayerPassword.file_contents)
4615     (TestLoadError.file_contents, TestLoadError.test): Update to use
4616     1.0-dev namespace
4617     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
4618     use 1.0-dev namespace and use an EPSG projection to test whether
4619     loading it works
4620    
4621     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
4622     as of Thuban 0.9. These are now tests to determine whether Thuban
4623     can still read files generated by Thuban 0.9
4624    
4625     * Thuban/Model/save.py (SessionSaver.write)
4626     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
4627     namespace
4628     (SessionSaver.write_projection): Write the projection's epsg
4629     attribute
4630    
4631     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
4632     thuban-1.0-dev.dtd namespace
4633     (SessionLoader.check_attrs): Allow a callable object as conversion
4634     too
4635     (SessionLoader.start_projection, SessionLoader.end_projection)
4636     (SessionLoader.start_parameter): Handle the epsg attribute and
4637     rename a few instance variables to lower case
4638    
4639     * Resources/XML/thuban-1.0.dtd: New. Only difference to
4640     thuban-0.9.dtd is the epsg attribute for projections.
4641    
4642     2003-10-21 Bernhard Herzog <[email protected]>
4643    
4644 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
4645     on the command line
4646    
4647     * test/support.py (ThubanTestResult.getDescription): Override to
4648     give a better short description. The description can be used as a
4649     parameter to run_tests to run that particular test in isolation.
4650    
4651 frank 1837 2003-10-21 Frank Koormann <[email protected]>
4652    
4653     Popup menu for legend. Scheduled for the 1.2 release this was too
4654     simple to implement: The popup menu is bound to the legend tree, while
4655     the events are hanlded by its anchestor, the legend panel. This
4656     allows reuse of all the event handlers already implemented for the
4657     legend toolbar buttons.
4658    
4659     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
4660     to add handlers for the events issued by the popup menu.
4661     (LegendPanel._OnToggleVisibility): Handler for toggling layer
4662     visibility event
4663     (LegendPanel._OnProjection): Handler for layer projection event.
4664     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
4665     (LegendTree._OnRightClick): Event handler for right click, select item
4666     and pop up menu.
4667     (LegendTree.ToggleVisibility): Toggle layer visibility
4668     (LegendTree.LayerProjection): Raise layer projection dialog for
4669     current layer.
4670    
4671 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
4672    
4673     * Resources/Projections/defaults.proj: Use correct DOCTYPE
4674     declaration. The top-level element is projectionlist not projfile
4675    
4676 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
4677    
4678     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
4679     method to write a projfile and display a busy cursor and error
4680     dialogs.
4681     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
4682     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
4683     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
4684     busy cursor while loading the user and system prj files.
4685    
4686 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
4687    
4688     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
4689     ProjFile objects
4690     (clear_proj_file_cache): New function to clear the cache. Mainly
4691     useful for use by the test suite
4692     (read_proj_file): Use the cache.
4693    
4694     * test/test_proj.py (TestProjFile): Clarify the doc-string
4695     (ProjFileReadTests): Update doc-string
4696     (ProjFileReadTests.test_get_system_proj_file): Check whether the
4697     system proj files is cached.
4698     (ProjFileLoadTestCase): New base class for the proj file tests
4699     derived from support.FileLoadTestCase to provide some common
4700     behavior.
4701     (TestLoadingProjFile)
4702     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
4703     (TestProjFileWithInvalidParameters.file_contents): Derive from
4704     ProjFileLoadTestCase
4705     (TestLoadingProjFile.test_caching): New. Test whether the cache
4706     works
4707    
4708 silke 1829 2003-10-16 Silke Reimer <[email protected]>
4709    
4710     * debian/*: New directory with configuration files for building a thuban
4711     deb-package.
4712    
4713 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
4714    
4715 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
4716     __main__ so that missing unsubscribes are detected
4717     (TestProjFile.tearDown): Destroy the proj_file properly
4718    
4719     2003-10-14 Bernhard Herzog <[email protected]>
4720    
4721 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
4722     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
4723     the ProjFile objects
4724    
4725     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
4726     easily send messages when the projections change
4727     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
4728     when the change was successful
4729    
4730     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
4731     proj file messages
4732     (TestProjFile.test_add_remove)
4733     (TestProjFile.test_remove_non_existing)
4734     (TestProjFile.test_replace)
4735     (TestProjFile.test_replace_non_existing): Test whether the right
4736     messages are sent
4737    
4738     2003-10-14 Bernhard Herzog <[email protected]>
4739    
4740 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
4741     tests
4742     (TestProjFile.test_add_remove)
4743     (TestProjFile.test_remove_non_existing)
4744     (TestProjFile.test_replace)
4745     (TestProjFile.test_replace_non_existing): Some of the new
4746     individual test cases
4747     (TestProjFileSimple): New class for the rest of the test cases
4748     that came out of the refactoring
4749     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
4750     derived classes don't have to
4751    
4752 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
4753    
4754 bh 1820 Add an optional EPSG code to the projection objects and extend the
4755     .proj file format accordingly.
4756    
4757     * Resources/XML/projfile.dtd (element projection): Add epsg
4758     attribute
4759    
4760     * Thuban/Model/proj.py (Projection.__init__): New parameter and
4761     instance variable epsg. Update doc-string
4762     (Projection.EPSGCode, Projection.Label): New methods to provide
4763     access to EPSG code and a label for use in dialogs
4764    
4765     * Thuban/Model/resource.py (ProjFileReader.start_projection)
4766     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
4767     Handle the epsg code attribute when reading or writing proj files
4768    
4769     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
4770     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
4771     (ProjFrame.__FillAvailList): Use the projection's Label method to
4772     get the string for the list box
4773    
4774     * test/test_proj.py (TestProjection.test_label)
4775     (TestProjection.test_label_epsg)
4776     (TestProjection.test_epsgcode_for_non_epsg_projection)
4777     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
4778     for the label and EPSGCode methods
4779     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
4780     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
4781     objects in the test cases and put the expected contents into the
4782     test case methods too. Update doTestWrite accordingly
4783     (TestLoadingProjFile)
4784     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
4785     read tests from TestProjFile.
4786     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
4787     tests are now in the new classes.
4788     (sample_projfile, sample_projfile_data)
4789     (sample_projfile2, sample_projfile_data2): Removed. Not used
4790     anymore.
4791     (TestProjFile.test_read_unreadable_file): No need to reset the
4792     permissions at the end anymore since we use a unique filename
4793    
4794     2003-10-13 Bernhard Herzog <[email protected]>
4795    
4796 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
4797     (ProjFileTest): New base class for the proj file tests.
4798     (TestProjFile): Derive from ProjFileTest
4799     (TestProjFile.test_read_unreadable_file)
4800     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
4801     the new filename method to get a unique filename
4802     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
4803     (WriteProjFileTests): New class for proj file write tests.
4804     Contains the write test that were in TestProjFile originally.
4805    
4806     2003-10-13 Bernhard Herzog <[email protected]>
4807    
4808 bh 1812 * test/test_proj.py (TestProjFile.testRead)
4809     (TestProjFile.test_read_non_existing_file)
4810     (TestProjFile.test_read_unreadable_file)
4811     (TestProjFile.test_read_empty_file): Split into several methods.
4812    
4813 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
4814    
4815 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
4816    
4817     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
4818     all projection type specific panels and put them into a
4819     NotebookLikeSizer. This way the dialog doesn't change its size
4820     when a different projection is selected
4821     (ProjFrame.__init__): Rename projection_panels
4822     projection_panel_defs and reuse projection_panels for a list of
4823     the instantiated panels.
4824     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
4825     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
4826     the panels
4827     (UnknownProjPanel._DoLayout): Place the newlines in the message
4828     differently to make the panel narrower.
4829     (TMPanel._DoLayout): Layout the parameters in one column.
4830    
4831     2003-10-10 Bernhard Herzog <[email protected]>
4832    
4833 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
4834     that contains all the setup for the dialog's widgets, layout and
4835     event handling.
4836     (__): Call build_dialog to build the dialog.
4837     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
4838     Their functionality is now in build_dialog
4839     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
4840     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
4841     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
4842     different widget names and hierarchy introduced with build_dialog.
4843    
4844     2003-10-10 Bernhard Herzog <[email protected]>
4845    
4846 bh 1805 * README: Fix typo.
4847    
4848 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
4849    
4850     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
4851     projection is already in the list. This is *a lot* faster when
4852     loading files with hundreds of projections since it saves a linear
4853     search. OTOH this will allow adding the same projection to the
4854     user.proj file multiple times in the projection dialog but we'll
4855     deal with that later
4856    
4857 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
4858    
4859     * devtools: New. Directory for developer tools that are not intended
4860     for the regular user.
4861    
4862     * devtools/create_epsg.py: New. Convert the epsg file of proj into
4863     a python .proj file.
4864    
4865 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
4866    
4867     * test/test_proj.py
4868     (TestProjection.test_get_parameter_without_equals_sign): New. Test
4869     whether GetParameter handles parameters without "=" sign correctly
4870    
4871     * Thuban/Model/proj.py (Projection.GetParameter): Handle
4872     parameters that do not contain a "=". Update the doc-string
4873    
4874 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
4875    
4876 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
4877     length limit on the projname text control
4878    
4879     2003-10-08 Bernhard Herzog <[email protected]>
4880    
4881 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
4882     (TestProjection.test_get_projection_units_normal): New. Tests for
4883     the Projection.GetProjectedUnits method
4884    
4885 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
4886    
4887     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
4888     Added missing 'val' parameter.
4889    
4890 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
4891    
4892 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
4893     projection type of the currently selected projection is not known,
4894     i.e. there's no panel for it, use the UnknownProjPanel
4895     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
4896     the actual replacing of the proj panel into the new method
4897     _show_proj_panel.
4898     (UnknownProjPanel): Add doc-string.
4899     (UnknownProjPanel._DoLayout): Insert a newline into the text so
4900     that the panel is not so wide.
4901    
4902     2003-10-08 Bernhard Herzog <[email protected]>
4903    
4904 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
4905     too. Update the doc-string
4906     (get_proj_files): Removed. It wasn't used anywhere
4907     (get_system_proj_files, get_system_proj_file): Rename to
4908     get_system_proj_file and return the ProjFile object and not a list
4909     of ProjFile objects. Update the callers.
4910     (get_user_proj_files, get_user_proj_file): Rename to
4911     get_user_proj_file return the ProjFile object and not a list of
4912     ProjFile objects. Update the callers.
4913     (ProjFileReader.__init__): New instance variable for the warnings.
4914     Rename the __pf ivar to projfile. Update the methods referring to
4915     __pf
4916     (ProjFileReader.end_projection): Catch any errors raised when
4917     instantiating the projection and record that as an error. The
4918     projection will not be in the final ProjFile object.
4919     (ProjFileReader.GetWarnings): New method to return the warnings.
4920    
4921     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
4922     show the warnings from the projfile reader
4923     (ProjFrame._OnImport): Deal with any warnings returned by
4924     read_proj_file
4925     (ProjFrame.__FillAvailList): Deal with any warnings returned by
4926     get_system_proj_file or get_user_proj_file.
4927    
4928     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
4929     (TestProjFileWithInvalidParameters.file_contents): New test cases
4930     to test whether read_proj_file handles invalid projection
4931     parameters correctly
4932     (TestProjFile.test_get_system_proj_file): New. Simple test for
4933     resource.get_system_proj_file
4934    
4935 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
4936    
4937     * test/test_derivedshapestore.py
4938     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
4939     properly so that the temporary directories get deleted correctly
4940    
4941 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
4942    
4943 bh 1783 Handle the title changes in a proper MVC way.
4944    
4945     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4946     canvas' TITLE_CHANGED messages
4947     (MainWindow.update_title): New. Update the main window's title
4948     (MainWindow.__SetTitle): Removed. Use update_title instead.
4949     (MainWindow.SetMap): Use update_title instead of __SetTitle
4950     (MainWindow.RenameMap): Do change the window title explicitly
4951     here. That's handled in a proper MVC way now.
4952     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
4953     messages
4954    
4955     * Thuban/Lib/connector.py (Conduit): New class to help classes
4956     that forward messages
4957    
4958     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
4959     (ViewPort): Derive from Conduit instead of Publisher
4960     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
4961     when calling the inherited versions
4962     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
4963     methods to subscribe and unsubscribe map messages
4964     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
4965     handle the map subscriptions
4966     (ViewPort.Map, ViewPort.map_projection_changed)
4967     (ViewPort.layer_projection_changed): Add or update doc-strings
4968    
4969     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
4970     typo
4971     (MyConduit): Helper class for the Conduit test.
4972     (TestConduit): Test cases for Conduit
4973    
4974     * test/test_connector.py: Use support.run_tests as main.
4975    
4976     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
4977     the TITLE_CHANGED messages
4978     (ViewPortTest.test_forwarding_title_changed): New test to check
4979     whether the viewport forwards the map's TITLE_CHANGED messages
4980     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
4981     after the port's because the latter may require a still functional
4982     map.
4983    
4984     2003-10-06 Bernhard Herzog <[email protected]>
4985    
4986 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
4987     doc-string
4988    
4989     2003-10-06 Bernhard Herzog <[email protected]>
4990    
4991 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
4992     (SimpleViewPortTest.test_init_with_size): Move the test for the
4993     initial size as a constructor parameter from ViewPortTest.setUp
4994     method to a new separate test in SimpleViewPortTest.
4995    
4996     2003-10-06 Bernhard Herzog <[email protected]>
4997    
4998 bh 1773 * test/test_viewport.py (MockView): New class derived from
4999     ViewPort with a mock implementation of GetTextExtent to be used in
5000     the test cases
5001     (ViewPortTest.setUp): Use MockView instead of ViewPort
5002    
5003     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
5004     into what would be a "pure virtual function" in C++: always raise
5005     NotImplementedError. Mock implementations for test cases don't
5006     belong into the real code
5007    
5008 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
5009    
5010     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
5011     close the dbf file we create so that it's contents have been
5012     written properly.
5013    
5014     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
5015     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
5016     Update to shapelib 1.2.10
5017    
5018 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
5019    
5020     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
5021     it annoys lintian which warns about these files not being
5022     executable. The #! isn't necessary here since if you absolutely
5023     must execute them you can always say "python <filename>".
5024    
5025 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
5026    
5027 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
5028     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
5029     is ported to a newer the import will fail, so it should be noticed
5030     immediately that this function is gone.
5031     Fixes RT#1919
5032    
5033     2003-09-26 Bernhard Herzog <[email protected]>
5034    
5035 bh 1757 Add a DTD for the projection files and make thuban write valid
5036     projection files
5037    
5038     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
5039     files
5040    
5041     * Thuban/Model/resource.py (ProjFileSaver.write): Use
5042     'projectionlist' as the name in the document type declaration so
5043     that it matches the element type of the root element.
5044    
5045     * test/test_proj.py (sample_projfile, sample_projfile2): Use
5046     'projectionlist' as the name in the document type declaration just
5047     as it is done now in the files thuban would write
5048     (sample_projfile, sample_projfile_data): Fix spelling of
5049     "Mercator"
5050     (TestProjFile.doTestWrite): Validate the written and the expected
5051     XML data
5052     (TestProjFile): Derive from ValidationTest so that we can run xml
5053     validation tests
5054    
5055 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
5056    
5057     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
5058     modify the list returned by map.Layers() in place since it is the
5059     actual list of layers used by the map.
5060    
5061 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
5062    
5063     * Doc/manual/thuban-manual.xml: Added subsection to chapter
5064     Extensions to describe the extensions coming with the Thuban
5065     standard package (gns2shp and importAPR).
5066    
5067 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
5068    
5069     * libraries/thuban/wxproj.cpp (project_point): if there's an
5070     inverse but no forward projection, convert to degrees after
5071     applying the inverse projection. Fixes RT#2096
5072    
5073     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
5074     implicitly tests for the fix to RT#2096
5075    
5076     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
5077     Check that the sequences have the same lengths
5078    
5079     * Resources/Projections/defaults.proj (Geographic projection): Use
5080     a much more precise value for the to_meter attribute.
5081    
5082 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
5083    
5084     * test/support.py (initthuban): Make sure to unset the LANG env.
5085     var. so that tests that compare translated strings work. Solves RT
5086     #2094
5087    
5088 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
5089    
5090 jan 1735 Small improvement of APR import.
5091    
5092     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
5093     Added tests for text-ranges.
5094    
5095     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
5096     returns a string object if the range is based on text.
5097    
5098     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
5099     range retrieval.
5100    
5101     2003-09-22 Jan-Oliver Wagner <[email protected]>
5102    
5103 jan 1730 Initial version of the importAPR extension which is in
5104     experimental state.
5105    
5106     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
5107     /Extensions/importAPR/test/: New directories.
5108    
5109     * /Extensions/importAPR/samples/README: New: Howto load the samples.
5110    
5111     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
5112     file which refers to the Thuban Iceland demo data.
5113    
5114     * /Extensions/importAPR/test/README: New: Howto execute the tests.
5115    
5116     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
5117    
5118     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
5119     as in '.apr'-files.
5120    
5121     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
5122     ODB Objects as in '.apr', '.avl' and other files.
5123    
5124     * /Extensions/importAPR/__init__.py: New: Init to make this
5125     directory a package.
5126    
5127     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
5128     project file (.apr) and convert it to Thuban.
5129    
5130     2003-09-22 Jan-Oliver Wagner <[email protected]>
5131    
5132     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
5133    
5134 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
5135    
5136     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
5137     with description on RPM installation and RPM binary package
5138     creation.
5139    
5140 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
5141    
5142     * setup.py (data_files): Only add the mo files if the Locales
5143     directory actually exists, so that setup.py works with a fresh CVS
5144     checkout
5145    
5146 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
5147    
5148     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
5149     in viewport, not anymore in view
5150    
5151 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
5152    
5153     Introducing first Extension (gns2shp).
5154    
5155     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
5156    
5157     * Extensions/__init__.py: New. init to make this dir a package.
5158    
5159     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
5160    
5161     * Extensions/gns2shp/test/README: New. some info on this test directory.
5162    
5163     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
5164    
5165     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
5166     of Shapefile from GNS text file format
5167    
5168 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
5169    
5170 jan 1707 Fix/workaround for bug #2019:
5171     https://intevation.de/rt/webrt?serial_num=2019
5172    
5173     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
5174     (IdentifyView.__init__): Added another button that allows to
5175     stop the identify mode.
5176     (IdentifyView.OnStop): New. Stops the identify mode.
5177    
5178     2003-09-03 Jan-Oliver Wagner <[email protected]>
5179    
5180 jan 1705 Introducing a new exception dialog that allows to exit the
5181     application immediately.
5182     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
5183    
5184     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
5185    
5186     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5187     Made strings available to translations. Exchanged the simple
5188     ScrolledMessageDialog by the new ExceptionDialog.
5189    
5190 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
5191    
5192 bh 1701 * NEWS: New. Summary of changes and release notes.
5193    
5194     * MANIFEST.in: Add NEWS
5195    
5196     2003-09-01 Bernhard Herzog <[email protected]>
5197    
5198 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
5199     include the documentation too.
5200    
5201     * setup.py (data_files): Add the .mo files
5202     (setup call): Up to version 0.9.0
5203    
5204     2003-09-01 Bernhard Herzog <[email protected]>
5205    
5206 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
5207     parameter list to just parent and session
5208     (ChooseDBTableDialog.__set_properties): Removed. Setting the
5209     selection of empty list boxes is not allowed (and produces C++
5210     assertion errors) and the rest of the setup is better done in
5211     __init__ anyway.
5212     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
5213     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
5214     builtins True/False for booleans to avoid warnings from wxPython
5215    
5216     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
5217     ChooseDBTableDialog constructor parameters.
5218    
5219     2003-09-01 Bernhard Herzog <[email protected]>
5220    
5221 bh 1694 * Thuban/Model/postgisdb.py
5222     (PostGISTable): Extend doc-string
5223     (PostGISTable._fetch_table_information): Set the column index
5224     correctly, pretending ignored columns don't exist.
5225    
5226     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
5227     for postgis tables with data types not yet supported by thuban.
5228    
5229 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
5230    
5231     * HOWTO-Release: Tweak item about running the tests.
5232    
5233 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
5234    
5235     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
5236    
5237 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
5238    
5239     Add some missing parameters to projections. Proj complains about
5240     them on windows but for some reason not on Linux.
5241    
5242     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
5243     missing required projection parameters
5244    
5245     * test/test_proj.py (TestProjFile.test): Add missing required
5246     projection parameters
5247    
5248     * test/test_load_0_8.py (TestLayerProjection.file_contents)
5249     (TestLayerProjection.test): Add missing required projection
5250     parameters and tests for them
5251    
5252     * test/test_load.py (TestLayerProjection.file_contents)
5253     (TestLayerProjection.test): Add missing required projection
5254     parameters and tests for them
5255    
5256     * test/test_layer.py (TestLayer.test_base_layer): Add missing
5257     required projection parameters
5258    
5259     2003-08-29 Bernhard Herzog <[email protected]>
5260    
5261     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
5262     access the pj_errno because directly accessing pj_errno doesn't
5263     work on windows if the proj library is in a DLL
5264    
5265     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
5266    
5267 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
5268    
5269 bh 1685 * test/test_proj.py: Import things from Thuban after calling
5270     initthuban
5271    
5272     * test/test_load.py (LoadSessionTest.filenames): New class
5273     variable with the filename attributes to normalize
5274     (LoadSessionTest.check_format): Pass self.filenames to
5275     sax_eventlist to normalize the filename attributes
5276    
5277     * test/xmlsupport.py: Add cvs keywords
5278     (SaxEventLister.__init__): New parameter filenames which indicates
5279     attributes that contain filenames
5280     (SaxEventLister.startElementNS): Normalize the filename attributes
5281     with os.path.normpath
5282     (sax_eventlist): New parameter filenames to pass through to
5283     SaxEventLister
5284    
5285     * test/test_derivedshapestore.py: Make this file callable as a
5286     program to execute the tests
5287     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
5288     the session to self.session so that it gets destroyed properly
5289    
5290     * test/test_layer.py (TestLayer.tearDown): Call the session's
5291     Destroy method
5292    
5293     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
5294     too if it exists
5295     (TestMapAddLayer.test_add_layer): Bind the session to self.session
5296     so that it gets destroyed properly
5297    
5298     * test/postgissupport.py (reason_for_not_running_tests): Add a
5299     test for the existence of popen2.Popen4.
5300    
5301     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
5302     reliable way to destroy the sessions created in the test cases
5303     (SaveSessionTest.test_dbf_table): Bind the session to self.session
5304     so that it gets destroyed properly
5305     (SaveSessionTest.testLayerProjection): Bind the session to
5306     self.session so that it gets destroyed properly
5307    
5308     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
5309     sure that the session is destroyed properly
5310    
5311     * test/test_shapefilestore.py: Make this callable as a program to
5312     execute the tests
5313    
5314     * test/test_scalebar.py: Remove unnecessary import of _ from
5315     Thuban
5316    
5317     * test/support.py (print_garbage_information): Call initthuban
5318     here because it may be called indirectly from test cases that test
5319     test support modules which do not use anything from thuban itself
5320     (ThubanTestProgram.runTests): Remove unnecessary debug print
5321    
5322     2003-08-28 Bernhard Herzog <[email protected]>
5323    
5324 bh 1672 * Thuban/version.py (longversion): Update to 0.9
5325    
5326     * Thuban/UI/mainwindow.py: Remove some unused imports
5327    
5328     * README: Add section about required additional software. Add date
5329     and revision CVS keywords
5330    
5331     * HOWTO-Release: Add item about the translations. Add date and
5332     revision CVs keywords and change formatting to match README a bit
5333     better
5334    
5335     * po/de.po: Update for 0.9
5336    
5337     * test/README: Tweak the wording a little because many tests are
5338     not really unittest.
5339    
5340 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
5341    
5342 bh 1665 As preparation for the 0.9 release, switch thuban files to a
5343     non-dev namespace
5344    
5345     * Thuban/Model/save.py (SessionSaver.write_session): Write files
5346     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
5347     namespace
5348    
5349     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
5350     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
5351    
5352     * test/test_save.py (SaveSessionTest.dtd)
5353     (SaveSessionTest.testEmptySession)
5354     (SaveSessionTest.testSingleLayer)
5355     (SaveSessionTest.testLayerProjection)
5356     (SaveSessionTest.testRasterLayer)
5357     (SaveSessionTest.testClassifiedLayer)
5358     (SaveSessionTest.test_dbf_table)
5359     (SaveSessionTest.test_joined_table)
5360     (SaveSessionTest.test_save_postgis): Update for new namespace
5361    
5362     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
5363     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5364     (TestLayerProjection.file_contents)
5365     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5366     (TestPostGISLayer.file_contents)
5367     (TestPostGISLayerPassword.file_contents)
5368     (TestLoadError.file_contents, TestLoadError.test): Update for new
5369     namespace
5370    
5371     2003-08-27 Bernhard Herzog <[email protected]>
5372    
5373 bh 1663 Make the table interface distinguish between row ids (an integer
5374     that uniquely identifies a row) and row ordinals (a simple row
5375     count from 0 to NumRows() - 1)
5376    
5377     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
5378     (PostGISTable.RowOrdinalToId): New methods to conver between row
5379     ids and row ordinals
5380     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
5381     parameter row_is_ordinal to indicate whether the row parameter is
5382     the row id or the ordinal
5383    
5384     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
5385     (TransientTableBase.RowOrdinalToId)
5386     (AutoTransientTable.RowIdToOrdinal)
5387     (AutoTransientTable.RowOrdinalToId): Same new methods as in
5388     PostGISTable.
5389     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
5390     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
5391     Same new parameter as in PostGISTable.
5392    
5393     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
5394     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
5395     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
5396     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
5397     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
5398     parameter as in PostGISTable.
5399    
5400     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
5401     (DataTable.RowOrdinalToId): New methods to convert between row ids
5402     and row ordinals.
5403     (TableGrid.SelectRowById): New method to select a row based on its
5404     ID as opposed to its ordinal
5405     (DataTable.GetValue, TableGrid.OnRangeSelect)
5406     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
5407     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
5408     (LayerTableFrame.__init__): Convert between row ids and row
5409     ordinals as appropriate
5410    
5411     * test/postgissupport.py (PostGISDatabase.__init__): Add
5412     doc-string.
5413     (PostGISDatabase.initdb): The optional third item in a tuple in
5414     tables is now a (key, value) list with additional arguments to
5415     pass to upload_shapefile
5416     (upload_shapefile): New parameter gid_offset to allow gids that
5417     are not the same as the shapeids in the shapefile
5418     (PostgreSQLServer.get_default_static_data_db): Use the new
5419     gid_offset to make the gids in landmarks 1000 higher than the
5420     shapeids in the shapefile
5421    
5422     * test/test_viewport.py
5423     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
5424     new shapeids in the landmarks table
5425    
5426     * test/test_transientdb.py
5427     (TestTransientTable.run_iceland_political_tests)
5428     (TestTransientTable.test_transient_joined_table): Add tests for
5429     the new table methods and new keywords arguments.
5430    
5431     * test/test_postgis_db.py
5432     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
5433     (TestPostGISTable.test_read_value_row_count_mode)
5434     (TestPostGISTable.test_row_id_to_ordinal)
5435     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
5436     table methods and the new arguments
5437     (TestPostGISShapestorePoint.test_shapes_in_region)
5438     (TestPostGISShapestorePoint.test_shape_raw_data)
5439     (TestPostGISShapestorePoint.test_shape_points)
5440     (TestPostGISShapestorePoint.test_shape_shapeid)
5441     (TestPostGISShapestorePoint.test_all_shapes)
5442     (TestPostGISTable.test_simple_query)
5443     (TestPostGISTable.test_simple_query)
5444     (TestPostGISTable.test_simple_query)
5445     (TestPostGISTable.test_read_value)
5446     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
5447     shapeids in the landmarks table
5448    
5449     * test/test_memory_table.py
5450     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
5451     (TestMemoryTable.test_read_value_row_count_mode)
5452     (TestMemoryTable.test_row_id_to_ordinal)
5453     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
5454     table methods and the new arguments
5455    
5456     * test/test_dbf_table.py
5457     (TestDBFTable.test_read_row_as_dict_row_count_mode)
5458     (TestDBFTable.test_read_value_row_count_mode)
5459     (TestDBFTable.test_row_id_to_ordinal)
5460     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
5461     methods and the new arguments
5462    
5463 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
5464    
5465 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
5466     more postgis specific but much faster method to get the bounding
5467     box
5468    
5469     2003-08-26 Bernhard Herzog <[email protected]>
5470    
5471 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
5472     (PostGISShapeStore.AllShapes): Add these missing methods.
5473     (PostGISShapeStore.ShapesInRegion): No need to raise
5474     StopIteration. We can simply return
5475    
5476     * test/test_postgis_db.py (TestPostGISTable.test_title)
5477     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
5478     new methods
5479    
5480 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
5481    
5482 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
5483    
5484     * test/test_postgis_db.py (PolygonTests): New class containing
5485     those tests from TestPostGISShapestorePolygon that can also be
5486     used to test MUTLIPOLYGON tables
5487     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
5488     so derive from that
5489     (TestPostGISShapestoreMultiPolygon): New class with tests for
5490     MUTLIPOLYGON tables
5491    
5492     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
5493     tables argument to have tuples with three items to override the
5494     WKT type used.
5495     (PostgreSQLServer.get_default_static_data_db): Use the above to
5496     create a polygon table with MUTLIPOLYGONs
5497     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
5498     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
5499     coords_to*
5500     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
5501     (wkt_converter): New. Map WKT types to converters
5502     (upload_shapefile): New parameter force_wkt_type to use a
5503     different WKT type than the default
5504    
5505     2003-08-25 Bernhard Herzog <[email protected]>
5506    
5507 bh 1655 * Thuban/UI/application.py
5508     (ThubanApplication.run_db_param_dialog): New. Suitable as a
5509     db_connection_callback. Main difference is that the dialog run
5510     from this method doesn't have a parent so it can be used even when
5511     there is no main window
5512     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
5513     no db_connection_callback was given. This way the dialog pops up
5514     even when the .thuban file was given as a command line parameter.
5515    
5516     2003-08-25 Bernhard Herzog <[email protected]>
5517    
5518 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
5519     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
5520     which leads to an effectively frozen X session because the user
5521     can only interact with the dialog but the mouse is still grabbed
5522     by the canvas.
5523     Also, call the tool's Hide method before MouseLeftUp because
5524     MouseLeftUp may change the tool's coordinates.
5525    
5526     2003-08-25 Bernhard Herzog <[email protected]>
5527    
5528 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
5529     LoadCancelled exceptions and handle them by returning immediately.
5530    
5531     2003-08-25 Bernhard Herzog <[email protected]>
5532    
5533 bh 1649 GUI part of loading sessions with postgis connections which may
5534     require user interaction to get passwords or updated parameters
5535    
5536     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
5537     bit nucer and be more generic.
5538     (DBFrame.OnAdd): Adapt to new DBDialog interface
5539    
5540     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
5541     optional parameter db_connection_callback which is passed to
5542     load_session.
5543    
5544     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
5545     Suitable as a db_connection_callback
5546     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
5547     db_connection_callback of the application's OpenSession method
5548    
5549    
5550     2003-08-25 Bernhard Herzog <[email protected]>
5551    
5552 bh 1647 Basic loading of sessions containing postgis connections:
5553    
5554     * Thuban/Model/load.py (LoadError): Add doc-string
5555     (LoadCancelled): New exception class to indicate a cancelled load
5556     (SessionLoader.__init__): Add the db_connection_callback parameter
5557     which will be used by the loader to get updated parameters and a
5558     password for a database connection
5559     (SessionLoader.__init__): Add the new XML elements to the
5560     dispatchers dictionary
5561     (SessionLoader.check_attrs): Two new conversions, ascii to convert
5562     to a byte-string object and idref as a generic id reference
5563     (SessionLoader.start_dbconnection)
5564     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
5565     elements
5566     (load_session): Add the db_connection_callback to pass through the
5567     SessionLoader
5568    
5569     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
5570     New classes to test loading of sessions with postgis database
5571     connections.
5572    
5573     2003-08-25 Bernhard Herzog <[email protected]>
5574    
5575 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
5576     replace it and the comment with __BuildDate__ by the Source: and
5577     Id: cvs keywords as used in the other files.
5578    
5579     2003-08-25 Bernhard Herzog <[email protected]>
5580    
5581 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
5582     LoadError when a required attribute is missing. The code used to
5583     be commented out for some reason, but probably should have been
5584     active.
5585    
5586     * test/test_load.py (TestLoadError.test): Test the message in the
5587     LoadError too to make sure it really is about the missing
5588     attribute
5589    
5590 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
5591 bh 1641
5592     * test/test_save.py (SaveSessionTest.test_dbf_table)
5593     (SaveSessionTest.test_joined_table): Add XML validation tests.
5594    
5595     2003-08-22 Bernhard Herzog <[email protected]>
5596    
5597 bh 1639 Implement saving a session with a postgis connection
5598 bh 1632
5599 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
5600     elements for database connections and shapestores using db
5601     connections
5602     (session): Add the dbconnections to the content model
5603    
5604     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
5605     Write the db connections
5606     (SessionSaver.write_session): Call write_db_connections to write
5607     the connection before the data sources
5608     (SessionSaver.write_data_containers): Handle postgis shapestores
5609    
5610     * test/test_save.py (SaveSessionTest.thubanids)
5611     (SaveSessionTest.thubanidrefs): Update for new DTD
5612     (SaveSessionTest.test_save_postgis): New. Test saving a session
5613     with postgis connections
5614    
5615     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
5616     (PostGISTable.TableName): New accessor methods for the connection
5617     and table name
5618    
5619     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
5620     (TestPostGISTable.test_dbname): New methods to test the new
5621     PostGISConnection methods
5622    
5623     2003-08-22 Bernhard Herzog <[email protected]>
5624    
5625 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
5626     for exceptions occurring when establishing a Database connection
5627     (PostGISConnection.connect): Catch psycopg.OperationalError during
5628     connects and raise ConnectionError.
5629    
5630     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
5631     tests for database exceptions
5632    
5633     2003-08-22 Bernhard Herzog <[email protected]>
5634    
5635 bh 1635 Prepare the test suite for tests with required authentication
5636    
5637     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
5638     variables with two predefined users/passwords, one for the admin
5639     and one for a non-privileged user.
5640     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
5641     the non-privileged user to the database and set the admin password
5642     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
5643     Better error reporting
5644     (PostgreSQLServer.connection_params)
5645     (PostgreSQLServer.connection_string): New methods to return
5646     information about how to connect to the server
5647     (PostgreSQLServer.execute_sql): New. Convenience method to execute
5648     SQL statements
5649     (PostgreSQLServer.require_authentication): Toggle whether the
5650     server requires authentication
5651     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
5652     Add or alter users
5653     (PostGISDatabase.initdb): Pass the admin name one the
5654     subprocesses' command lines. Grant select rights on
5655     geometry_columns to everybody.
5656     (upload_shapefile): Use the admin name and password when
5657     connecting. Grant select rights on the new table to everybody.
5658    
5659     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
5660     server's new methods to get the connection parameters.
5661    
5662     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
5663     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
5664     server's new methods to get the connection parameters.
5665    
5666     * test/test_postgis_db.py
5667     (TestPostGISConnection.test_gis_tables_empty)
5668     (TestPostGISConnection.test_gis_tables_non_empty)
5669     (PostGISStaticTests.setUp): Use the server's new methods to get
5670     the connection parameters.
5671    
5672     2003-08-22 Bernhard Herzog <[email protected]>
5673    
5674 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
5675    
5676     * Thuban/version.py: Add psycopg version
5677    
5678     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
5679     version of the psycopg module
5680    
5681     2003-08-22 Bernhard Herzog <[email protected]>
5682    
5683     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
5684     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
5685     at the moment. The functionality should probably be implemented
5686     some time, though.
5687 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
5688     removed because it's still in use.
5689 bh 1632
5690 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
5691    
5692     * Thuban/UI/about.py (About.__init__): split up the huge about
5693     text into elements/lists for easier translation. This fixes bug
5694     https://intevation.de/rt/webrt?serial_num=2058
5695     Also, made some forgotten string available for the i18n.
5696    
5697 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
5698    
5699     Make postgis support really optional including insensitive menu
5700     items.
5701    
5702     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
5703     whether the postgis is supported.
5704    
5705     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
5706     to make postgis support optional
5707    
5708     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
5709     version of Thuban.Model.postgisdb.has_postgis_support
5710     (database_management command): Make it only sensitive if postgis
5711     is supported.
5712    
5713 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
5714    
5715 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
5716     (section Adding and Removing Layers): Added text and described
5717     multi-selection.
5718     (chapter Extensions): New.
5719    
5720     2003-08-21 Jan-Oliver Wagner <[email protected]>
5721    
5722 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
5723     settings to allow multiple files to load into the map.
5724     Also reduced selection to *.shp as a default.
5725    
5726 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
5727    
5728     Add dialogs and commands to open database connections and add
5729     database layers.
5730    
5731     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
5732     method to open the database connection management dialog
5733     (MainWindow.AddDBLayer): New method to add a layer from a database
5734     (_has_dbconnections): New helper function to use for sensitivity
5735     (database_management command, layer_add_db command): New commands
5736     that call the above new methods.
5737     (main_menu): Add the new commands to the menu.
5738    
5739     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
5740     (PostGISConnection.connect): Establish the actual connection in a
5741     separate method and call it in __init__. This makes it easier to
5742     override the behavior in test cases
5743     (PostGISConnection.BriefDescription): New method to return a brief
5744     description for use in dialogs.
5745    
5746     * test/test_postgis_db.py (NonConnection): DB connection that
5747     doesn't actually connect
5748     (TestBriefDescription): New class with tests for the new
5749     BriefDescription method
5750    
5751 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
5752    
5753     Moved anything from extensions to libraries.
5754    
5755     * libraries: New.
5756    
5757     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
5758    
5759     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
5760     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
5761     been moved here from thuban/extensions/pyprojection/
5762     See there in the Attic for the older history.
5763    
5764     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
5765     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
5766     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
5767     have been moved here from thuban/extensions/pyshapelib/
5768     See there in the Attic for the older history.
5769    
5770     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
5771     files have been moved here from thuban/extensions/shapelib/
5772     See there in the Attic for the older history.
5773    
5774     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5775     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
5776     thuban/extensions/thuban/
5777     See there in the Attic for the older history.
5778    
5779     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
5780    
5781     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5782     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
5783    
5784     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
5785     Moved to libraries/shapelib.
5786    
5787     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
5788     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
5789     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
5790     Moved to libraries/pyshapelib.
5791    
5792     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
5793     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
5794     Moved to libraries/pyprojection.
5795    
5796     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
5797    
5798     * extensions: Removed.
5799    
5800 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
5801    
5802 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
5803     facilities of FileTestMixin so don't derive from it.
5804     (TestViewportWithPostGIS): New class with tests for using a
5805     viewport on a map with postgis layers.
5806    
5807     2003-08-19 Bernhard Herzog <[email protected]>
5808    
5809     Add the db connection management to the session.
5810    
5811     * Thuban/Model/session.py (Session.__init__): New instance
5812     variable db_connections
5813     (Session.AddDBConnection, Session.DBConnections)
5814     (Session.HasDBConnections, Session.CanRemoveDBConnection)
5815     (Session.RemoveDBConnection): New methods to manage and query the
5816     db connections managed by the session
5817     (Session.OpenDBShapeStore): New method to open a shapestore from a
5818     db connection
5819    
5820     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
5821     messages for the db connection handling in the session
5822    
5823     * test/test_postgis_session.py: New. test cases for the session's
5824     db connection handling with postgis connections
5825    
5826     2003-08-19 Bernhard Herzog <[email protected]>
5827    
5828 bh 1606 Add very basic postgis database support and the corresponding test
5829     cases. The test cases require a PostgreSQL + postgis installation
5830     but no existing database. The database will be created
5831     automatically by the test cases
5832    
5833     * test/README: Add note about skipped tests and the requirements
5834     of the postgis tests.
5835    
5836     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
5837    
5838     * test/test_postgis_db.py: New. Test cases for the postgis
5839     support.
5840    
5841     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
5842     format
5843    
5844     * test/test_wellknowntext.py: New. Test cases for the
5845     wellknowntext parser
5846    
5847     * test/postgissupport.py: New. Support module for tests involving
5848     a postgis database.
5849    
5850     * test/support.py (execute_as_testsuite): Shut down the postmaster
5851     if it's still running after the tests
5852    
5853     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
5854     well known text format
5855    
5856 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
5857    
5858     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
5859     message dialog.
5860    
5861 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
5862    
5863 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
5864     reason for the skips in the output to make it a bit more readable.
5865     (execute_as_testsuite): New helper function to run a test suite
5866     and print some more information.
5867     (run_tests): Use execute_as_testsuite to run the tests
5868    
5869     * test/runtests.py (main): Use execute_as_testsuite to run the
5870     tests
5871    
5872     2003-08-18 Bernhard Herzog <[email protected]>
5873    
5874 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
5875     changes introduced in Python 2.3:
5876    
5877     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
5878     filename is an absolute name
5879    
5880     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
5881     filename is an absolute name
5882    
5883     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
5884     unique filename to save to and use the correct relative filename
5885     in the expected output.
5886     (SaveSessionTest.test_dbf_table): Use the correct relative
5887     filename in the expected output.
5888    
5889     * test/test_layer.py (TestLayer.test_raster_layer): Update the
5890     test to check whether the filename is absolute.
5891    
5892 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
5893    
5894     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
5895    
5896 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
5897    
5898 bh 1594 Change the way shapes are returned by a shape store. The
5899     ShapesInRegion method returns an iterator over actual shape
5900     objects instead of a list of shape ids.
5901    
5902     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
5903     id.
5904     (ShapefileStore.ShapesInRegion): Return an iterator over the
5905     shapes which yields shape objects instead of returning a list of
5906     shape ids
5907     (ShapefileStore.AllShapes): New. Return an iterator over all
5908     shapes in the shape store
5909     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
5910    
5911     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
5912     doc-string.
5913    
5914     * Thuban/UI/baserenderer.py
5915     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
5916     layer_shapes and make it return an iterator containg shapes
5917     instead of a list of ids.
5918     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
5919     layer_shapes() change
5920    
5921     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
5922     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
5923    
5924     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
5925     changes in the ShapesInRegion return value.
5926     (ViewPort._get_hit_tester): Remove commented out code
5927    
5928     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
5929     new return value.
5930     (SimpleShapeStore.AllShapes): New. Implement this method too.
5931    
5932     * test/test_layer.py (TestLayer.test_arc_layer)
5933     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5934     (TestLayer.test_point_layer_with_projection)
5935     (TestLayer.test_derived_store): Adapt to changes in the
5936     ShapesInRegion return value.
5937    
5938     * test/test_shapefilestore.py
5939     (TestShapefileStoreArc.test_shapes_in_region)
5940     (TestShapefileStorePolygon.test_shapes_in_region)
5941     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
5942     in the ShapesInRegion return value.
5943     (TestShapefileStorePoint.test_all_shapes)
5944     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
5945     methods
5946    
5947     * test/test_derivedshapestore.py
5948     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
5949     the ShapesInRegion return value.
5950     (TestDerivedShapeStore.test_all_shapes)
5951     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
5952     methods
5953    
5954     2003-08-15 Bernhard Herzog <[email protected]>
5955    
5956 bh 1592 Make the renderers deal correctly with raw vs. python level
5957     representation of shape geometries
5958    
5959     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
5960     Return a flag useraw in addition to the callable and the parameter
5961     to indicate whether the callable can deal with the raw shape data
5962     or uses the higher level python lists of coordinates. The callable
5963     now should accept either the raw data or the return value of the
5964     shape's Points() method.
5965     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
5966     change
5967     (BaseRenderer.projected_points): Instead of the shape id use the
5968     points list as parameter.
5969     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
5970     (BaseRenderer.draw_point_shape): Adapt to projected_points()
5971     change and accept the points list as parameter instead of the
5972     shape id.
5973    
5974     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
5975     the useraw flag as required by the BaseRenderer
5976     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
5977     changes.
5978    
5979     * test/test_baserenderer.py
5980     (TestBaseRenderer.test_point_with_classification): New test for
5981     rendering a map with classifications.
5982    
5983     2003-08-15 Bernhard Herzog <[email protected]>
5984    
5985 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5986     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
5987     (ViewPort._get_hit_tester, ViewPort.projected_points)
5988     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
5989     (ViewPort._find_label_at): Split the find_shape_at method into
5990     several new methods and use the functions in the hit-test module.
5991    
5992     * Thuban/UI/hittest.py: New module with Python-level hit-testing
5993     functions
5994    
5995     * test/test_hittest.py: New. Test for the new hittest module
5996    
5997     2003-08-15 Bernhard Herzog <[email protected]>
5998    
5999 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
6000     projection to all corners of the bounding box to get a better
6001     approximation of the projected bounding box
6002    
6003     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
6004     New. Test coordinate handling of a layer with a projection.
6005     Catches the bug fixed in Layer.ShapesInRegion
6006    
6007     2003-08-15 Bernhard Herzog <[email protected]>
6008    
6009 bh 1586 Move some of the mock objects in test_baserenderer into their own
6010     module so they can easily be used from other tests
6011    
6012     * test/mockgeo.py: New test helper module with some mock objects
6013     for geometry related things like shapes, shapestores and
6014     projections.
6015    
6016     * test/test_mockgeo.py: New. Tests for the new helper module
6017    
6018     * test/test_baserenderer.py: Some of the mock-objects are in
6019     mockgeo now.
6020    
6021 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
6022    
6023     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
6024    
6025 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
6026    
6027 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
6028    
6029     2003-08-12 Bernhard Herzog <[email protected]>
6030    
6031 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
6032     strings have to be one string literal.
6033    
6034 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
6035    
6036 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
6037     New. This method was used in various derived classes, but it's
6038     better to have it here.
6039    
6040     * test/test_shapefilestore.py
6041     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
6042     FloatComparisonMixin
6043    
6044     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
6045     It's now in FloatComparisonMixin
6046    
6047     * test/test_derivedshapestore.py
6048     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
6049     in FloatComparisonMixin
6050    
6051     2003-08-11 Bernhard Herzog <[email protected]>
6052    
6053 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
6054     error message
6055    
6056 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
6057    
6058 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
6059     with version number.
6060     Changed title to reflect version number of Thuban.
6061    
6062     2003-08-08 Jan-Oliver Wagner <[email protected]>
6063    
6064 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
6065     the list corresponds to the "About" web page.
6066    
6067 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
6068    
6069     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
6070     Make sure translated strings are recognized as one string literal.
6071    
6072     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
6073     Make sure translated strings are recognized as one string literal.
6074    
6075     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
6076     translated strings are recognized as one string literal.
6077    
6078     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
6079     sure translated strings are recognized as one string literal.
6080    
6081 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
6082    
6083 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
6084     Simply delegates to the original shapestore.
6085    
6086     * test/test_derivedshapestore.py
6087     (TestDerivedShapeStore.test_raw_format): New. Test case for
6088     DerivedShapeStore.RawShapeFormat
6089    
6090     2003-08-07 Bernhard Herzog <[email protected]>
6091    
6092 bh 1561 Add raw data interface to shape objects.
6093    
6094     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
6095     class to ShapefileShape which now holds shapefile specific
6096     information.
6097     (ShapefileShape.compute_bbox): Simplified to not cache any
6098     information. The way this method is used that shouldn't matter
6099     performance wise.
6100     (ShapefileShape.RawData): New. Return the shapeid which is the raw
6101     data format for shapes from shapefiles.
6102     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
6103     in the shape objects returned by a shapestore. For a
6104     ShapefileStore this is always RAW_SHAPEFILE.
6105     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
6106     method.
6107    
6108     * test/test_shapefilestore.py
6109     (TestShapefileStore.test_raw_format): New test to test the raw
6110     format feature of shapes.
6111    
6112 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
6113     data. It was only there for interface compatibility but it's not
6114 bh 1561 used inside of Thuban and the generic Shape class has gone away.
6115 bh 1560
6116 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
6117     the raw data format and only use an optimized version of its a
6118     shapefile.
6119    
6120 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
6121    
6122 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
6123     tests.
6124     (SimpleShapeStore.Shape): Use SimpleShape instead of
6125     Thuban.Model.data.Shape to make the tests independed of the coming
6126     changes.
6127    
6128     2003-08-07 Bernhard Herzog <[email protected]>
6129    
6130 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
6131     (ThubanTestProgram): New classes that extend the respective
6132     classes from unittest. These new version support skipping tests
6133     under certain expected conditions. In the Thuban test suite we
6134     uses this for tests that require the optional gdal support.
6135     (run_tests): Use ThubanTestProgram instead of the unittest.main()
6136    
6137     * test/runtests.py (main): Use the new ThubanTestRunner instead of
6138     the normal one from unittest
6139    
6140     * test/test_layer.py (TestLayer.test_raster_layer): If this test
6141     is not run because gdal support isn't available report this to the
6142     runner.
6143    
6144     * test/test_baserenderer.py
6145     (TestBaseRenderer.test_raster_no_projection): Do not run this test
6146     if gdal support isn't available and report this to the runner.
6147    
6148 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
6149    
6150     Rearrange the renderers a bit, partly in preparation for changes
6151     required for the postgis merge, partly to make it more testable.
6152     Also make the representation of coordinates in Shapes more
6153     consistent.
6154    
6155     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
6156     this class is now in BaseRenderer. This class is now practically
6157     only a specialization of BaseRenderer for rendering to an actual
6158     wx DC.
6159     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
6160     to get the shapetype specific rendering functions.
6161    
6162     * Thuban/UI/baserenderer.py: New file with the basic rendering
6163     logic. The code in this file is completely independend of wx.
6164     (BaseRenderer): Class with the basic rendering logic
6165    
6166     * test/test_baserenderer.py: New. Test cases for BaseRenderer
6167    
6168     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6169     error_on_redraw to guard agains endless loops and stack overflows
6170     when there's a bug in the rendering code that raises exceptions.
6171     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
6172     rendering into a separate method _do_redraw so that error handling
6173     is a bit easier. When an exception occurs, set error_on_redraw to
6174     true. When it's true on entry to OnIdle do nothing and return
6175     immediately.
6176    
6177     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
6178     Shape object will always have the coordinates as a list of list of
6179     coordinate pairs (tuples).
6180     (Shape.compute_bbox): Adapt to new representation.
6181    
6182     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
6183     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
6184     Shape objects.
6185    
6186     * test/test_shapefilestore.py
6187     (ShapefileStoreTests.assertFloatTuplesEqual)
6188     (ShapefileStoreTests.assertPointListEquals): Rename to
6189     assertPointListEquals and change purpose to checking equality of
6190     the lists returned by Shape.Points().
6191     (TestShapefileStoreArc.test_shape)
6192     (TestShapefileStorePolygon.test_shape)
6193     (TestShapefileStorePoint.test_shape): Use the new
6194     assertPointListEquals instead of assertFloatTuplesEqual
6195    
6196     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
6197     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
6198     and change purpose to checking equality of the lists returned by
6199     Shape.Points().
6200     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
6201     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
6202     (TestLayer.test_derived_store): Use the new assertPointListEquals
6203     instead of assertFloatTuplesEqual
6204    
6205     * test/test_derivedshapestore.py
6206     (TestDerivedShapeStore.assertFloatTuplesEqual)
6207     (TestDerivedShapeStore.assertPointListEquals): Rename to
6208     assertPointListEquals and change purpose to checking equality of
6209     the lists returned by Shape.Points().
6210     (TestDerivedShapeStore.test_shape): Use the new
6211     assertPointListEquals instead of assertFloatTuplesEqual
6212    
6213 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
6214    
6215     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
6216     a bounding box. A dialog is raised in case, no bounding box
6217     is found. This fixes bug #2043:
6218     https://intevation.de/rt/webrt?serial_num=2043
6219    
6220 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
6221    
6222     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
6223     object look like a Color instantiation. Formerly it looked like a
6224     tuple.
6225    
6226     * test/test_color.py (TestColor.test_repr)
6227     (TestColor.test_equality, TestColor.test_inequality): New. test
6228     some more apects of the Color class
6229     (TestTransparent.test_repr, TestTransparent.test_hex)
6230     (TestTransparent.test_equality): New. Test cases for the
6231     Transparent object.
6232    
6233 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
6234    
6235     * Doc/manual/thuban-manual.xml: a number of small improvements.
6236     The resulting file is the version submitted for GREAT-ER II.
6237    
6238 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
6239    
6240 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
6241     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
6242     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
6243    
6244     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
6245     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
6246     (ThubanEndBusyCursor): Add doc-strings
6247    
6248     2003-08-01 Bernhard Herzog <[email protected]>
6249    
6250 bh 1540 First step towards PostGIS integration. More abstraction by movin
6251     more code from the layer to the shapestore. More methods of the
6252     layer are now simply delegated to the equivalent method of the
6253     shapestore. The SHAPETYPE_* constants are now in data not in
6254     layer.
6255    
6256     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6257     (SHAPETYPE_POINT, Shape): Move these constants and classes from
6258     layer.py to data.py
6259     (ShapefileStore.__init__): More Initialization for the new methods
6260     and functionality.
6261     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
6262     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
6263     (ShapefileStore.Shape): New methods that were formerly implemented
6264     in the layer.
6265     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
6266     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
6267     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
6268     equivalents of the new shape methods. These versions are simply
6269     delegated to the original shapstore.
6270    
6271     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6272     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
6273     (Layer.SetShapeStore): Removed the initializatin of instance
6274     variables that were needed for the stuff that's now in
6275     ShapefileStore
6276     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
6277     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
6278     shapestore.
6279    
6280     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
6281     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
6282     instead of layer.
6283    
6284     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
6285    
6286     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
6287    
6288     * test/test_layer.py: Import the SHAPETYPE_* constants from data
6289     instead of layer.
6290     (TestLayer.test_derived_store): Remove the test for the exception
6291     when instantiating the DerivedShapeStore with an incompatible
6292     table which is now in test_derivedshapestore.py. Add some more
6293     tests of the layer methods to determine whether they work for a
6294     DerivedShapeStore as well.
6295    
6296 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
6297    
6298     * Doc/manual/thuban-manual.xml: Fix the list of required packages
6299     by just listing the name and where they can be found.
6300    
6301 frank 1532 2003-07-31 Frank Koormann <[email protected]>
6302    
6303     * Doc/manual/thuban-manual.xml:
6304     Changed the screenshot elements to figure.
6305     Changed some variablelist elements to itemizedlist.
6306     Added section on GDAL formats.
6307    
6308 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
6309    
6310     * Doc/manual/thuban-manual.xml: Added a few sentences about
6311     the Fix Border Color option when generating classes.
6312    
6313 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
6314    
6315     * Thuban/Model/classgen.py: Add docstrings. Rename specific
6316     Ramp instances to use lower_case_style.
6317    
6318     * Thuban/UI/classgen.py: Use renamed Ramp instances.
6319    
6320     * Thuban/UI/classifier.py: Add docstrings.
6321    
6322     * Thuban/UI/dock.py: Add docstrings.
6323    
6324     * test/test_classgen.py: Use renamed Ramp instances.
6325    
6326 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
6327    
6328 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
6329     was never used in Thuban.
6330    
6331     2003-07-30 Bernhard Herzog <[email protected]>
6332    
6333 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
6334     method directly instead of going through the transient_table
6335     method. This faster because transient_table may force the copy of
6336     a DBF file into the transient database and setting a table's title
6337     doesnm't affect the title of the associated transient table, so
6338     this fixes RT #2042
6339    
6340     * Thuban/UI/main.py (__version__): Don't import the already
6341     removed show_exception_dialog.
6342    
6343 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
6344    
6345 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6346     Put back this method and remove the equivalent function since we
6347     are setting the exception hook from within this class (OnInit).
6348    
6349     2003-07-29 Jonathan Coles <[email protected]>
6350    
6351 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
6352     Doc/manual/images/5_2_quantiles.png,
6353     Doc/manual/images/5_2_uniform_dist.png,
6354     Doc/manual/images/5_2_unique_values.png,
6355     Doc/manual/images/8_int_error.png: New screen shots.
6356    
6357     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
6358     some points, and added more screen shots.
6359    
6360 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
6361    
6362 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
6363    
6364     2003-07-29 Bernhard Herzog <[email protected]>
6365    
6366 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
6367     deprecated since before the 0.8 release and isn't used in Thuban
6368     itself anymore.
6369    
6370 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
6371    
6372 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
6373 jonathan 1506
6374     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
6375     python exception hook here so that we are sure to catch any
6376     Thuban exception that happen during initialization.
6377    
6378     * Thuban/UI/main.py (main): Don't set the exception hook here,
6379     it will get set in ThubanApplication.OnInit.
6380    
6381     2003-07-29 Jonathan Coles <[email protected]>
6382 jonathan 1503
6383     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6384     Removed and called it show_exception_dialog() so that the exception
6385     handler can be set before the class is created.
6386    
6387     * Thuban/UI/main.py (main): Install the exception handler before
6388     a ThubanApplication is created.
6389    
6390 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
6391    
6392     * po/it.po: New. Italian translation by Maurizio Napolitano
6393    
6394     * po/ru.po: New. Russian translation by Alex Shevlakov
6395    
6396 frank 1497 2003-07-29 Frank Koormann <[email protected]>
6397    
6398 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
6399     projections.
6400    
6401     2003-07-29 Frank Koormann <[email protected]>
6402    
6403 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
6404    
6405 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
6406    
6407 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
6408     on white background.
6409    
6410     2003-07-29 Jonathan Coles <[email protected]>
6411    
6412 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
6413     descriptions for the legend toolbar.
6414    
6415     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
6416     cursor from dialog box.
6417    
6418     2003-07-28 Jonathan Coles <[email protected]>
6419    
6420     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
6421    
6422     * Doc/manual/images/2_4_session_tree.png,
6423     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
6424     Doc/manual/images/4_2_layer_properties.png,
6425     Doc/manual/images/4_2_raster_layer_properties.png,
6426     Doc/manual/images/5_3_genclass.png,
6427     Doc/manual/images/5_classification.png,
6428     Doc/manual/images/6_projection.png,
6429     Doc/manual/images/7_1_table_view.png,
6430     Doc/manual/images/7_2_5_join.png: New screenshots.
6431    
6432     2003-07-24 Jonathan Coles <[email protected]>
6433    
6434     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
6435    
6436     2003-07-24 Jonathan Coles <[email protected]>
6437    
6438     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
6439     chapter on Layer Management.
6440    
6441     * Doc/manual/Makefile: New. Makefile to generate all formats for the
6442     manual and images.
6443    
6444 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
6445    
6446     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
6447     it annoys lintian which warns about these files not being
6448 jan 1767 executable. The #! isn't necessary here since if you absolutely
6449 bh 1483 must execute them you can always say "python <filename>".
6450    
6451     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
6452     superfluous code to set brush and pen for point shapes
6453    
6454     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
6455     belong in viewport anyway
6456    
6457 frank 1479 2003-07-24 Frank Koormann <[email protected]>
6458    
6459     * Doc/manual/thuban-manual.xml: Added section on table management.
6460    
6461 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
6462    
6463     * test/runtests.py (main): Recognize the long "verbose" option
6464     correctly.
6465    
6466 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
6467    
6468     * Doc/manual/thuban-manual.xml: Continue to write first revision
6469     of the manual.
6470    
6471     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
6472     with Begin/EndDrawing() calls to ensure we aren't doing to
6473     many updates to the dc during rendering.
6474     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
6475     a pen and brush argument so they need to be passed to the function.
6476    
6477     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
6478     Calculates the minimum and maximum scale values. Factored out
6479     of set_view_transform so that it could be used to zoom all the
6480     way into a single point.
6481     (ViewPort.set_view_transform): Call calc_min_max_scales().
6482     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
6483     if only a single point is selected.
6484    
6485     * Doc/manual/images/1_2_legend_close.png,
6486     Doc/manual/images/1_2_legend_dock.png,
6487     Doc/manual/images/1_2_mainwindow.png,
6488     Doc/manual/images/1_2_mainwindow.ps,
6489     Doc/manual/images/1_2_mainwindow.sk,
6490     Doc/manual/images/3_2_fullextent.png,
6491     Doc/manual/images/3_2_fulllayerextent.png,
6492     Doc/manual/images/3_2_fullshapeextent.png,
6493     Doc/manual/images/3_2_pan.png,
6494     Doc/manual/images/3_2_zoomin.png,
6495     Doc/manual/images/3_2_zoomout.png,
6496     Doc/manual/images/3_3_identify.png,
6497     Doc/manual/images/3_3_label.png,
6498     Doc/manual/images/3_5_invisible.png,
6499     Doc/manual/images/3_5_movedown.png,
6500     Doc/manual/images/3_5_moveup.png,
6501     Doc/manual/images/3_5_props.png,
6502     Doc/manual/images/3_5_tobottom.png,
6503     Doc/manual/images/3_5_totop.png,
6504     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
6505    
6506 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
6507    
6508 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
6509    
6510     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
6511     after the new map has been assigned
6512    
6513     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
6514     Delegate MAP_REPLACED to the canvas too
6515     (MainWindow.prepare_new_session): Removed. Thanks to the new
6516     MAP_REPLACED message it's no longer needed
6517     (MainWindow.OpenSession, MainWindow.NewSession):
6518     prepare_new_session has been removed.
6519    
6520     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
6521     MAP_REPLACED so that we can close the dialog if a new map is set.
6522     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
6523     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
6524     dialog
6525    
6526     * test/test_viewport.py (SimpleViewPortTest)
6527     (SimpleViewPortTest.test_default_size): Add doc-strings
6528     (ViewPortTest.setUp): Bind map to self.map so we can use it in
6529     tests. Subscribe to MAP_REPLACED messages too.
6530     (ViewPortTest.tearDown): No need to explicitly unsubscribe
6531     (ViewPortTest.test_set_map): New test for the SetMap method.
6532    
6533     2003-07-18 Bernhard Herzog <[email protected]>
6534    
6535 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
6536     Move this test from ViewPortTest.setUp to this new separate test
6537     case. setUp is not the place for the actual tests.
6538     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
6539     more of the test from setUp to the new test test_inital_settings.
6540     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
6541     (ViewPortTest.test_proj_conv): Split test_proj_conv into
6542     test_win_to_proj and test_proj_to_win and make the tests easier to
6543     understand
6544     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
6545     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
6546     (ViewPortTest.test_unprojected_rect_around_point)
6547     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
6548     Reformat to increase readability.
6549    
6550     2003-07-18 Bernhard Herzog <[email protected]>
6551    
6552 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
6553    
6554     2003-07-18 Bernhard Herzog <[email protected]>
6555    
6556 bh 1459 * test/runtests.py: The test suite can now be run without an X
6557     connection. To make sure this remains true, remove the DISPLAY
6558     environment variable so that an error occurs if the wxGTK is
6559     imported accidentally
6560    
6561     2003-07-18 Bernhard Herzog <[email protected]>
6562    
6563 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
6564    
6565     * Thuban/UI/view.py: Remove unused imports
6566    
6567     2003-07-18 Bernhard Herzog <[email protected]>
6568    
6569 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
6570     function is now in viewport.py and is called output_transform
6571     (TestScalebar.test_output_transform)
6572     (TestScalebar.test_OutputTransform): Renamed to
6573     test_output_transform and updated to use output_transform instead
6574     of OutputTransform
6575    
6576     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
6577     renamed.
6578     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
6579     renamed to output_transform
6580    
6581     * Thuban/UI/viewport.py (OutputTransform, output_transform):
6582     Rename to output_transform
6583    
6584     2003-07-18 Bernhard Herzog <[email protected]>
6585    
6586 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
6587     classificationField to classificatin_column and init it here so
6588     that it can be used in SetClassificationColumn
6589     (Layer.GetClassificationColumn, Layer.GetClassificationField):
6590     Rename to GetClassificationColumn.
6591     (Layer.SetClassificationColumn, Layer.SetClassificationField):
6592     Rename to SetClassificationColumn and issue a LAYER_CHANGED
6593     message if the column changes.
6594     (Layer._classification_changed, Layer.ClassChanged): Rename to
6595     _classification_changed. Update the callers.
6596     (Layer.SetShapeStore): Further field->column renames.
6597    
6598     * Thuban/Model/load.py (SessionLoader.start_classification)
6599     (SessionLoader.start_clpoint): Updates because of
6600     field->column method name changes in the Layer class
6601    
6602     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
6603     because of field->column method name changes in the Layer class
6604    
6605     * Thuban/UI/classifier.py (Classifier.__init__)
6606     (Classifier._OnTry, Classifier._OnRevert): Updates because of
6607     field->column method name changes in the Layer class
6608    
6609     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
6610     because of field->column method name changes in the Layer class
6611    
6612     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
6613     of field->column method name changes in the Layer class
6614    
6615     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
6616     (SaveSessionTest.testClassifiedLayer): Update because of
6617     field->column method name changes in the Layer class
6618    
6619     * test/test_layer.py (SetShapeStoreTests.setUp)
6620     (SetShapeStoreTests.test_sanity): Update because of field->column
6621     method name changes in the Layer class
6622     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
6623     (TestLayerModification.test_sanity)
6624     (TestLayerModification.test_initial_settings): remove unsued code
6625     and rename to test_sanity.
6626     (TestLayerModification.test_set_classification): New test for
6627     SetClassification and SetClassificationField.
6628    
6629     2003-07-18 Bernhard Herzog <[email protected]>
6630    
6631 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
6632     the non-fixed values as well. The old test would have accepted a
6633     fixed ramp that only returnes the fixed properties
6634    
6635 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
6636    
6637     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
6638     shots for the manual. The XCF file is the source image and
6639     has additional layers to support changes.
6640    
6641     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
6642    
6643     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
6644     Return both the new class and the field name.
6645    
6646     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
6647     fit the map to the window as this changes any zoom level that
6648     the user may have set.
6649    
6650 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
6651    
6652     * Thuban/Model/classgen.py (generate_singletons,
6653     generate_uniform_distribution, generate_quantiles): Remove
6654     fixes parameter, but maintain the same functionality by having
6655     the calling function pass a FixedRamp object for the ramp.
6656     (FixedRamp): New. Adapts a ramp to have fixed property values.
6657    
6658     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
6659     (Classification): Inherit from Publisher.
6660     (Classification.__init__): Remove the layer parameter.
6661     Classifications no longer need to have a parent layer.
6662     (Classification.GetField, Classification.GetFieldType,
6663     Classification.SetFieldInfo): Removed. The field name is stored
6664     in the layer, and the type can be retreived by calling
6665     Layer.GetFieldType().
6666     (Classification._set_layer, Classification.GetLayer): Removed.
6667     Classifications no longer have a parent layer.
6668    
6669     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
6670     classification.
6671     (Layer.SetShapeStore): Reset the classification first while
6672     we still have the old shape store to work with.
6673     (Layer.GetClassificationField, Layer.SetClassificationField):
6674     New. Method for getting/setting the field to classify on.
6675     (Layer.SetClassification): Simplified now that the layer
6676     simply has to hold a reference to the classification and not
6677     tell the classification who owns it.
6678     Fixes RTbug #2023.
6679    
6680     * Thuban/Model/load.py (SessionLoader.start_classification):
6681     Set the field name on the layer, not the classification.
6682    
6683     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
6684     classification is modified.
6685    
6686     * Thuban/Model/save.py (SessionSaver.write_classification):
6687     Get the field name and type from the layer.
6688    
6689     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
6690     parameter records to rows and add docstring. Fixes RTbug #1997.
6691    
6692     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
6693     ramp when we need to fix certain values of a ramp rather than
6694     using the old fixes parameter. Fixes RTbug #2024.
6695    
6696     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
6697     parameter.
6698     (ClassTable.Reset): Add fieldType parameter and use it, rather
6699     than asking the classification.
6700     (Classifier.__init__): Remember the original class's field
6701     and ask the layer for the field type, rather than the classification.
6702     (Classifier.__SetGridTable): Retrieve the field and field type
6703     for the table because they are not in the classification.
6704     (Classifier._OnTry, Classifier._OnRevert): Set the classification
6705     field on the layer in addition to the classification itself.
6706    
6707     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
6708     classification field from layer.
6709    
6710     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
6711     classification field from layer. Split up tests and remove
6712     *-imports. Fixes RTbug #1992.
6713    
6714     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
6715    
6716     * test/test_classification.py
6717     (TestClassification.test_classification): Remove tests for methods
6718     that no longer exist.
6719    
6720     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
6721     __init__ no longer has a field parameter, use SetClassificationField.
6722     (SetShapeStoreTests.test_sanity): Use layer object to get class
6723     field info.
6724    
6725     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
6726     SetClassificationField on layer to set class field info.
6727    
6728     * test/test_viewport.py: Renamed from test/test_view.py.
6729    
6730 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
6731    
6732     * Doc/manual/thuban-manual.xml: Added authors and an initial
6733     coarse structure.
6734    
6735 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
6736    
6737 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
6738     and therefore should not be derived from any other class.
6739    
6740     * test/test_range.py (RangeTest): FloatComparisonMixin is a
6741     mix-in, so derive from TestCase as well.
6742    
6743     2003-07-15 Bernhard Herzog <[email protected]>
6744    
6745 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
6746     draw_func handling a bit to remove one layer of indirection. This
6747     makes the renderer about 10% faster in the non-classifying case
6748     and the code a bit cleaner
6749     (MapRenderer.draw_point_shape): Add the pen and brush parameters
6750     and set them in the dc. Now the draw_point_shape method and
6751     wxproj's draw_polygon_shape function have basically the same
6752     signature so that both can be directly used as draw_func
6753    
6754     2003-07-15 Bernhard Herzog <[email protected]>
6755    
6756 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
6757     string values (in addition to the labels) as UTF 8
6758    
6759     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
6760     values if the field type is string
6761    
6762     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
6763     saving a session with non-ascii string classification values.
6764    
6765     * test/test_load.py (TestClassification.file_contents)
6766     (TestClassification.test): Check for non-ascii values in string
6767     classifications
6768    
6769 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
6770    
6771     * test/test_view.py: New. Tests for ViewPort.
6772    
6773 frank 1409 2003-07-14 Frank Koormann <[email protected]>
6774    
6775     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
6776     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
6777    
6778 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
6779     unicode strings from session file: session title, map title and
6780     projection name.
6781    
6782 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
6783    
6784 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
6785     drag_stop, not drag_move when the mouse is released.
6786    
6787     2003-07-10 Jonathan Coles <[email protected]>
6788    
6789 jonathan 1403 The most important part of this is the seperation of view.py into
6790     two pieces. viewport.py now has a class called ViewPort which
6791     contains all the non-wx parts of view.py and can therefore be
6792     tested. view.py contains only the wx-specific parts and is fairly
6793     simple.
6794    
6795     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
6796     RTTbug #1992.
6797     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
6798     RTTbug #1992.
6799    
6800     * Thuban/Model/classgen.py (generate_singletons,
6801     generate_uniform_distribution, generate_quantiles):
6802     Added 'fixes' parameter so that property attributes can
6803     be held constant over the generated classification groups.
6804     (CustomRamp.GetProperties): Remove unused variables.
6805    
6806     * Thuban/Model/map.py (Map.SetProjection): Send the old
6807     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
6808     event.
6809    
6810     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
6811     parameter which is a list of records that restricts which
6812     records are saved. Fixes RTbug #1997.
6813    
6814     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6815     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
6816    
6817     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
6818     to allow the user to fix line color/width on generated groups.
6819     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
6820     functions to optionally fix group properties.
6821    
6822     * Thuban/UI/main.py (main): Set exception hook to the
6823     ShowExceptionDialog. Fixes RTbug #1993.
6824    
6825     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
6826     the table window when it is selectd to be shown.
6827    
6828     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
6829     Export Selection button and move the export buttons underneath
6830     the table.
6831     (QueryTableFrame.UpdateStatusText): Added event argument so
6832     that it can respond to grid selection events. The status text
6833     is now updated even when the table is not associated with a
6834     layer as was previously assumed.
6835     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
6836     UpdateStatusText responds to these events.
6837     (QueryTableFrame.OnSaveAs): Renamed to doExport.
6838     (QueryTableFrame.doExport): Helper function that saves the
6839     entire table, or selected rows, to a file.
6840     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
6841     Respond to export button events and call doExport.
6842    
6843     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
6844     the function doesn't return NULL without first setting a Python
6845     Error.
6846    
6847     * test/runtests.py (main): Only print "Unknown option" for
6848     unsupported options.
6849    
6850     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
6851     optional epsilon argument to specify floating point accuracy.
6852     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
6853     for each item test.
6854    
6855     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
6856     tests for saving selected records.
6857    
6858     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6859     tests for saving selected records.
6860    
6861     * test/test_map.py (TestMapWithContents.test_set_projection):
6862     MAP_PROJECTION_CHANGED events send the old projection.
6863    
6864     * test/test_session.py
6865     (TestSessionWithContent.test_forward_map_projection):
6866     MAP_PROJECTION_CHANGED events send the old projection.
6867    
6868     * test/test_table.py (TableTest): Update tests to use non-deprecated
6869     functions.
6870    
6871 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
6872    
6873 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
6874     constants in the column objects are the standard ones defined in
6875     the table module.
6876    
6877     * test/test_transientdb.py
6878     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
6879     exporting transient tables as DBF works. This should catch the bug
6880     just fixed in TransientTableBase.Width.
6881    
6882     2003-07-08 Bernhard Herzog <[email protected]>
6883    
6884 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
6885     interpolated colors correctly.
6886    
6887     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
6888     New. Test case for the fix in classgen.py
6889    
6890     2003-07-08 Bernhard Herzog <[email protected]>
6891    
6892 bh 1378 * test/runtests.py (main): Make the default output less verbose
6893     and add a verbosity option (-v) to get the old output
6894    
6895     2003-07-08 Bernhard Herzog <[email protected]>
6896    
6897 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
6898     0.9.
6899    
6900     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
6901     New. Return the join type
6902    
6903     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
6904     DTD
6905     (SessionSaver.write_data_containers): Save the join type for
6906     joined tables
6907    
6908     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
6909     namespace
6910     (SessionLoader.start_jointable): Handle the jointype attribute
6911    
6912     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
6913     as of Thuban 0.8. These are now tests to determine whether Thuban
6914     can still read files generated by Thuban 0.8
6915    
6916     * test/test_load.py (LoadSessionTest.dtd)
6917     (TestSingleLayer.file_contents)
6918     (TestLayerVisibility.file_contents, TestLabels.file_contents)
6919     (TestLayerProjection.file_contents)
6920     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
6921     (TestJoinedTable.file_contents)
6922     (TestLoadError.file_contents): Update for new DTD
6923     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
6924     for new join type attribute
6925    
6926     * test/test_save.py (SaveSessionTest.dtd)
6927     (SaveSessionTest.testEmptySession)
6928     (SaveSessionTest.testSingleLayer)
6929     (SaveSessionTest.testLayerProjection)
6930     (SaveSessionTest.testRasterLayer)
6931     (SaveSessionTest.testClassifiedLayer)
6932     (SaveSessionTest.test_dbf_table)
6933     (SaveSessionTest.test_joined_table): Update for new DTD
6934     (SaveSessionTest.test_joined_table): Add test for new join type
6935     attribute
6936    
6937 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
6938    
6939     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
6940     function for table_to_dbf
6941     (table_to_dbf): Deal with names longer than the 10 character limit
6942    
6943     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6944     doc-string
6945     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
6946     long column names
6947    
6948 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
6949    
6950 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
6951    
6952     2003-07-03 Bernhard Herzog <[email protected]>
6953    
6954 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
6955     for the Thuban manual and README with some basic information about
6956     the manual
6957    
6958     2003-07-03 Bernhard Herzog <[email protected]>
6959    
6960 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6961     Update doc-string
6962     (TransientJoinedTable.create): Do not modify the column objects of
6963     the input tables in place and copy all columns of the input tables
6964     into the joined table after all.
6965    
6966     * test/test_transientdb.py
6967     (TestTransientTable.test_transient_joined_table_same_column_name):
6968     Update to reflect the new behavior
6969     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6970     Update to reflect the new behavior
6971     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
6972     New test case for a bug which modified the column objects in place
6973    
6974 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
6975 jonathan 1349
6976 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
6977     generate_uniform_distribution, generate_quantiles,
6978 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
6979     one, otherwise we could divide by zero.
6980    
6981     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
6982     ClassGenTest.doClassSingleTest): Call doBoundsTest to
6983     check the end classification groups against the
6984     proper property values.
6985     (ClassGenTest.doBoundsTest): New. Checks the first and
6986     last classification groups to make sure their properties
6987     are the correct upper and lower bounds for a color ramp.
6988    
6989     2003-07-02 Jonathan Coles <[email protected]>
6990    
6991     * Thuban/Model/classgen.py (generate_singletons,
6992     generate_uniform_distribution, generate_quantiles,
6993 jonathan 1360 GenQuantiles0): The denominator was one to high when
6994     calculating the index for the ramp causing the index
6995     to never to reach one.
6996    
6997     2003-07-02 Jonathan Coles <[email protected]>
6998    
6999 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
7000     ClassGroupRange.SetRange() so that the min/max values are
7001     passed as a tuple. This makes a better calling scheme for
7002     when a Range object is passed instead.
7003    
7004     * Thuban/Model/classgen.py: Fixed parameters to
7005     ClassGroupRange constructor.
7006    
7007     * Thuban/Model/classification.py (ClassGroupRange.__init__):
7008     Consolidate the min/max parameters into a single _range which
7009     can either be a tuple or a Range object.
7010     (ClassGroupRange.SetRange): Consolidate the min/max parameters
7011     into a single _range which can either be a tuple or a Range object.
7012    
7013     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
7014     call to ClassGroupRange constructor to use a tuple.
7015    
7016     * Thuban/Model/layer.py (Layer.SetClassification): Switch
7017     the classification instance variable to the new class
7018     before calling _set_layer otherwise subscribers to a
7019     LAYER_CHANGED event will not see any difference.
7020    
7021     * test/test_classification.py: Fix tests of ClassGroupRange
7022     so that they use the new signature.
7023    
7024     * test/test_load.py: Fix use of ClassGroupRange so that it
7025     uses the new signature.
7026    
7027     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
7028     uses the new signature.
7029    
7030     * test/test_save.py: Fix use of ClassGroupRange so that it
7031     uses the new signature.
7032    
7033    
7034     2003-07-01 Jonathan Coles <[email protected]>
7035    
7036 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
7037     Import used objects/class from color.
7038     (generate_singletons): We don't
7039     need the numGroups parameter anymore because we are using
7040     the new ramps with GetProperties().
7041     (generate_uniform_distribution): Use new ramp method
7042     GetProperties().
7043     (generate_quantiles, GenQuantiles0): Use new ramp method
7044     GetProperties().
7045     (CustomRamp.SetNumGroups): Removed. The ramps now map
7046     a value from 0 to 1 to class properties so the number
7047     of groups is not needed ahead of time.
7048     (CustomRamp.next): Removed. CustomRamp does not support
7049     interation anymore.
7050     (CustomRamp.GetProperties): Returns a ClassGroupProperties
7051     object based on the index value from 0 to 1 that is
7052     passed to it.
7053     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
7054     Made into instances of Monochromatic class instread of
7055     deriving from it.
7056     (HotToCold.SetNumGroups): Removed. See CustomRamp.
7057     (HotToCold.next): Removed. See CustomRamp.
7058    
7059     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
7060     (Classification.SetField, Classification.SetFieldType):
7061     Replaced with SetFieldInfo.
7062     (Classification.SetFieldInfo): New. Does a better job of
7063     what SetField and SetFieldType used to do by combining
7064     their function since they should really always be done
7065     at the same time.
7066     (Classification.SetLayer): Renamed to _set_layer.
7067     (Classification._set_layer): Should only be called from
7068     Layer's SetClassification. This does not cause a recursive
7069     call as SetLayer did because we know that Layer knows about
7070     the classification.
7071    
7072     * Thuban/Model/color.py: Fixes RTbug #1971.
7073     (_Transparent): Renamed from Transparent so it doesn't
7074     conflict with the module variable.
7075     (Transparent, Black): Renamed from Color.Transparent,
7076     Color.Black so they are not class variables.
7077    
7078     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
7079     (Layer.Destroy): We don't need to call SetClassification
7080     anymore to clear out the back reference in the classifcation
7081     to the layer. It's better to set it to None using _set_layer,
7082     and we won't be creating another clas object too.
7083     (Layer.SetClassification): Classification._set_layer is not
7084     recursive so remove all the locking variables. Also clean
7085     up the code so that it remains unchanged if something fails.
7086    
7087     * Thuban/Model/load.py: Fixes RTbug #1971.
7088     (SessionLoader.start_classification): Call
7089     Classification.SetFieldInfo().
7090    
7091     * Thuban/Model/save.py: Removed import of Color which wasn't
7092     being used.
7093    
7094     * Thuban/UI/classgen.py: Fixes RTbug #1972.
7095     (ClassGenDialog.__init__): Color ramps are now instances
7096     already so we don't need to create any new objects.
7097     (ClassGenDialog.OnOK): Check for numGroups is no longer
7098     necessary because we never use it.
7099    
7100     * Thuban/UI/classifier.py: Fixes RTbug #1971.
7101     (Classifier.__BuildClassification, Classifier.__SetGridTable):
7102     Call Classification.SetFieldInfo() instead of SetFieldType.
7103    
7104     * Thuban/UI/renderer.py: Fixes RTbug #1971.
7105    
7106     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
7107     (MapCanvas.__init__): Subscribe to the idle time event. Set
7108     background color to white.
7109     (MapCanvas.OnPaint): Set a flag indicating that we should
7110     render the map during idle time. If we already have a bitmap
7111     just draw it now.
7112     (MapCanvas.OnIdle): New. Render the map only during idle time.
7113     This also fixes a problem with the busy cursor under gtk.
7114    
7115     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
7116     Fix calls to generate_singletons because the signature changed.
7117    
7118     * test/test_classification.py: Fix color references and
7119     change calls to Classification.[SetField|SetFieldType] to
7120     SetFieldInfo.
7121    
7122     * test/test_load.py: Fix color references.
7123    
7124     * test/test_load_0_2.py: Fix color references.
7125    
7126     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
7127     Change calls to Classification.[SetField|SetFieldType] to
7128     SetFieldInfo.
7129    
7130 frank 1334 2003-07-01 Frank Koormann <[email protected]>
7131    
7132     MERGE from the greater-ms3 branch.
7133    
7134     * test/test_transientdb.py
7135     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
7136     New. Test join of two tables with partly equal column names.
7137    
7138     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
7139     If duplicates in left and right tables column names are found,
7140     append '_' (underscores) to the name until it is unique.
7141     Create always new internal names for the resulting table and reference
7142     columns in the join statement with <table>.<column>
7143    
7144 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
7145    
7146     * test/test_transientdb.py
7147     (TestTransientTable.test_transient_joined_table_same_column_name):
7148     New. Test whether joining on columns with the same names in both
7149     tables works.
7150 frank 1334
7151 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
7152     sure to use the right internal names even when joining on field
7153     with the same names in both tables. Also, detect duplicate names
7154     in the joined table correctly.
7155    
7156 frank 1325 2003-07-01 Frank Koormann <[email protected]>
7157    
7158     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
7159     Reverse List of layers to render in same order as in desktop legend.
7160    
7161 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
7162    
7163 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
7164     and splits it into a tuple of at most three integers.
7165     Used make_tuple() to make tuple versions of the version
7166     numbers.
7167    
7168     * Thuban/UI/about.py: Add Thuban email addresses.
7169    
7170     2003-06-30 Jonathan Coles <[email protected]>
7171    
7172 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
7173     were too high.
7174    
7175     2003-06-30 Jonathan Coles <[email protected]>
7176    
7177 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
7178    
7179     * MANIFEST.in: Added Projections so that default.proj is
7180     included.
7181    
7182 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
7183    
7184     New About box with lots more information including library
7185     versions and credits. More/better version checking before
7186     Thuban starts.
7187    
7188     * Thuban/UI/about.py: New. New About box that displays
7189     library version information and credits.
7190    
7191     * Thuban/version.py: Added new 'versions' dictionary which
7192     contains the verions of various libraries which are checked
7193     when the module loads.
7194     (verify_versions): Check all version numbers and returns
7195     a list of errors.
7196    
7197     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
7198     Reset the status of the buttons as the situation warrants,
7199     but in a better more reliable way by not relying on the
7200     current status to determine what needs to change.
7201    
7202     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
7203     (verify_versions): Remove most of the code since it is
7204     now in Thuban.version.verify_versions.o
7205    
7206     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
7207     About box in Thuban.UI.about.
7208    
7209     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
7210     Returns the version of gdal library being used as a string.
7211    
7212     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
7213     Removed.
7214     (get_proj_version): Return the version of PROJ that the file
7215     was compiled with.
7216     (get_gtk_version): Return th version of GTK that the file
7217     was compiled with.
7218    
7219 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
7220    
7221     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
7222     of the SelectPropertiesDialog should be self so the window
7223     appears on top.
7224     (ClassGroupPropertiesCtrl.DoEdit): The parent
7225     of the SelectPropertiesDialog should be self so the window
7226     appears on top.
7227    
7228     * Thuban/UI/resource.py: Cleaned up how we determine file
7229     extensions.
7230     (GetImageResource): Return an wxImage from our Resources.
7231    
7232 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
7233    
7234     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
7235     Check that a layer has a classification before trying
7236     to get it. Raster layers don't have classifications.
7237    
7238 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
7239 jonathan 1297
7240     * setup.py: Add Resources/XML to resource list.
7241    
7242     2003-06-23 Jonathan Coles <[email protected]>
7243 jonathan 1286
7244 jonathan 1297 * setup.cfg: Fix copyright dates
7245    
7246     2003-06-23 Jonathan Coles <[email protected]>
7247    
7248 jonathan 1294 * MANIFEST.in: Update with Resources/XML
7249    
7250     * setup.py: Don't include Locale resources yet as we don't
7251     have any and it causes problems building the distribution
7252     for Windows. Update version to 0.8.0.
7253    
7254     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
7255    
7256     * Thuban/UI/mainwindow.py: Add blank line at the end because
7257     file was not being read correctly building the Windows
7258     distribution.
7259    
7260     2003-06-23 Jonathan Coles <[email protected]>
7261    
7262 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
7263    
7264     * Thuban/version.py: Temporarily update longversion for
7265     the 0.8 release so that it doesn't have the cvs revision.
7266    
7267     2003-06-23 Jonathan Coles <[email protected]>
7268    
7269 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
7270     to make sure that we don't create reentrant possibilities with
7271     wxYield.
7272    
7273     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
7274     directly to avoid the wxSafeYield() call which generates an
7275     OnPaint event causing infinite recursion. Don't try to catch
7276     exception anymore. This was for before there were limits on map
7277     scaling.
7278    
7279 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
7280    
7281     Bug fix for RT #1961:
7282    
7283     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
7284     Register DerivedShapestores with the session
7285    
7286     * Thuban/Model/session.py (Session.Tables): Make sure each table
7287     is only listed once.
7288    
7289     * test/test_load.py (TestJoinedTable.test): Add check_format call.
7290     Update file contents to match the one written out.
7291    
7292 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
7293    
7294     * test/xmlsupport.py (SaxEventLister.startElementNS)
7295     (SaxEventLister.endElementNS): Do not include the qname. Python
7296     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
7297     is (presumably incorrectly) None, whereas it's a string with the
7298     element name in the later versions.
7299    
7300     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
7301     (TestEventList.test_even_list_namespace): Update tests to reflect
7302     the new behaviour
7303     (TestEventList.test_even_list_id_normalization): Fix doc-string
7304    
7305 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
7306    
7307 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
7308     by deriving classes to determine if that layer supports shapes.
7309     (Layer): Override HasShapes and return true.
7310    
7311     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
7312     instead of a direct call to wx[Begin|End]CusyCursor().
7313     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
7314     table data.
7315    
7316     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
7317     New. Wrappers around the wxWindows functions that allow us to
7318     make additional calls such as wxYield which gives the native
7319     system a chance to update the cursor correctly.
7320    
7321     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
7322     instead of a direct call to wx[Begin|End]CusyCursor().
7323    
7324     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
7325     instead of a direct call to wx[Begin|End]CusyCursor().
7326     (MapCanvas.find_shape_at): Check if the current search layer
7327     support shapes, otherwise go on to the next layer.
7328    
7329     * test/test_layer.py: Add tests in each type of layer for
7330     HasClassification() and HasShapes()
7331    
7332     2003-06-20 Jonathan Coles <[email protected]>
7333    
7334 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
7335     turning on the busy cursor to allow the system to change the
7336     cursor before we begin painting. This fixes a problem that
7337     was occuring only under GTK. Fixes RTbug #1840.
7338    
7339 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
7340    
7341     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
7342     version.
7343    
7344     * Thuban/Model/save.py (sort_data_stores): New. Make topological
7345     sort of the data sources so they can be written with sources that
7346     data sources that depend on other data sources come after the
7347     sources they depend on.
7348     (SessionSaver.__init__): Add idmap instance variable to map from
7349     objects to the ids used in the file.
7350     (SessionSaver.get_id, SessionSaver.define_id)
7351     (SessionSaver.has_id): New. Methods to manage the idmap
7352     (SessionSaver.write): Use thuban-0.8.dtd
7353     (SessionSaver.write_session): Add a namespace on the session and
7354     write out the data sources before the maps.
7355     (SessionSaver.write_data_containers): New. Write the data
7356     containers.
7357     (SessionSaver.write_layer): Layer elements now refer to a
7358     shapestore and don't contain filenames anymore.
7359    
7360     * Thuban/Model/load.py (LoadError): Exception class to raise when
7361     errors in the files are discovered
7362     (SessionLoader.__init__): Define dispatchers for elements with a
7363     thuban-0.8 namespace too.
7364     (SessionLoader.check_attrs): New helper method to check and
7365     convert attributes
7366     (AttrDesc): New. Helper class for SessionLoader.check_attrs
7367     (SessionLoader.start_fileshapesource)
7368     (SessionLoader.start_derivedshapesource)
7369     (SessionLoader.start_filetable, SessionLoader.start_jointable):
7370     Handlers for the new elements in the new fileformat
7371     (SessionLoader.start_layer): Handle the shapestore attribute in
7372     addition to filename.
7373     (SessionLoader.start_table, SessionLoader.end_table): Removed.
7374     They were never used in the old formats and aren't needed for the
7375     new.
7376    
7377     * Thuban/Model/session.py (Session.DataContainers): New method to
7378     return all "data containers", i.e. shapestores and tables
7379    
7380     * test/xmlsupport.py (SaxEventLister.__init__)
7381     (SaxEventLister.startElementNS, sax_eventlist): Add support to
7382     normalize IDs.
7383    
7384     * test/test_xmlsupport.py
7385     (TestEventList.test_even_list_id_normalization): New test case for
7386     id normalization
7387    
7388     * test/test_load.py (LoadSessionTest.check_format): Use ID
7389     normalization
7390     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
7391     class atrributes used for ID normalization
7392     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
7393     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
7394     file format
7395     (TestJoinedTable): New test for loading sessions with joined
7396     tables.
7397     (TestLoadError): New. Test whether missing required attributes
7398     cause a LoadError.
7399    
7400     * test/test_save.py (SaveSessionTest.thubanids)
7401     (SaveSessionTest.thubanidrefs): New class attributes for ID
7402     normalization in .thuban files.
7403     (SaveSessionTest.compare_xml): Use id-normalization.
7404     (SaveSessionTest.testEmptySession)
7405     (SaveSessionTest.testLayerProjection)
7406     (SaveSessionTest.testRasterLayer)
7407     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
7408     (SaveSessionTest.testLayerProjection): The filename used was the
7409     same as for testSingleLayer. Use a different one.
7410     (SaveSessionTest.test_dbf_table)
7411     (SaveSessionTest.test_joined_table): New test cases for saving the
7412     new data sources structures.
7413     (TestStoreSort, MockDataStore): Classes to test the sorting of the
7414     data stores for writing.
7415    
7416     * test/runtests.py: Add CVS keywords
7417    
7418 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
7419    
7420 jonathan 1267 * test/test_session.py
7421     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
7422     Use the cultural_landmark-point.dbf file for the store so that
7423     the table rows and shape count match.
7424    
7425     2003-06-20 Jonathan Coles <[email protected]>
7426    
7427 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
7428     an exception if the number of shapes is different from the
7429     number of rows in the table. Address RTbug #1933.
7430    
7431     * test/test_layer.py (TestLayer.test_derived_store): Add
7432     a test for the new exception in DerivedShapeStore.__init__.
7433    
7434     * test/support.py (FloatTestCase): Removed since there is
7435     already FloatComparisonMixin. Fixes RTbug #1954.
7436     (FloatComparisonMixin.assertFloatEqual): Include test for
7437     infinity that was part of FloatTestCase.
7438    
7439     * test/test_range.py (RangeTest): Inherit from
7440     support.FloatComparisonMixin now that we don't have
7441     support.FloatTestCase.
7442    
7443 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
7444    
7445 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
7446     the implementation in xmlsupport instead.
7447     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
7448    
7449     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
7450     of test_save
7451    
7452     2003-06-20 Bernhard Herzog <[email protected]>
7453    
7454 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
7455     method to make sure the test files we load might have been written
7456     by the current thuban version.
7457     (ClassificationTest.TestLayers, TestSingleLayer.test)
7458     (TestLayerVisibility.test, TestClassification.test)
7459     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
7460     Add check_format() calls and fix the thuban data to match the data
7461     that would be written by saving the session loaded from it.
7462    
7463     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
7464     the same class and function in test_save.
7465    
7466     * test/test_xmlsupport.py (TestEventList): New. test cases for
7467     sax_eventlist
7468    
7469     2003-06-20 Bernhard Herzog <[email protected]>
7470    
7471 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
7472     Thuban are covered by this DTD
7473     (map): Fix content model for layers and raster layers. There can
7474     be any number or layers and raster layers in any order.
7475    
7476 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
7477    
7478 jonathan 1265 This is mainly about fixing RTbug #1949.
7479    
7480 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
7481     import statement since python 2.2 is the earliest supported
7482     version.
7483    
7484     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
7485     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
7486     depending on the units this projection *forwards* into.
7487    
7488     * Thuban/Model/save.py (SessionSaver.write_classification):
7489     Remove unnecessary use of lambdas and nested functions.
7490    
7491     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
7492     adjustment here if the map projection uses degrees.
7493    
7494     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
7495     scale adjust code since it is now done before calling
7496     this method. Don't do anything if the map projection
7497     is None.
7498    
7499 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
7500    
7501 bh 1248 Move version specific load tests to their own file.
7502    
7503     * test/test_load.py: Expand the doc-string to explain a bit how to
7504     handle file format changes.
7505     (TestClassification.test): Update the docstring as this test is
7506     not about Thuban 0.2 anymore.
7507    
7508     * test/test_load_0_2.py: New file with the load tests for thuban
7509     files created with Thuban 0.2 and earlier.
7510    
7511     2003-06-19 Bernhard Herzog <[email protected]>
7512    
7513 bh 1246 Add XML validation to some of the tests. Validation will only be
7514     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
7515     To make the DTD available to the test cases it's moved into
7516     Resources/XML
7517    
7518     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
7519     for versions up to and including 0.2. Two slight changes: added an
7520     encoding specification and fixed the comment which refered to
7521     GRASS, not Thuban
7522    
7523     * test/xmlsupport.py: New support module for tests involving XML.
7524     Currently there's a mix-in class for XML validation.
7525    
7526     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
7527    
7528     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
7529     so that we can validate the
7530     (SaveSessionTest.testEmptySession)
7531     (SaveSessionTest.testSingleLayer)
7532     (SaveSessionTest.testSingleLayer)
7533     (SaveSessionTest.testLayerProjection)
7534     (SaveSessionTest.testRasterLayer)
7535     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
7536    
7537     * test/runtests.py (main): Call print_additional_summary instead
7538     of print_garbage_information
7539    
7540     * test/support.py (resource_dir): New function to return the
7541     "Resource" subdirectory
7542     (print_additional_summary): New function to combine several
7543     summary functions
7544     (run_tests): Use print_additional_summary instead of calling
7545     print_garbage_information directly
7546    
7547     2003-06-19 Bernhard Herzog <[email protected]>
7548    
7549 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
7550     the classification element.
7551     (projection): Add the "name" attribute
7552    
7553 frank 1242 2003-06-19 Frank Koormann <[email protected]>
7554    
7555     MERGE from the greater-ms3 branch.
7556    
7557     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
7558     scale if projection is latlong to get better estimate.
7559    
7560     Fix problem of hidden properties dialog under windows after double
7561     click on layer tree:
7562     The tree control always gets an Expanded / Collapsed event after
7563 joey 2162 the ItemActivated on double click, which raises the main window again.
7564     We add a second ItemActivated event to the queue, which simply
7565 frank 1242 raises the already displayed window.
7566    
7567     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
7568     raiseProperties initialized to prevent endless loops
7569     (LegendTree._OnItemActivated): Depending on self.raiseProperties
7570     simply raise the properties or open the dialog and issue a second
7571     event.
7572    
7573 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
7574    
7575 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
7576    
7577     2003-06-18 Jonathan Coles <[email protected]>
7578    
7579 jonathan 1235 When Thuban loaded the map was redrawn twice because the
7580     legend was being opened after the mainwindow was created
7581     and not during its creation. This meant the map was drawn
7582     initially and then had to be redrawn when the legend
7583     caused the display to change. Now the legend is opened
7584     in the mainwindow constructor which resolves this issue.
7585    
7586     Also, although we were checking for the existence of
7587     gdal and gdalwarp modules, the gdalwarp extension was
7588     still being compiled (which may fail if the system doesn't
7589     have gdal installed). the build_ext command to setup.py
7590     now accepts the flags --with-gdal and --without-gdal.
7591     If --without-gdal is specified setup.py will try to
7592     use the gdal parameters specified by gdal-config. Under
7593     windows, those parameters have to be set in setup.py
7594     as with proj4 an wxWindows.
7595    
7596     * setup.py: Use a list instead of seperate variables for
7597     extension parameters so we can create a generic function
7598     that runs an appropriate *-config script.
7599     (run_cs_script): Renamed from run_wx_script and modified
7600     to accept a second argument which is a list of lists to
7601     be filled in by the values returned from running the command.
7602     (thuban_build_ext): New. Extends the build_ext command and
7603     provides the options --with-gdal/--without-gdal which then
7604     optionally includes the gdalwarp extension.
7605    
7606     * Thuban/Model/resource.py: First check if we can import
7607     the gdalwarp Thuban extension before checking for gdal.
7608     Also added some comments.
7609    
7610     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
7611     the map is None which may be the case if none has been loaded
7612     yet.
7613    
7614     * Thuban/UI/main.py (main): Remove call to ShowLegend.
7615    
7616     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
7617    
7618     * Thuban/UI/renderer.py: Check for gdal support before importing
7619     gdalwarp.
7620     (MapRenderer.render_map): Only try to optimize if we have gdal
7621     support otherwise nothing will get drawn.
7622    
7623 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
7624     during startup before a map has been created. Check if map is None
7625     before using it and do nothing if it is.
7626    
7627 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
7628    
7629     Fix the problem with raster layers under Windows that caused
7630     Thuban to crash. The view should respond to layer projection
7631     changed events to update the display. Changes to a projection
7632     should not cause the map to be set to full extent.
7633    
7634     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7635     current_map_proj to remember the current map projection so that
7636     when the projection changes we know what the previous projection
7637     was.
7638     (MapCanvas.SetMap): Unsubscribe and subscribe to
7639     LAYER_PROJECTION_CHANGED events.
7640     (MapCanvas.projection_changed): Split into two methods that respond
7641     to map and layer projection changes.
7642     (MapCanvas.map_projection_changed): New. Takes the current view and
7643     projects it using the new projection. This does not cause the
7644     map to be redrawn at full extent.
7645     (MapCanvas.layer_projection_changed): New. Cause a redraw which
7646     will draw each layer in its new projection.
7647    
7648     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
7649     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
7650     under Windows.
7651    
7652     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
7653     to twice sizeof(void*) because there are two digits for each
7654     hex byte.
7655    
7656 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
7657    
7658     Update to the layer interface: Direct access to the table,
7659     shapetable, shapefile and filename attributes is now actively
7660     deprecated by issuing deprecation warnings for all places where
7661     this happens.
7662    
7663     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
7664     to the instance variables table, shapetable, shapefile and
7665     filename via __getattr__ so that we can issue a deprecation
7666     warning.
7667     (Layer.SetShapeStore): Don't set the deprecated instance variables
7668     any more
7669     (Layer.SetShapeStore): Don't use deprecated layer instance
7670     variables
7671     (Layer.Destroy): No need to explicitly remove the instance
7672     variables any more
7673     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
7674     instance variables
7675    
7676     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7677     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
7678     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
7679     use deprecated layer instance variables
7680    
7681     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
7682     deprecated layer instance variables
7683    
7684     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7685     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
7686     instance variables
7687    
7688     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
7689     deprecated layer instance variables
7690    
7691     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
7692     deprecated layer instance variables
7693    
7694     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
7695     deprecated layer instance variables
7696    
7697     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
7698     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
7699     variables
7700    
7701     * test/runtests.py (main): Turn Thuban's deprecation warnings into
7702     errors so that they're cought by the tests
7703    
7704     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
7705     layer instance variables
7706    
7707 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
7708    
7709     Fix a problem under Windows whereby if the user double-clicks on a
7710     layer in the legend that tree item will expand or collapse as well
7711     as open the layer properties dialog. The state of the tree item
7712     should not be affected.
7713    
7714     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
7715     preventExpandCollapse and subscribe to expanding and collapsing
7716     events.
7717     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
7718     collapsing events and will veto the event if it has been triggered
7719     by the user double clicking on a layer.
7720     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
7721     that an expanding/collapsing event should be vetoed.
7722    
7723 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
7724    
7725     * Thuban/UI/classifier.py (Classifier.OnClose)
7726     (Classifier.map_layers_removed)
7727     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
7728     in OnClose and not in map_layers_removed or
7729     layer_shapestore_replaced to make sure it always happens when the
7730     dialog is closed
7731    
7732 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
7733    
7734 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
7735     the background of the table view appears correctly.
7736    
7737     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
7738     object that can be used by derived classes to place any
7739     controls (including the grid) onto.
7740     (QueryTableFrame.__init__): Use the panel as the parent window
7741     for all the controls. Reparent the grid so that the panel is
7742     the parent. Call UpdateStatusText() to correctly initialize
7743     the status bar.
7744    
7745     2003-06-13 Jonathan Coles <[email protected]>
7746    
7747 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
7748     from wxFrame (as opposed to wxDialog like the other classes)
7749     but otherwise behaves like the other classes. This is needed
7750     for the TableView which isn't really a dialog and needs to
7751     have a status bar and control buttons.
7752    
7753     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
7754     instance variable to keep track of how many rows are selected.
7755     Subscribe once to the the events we are interested in.
7756     (ThubanGrid.OnRangeSelect): Only handle event if event handling
7757     hasn't been turned off.
7758     (ThubanGrid.OnSelectCell): Only handle event if event handling
7759     hasn't been turned off.
7760     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
7761     as an event listener (which changes the event handler stack)
7762     simply set an instance variable to False. This is checked in
7763     the event handlers.
7764     (ThubanGrid.GetNumberSelected): Return the number of currently
7765     selected rows.
7766     (TableFrame): Inherit from ThubanFrame so we can have a
7767     status bar and control buttons.
7768     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
7769     Explicitly set which items are selected in the operator choice and
7770     action choice so there is always a valid selection. Fixes RTbug #1941.
7771     Subscribe to grid cell selection events so we can update the
7772     status bar.
7773     (QueryTableFrame.UpdateStatusText): Update the status bar with
7774     how many rows are in the grid, how many columns, and how many
7775     rows are selected.
7776     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
7777     Call UpdateStatusText when cells are (de)selected.
7778     (QueryTableFrame.OnQuery): Use the string value in the value
7779     combo if either the selected item index is 0 or if the string
7780     cannot be found in the predefined list (this happens if the
7781     user changes the text). Fixes RTbug #1940.
7782     Only turn off the grid event listeners if there a query comes
7783     back with a none empty list of ids. in the case that the list
7784     is empty this causes a grid.ClearSelection() call to actually
7785     clear the grid selection which causes the selected items in
7786     the map to be deselected. Fixes RTbug #1939.
7787    
7788     * test/test_save.py (XMLWriterTest.Encode): Check return values.
7789     Fixes RTbug #1851.
7790    
7791 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
7792    
7793     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
7794     self.selected_shape with the current selection to make sure the
7795     contents of the dialog are up to date when it's shown for the
7796     first time.
7797     The dialog used to work without this by luck. The recent fix to
7798     the connector module 'broke' a 'feature' the identify view was
7799     relying on, i.e that subscribing to a message in response to
7800     receiving a message of that type would mean that the new
7801     subscriber would also be called for the same message.
7802    
7803 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
7804 jonathan 1175
7805 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
7806     the image is rendered. Fixes RTbug #1937.
7807    
7808     2003-06-12 Jonathan Coles <[email protected]>
7809    
7810 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
7811 jonathan 1193 user directory if it doesn't exist on a posix system.
7812     Fixes RTbug #1815.
7813 jonathan 1191
7814     * Thuban/Model/resource.py (get_user_proj_files): Moved the
7815     called to get_application_dir here, so that the directory
7816     will only be called if this method is invoked.
7817    
7818     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
7819     the projfilepath if no projection is selected.
7820    
7821     2003-06-12 Jonathan Coles <[email protected]>
7822    
7823 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
7824     the scalebar if the current map has no projection set.
7825    
7826     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
7827     projfilepath label to just the basename of the projection file
7828     rather than include the entire path.
7829    
7830     * Thuban/Model/resource.py: Fix missed proj functions that
7831     needed to be renamed.
7832    
7833     2003-06-12 Jonathan Coles <[email protected]>
7834    
7835 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
7836     tested if the variable was an instance of Color.
7837    
7838     * Thuban/Model/color.py (Color): Remove commented code that isn't
7839     used.
7840     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
7841     Fixes RTbug #1835.
7842     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
7843     Needed now that the class doesn't inherit from Color.
7844    
7845     2003-06-12 Jonathan Coles <[email protected]>
7846    
7847 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
7848     check unicode strings.
7849    
7850     * test/test_layer.py: Check for existence of gdal.
7851    
7852     2003-06-12 Jonathan Coles <[email protected]>
7853 jonathan 1172
7854     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
7855     that was in load.py
7856 jonathan 1169
7857 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
7858     that was in save.py
7859    
7860     2003-06-12 Jonathan Coles <[email protected]>
7861    
7862 jonathan 1169 This is largely a collection of bug fixes. We also handle the
7863     case where gdal is not on the system. The XMLReader and XMLWriter
7864     classes were moved into there own files to resolve some circular
7865     import references and because they shouldn't really be in the
7866     file that is dediciated to reading/writing session files since
7867     they are also used elsewhere.
7868    
7869     * Thuban/Model/classgen.py: Renamed functions to follow the
7870     function_names_with_underscores style. Fixes RTbug #1903.
7871     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7872    
7873     * Thuban/Model/layer.py: Import gdal only if it available.
7874     (RasterLayer): Handle the case where the gdal library is unavailable.
7875     Addresses RTbug #1877.
7876    
7877     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7878     xmlreader.py.
7879    
7880 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
7881    
7882     This is largely a collection of bug fixes. We also handle the
7883     case where gdal is not on the system. The XMLReader and XMLWriter
7884     classes were moved into there own files to resolve some circular
7885     import references and because they shouldn't really be in the
7886     file that is dediciated to reading/writing session files since
7887     they are also used elsewhere.
7888    
7889     * Thuban/Model/classgen.py: Renamed functions to follow the
7890     function_names_with_underscores style. Fixes RTbug #1903.
7891     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7892    
7893     * Thuban/Model/layer.py: Import gdal only if it available.
7894     (RasterLayer): Handle the case where the gdal library is unavailable.
7895     Addresses RTbug #1877.
7896    
7897     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7898     xmlreader.py.
7899    
7900 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
7901     file xmlwriter.py.
7902    
7903     * Thuban/Model/resource.py: Renamed functions to following the
7904     function_names_with_underscores style.
7905     (has_gdal_support): New function that returns true if the gdal
7906     library is available. Addresses RTbug #1877.
7907    
7908     * Thuban/UI/application.py (ThubanApplication.OpenSession):
7909     Display a message box if the gdal library is not available, but
7910     only if there are any layers that would use it. Addresses RTbug #1877.
7911    
7912     * Thuban/UI/classgen.py: Use renamed projection resource functions.
7913     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
7914     when using integers versus floats.
7915    
7916     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
7917     determine if the "Add Image Layer" menu option should be
7918     greyed out or not. Addresses RTbug #1877.
7919    
7920     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
7921    
7922     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
7923     optimize if a raster layer is visible. Fixes RTbug #1931.
7924     Only draw the raster layer if the gdal library is available.
7925     Addresses RTbug #1877.
7926    
7927     * test/test_classgen.py: Add tests for generate_singletons,
7928     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
7929     (test_calculate_quantiles): Fix some tests to catch the new
7930     ValueError that is raised.
7931    
7932     * test/test_proj.py: Use renamed projection resource functions.
7933    
7934     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
7935     test for saving classified layers. Fixes RTbug #1902.
7936     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
7937    
7938 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
7939    
7940     Fix for http://intevation.de/rt/webrt?serial_num=1900.
7941    
7942     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
7943    
7944     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
7945     multiplechoicedialog.py rather than from the wxPython library.
7946    
7947 frank 1151 2003-06-11 Frank Koormann <[email protected]>
7948    
7949 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
7950     update.
7951    
7952     2003-06-11 Frank Koormann <[email protected]>
7953    
7954 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
7955     determine the absolute .thuban/thuban directory under
7956     "posix" (os.expanduser) and "nt" (read AppData registry key).
7957    
7958     * Thuban/Model/resource.py: Use get_application_dir
7959    
7960     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7961     Use get_application_dir.
7962    
7963 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
7964    
7965 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
7966     the messages MAP_LAYERS_REMOVED messages
7967     (LayerTableFrame.OnClose): Unsubscribe from it.
7968     (LayerTableFrame.map_layers_removed): New. Receiver for
7969     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
7970     dialog is showing is removed.
7971    
7972     2003-06-10 Bernhard Herzog <[email protected]>
7973    
7974 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
7975     of the receivers list so that unsubscribing in a receiver doesn't
7976     modify it while iterating over it.
7977    
7978     * test/test_connector.py
7979     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
7980     unsubscribing in a receiver works correctly. See docstring for
7981     details
7982    
7983     2003-06-10 Bernhard Herzog <[email protected]>
7984    
7985 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
7986     message.
7987    
7988     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
7989     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
7990     LAYER_CHANGED will still be sent if the classification changes.
7991    
7992     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
7993     parameter so we can subscribe to some of its messages
7994     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
7995     and the layer's LAYER_SHAPESTORE_REPLACED
7996     (Classifier.unsubscribe_messages): New. Unsubscribe from message
7997     subscribed to in __init__
7998     (Classifier.map_layers_removed)
7999     (Classifier.layer_shapestore_replaced): receivers for the messages
8000     subscribed to in __init__. Unsubscribe and close the dialog
8001    
8002     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
8003     the map to the Classifier dialog
8004    
8005     * test/test_layer.py (SetShapeStoreTests): Derive from
8006     SubscriberMixin as well so we can test messages
8007     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
8008     messages
8009     (SetShapeStoreTests.tearDown): Clear the messages again
8010     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
8011     for the modified flag too
8012     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
8013     to check whether SetShapeStore sets the modified flag
8014     (SetShapeStoreTests.test_set_shape_store_different_field_name)
8015     (SetShapeStoreTests.test_set_shape_store_same_field)
8016     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
8017     Add tests for the messages. This checks both the new
8018     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
8019    
8020 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
8021    
8022     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
8023     the menu items.
8024    
8025 frank 1134 2003-06-05 Frank Koormann <[email protected]>
8026    
8027 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
8028     Layout reimplemented without panel. Make life easier to fit the list
8029     in the dialog.
8030    
8031     2003-06-05 Frank Koormann <[email protected]>
8032    
8033 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
8034     once on initialisation (Former implementation resulted in multiple
8035     entries for each projection).
8036     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
8037     if set, select the projection found under the specified name. This
8038     overwrites any other selection estimate.
8039     Removed projchoice filling from this method.
8040     (ProjFrame._OnSave, ProjFrame._OnAddToList):
8041     Updated call of ProjFrame.__FillAvailList
8042     (LCCPanel._DoLayout): Moved parameter controls in more common order.
8043    
8044     * Resources/Projections/defaults.proj: Extended defaults representing
8045     various common European projections.
8046    
8047     2003-06-05 Frank Koormann <[email protected]>
8048    
8049 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
8050     Use ListCtrl instead of GridCtrl
8051    
8052     * Thuban/Model/resource.py:
8053     Guess location of .thuban directory from tempdir parent directory.
8054    
8055     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
8056     Guess location of .thuban directory from tempdir parent directory.
8057    
8058 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
8059    
8060     Do not cache the values returned by the tree widget's
8061     GetFirstChild and GetNextChild methods because it led to lots of
8062     segfaults. The new way requires more brute force but is more
8063     reliable.
8064    
8065     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
8066     variable layer2id
8067     (LegendTree.find_layer): New method to do with brute force what
8068     layer2id tried to accomplish
8069     (LegendTree._OnMsgLayerChanged)
8070     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
8071     Use find_layer instead of layer2id
8072     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
8073     update layer2id anymore
8074     (LegendTree._OnMsgMapLayersRemoved)
8075     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
8076    
8077 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
8078    
8079     * Thuban/Model/classgen.py (GenQuantiles0): New function.
8080    
8081 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
8082    
8083 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
8084     New commands.
8085     (main_menu): Add the new commands.
8086     (MainWindow.TableRename): New. Implementation of the table_rename
8087     command.
8088     (MainWindow.RenameLayer): New. Implementation of the layer_rename
8089     command.
8090    
8091     * Thuban/Model/session.py (Session.AddTable): call self.changed to
8092     set the modified flag
8093    
8094     * test/test_session.py (TestSessionSimple.test_add_table): Test
8095     whether the modified flag is set properly
8096    
8097     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
8098     instead of issue so that the modified flags get updated.
8099    
8100     * test/test_base.py (SomeTitledObject): Derive from Modifiable
8101     instead of Publisher to reflect reality better and to accomodate
8102     the fact that SetTitle now calls changed instead of issue
8103    
8104     2003-06-02 Bernhard Herzog <[email protected]>
8105    
8106     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
8107     acquisition has to happen before the try in a try-finally.
8108    
8109     2003-06-02 Bernhard Herzog <[email protected]>
8110    
8111 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
8112     possible that a layer is removed that is not currently selected in
8113     the legend so don't check for this.
8114    
8115 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
8116    
8117 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
8118     variables to None that have direct or indirect references to
8119     shapefiles or dbf files to make sure that they do go away and the
8120     files are closed.
8121    
8122     2003-05-30 Bernhard Herzog <[email protected]>
8123    
8124 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
8125     availImgListIndices when a new image list is created
8126    
8127     2003-05-30 Bernhard Herzog <[email protected]>
8128    
8129 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
8130     changing_selection to indicate whether the LegendTree code itself
8131     is currently changing the selection
8132     (LegendTree.normalize_selection): New method to normalize the
8133     selection by selecting the layer item even if the user clicked on
8134     the classification.
8135     (LegendTree._OnSelChanged): normalize the selection. This works
8136     around a bug in wx which doesn't keep track of the selection
8137     properly when subtrees are deleted.
8138    
8139     2003-05-30 Bernhard Herzog <[email protected]>
8140    
8141 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
8142     maximum and minimum scale factors.
8143    
8144     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
8145     changes in classgen.py
8146    
8147 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
8148    
8149     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
8150     all the methods functions. Fixes RTBug #1903.
8151    
8152     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
8153     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
8154     RTBug #1907.
8155    
8156     * Thuban/UI/classgen.py: Use classgen functions that were part
8157     of the ClassGenerator class. Put try/finally blocks around
8158     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
8159     RTBug #1904.
8160    
8161     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
8162    
8163     * Thuban/UI/legend.py: The legend was cleared and repopulated any
8164     time something changed which caused some state to be lost such
8165     as which children were expanded or collapsed. Fixes RTBug #1901.
8166     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
8167     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
8168     the legend but not in the map.
8169     (LegendTree.__FillTree): Move main functionality out into smaller
8170     methods that can be used by other methods.
8171     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
8172     if they are available.
8173     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
8174     that we override the wxTreeCtrl method. Iterate over children
8175     and call __RemoveLayer.
8176     (LegendTree.__AddLayer): New. Add a new layer to the legend.
8177     (LegendTree.__RemoveLayer): Remove a layer from the legend.
8178     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
8179     Should only be called with the id of a layer branch.
8180     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
8181     Returns the root item or creates one if necessary.
8182    
8183     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
8184     ProjectRasterFile with tuple arguments instead of strings.
8185    
8186     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
8187     with try/finally. Fixes RTBug #1904.
8188    
8189     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
8190     with try/finally. Fixes RTBug #1904.
8191     (MapCanvas.FitSelectedToWindow): If a single point is selected
8192     simply center it on the display. Fixes RTBug #1849.
8193    
8194     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
8195     to be compiled as a standalone app. Now the code can only be
8196     called from Python which simplifies the parameter passing.
8197     (ProjectRasterFile): Handle Python arguments. Remove code that
8198     checks for a destination dataset. Add more clean up code.
8199    
8200     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
8201     TestMapWithContents.test_lower_layer_bottom):
8202     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
8203     Fixes RTBug #1907.
8204    
8205     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
8206     extent to the map when the legend is toggled. Fixes RTBug #1881.
8207    
8208 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
8209    
8210     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
8211     unsubscribes all that is subcribed in __init__.
8212    
8213 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
8214    
8215 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
8216     (MainWindow.CanDuplicateLayer): New methods to implement the
8217     Layer/Duplicate command.
8218     (layer_duplicate command): New.
8219     (main_menu): Add layer_duplicate to the Layer menu.
8220    
8221     2003-05-28 Bernhard Herzog <[email protected]>
8222    
8223 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
8224     renderer so that NULL/None values get displayed differently (by a
8225     gray rectangle).
8226     (TableGrid.__init__): Override the default renderers
8227    
8228     2003-05-28 Bernhard Herzog <[email protected]>
8229    
8230 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
8231     classification to "None" if the type of the field has changed.
8232    
8233     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
8234     test for the Layer.SetShapeStore method
8235    
8236 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
8237 jan 1085
8238 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
8239     does not necessarily have a filename).
8240    
8241     2003-05-28 Jan-Oliver Wagner <[email protected]>
8242    
8243 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
8244     sort the selection list for the dialog.
8245    
8246 frank 1083 2003-05-28 Frank Koormann <[email protected]>
8247    
8248     * extensions/thuban/wxproj.cpp
8249     (project_point): Removed cast to int for projected point coordinates.
8250     (shape_centroid): Return last point if all polygon vertices fall
8251     to one point.
8252    
8253 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
8254    
8255 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
8256     with layers that don't have shapestores, i.e. raster layers.
8257    
8258     2003-05-28 Bernhard Herzog <[email protected]>
8259    
8260 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
8261     when determining the title from the filename.
8262    
8263     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
8264     reflect changes in the way the title is derived from the filename
8265    
8266 frank 1077 2003-05-28 Frank Koormann <[email protected]>
8267    
8268     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
8269     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
8270    
8271 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
8272    
8273 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
8274     delegate SelectedLayer.
8275     (MainWindow.LayerUnjoinTable): Implement.
8276     (_can_unjoin): New. Helper function for the sensitivity of the
8277     layer/unjoin command.
8278    
8279     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
8280     (DerivedShapeStore.OrigShapeStore): New. Return the original
8281     shapestore. Used to figure out how to unjoin.
8282     (DerivedShapeStore.Shapefile): Fix a typo.
8283    
8284     2003-05-27 Bernhard Herzog <[email protected]>
8285    
8286 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
8287     well
8288     (JoinDialog.__init__): Use the layer parameter and only build the
8289     left choice when a layer is given
8290     (JoinDialog.OnJoin): Handle layer joins as well
8291     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
8292     that the user selects the "Select..." item. The sensitivitly
8293     updating is now in update_sensitivity
8294     (JoinDialog.y): New method to refactor the sensitivity update of
8295     the join button into its own method.
8296    
8297     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
8298    
8299     2003-05-27 Bernhard Herzog <[email protected]>
8300    
8301 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
8302     iff there are unreferenced tables in the session
8303    
8304     2003-05-27 Bernhard Herzog <[email protected]>
8305    
8306 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
8307    
8308     * Thuban/Model/session.py (Session.UnreferencedTables): New method
8309     to return tables that are not referenced by other tables or shape
8310     stores and can be removed.
8311     (Session.RemoveTable): Issue a TABLE_REMOVED message after
8312     removing the table
8313    
8314     * Thuban/UI/mainwindow.py: Remove unused imports
8315     (MainWindow.TableClose): Implement.
8316    
8317     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
8318     messages so that the frame will be automatically closed when a new
8319     session is opened or the table is removed.
8320     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
8321     __init__
8322     (TableFrame.close_on_session_replaced)
8323     (TableFrame.close_on_table_removed): New. Subscribers that close
8324     the window
8325    
8326     * test/test_session.py (TestSessionMessages.test_remove_table)
8327     (TestSessionSimple.test_remove_table): Move the test to
8328     TestSessionSimple and add test for the TABLE_REMOVED message
8329     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
8330     (TestSessionSimple.test_unreferenced_tables) New. Test for the
8331     UnreferencedTables method.
8332     (UnreferencedTablesTests): New. Class with some more sophisticated
8333     tests for UnreferencedTables.
8334    
8335 frank 1065 2003-05-27 Frank Koormann <[email protected]>
8336    
8337 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
8338     display has some unwanted side effects. Removed again.
8339    
8340     2003-05-27 Frank Koormann <[email protected]>
8341    
8342 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
8343    
8344     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
8345    
8346 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
8347    
8348 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
8349     Menu.RemoveItem().
8350 jan 1062
8351 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
8352     the menu.
8353 jan 1062
8354 frank 1059 2003-05-27 Frank Koormann <[email protected]>
8355    
8356     Nonmodal dialogs without parent (i.e. they can fall behind the main
8357     window)
8358    
8359     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
8360     all dialogs in the dialogs dictionary and the canvas.
8361    
8362     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
8363     parent, i.e. can fall behind other windows.
8364     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
8365     dictionary before removing it.
8366    
8367     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
8368    
8369     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
8370     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
8371     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
8372    
8373 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
8374    
8375 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
8376     tableview dialog
8377     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
8378     Also, don't use the table's titles as the dialog names. The titles
8379     aren't guaranteed to be unique.
8380     (MainWindow.TableOpen): Open a table view dialog after opening the
8381     table
8382    
8383     2003-05-27 Bernhard Herzog <[email protected]>
8384    
8385 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
8386     effect can be achieved by simply closing the window showing the
8387     table.
8388     (MainWindow.TableHide): Removed.
8389     (main_menu): Removed "table_hide"
8390    
8391 frank 1051 2003-05-27 Frank Koormann <[email protected]>
8392    
8393     Fix legend tree display problems under Win32
8394    
8395     * Thuban/UI/legend.py: BMP_SIZE_W = 15
8396     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
8397     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
8398    
8399     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
8400    
8401 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
8402    
8403     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
8404     'after' now allows to insert separators almost anywhere in the menu.
8405    
8406 frank 1046 2003-05-27 Frank Koormann <[email protected]>
8407    
8408     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
8409     "S" of selection box label to hint on hot key (Alt-S). Works under
8410     Win32 but is ignored under GTK.
8411    
8412     2003-05-26 Frank Koormann <[email protected]>
8413    
8414     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
8415     Center Choices.
8416    
8417 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
8418    
8419 bh 1044 Remove the Precision methods again. They're too DBF specific to be
8420     part of the table interface and they're only used in table_to_dbf
8421     anyway.
8422    
8423     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
8424     fixed precision of 12 for doubles.
8425     (TransientTableBase.Precision): Removed
8426     (AutoTransientTable.Width): Delegate to self.table.
8427    
8428     * Thuban/Model/table.py (DBFTable.Precision)
8429     (MemoryTable.Precision): Removed.
8430     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
8431     (table_to_dbf): Use a fixed precision of 12 for floats unless the
8432     column object specifies something else.
8433    
8434     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
8435     test for table_to_dbf
8436    
8437     2003-05-26 Bernhard Herzog <[email protected]>
8438    
8439     * test/test_transientdb.py
8440     (TestTransientTable.run_iceland_political_tests): Fix a comment.
8441    
8442     2003-05-26 Bernhard Herzog <[email protected]>
8443    
8444 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
8445     implementation. Mark parts of the file format strings for
8446     localization.
8447    
8448     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
8449     file and add the table to the tables managed by the session
8450    
8451 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
8452     New. test case for OpenTableFile
8453    
8454 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
8455    
8456 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
8457     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
8458     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
8459     Replace the true/false of wxWindows by True/False of Python 2.2.1.
8460    
8461     2003-05-26 Jan-Oliver Wagner <[email protected]>
8462    
8463 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
8464     already a selection present, update the grid accordingly.
8465 jan 1033
8466     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
8467     resizeable and increase its initial size.
8468    
8469 frank 1030 2003-05-26 Frank Koormann <[email protected]>
8470    
8471     Table export functionality
8472    
8473     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
8474     Return width (in characters) for a column.
8475     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
8476     (table_to_dbf): Write table to dbf file.
8477     (table_to_csv): Write table to csv file.
8478    
8479     * Thuban/Model/transientdb.py (TransientTableBase.Width,
8480     TransientTableBase.Precision): Return column width and precision.
8481    
8482     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
8483     or table_to_csv depending on file selection.
8484    
8485     * test/test_dbf_table.py:
8486     Test table_to_dbf (extension of former part of test).
8487    
8488     * test/test_csv_table.py:
8489     Test table_to_csv.
8490    
8491 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
8492    
8493 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
8494     Use QueryTableFrame instead of TableFrame.
8495 jan 1021
8496 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
8497     table window with 'Layer Table:' instead of 'Table:'.
8498    
8499     2003-05-23 Jan-Oliver Wagner <[email protected]>
8500    
8501     Give all tables a title via mix-in TitledObject.LayerShowTable
8502    
8503 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
8504     only if it exists.
8505    
8506     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
8507     and call its init-method with a default title. Remove Title() method.
8508    
8509     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
8510     AutoTransientTable): mix-in TitledObject and call its init-method with
8511     a default title. Remove Title() method.
8512    
8513 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
8514    
8515     * Thuban/Model/session.py (Session.AddShapeStore): Define
8516     AddShapeStore analogously to AddTable.
8517    
8518     * test/test_session.py (TestSessionSimple.test_add_shapestore):
8519     New. Test for AddShapeStore
8520    
8521 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
8522    
8523     Introducing QueryTableFrame and a very coarse ShowTable implementation.
8524    
8525     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
8526     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
8527     The latter implements the selection GUI without dependency on a layer.
8528     LayerTableFrame now is derived from QueryTableFrame and connects
8529     to a layer.
8530    
8531     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
8532     implementation that still needs work.
8533    
8534     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
8535    
8536 frank 1011 2003-05-22 Frank Koormann <[email protected]>
8537    
8538     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
8539     Added "outer_join = False" as optional parameter.
8540     (TransientJoinedTable.create): If outer join is true, perform a
8541     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
8542     the left table. Records not matching are filled with 0 / None.
8543    
8544     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
8545     (JoinDialog.OnJoin): Consider outer join check box.
8546    
8547 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
8548    
8549 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
8550     somewhat safer way. Storing the traceback in a local variable can
8551     lead to memory leaks
8552    
8553     2003-05-22 Bernhard Herzog <[email protected]>
8554    
8555 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
8556     the wxMessageDialog's Destroy() method.
8557    
8558 frank 1004 2003-05-22 Frank Koormann <[email protected]>
8559    
8560     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
8561     TransientTable.Title()
8562    
8563     2003-05-22 Frank Koormann <[email protected]>
8564    
8565     Join Dialog, initial version.
8566    
8567     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
8568    
8569     * Thuban/UI/join.py (JoinDialog): Functional implementation of
8570     former framework. Renamed Table1/Table2 to LeftTable/RightTable
8571     in all occurences.
8572    
8573     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
8574     Typo fixed.
8575    
8576 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
8577    
8578 bh 999 Give the tables titles so that the GUI can display more meaningful
8579     names. For now the titles are fixed but depend on e.g. filenames
8580     or the titles of the joined tables.
8581    
8582     * Thuban/Model/transientdb.py (TransientTable.Title)
8583     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
8584    
8585     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
8586    
8587     * test/test_transientdb.py
8588     (TestTransientTable.test_auto_transient_table_title): New. Test
8589     for the Title method
8590     (TestTransientTable.test_transient_joined_table)
8591     (TestTransientTable.test_transient_table): Add test for the Title
8592     methods
8593    
8594     * test/test_memory_table.py (TestMemoryTable.test_title): New.
8595     Test for the Title method
8596    
8597     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
8598     the Title method
8599    
8600     2003-05-22 Bernhard Herzog <[email protected]>
8601    
8602 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8603     Provide a better way to destroy the layers
8604     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
8605     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8606     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
8607     the new way to destroy the layers.
8608     (TestLayer.test_derived_store): New. Test for using a layer with a
8609     DerivedShapeStore
8610    
8611     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
8612     filename if the shape store actually has one.
8613    
8614     2003-05-22 Bernhard Herzog <[email protected]>
8615    
8616 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
8617     for the filename
8618    
8619     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
8620     for the FileName method
8621     (TestDBFTableWriting.test_write): Fix spelling of filename
8622    
8623 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
8624    
8625     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
8626     from SciParam that now really is immutable.
8627    
8628 frank 992 2003-05-22 Frank Koormann <[email protected]>
8629    
8630     Layer Top/Bottom placement added to legend.
8631    
8632     * Thuban/UI/legend.py
8633     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
8634     bound to tool events.
8635     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
8636     New, methods binding the event methods with the map methods.
8637    
8638     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
8639     layer at top/bottom of layer stack.
8640    
8641     * Resources/Bitmaps/top_layer.xpm: New button icon.
8642    
8643     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
8644    
8645 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
8646    
8647     * Thuban/Model/session.py (Session.RemoveTable): New method to
8648     remove tables
8649    
8650     * test/test_session.py (TestSessionSimple.test_remove_table): New.
8651     Test for RemoveTable
8652    
8653 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
8654    
8655     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
8656     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
8657    
8658 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
8659    
8660 bh 985 Implement a way to discover dependencies between tables and
8661     shapestores.
8662    
8663     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
8664     (TransientJoinedTable.Dependencies)
8665     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
8666     interface
8667     (TransientJoinedTable.__init__): Keep tack of the original table
8668     objects in addition to the corresponding transient tables.
8669    
8670     * Thuban/Model/table.py (DBFTable.Dependencies)
8671     (MemoryTable.Dependencies): New. Implement the dependencies
8672     interface
8673    
8674     * Thuban/Model/data.py (ShapeTable): New. Helper class for
8675     ShapefileStore
8676     (ShapefileStore.__init__): Use ShapeTable instead of
8677     AutoTransientTable
8678     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
8679     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
8680     methods for filename and type
8681     (ShapefileStore.Dependencies): New. Implement the dependencies
8682     interface
8683     (DerivedShapeStore): New class to replace SimpleStore. The main
8684     difference to SimpleStore is that it depends not on a shapefile
8685     but another shapestore which expresses the dependencies a bit
8686     better
8687     (SimpleStore.__init__): Add deprecation warning.
8688    
8689     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
8690     Test for the Dependencies method.
8691    
8692     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
8693     New. Test for the Dependencies method.
8694    
8695     * test/test_transientdb.py
8696     (TestTransientTable.test_auto_transient_table_dependencies): New.
8697     Test for the Dependencies method.
8698     (TestTransientTable.test_transient_joined_table): Add test for the
8699     Dependencies method.
8700    
8701     * test/test_session.py (TestSessionSimple.setUp)
8702     (TestSessionSimple.tearDown): New. Implement a better way to
8703     destroy the sessions.
8704     (TestSessionSimple.test_initial_state)
8705     (TestSessionSimple.test_add_table): Bind session to self.session
8706     so that it's destroyed by tearDown
8707     (TestSessionSimple.test_open_shapefile): New. Test for
8708     OpenShapefile and the object it returns
8709    
8710     2003-05-22 Bernhard Herzog <[email protected]>
8711    
8712 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
8713     register tables with the session.
8714     (Session.Tables): Return the tables registered with AddTable too.
8715    
8716     * test/test_session.py (TestSessionSimple.test_add_table): New.
8717     Test case for the AddTable method
8718    
8719 frank 981 2003-05-22 Frank Koormann <[email protected]>
8720    
8721     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
8722     lower right corner, center labels for selections, initialize controls
8723     in reasonable order for keyboard navigation.
8724    
8725     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
8726     (ProjFrame.__DoOnProjAvail): Determine position of current projection
8727     using the wxListBox.FindString() method. Still a problem (#1886)
8728    
8729     * Thuban/UI/classifier.py
8730     (Classifier.__init__, SelectPropertiesDialog.__init__)
8731    
8732     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
8733     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
8734     different classification types from here to __init__.
8735     (GenUniquePanel.__init__): Set the column width of the first field
8736     in the Field ListCtrl to the full width.
8737    
8738     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
8739     Button to 'Export'. Center Buttons in Selection Box, set Focus to
8740     Grid.
8741     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
8742     changes focus to the Selection when pressing "Alt-S".
8743    
8744     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
8745     the text if not visible. The italic font sometimes exceeds the
8746     rendering area.
8747    
8748 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
8749 jonathan 971
8750 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
8751     to OnClose so that Thuban closes correctly.
8752    
8753     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
8754     DockFrame.OnClose, not DockFrame._OnClose.
8755    
8756     2003-05-21 Jonathan Coles <[email protected]>
8757    
8758 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
8759     references to 'inf' and use new Range __init__ to pass floats
8760     directly rather than converting them to strings first.
8761     Fixes RTBug #1876.
8762    
8763     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
8764     Use new Range ___init__ to pass floats.
8765    
8766     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
8767     filename is a valid image file. Throw IOError otherwise.
8768    
8769     * Thuban/Model/range.py: Brought over new Range from SciParam that
8770     is immutable and has an __init__ which can accept floats.
8771    
8772     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
8773     into try block. AddLayer doesn't throw any exceptions anymore.
8774     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
8775     try block.
8776    
8777     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
8778     the first item in choices. Fixes RTBug #1882.
8779    
8780     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
8781     has gone to 0 which is a serious problem. abort.
8782     (MapRenderer.draw_raster_layer): Catch IOError seperately and
8783     print the error from GDAL.
8784    
8785     * Thuban/UI/tableview.py (TableGrid.__init__): Call
8786     ToggleEventListeners to turn on listening.
8787     (TableGrid.ToggleEventListeners): New. Turns event listening on
8788     and off so as to prevent excessive messages.
8789     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
8790     to suppress excessive messages when selecting many rows.
8791     Fixes RTBug #1880.
8792    
8793     * Thuban/UI/view.py: Added checks against if scale == 0. This
8794     is a serious problem that can occur when an image without
8795     geo data is loading and causes the map projection bounds to
8796     go to infinity. Right now, the solution is to simply try
8797     to recover.
8798    
8799     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
8800     to set the MFILEReceiver attributes even if the data is NULL.
8801    
8802     * extensions/thuban/gdalwarp.cpp: Improved the error handling
8803     and passed GDAL messages back up to the Python layer. Also
8804     tried to fix some memory leaks that were present in the original
8805     utility but didn't matter because the program aborted.
8806    
8807     * test/test_range.py: Copied over tests from SciParam. Removed
8808     tests against importing. Fixes RTBug #1867.
8809    
8810 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
8811    
8812     * test/test_load.py: Remove unused imports and restructure the
8813     test code
8814     (LoadSessionTest): Split into one class for each test and turn
8815     LoadSessionTest itself into the base class for all such session
8816     tests.
8817     (ClassificationTest): New base class for load tests that test
8818     classifications
8819     (TestSingleLayer, TestLayerVisibility, TestClassification)
8820     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
8821     for the individual tests
8822    
8823     * test/support.py (FileLoadTestCase.filename): New base class for
8824     file loading tests
8825    
8826 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
8827    
8828     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
8829     Mercator' to 'UTM Zone 32' as a more convenient example.
8830     Added 'Gauss Krueger Zone 6'.
8831    
8832     * Data/iceland_sample_raster.thuban: political polygon now
8833     filled transparent to have the raster image visible at once.
8834    
8835 frank 952 2003-05-21 Frank Koormann <[email protected]>
8836    
8837     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
8838     OnClose() to keep in sync with extensions. Internally Thuban
8839     still uses "underscored" names.
8840    
8841 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
8842    
8843     This puts back Raster layer support. These layers support projections
8844     through the GDAL library. Currently, the CVS version is being used.
8845     There are no Debian packages available although this may change soon.
8846     A GDAL driver was extended to support writing to memory rather to
8847     files.
8848    
8849     There is still some work that needs to be done, such as some error
8850     handling when loading invalid images or when there is a problem
8851     projecting the image. This putback simply checks in the majority
8852     of the work.
8853    
8854     * setup.py: Add gdalwarp library extension.
8855    
8856     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
8857     Defaults to False, but can be overridden by subclasses if they
8858     support classification.
8859     (RasterLayer): New. Defines a new layer that represents an
8860     image.
8861    
8862     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
8863     tag handler.
8864     (SessionLoader.start_layer): Encode the filename.
8865     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
8866     New. Supports reading a rasterlayer tag.
8867    
8868     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
8869    
8870     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
8871     get a string in Latin1. If we get such as string convert it to
8872     unicode first, otherwise leave if alone before encoding.
8873     (SessionSaver.write_layer): Add support for writing both Layers
8874     and RasterLayers.
8875    
8876     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8877     The right argument may not be a string, it could also be a Column.
8878    
8879     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
8880     Make initial window size 600x400. Fixes RTBug #1872.
8881    
8882     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
8883     the dialog is constructed so that we can support layers that
8884     do not have classifications.
8885     (Classifier._OnTry): Only build a classification if the layer
8886     supports one.
8887    
8888     * Thuban/UI/legend.py: Change all checks that a layer is an
8889     instance of Layer into checks against BaseLayer.
8890     (LegendTree.__FillTreeLayer): Only add children to a branch if
8891     the layer supports classification.
8892    
8893     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
8894     MainWindow.OpenSession): Don't proceed with an action if the
8895     user chooses Cancel when they are asked to save changes.
8896     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
8897     user to select an image file. Create a new RasterLayer and add
8898     it to the map.
8899    
8900     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
8901     for rendering RasterLayer layers.
8902     (MapRenderer.draw_raster_layer): Actually method that calls
8903     the GDALWarp python wrapper and constructs an image from the
8904     data returned.
8905    
8906     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
8907     Choices symbols to match those used in the table query method.
8908     Replace deprecated method calls on table with new method names.
8909    
8910     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
8911     how small the scale can get. This still needs more testing.
8912    
8913     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
8914     Provides a driver to output in .bmp format.
8915    
8916     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
8917     New. Provides IO routines which write to memory, rather than a file.
8918    
8919     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
8920     of the gdalwarp utility provided in GDAL. Added function calls
8921     that can be accessed from python.
8922    
8923     * Data/iceland_sample_raster.thuban: New. Sample file that uses
8924     a raster layer.
8925    
8926     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
8927     layer image data.
8928    
8929     * Doc/thuban.dtd: Added rasterlayer attribute definition.
8930    
8931     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
8932     tests associated with the raster layer code.
8933    
8934     * test/test_transientdb.py
8935     (TestTransientTable.test_auto_transient_table_query): Added a test
8936     for using a Column object as the "right" parameter to a query.
8937    
8938 frank 924 2003-05-19 Frank Koormann <[email protected]>
8939    
8940 frank 927 * Thuban/version.py (get_changelog_date):
8941     Catch exceptions if ChangeLog does not exist.
8942    
8943     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
8944    
8945     2003-05-19 Frank Koormann <[email protected]>
8946    
8947 frank 924 Extended version information for Thuban
8948    
8949     * Thuban/version.py: New, version information for Thuban: Last
8950     modification date and last ChangeLog entry date.
8951    
8952     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
8953     information: Display Thuban, wxPython and Python version.
8954    
8955 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
8956    
8957 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
8958     __future__ import for nested_scopes as Thuban relies on Python 2.2
8959     now.
8960     (XMLWriter.encode): Remove the special case for a None argument.
8961     In the saver encode is always called with a string argument.
8962    
8963     2003-05-16 Bernhard Herzog <[email protected]>
8964    
8965 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
8966     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
8967     of the bug was that e.g. float("1.2") would fail. Thuban now
8968     requires 2.4.x.
8969    
8970 frank 917 2003-05-16 Frank Koormann <[email protected]>
8971    
8972     Printing enhancement and WMF export (under Win32)
8973    
8974     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
8975     ScreenRenderer. Renders Map, Legend and Scalebar for export.
8976     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
8977     PrintRender.
8978    
8979     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
8980     to fullfil information needed for PrinterRenderer.
8981     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
8982     (MapCanvas.Print): Adapted to new MapPrintout.
8983     (OutputTransform): General calculations to transform from canvas
8984     coordinates to export/printing devices.
8985    
8986     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
8987     new method_command to call ExportMap, with platform dependency (only
8988     __WXMSW__)
8989    
8990     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
8991     of scalebar drawing area as new parameters.
8992    
8993     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
8994    
8995     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
8996     Update to extended scalebar.DrawScalebar header.
8997    
8998     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
8999    
9000     * test/test_scalebar.py: Made test executable as standalone.
9001    
9002 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
9003    
9004     * Thuban/Model/table.py (Table): Remove this compatibility alias
9005     for DBFTable.
9006    
9007     * test/test_table.py: Import DBFTable as Table because that alias
9008     doesn't exist anymore.
9009    
9010     * Thuban/UI/classgen.py: Remove some unused imports
9011    
9012 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
9013    
9014     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
9015     Fix docstring.
9016     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
9017     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
9018     values of the supplied range to determine the beginning and end
9019     bounds of the generated classes.
9020    
9021     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
9022     do not have a leading 0 (.5 is now accepted as well as 0.5).
9023    
9024     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
9025     call to ClassGenerator.GenUniformDistribution.
9026    
9027     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
9028     layout bug with the 'Projection' label.
9029    
9030     * test/support.py (FloatTestCase): New. Needed for the Range tests.
9031    
9032     * test/test_range.py: New. Imported from SciParam.
9033    
9034 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
9035    
9036 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
9037     to table.UniqueValues() with calls that retrieve all the values
9038     from the table. This will need to be replaced by a method on table
9039     which can simply return the list (perhaps more efficiently).
9040    
9041     2003-05-12 Jonathan Coles <[email protected]>
9042    
9043 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
9044     Refer to the documentation for details.
9045    
9046     * test/test_classgen.py: Modified Quantile tests to use the
9047     new return values.
9048    
9049     * Thuban/Model/classgen.py
9050     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
9051     use new return values from CalculateQuantiles to produce the correct
9052     range bounds in the Classification.
9053     (ClassGenerator.CalculateQuantiles): Add more comments describing
9054     the return values and parameters. Make minor adjustments to improve
9055     the legibility of the code. Fix problem with adjusted not being set
9056     in most cases.
9057    
9058 frank 893 2003-05-12 Frank Koormann <[email protected]>
9059    
9060     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
9061     and latin1. Fixes #1851 finally.
9062    
9063 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
9064    
9065 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
9066    
9067     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
9068     Clean up debugging statement, add comments, fix a small bug in the
9069     returned adjusted percentiles.
9070    
9071     2003-05-09 Jonathan Coles <[email protected]>
9072    
9073 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
9074     and such ranges can now be saved and loaded from disk.
9075    
9076     Quantiles are now available in the Classification Generator.
9077    
9078     Initial support for building Queries on a table. Doesn't do anything
9079     but run some tests.
9080    
9081     * Thuban/Model/classification.py: Explicit imports.
9082     (ClassGroupRange): Use the Range class to store the underlying
9083     range information. The interface remains the same, except for
9084     GetRange(), and you can also supply a Range object as the min
9085     parameter to SetRange or __init__.
9086    
9087     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
9088     string appropriately for use in Thuban. Fixes RTbug #1851.
9089     (SessionLoader.end_projection): Handle the context of the
9090     projection tag a bit better by looking at what objects are not
9091     None. There was an assumption that a projection tag for a map
9092     could occur before any layers.
9093     (SessionLoader.start_clrange): Provide backward compatibility for
9094     reading min/max values as well as the new range parameter.
9095    
9096     * Thuban/Model/map.py: Explicit imports.
9097    
9098     * Thuban/Model/resource.py: Import _.
9099     (ProjFileSaver.write): write header using projfile.dtd.
9100    
9101     * Thuban/Model/save.py: Explicit imports.
9102     (XMLWriter.encode): New. Encode the given string from a format
9103     used by Thuban into UTF-8. Fixes RTbug #1851.
9104    
9105     * Thuban/UI/classgen.py: Explicit imports.
9106     (ClassGenDialog.__init__): Clean up the code and add support
9107     for Quantiles.
9108     (ClassGenDialog.OnOK): Add support for Quantiles.
9109     (GenQuantilesPanel): New. Input panel for Quantiles.
9110     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
9111     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
9112    
9113     * Thuban/Model/classgen.py: New. Contains all the classes named above.
9114    
9115     * Thuban/UI/classifier.py: Explicit imports.
9116     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
9117     ClassTable.SetValueAsCustom): Reworked to use new Range class.
9118    
9119     * Thuban/UI/legend.py: Explicit imports.
9120    
9121     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
9122     a Table menu and associated method calls.
9123     (MainWindow.choose_color): Removed. No longer needed.
9124    
9125     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
9126     should be disabled if no projection is selected in the available
9127     list.
9128    
9129     * Thuban/UI/renderer.py: Explicit imports.
9130    
9131     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
9132     with correctly selecting the rows and issuing the right events.
9133     Be sure to call Skip() to allow the grid to do some of its own
9134     handling which allows the rows to actually be selected.
9135     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
9136     selecting multiple shapes.
9137     (LayerTableFrame): Support for building Queries.
9138     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
9139    
9140     * Thuban/UI/tree.py: Explicit imports.
9141    
9142     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
9143     table view can call it.
9144    
9145     * test/test_classification.py: Explicit imports.
9146     (TestClassification.test_ClassGroupRange): Fix test for new
9147     Range class.
9148    
9149     * Doc/thuban.dtd: Add range parameter for clrange.
9150    
9151     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
9152     object in ClassGroupRange, and also uesd for inputting ranges in
9153     the classifer table and elsewhere.
9154    
9155     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
9156     yet.
9157    
9158 frank 872 2003-05-09 Frank Koormann <[email protected]>
9159    
9160     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
9161    
9162 frank 860 2003-05-08 Frank Koormann <[email protected]>
9163    
9164 frank 870 Coding style updates
9165    
9166     * test/test_scalebar.py: Replaced tab indentation by spaces.
9167    
9168     * Thuban/UI/scalebar.py: Explicit imports.
9169    
9170     2003-05-08 Frank Koormann <[email protected]>
9171    
9172 frank 867 * Thuban/UI/scalebar.py
9173     (ScaleBar.DrawScalebar): Format string bug fixed.
9174    
9175     2003-05-08 Frank Koormann <[email protected]>
9176    
9177 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
9178    
9179     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
9180     (deriveInterval):
9181     Calculate scalebar interval and unit which fits in width for scale.
9182     (roundInterval): Round float.
9183    
9184     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
9185    
9186     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
9187    
9188     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
9189    
9190     2003-05-08 Frank Koormann <[email protected]>
9191    
9192 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
9193     Initialize ScaleBar with canvas.map
9194    
9195     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
9196     round intervals to display smarter lengths
9197     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
9198     layer. If the maps has no projection applied grey the scalebar.
9199    
9200 frank 857 2003-05-07 Frank Koormann <[email protected]>
9201    
9202     Basic Scalebar features added.
9203    
9204     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
9205    
9206     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
9207     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
9208     and the renderer.
9209    
9210     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
9211    
9212     * Thuban/UI/messages.py: SCALE_CHANGED added.
9213    
9214 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
9215    
9216 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
9217     variable shapestores to hold a list of all open shapestore objects
9218     (Session.ShapeStores): New. Accessor method for the shapestores
9219     list.
9220     (Session._add_shapestore, Session._clean_weak_store_refs): New.
9221     Internal methods to maintain the shapestores list.
9222     (Session.Tables): New. Return all tables open in the session.
9223     (Session.OpenShapefile): Insert the new ShapeStore into the
9224     shapestores list.
9225    
9226     * test/test_session.py (TestSessionSimple.test_initial_state): Add
9227     tests for ShapeStores and Tables
9228     (TestSessionWithContent.test_shape_stores)
9229     (TestSessionWithContent.test_tables): New. Test cases for
9230     ShapeStores and Tables
9231    
9232     2003-05-07 Bernhard Herzog <[email protected]>
9233    
9234 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
9235     Add comments about the optimizations used.
9236     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
9237     Implement the ReadValue table interface method.
9238    
9239     * test/test_transientdb.py
9240     (TestTransientTable.run_iceland_political_tests)
9241     (TestTransientTable.test_transient_joined_table): Add tests for
9242     ReadValue
9243    
9244 frank 848 2003-05-07 Frank Koormann <[email protected]>
9245    
9246     * Resources/Bitmaps/fulllayerextent.xpm,
9247     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
9248     new icons.
9249    
9250 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
9251    
9252 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
9253     New. Simply delegate to the transient table's version.
9254    
9255     * test/test_transientdb.py
9256     (TestTransientTable.test_auto_transient_table_query): New. Test
9257     case for AutoTransientTable's SimpleQuery
9258    
9259     2003-05-06 Bernhard Herzog <[email protected]>
9260    
9261 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
9262     Implement a simple query method for the query dialog
9263     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
9264     the row index or shapeid.
9265     (TransientTable.create): Insert the right value of the row index
9266     (TransientJoinedTable.create): Copy the row index of the left
9267     table to the joined result table
9268    
9269     * test/test_transientdb.py
9270     (TestTransientTable.test_transient_table_read_twice): Fix
9271     doc-string
9272     (TestTransientTable.test_transient_table_query): New. Test for the
9273     SimpleQuery method
9274    
9275     2003-05-06 Bernhard Herzog <[email protected]>
9276    
9277 bh 840 Convert all table users to use the new table interface. This only
9278     covers Thuban itself, not GREAT-ER or other applications built on
9279     Thuban yet, so the compatibility interface stays in place for the
9280     time being but it now issues DeprecationWarnings.
9281    
9282     Finally, the new Table interface has a new method, HasColumn.
9283    
9284     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
9285     issue deprecation warnings when they're. The warnings refer to the
9286     caller of the method.
9287     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
9288     for the deprecation warnings
9289    
9290     * test/test_table.py: Ignore the deprecation warnings for the old
9291     table in the tests in this module. The purpose of the tests is to
9292     test the old interface, after all.
9293    
9294     * test/test_transientdb.py
9295     (TestTransientTable.run_iceland_political_tests): Use the
9296     constants for the types. Add a test for HasColumn
9297     (TestTransientTable.test_transient_joined_table): Adapt to new
9298     table interface. Add a test for HasColumn
9299     (TestTransientTable.test_transient_table_read_twice): Adapt to new
9300     table interface
9301    
9302     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
9303     Adapt to new table interface
9304    
9305     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
9306     new table interface
9307    
9308     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
9309     (RecordTable.SetTable): Adapt to new table interface
9310    
9311     * Thuban/UI/classifier.py (Classifier.__init__)
9312     (Classifier.__init__): Adapt to new table interface
9313    
9314     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
9315     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
9316     to new table interface
9317    
9318     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
9319     (AutoTransientTable.HasColumn): Implement the new table interface
9320     method
9321     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
9322     (AutoTransientTable.UniqueValues): Adapt to new table interface
9323    
9324     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
9325     Adapt to new table interface
9326    
9327     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
9328     simplify opening shapefiles a bit easier.
9329     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9330     (TestLayer.test_point_layer): Use the new helper method
9331     (TestLayer.test_get_field_type): New. Test for the GetFieldType
9332     method
9333    
9334     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
9335     the new table method
9336    
9337     * test/test_memory_table.py (TestMemoryTable.test_has_column):
9338     Test for the new table method HasColumn
9339    
9340 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
9341    
9342     Addresses the "Selection Extent" wish of RTbug #1787.
9343    
9344     * Resources/Bitmaps/fulllayerextent.xpm,
9345     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
9346     extent. These are just place holders for the real bitmaps.
9347    
9348     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
9349     calculate the bounding box once (the first time compute_bbox() is
9350     called).
9351     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
9352     the bounding box for the shapes in lat/long coordinates.
9353    
9354     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
9355     option.
9356     (MainWindow.has_selected_shapes): New. Returns true if there are
9357     any selected shapes.
9358     (MainWindow.FullSelectionExtent): New. Calls
9359     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
9360     (_has_selected_shapes): New. Returns true if there are any
9361     selected shapes.
9362    
9363     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
9364     true if there are any selected shapes.
9365    
9366     * Thuban/UI/view.py (MapCanvas): Added delegated method
9367     HasSelectedShapes.
9368     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
9369     shapes on the canvas using the map projection (if any).
9370    
9371     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
9372     for Layer.ShapesBoundingBox().
9373    
9374 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
9375    
9376     * Resources/Projections/defaults.proj: Fix spelling of Mercator
9377    
9378 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
9379    
9380     Addresses the "Full Layer Extent" wish of RTbug #1787.
9381    
9382     * Resources/Projections/defaults.proj: Added UK National Grid.
9383    
9384     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
9385     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
9386     when the user selects the menu option.
9387    
9388     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
9389     scales the given layer on the canvas using the map projection.
9390    
9391 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
9392    
9393     Convert the table implementations to a new table interface. All
9394     tables use a common mixin class to provide backwards compatibility
9395     until all table users have been updated.
9396    
9397     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
9398     provide backwards compatibility for table classes implementing the
9399     new interface
9400     (DBFTable, MemoryTable): Implement the new table interface. Use
9401     OldTableInterfaceMixin as base for compatibility
9402     (DBFColumn, MemoryColumn): New. Column description for DBFTable
9403     and MemoryTable resp.
9404    
9405     * test/test_dbf_table.py: New. Test cases for the DBFTable with
9406     the new table interface.
9407    
9408     * test/test_memory_table.py: New. Test cases for the MemoryTable
9409     with the new table interface.
9410    
9411     * test/test_table.py: Document the all tests in this file as only
9412     for backwards compatibility. The equivalent tests for the new
9413     interface are in test_memory_table.py and test_dbf_table.py
9414     (MemoryTableTest.test_read): field_info should be returning tuples
9415     with four items
9416     (MemoryTableTest.test_write): Make doc-string a more precise.
9417    
9418     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
9419     table interface. Derive from from OldTableInterfaceMixin for
9420     compatibility.
9421     (TransientTableBase.create): New intance variable column_map to
9422     map from names and indices to column objects
9423     (TransientTable.create): Use the new table interface of the input
9424     table
9425     (AutoTransientTable): Convert to new table interface. Derive from
9426     from OldTableInterfaceMixin for compatibility.
9427     (AutoTransientTable.write_record): Removed. It's not implemented
9428     yet and we still have to decide how to handle writing with the new
9429     table and data framework.
9430    
9431     * test/test_transientdb.py
9432     (TestTransientTable.run_iceland_political_tests)
9433     (TestTransientTable.test_transient_joined_table): Use the new
9434     table interface
9435    
9436 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
9437    
9438     This is namely a collection of UI updates to improve user interactivity.
9439     Tabbing between controls now exists and you can use ESC to close dialog
9440     boxes; ENTER will active the default button.
9441    
9442     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
9443     order that the controls are created so that tabbing works correctly.
9444     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
9445     wxDialog can handle the default button correctly.
9446     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
9447     same reasons as for OnOK.
9448     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
9449     when we ask the table for the maximum/minimum values of a field
9450     which could take a very long time.
9451    
9452     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
9453     order that the controls are created so that tabbing works correctly.
9454     (SelectPropertiesDialog.__init__): Rearrange the order that the
9455     controls are created so that tabbing works correctly.
9456    
9457     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
9458     to derive from a wxDialog but behave like the original implementation
9459     which was derived from a wxFrame. wxDialog provides useful key
9460     handling functionality like ESC calling OnCancel and ENTER calling
9461     OnOK which is lost with wxFrame.
9462    
9463     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
9464     new dialogs.
9465    
9466     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
9467     order that the controls are created so that tabbing works correctly.
9468     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
9469     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
9470     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
9471     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
9472     can provide the "UK National Grid" as a default projection.
9473     (UTMPanel.__init__): Rearrange the order that the controls are
9474     created so that tabbing works correctly.
9475    
9476 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
9477    
9478 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
9479     (project_point): If a map projection but no layer projection is
9480     given, convert degrees to radians before applying the map
9481     projection.
9482    
9483 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
9484     (TableGrid.allow_messages): New methods to make it possible to
9485     inhibit message sending.
9486     (TableGrid.issue): Only send the message if not inhibited.
9487     (LayerTableGrid.select_shape): Use the new methods to make sure
9488     that no ROW_SELECTED message is sent while we're updating the
9489     selected rows to match the selected shapes.
9490    
9491 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
9492    
9493     Implementation of MemoryTable.
9494    
9495     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
9496     implementation that operates on a list of tuples. All of the data
9497     are kept in the memory.
9498    
9499     * test/test_table.py (MemoryTableTest): New.
9500    
9501     * test/test_transientdb.py (SimpleTable): Removed.
9502     (TestTransientTable.test_transient_joined_table,
9503     (TestTransientTable.test_transient_table_read_twice): Replaced
9504     SimpleTable by MemoryTable.
9505    
9506 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
9507    
9508 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
9509     for each of the layers.
9510    
9511     * Resources/Projections/defaults.proj: Geographic projection
9512     contains unit conversion parameter.
9513    
9514     2003-04-30 Jonathan Coles <[email protected]>
9515    
9516 jonathan 793 The most important part of this putback is the projection changes.
9517     It should now be possible to specify the projection that a layer
9518     is in and then specify a different projection for the map. The
9519     projection dialog has an extra parameter for a geographic projection
9520     which lets the user select if the input is in degrees or radians.
9521    
9522     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
9523     to say that the parameter is a tuple of unprojected
9524     points (which is what the callers to this method were assuming).
9525     Also, since the points are unprojected we need to projected them.
9526    
9527     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
9528     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
9529     groups are selected, move the layer up/down. Fixes RTbug #1833.
9530    
9531     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
9532    
9533     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
9534     parameter in call to SetClientData.
9535     (GeoPanel): Add support for selecting the units that the
9536     source data is in (Radians or Degrees).
9537    
9538     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
9539     the rendering loop by reducing the number of if's, removing the
9540     unnecessary try/except block, and checking if the old group
9541     is the same as the new one (which happens a lot if there is
9542     no classification, or lots of shapes are in the same group).
9543    
9544     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
9545     around the redraw routine to try to catch problems that the user
9546     may create by selecting invalid projections for the data set and
9547     map. Clears the display if there are any problems and prints the
9548     error.
9549     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
9550     rectangle.
9551    
9552     * extensions/thuban/wxproj.cpp (project_point): First invert the
9553     supplied point (which should be in projected coordinates) using
9554     the layer's projection and then project the point using the
9555     map's projection.
9556     (project_points): Use project_point() to project each point.
9557    
9558 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
9559    
9560     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
9561     don't set the Classification to None if the classfication field
9562     is None (ie only a DEFAULT).
9563    
9564 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
9565    
9566 bh 790 * Thuban/UI/view.py: Fix some typos.
9567    
9568 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
9569     not pop up the dialog if the selection becomes empty (this could
9570     happen if e.g. a new selection is opened while the identify tool
9571     is active and dialog had been closed)
9572    
9573     2003-04-30 Bernhard Herzog <[email protected]>
9574    
9575 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
9576     instance variable read_record_last_result
9577     (TransientTableBase.read_record): Make sure reading the same
9578     record twice works. The implementation uses the new instance
9579     variable read_record_last_result
9580    
9581     * test/test_transientdb.py
9582     (TestTransientTable.test_transient_table_read_twice): New test
9583     case for the above bug-fix.
9584    
9585 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
9586    
9587     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
9588    
9589     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
9590    
9591     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
9592     (ClassTable.SetValueAsCustom): Rename keyword argument in
9593     ClassGroup* constructors to match argument name.
9594    
9595 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
9596    
9597     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
9598     transient DB if it exists to make sure it doesn't leave a journal
9599     file in the temp directory.
9600    
9601     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
9602     self.conn to None after closing the connection to make sure it's
9603     not closed twice
9604    
9605 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9606    
9607 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
9608     "true". If anything other than "false" is specified we also assume
9609 jonathan 776 "true". Addresses RTbug #1025.
9610 jonathan 769
9611     * Doc/thuban.dtd: Add visible parameter to a layer.
9612    
9613     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
9614     of visible from 1 to True.
9615     (Layer.__init__): Change default value of visible from 1 to True.
9616    
9617     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
9618     parameter.
9619    
9620     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
9621     parameter.
9622    
9623     * test/test_load.py: Add new test data contents_test_visible.
9624     (LoadSessionTest.setUp): save test data.
9625     (LoadSessionTest.testLayerVisibility): Test if the visible flag
9626     is loaded correctly.
9627    
9628     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
9629     for saving an invisible layer.
9630    
9631     2003-04-29 Jonathan Coles <[email protected]>
9632    
9633 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
9634     legend dialog box and tell it to change its map to the one
9635     supplied to SetMap(). Fixes RTbug #1770.
9636    
9637 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
9638    
9639 bh 766 Next step of table implementation. Introduce a transient database
9640     using SQLite that some of the data is copied to on demand. This
9641     allows us to do joins and other operations that require an index
9642     for good performance with reasonable efficiency. Thuban now needs
9643     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
9644     haven't tested that.
9645    
9646     * Thuban/Model/transientdb.py: New. Transient database
9647     implementation.
9648    
9649     * test/test_transientdb.py: New. Tests for the transient DB
9650     classes.
9651    
9652     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
9653     classes to help automatically remove temporary files and
9654     directories.
9655     (Session.__init__): New instance variables temp_dir for the
9656     temporary directory and transient_db for the SQLite database
9657     (Session.temp_directory): New. Create a temporary directory if not
9658     yet done and return its name. Use AutoRemoveDir to have it
9659     automatically deleted
9660     (Session.TransientDB): Instantiate the transient database if not
9661     done yet and return it.
9662    
9663     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
9664     AutoTransientTable so that data is copied to the transient DB on
9665     demand.
9666     (SimpleStore): New class that simply combines a table and a
9667     shapefile
9668    
9669     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
9670     DBFTable and update its doc-string to reflect the fact that this
9671     is only the table interface to a DBF file. Table is now an alias
9672     for DBFTable for temporary backwards compatibility.
9673    
9674     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
9675     the last reference to the session goes away so that the temporary
9676     files are removed properly.
9677    
9678     * test/test_load.py (LoadSessionTest.tearDown): Remove the
9679     reference to the session to make sure the temporary files are
9680     removed.
9681    
9682     2003-04-29 Bernhard Herzog <[email protected]>
9683    
9684 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
9685     the __parser instance variable into a normal local variable in
9686     read. It's only used there and read will never be called more than
9687     once. Plus it introduces a reference cycle that keeps can keep the
9688     session object alive for a long time.
9689    
9690 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9691 jonathan 735
9692 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
9693     Projection an immutable item. Fixes RTbug #1825.
9694     (Projection.__init__): Initialize instance variables here.
9695     (ProjFile.Replace): New. Replace the given projection object with
9696     the new projection object. This solves the problem of needing the
9697     mutator Projection.SetProjection() in the ProjFrame class and
9698     allows a projection to change parameters without changing its
9699     location in the file.
9700    
9701     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
9702     be of type wxSAVE and should verify overwriting a file.
9703    
9704     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
9705     ProjFile.Replace() method instead of the mutator
9706     Projection.SetProjection(). Also requires that we reassign the
9707     client data to the new projection.
9708    
9709     * test/test_proj.py (TestProjection.test): Test GetName() and
9710     GetAllParameters()
9711     (TestProjFile.test): Remove tests for Set*() methods. Add tests
9712     for Replace().
9713    
9714     2003-04-25 Jonathan Coles <[email protected]>
9715    
9716 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
9717     to save the name of the projection.
9718    
9719     * test/test_save.py (SaveSessionTest.testLayerProjection): New
9720     test to verify layer projections are saved correctly.
9721    
9722     2003-04-25 Jonathan Coles <[email protected]>
9723    
9724 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
9725     to "Unknown" if name is None.
9726     (Projection.SetAllParameters): New. Set the projection's
9727     parameter list to the one supplied.
9728     (Projection.SetProjection): New. Set the projection's
9729     properties to those of the supplied Projection.
9730    
9731     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
9732     the dialog title to include the map's title.
9733     (MainWindow.LayerProjection): Set the dialog title to include
9734     the layer's title.
9735    
9736     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
9737     error dialogs into a single method call.
9738     (ProjFrame.__VerifyButtons): Add more states to check.
9739     (ProjFrame.__GetProjection): Return the current state of an
9740     edited projection or None.
9741     (ProjFrame.__FillAvailList): Remove checks for states that
9742     shouldn't exist.
9743     (ProjFrame._OnNew): Clear all selected items and supply
9744     a projection panel if necessary.
9745    
9746     * test/test_proj.py (TestProjFile.test): Add tests for
9747     ProjFile.SetAllParameters, ProjFile.SetProjection,
9748     ProjFile.SetName.
9749    
9750     2003-04-25 Jonathan Coles <[email protected]>
9751    
9752 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
9753     takes an optional argument to select the current projection.
9754     This does not guarantee that the item is visible due to
9755     limited wxWindows functionality. Fixes RTBug #1821.
9756    
9757     2003-04-25 Jonathan Coles <[email protected]>
9758    
9759 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
9760     the projection name and use it when constructing the Projection
9761     object.
9762    
9763     * Thuban/Model/proj.py (Projection.__init__): Change the default
9764     value for 'name' to None and then test if name is equal to None
9765     in the body of the constructor. This way the caller doesn't have to
9766     know what the default value should be. Namely, useful in load.py
9767     where we have to pick a default value if the 'name' parameter
9768     doesn't exist in the XML file.
9769    
9770     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
9771     Tests a file where a layer has a projection.
9772    
9773     2003-04-25 Jonathan Coles <[email protected]>
9774    
9775 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
9776     tree for projection information.
9777    
9778     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
9779     XMLReader.GetFileName.
9780     (SessionLoader): Added support for loading projection tags that
9781     appear inside a layer.
9782    
9783     * Thuban/Model/proj.py (ProjFile): Document the class. Move
9784     back to using a list because the order of the projections in
9785     the file is important to maintain. Fixes RTbug #1817.
9786    
9787     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
9788     to ProjFile.GetFilename.
9789    
9790     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
9791     information.
9792    
9793     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
9794     ProjFrame._OnSaveAs. Removed old dead code from previous
9795     implementation.
9796     (ProjFrame._OnExport): Add support for exporting more than one
9797     projection to a single file.
9798     (ProjFrame.__FillAvailList): use string formatting (% operator)
9799     to build strings that are (partly) translated. Fixes RTbug #1818.
9800    
9801     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
9802     class.
9803    
9804 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
9805    
9806     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
9807    
9808     * po/fr.po: New. French translation by Daniel Calvelo Aros
9809    
9810     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
9811     empty strings.
9812    
9813 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
9814 jonathan 724
9815     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
9816     implement the interface that the ProjFrame dialog expects.
9817    
9818     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
9819     name of the projection to be changed.
9820     (ProjFile): Use a dictionary instead of a list so that removing
9821     projections is easier and we are sure about uniqueness.
9822     (ProjFile.Remove): Remove the given projection object.
9823    
9824     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
9825     Return a list with only one projection file instead of searching for
9826     any projection file. This simplifies many things if the user can
9827     only have one system file and one user file.
9828    
9829     * Thuban/UI/classgen.py: Change all references to
9830     genCombo to genChoice.
9831    
9832     * Thuban/UI/mainwindow.py: Add a Projection option under the
9833     layer menu.
9834     (MainWindow.LayerProjection): New. Open up a projection window
9835     for a layer.
9836    
9837     * Thuban/UI/projdialog.py: Large changes to how the dialog is
9838     laid out. Use three panels instead of one. One for the list of
9839     projections, one for the edit controls, and one for the buttons.
9840     Fixed resizing problems so that the dialog resizes correctly
9841     when the projection panel changes. Added import/export, save, and
9842     new buttons/functionality.
9843    
9844 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
9845    
9846     First step towards table management. Introduce a simple data
9847     abstraction so that we replace the data a layer uses more easily
9848     in the next step.
9849    
9850     * Thuban/Model/data.py: New file with a simple data abstraction
9851     that bundles shapefile and dbffile into one object.
9852    
9853     * Thuban/Model/session.py (Session.OpenShapefile): New method to
9854     open shapefiles and return a shape store object
9855    
9856     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
9857     object instead of a shapefile filename. This introduces a new
9858     instance variable store holding the datastore. For intermediate
9859     backwards compatibility keep the old instance variables.
9860     (open_shapefile): Removed. No longer needed with the shape store.
9861     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
9862     get the shape store used by a layer.
9863     (Layer.Destroy): No need to explicitly destroy the shapefile or
9864     table anymore.
9865    
9866     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
9867     (MainWindow.AddLayer): Use the session's OpenShapefile method to
9868     open shapefiles
9869    
9870     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
9871     session's OpenShapefile method to open shapefiles
9872    
9873     * test/test_classification.py
9874     (TestClassification.test_classification): Use the session's
9875     OpenShapefile method to open shapefiles and build the filename in
9876     a more platform independed way
9877    
9878     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
9879     Implement to have a session to use in the tests
9880     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9881     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
9882     session's OpenShapefile method to open shapefiles
9883     (TestLayerLegend.setUp): Instantiate a session so that we can use
9884     it to open shapefiles.
9885     (TestLayerLegend.tearDown): Make sure that all references to
9886     layers and session are removed otherwise we may get a resource
9887     leak
9888    
9889     * test/test_map.py (TestMapAddLayer.test_add_layer)
9890     (TestMapWithContents.setUp): Instantiate a session so that we can
9891     use it to open shapefiles.
9892     (TestMapWithContents.tearDown): Make sure that all references to
9893     layers, maps and sessions are removed otherwise we may get a
9894     resource leak
9895     ("__main__"): use support.run_tests() so that more info about
9896     uncollected garbage is printed
9897    
9898     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
9899     session's OpenShapefile method to open shapefiles
9900     ("__main__"): use support.run_tests() so that more info about
9901     uncollected garbage is printed
9902    
9903     * test/test_selection.py (TestSelection.tearDown): Make sure that
9904     all references to the session and the selection are removed
9905     otherwise we may get a resource leak
9906     (TestSelection.get_layer): Instantiate a session so that we can
9907     use it to open shapefiles.
9908     ("__main__"): use support.run_tests() so that more info about
9909     uncollected garbage is printed
9910    
9911     * test/test_session.py (TestSessionBase.tearDown)
9912     (TestSessionWithContent.tearDown): Make sure that all references
9913     to the session and layers are removed otherwise we may get a
9914     resource leak
9915     (TestSessionWithContent.setUp): Use the session's OpenShapefile
9916     method to open shapefiles
9917    
9918 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
9919    
9920     * Thuban/Model/load.py (XMLReader.read): Should have been checking
9921     if the file_or_filename object had the 'read' attribute.
9922    
9923 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
9924    
9925 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
9926     (ReadProjFile): Add documentation about which exceptions are raised.
9927     Always pass the exceptions up to the caller.
9928     (GetProjFiles): If the directory can't be read return an empty list.
9929     If any of the proj files can't be read skip that file and go
9930     on to the next one.
9931    
9932     * test/test_proj.py: Added test cases to handle nonexistent files,
9933     unreadable files, and files that don't parse correctly.
9934    
9935     2003-04-23 Jonathan Coles <[email protected]>
9936    
9937 jonathan 716 Projection dialog. Allows the user to select from a list
9938     of projection templates and optionally edit them and save new ones.
9939    
9940     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
9941     (ProjPanel): Base class for projection specific panels.
9942     (TMPanel): Projection panel for Transverse Mercartor.
9943     (UTMPanel): Projection panel for Universal Transverse Mercartor.
9944     (LCCPanel): Projection panel for Lambert Conic Conformal.
9945     (GeoPanel): Projetion panel for Geographic Projection.
9946    
9947     2003-04-23 Jonathan Coles <[email protected]>
9948    
9949 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
9950     promote symmetry. There now exists XMLReader and XMLWriter.
9951     (XMLReader.read): New. Call to read the given file descriptor or
9952     filename.
9953     (XMLReader.close): New. Make sure the file is closed.
9954     (XMLReader.GetFileName): New. Return just the file name that is being
9955     read from.
9956     (XMLReader.GetDirectory): New. Return just the directory of the file
9957     that is being read.
9958     (XMLReader.AddDispatchers): New. Take a dictionary which contains
9959     the names of functions to call as the XML tree is parsed.
9960     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
9961     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
9962     (SessionLoader): Removed class variables start_dispatcher and
9963     end_dispatcher since this functionality is now part of a class
9964     instance. Fixes RTbug #1808.
9965     (SessionLoader.__init__): Add dispatcher functions.
9966     (load_xmlfile): Code was moved into the XMLReader.read().
9967     (load_session): Use modified SessionLoader.
9968    
9969     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
9970     map's projection.
9971    
9972     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
9973     GetAllParameters.
9974     (Projection.GetParameter): Returns the value for the given parameter.
9975    
9976     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
9977     (GetProjFiles): Renamed from GetProjections. Now returns a list
9978     of ProjFile objects.
9979     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
9980     a list of ProjFile objects whose files are not user defined.
9981     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
9982     list of ProjFile objects whose files are user defined.
9983     (ProjFileReader): Extend new XMLReader.
9984    
9985     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
9986     promote symmetry.
9987    
9988     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
9989     control instead of a wxComboBox. wxChoice controls do not generate
9990     events as the uses highlights possible choices which fixes problems
9991     with resizing the dialog when the use selects an option.
9992    
9993     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
9994     control instead of a wxComboBox.
9995    
9996     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
9997     dialog.
9998    
9999     * test/test_proj.py (TestProjection.test): New tests for GetParameter
10000     method.
10001    
10002 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
10003    
10004 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
10005     constants
10006    
10007 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
10008     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
10009    
10010 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
10011    
10012 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
10013     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
10014     anymore.
10015     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
10016     (Layer.ShapeType, Layer.Shape): No need to call
10017     self.open_shapefile since it's always called in __init__
10018    
10019 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
10020     In wxPython 2.4 there's no need to extend MainLoop anymore since
10021     wxPython itself makes sure OnExit is called.
10022    
10023 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
10024    
10025 jonathan 693 Initial putback of projection management code. Includes new
10026     classes to read and write projection files. The current load
10027     and save classes were abstracted a bit so they could be reused.
10028     The Projection class was extended to provide new methods and
10029     have a name.
10030    
10031     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
10032     general XML reading methods that were part of ProcessSession.
10033    
10034     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
10035     name.
10036     (ProjFile): New. Represents a file that contains projection
10037     information.
10038    
10039     * Thuban/Model/resource.py: New. Contains general utilities
10040     for read and writing projection files.
10041    
10042     * Thuban/Model/save.py (XMLSaver): New. Contains all the
10043     general XML writing methods that were part of SessionSaver.
10044     (SessionSaver): Renamed from Saver.
10045    
10046     * test/test_proj.py: New test cases for the projection
10047     file read and write functions.
10048    
10049     2003-04-16 Jonathan Coles <[email protected]>
10050    
10051 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
10052     in the ClassGroup*.__repr__() methods so it is clearer when
10053     a value is a string and when it is a number.
10054    
10055     * test/test_load.py: Rework the classification test to test
10056     that we can load old files.
10057     (testLabels): Test a file where the groups have labels.
10058    
10059 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
10060    
10061     Safer implementation of the performance enhancements of the
10062     low-level renderer:
10063    
10064     * extensions/thuban/wxproj.cpp (extract_projection)
10065     (extract_pointer): Rename extract_projection to extract_pointer
10066     and redefine its purpose to return the pointer stored in a CObject
10067     returned by the object's cobject method. Update all callers.
10068     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
10069     handling of these low-level parameters so that each s_draw_info
10070     instance is handled as a CObject at python level that also
10071     contains real references to the actual python objects which
10072     contain the values in the struct. Add free_draw_info as the
10073     destructor.
10074     (draw_polygon_shape): Add the py_draw_info parameter which must a
10075     cobject containing an s_draw_info pointer.
10076    
10077     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
10078     method to instantiat the low-level render parameter
10079     (MapRenderer.draw_shape_layer): Use the new method. Remove some
10080     commented out code.
10081     (MapRenderer.draw_polygon_shape): Make the first parameter not the
10082     layer but the low-level render parameter
10083     (ScreenRenderer.draw_shape_layer): Use the low-level render
10084     parameter.
10085    
10086 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
10087    
10088 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
10089     the ClassGroup* classes to make debugging a bit easier.
10090     (ClassGroup.SetLabel): Check that the string is an instance
10091     of StringTypes not StringType. Accounts for Unicode strings.
10092    
10093     * Thuban/Model/color.py: Implemented __repr__ to make
10094     debugging a bit easier.
10095    
10096     * Thuban/Model/save.py (Saver.write_classification): Need to
10097     save the group label.
10098    
10099     * test/test_load.py (testClassification): New. Loads the
10100     iceland_sample_test.thuban file and checks if it was loaded
10101     correctly.
10102    
10103     2003-04-15 Jonathan Coles <[email protected]>
10104    
10105 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
10106     to improve rendering performance by initializing the variables
10107     that are not change each time draw_polygon_shape() is called.
10108     The values are stored in a global struct draw_info.
10109     (draw_polygon_shape): Removed initialization code that is
10110     now in draw_polygon_init().
10111    
10112     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
10113 jonathan 674 drawing initialization call to draw_polygon_init()
10114     (MapRenderer.draw_polygon_shape): Use new signature of
10115     draw_polygon_shape.
10116 jonathan 673
10117 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
10118     weirdness by setting the range to (1, maxint).
10119 jonathan 673
10120 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
10121     instance variables private and optimize comparison operator
10122     by first checking if the color references are the same.
10123     (ClassGroupSingleton): Make instance variables private.
10124     (ClassGroupRange): Make instance variables private.
10125 jonathan 673
10126 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
10127    
10128 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
10129    
10130     First stab at internationalized messages:
10131    
10132     * Thuban/__init__.py (_): Implement the translation function for
10133     real using the python gettext module.
10134    
10135     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
10136     translate empty strings.
10137    
10138     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
10139     Add a missing space to a warning message
10140    
10141     * po/README: New. Notes about the management of the translation
10142     files.
10143    
10144     * po/Makefile: New. Makefile to help manage the translation files.
10145    
10146     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
10147    
10148     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
10149     translations and support files in po/
10150    
10151     * setup.py (data_files): Add the *.mo files to the data_files too
10152    
10153     * README: Add note about the translations when building from CVS
10154    
10155 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
10156    
10157     * Thuban/UI/dock.py: Fixes some window resizing problems most
10158     noticable under windows. Always assume the button bitmaps will
10159     be there. Code clean up.
10160     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
10161     images for the dock/undock button to the same images.
10162     Work around for RTbug #1801.
10163    
10164     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
10165     be allowed to grow within the sizer. Fixes a bug under Windows
10166     where the toolbar wasn't being drawn.
10167    
10168 frank 664 2003-04-14 Frank Koormann <[email protected]>
10169    
10170     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
10171     Updated design to try to make the button functionality more
10172     transparent.
10173    
10174 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
10175    
10176     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
10177     finalize the intialization of the panel.
10178    
10179     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
10180     creation of the panel. Should be the last thing called in the
10181     initializer of a subclass.
10182    
10183     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
10184     set the current selections in the combo boxes. This is needed
10185     under Windows.
10186    
10187     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
10188     level panel to the dialog so that the background colors are
10189     consistent under Windows.
10190    
10191 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
10192    
10193 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
10194     not black.
10195    
10196     * Thuban/UI/legend.py: Enable/disable the legend buttons when
10197     the legend changes. Fixes RTbug #1793.
10198    
10199     * test/test_classification.py: Added test for copying of
10200     classifications.
10201    
10202     2003-04-11 Jonathan Coles <[email protected]>
10203    
10204 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
10205     such as bitmaps.
10206    
10207     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
10208     added images to the move buttons, added 'reverse' button.
10209     (CustomRampPanel.__init__): Added images to the move buttons.
10210     (GreyRamp): New. Generates a ramp from white to black.
10211     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
10212    
10213     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
10214     ID_PROPERTY_*.
10215     (Classifier.__init__): Minor changes to the layout.
10216     (Classifier._OnTitleChanged): Listen for when the user edits the
10217     title and update the dialog's title and the layer's title.
10218    
10219     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
10220    
10221     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
10222     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
10223     if the layer's title changes.
10224    
10225     * Thuban/UI/mainwindow.py: Added new menu item and associated code
10226     to open a dialog to rename the map.
10227     (MainWindow): Use new resource class to import bitmaps.
10228    
10229     2003-04-11 Jonathan Coles <[email protected]>
10230    
10231 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
10232 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
10233     Resources/Bitmaps/group_use_none.xpm,
10234     Resources/Bitmaps/group_use_not.xpm,
10235     Resources/Bitmaps/hide_layer.xpm,
10236     Resources/Bitmaps/layer_properties.xpm,
10237     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
10238     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
10239     New.
10240 jonathan 646
10241 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
10242    
10243 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
10244     Should pass group to ClassGroup constructor.
10245    
10246     2003-04-10 Jonathan Coles <[email protected]>
10247    
10248 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
10249     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
10250     here. Implement SetVisible(), IsVisible().
10251     (ClassGroup.__init__): Add group parameter which acts as a copy
10252     constructor.
10253    
10254     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
10255     "Visible" check boxes.
10256     (Classifier): Rename the buttons and refactor the code to match
10257     the new labels.
10258    
10259     * Thuban/UI/legend.py: Classify button is now called "Properties".
10260     Refactored the code to change variable names.
10261     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
10262    
10263     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
10264     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
10265     renamed to MainWindow.LayerEditProperties.
10266     (MainWindow.ToggleLegend): Don't include map name in legend title.
10267     (MainWindow.SetMap): Added the map name to the window title.
10268     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
10269     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
10270     Functionality is found in the layer properties dialog.
10271    
10272     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10273     draw visible groups.
10274    
10275 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
10276    
10277 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
10278     addition and selection of new color schemes.
10279     (MonochromaticRamp): New. Generates a ramp between two colors.
10280     (RedRamp): New. Generates a ramp of all red.
10281     (GreenRamp): New. Generates a ramp of all green.
10282     (BlueRamp): New. Generates a ramp of all blue.
10283    
10284     2003-04-09 Jonathan Coles <[email protected]>
10285    
10286 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
10287     Need to copy over field and fieldType attributes.
10288    
10289     * Thuban/Model/table.py (Table.field_range): New. Retrive the
10290     maximum and minimum values over the entire table for a given
10291     field.
10292     (Table.GetUniqueValues): New. Retrieve all the unique values
10293     in the table for a given field.
10294    
10295     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
10296     (GenUniquePanel): New. Controls to allow the user to select
10297     which unique field values they would like in the classification.
10298     (CustomRampPanel): Code that was in ClassGenDialog that allows
10299     the user to select the properties for a custom ramp.
10300     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
10301    
10302     * Thuban/UI/classifier.py: Removed a lot of debugging code.
10303     (Classifier._SetClassification): Callback method so that the
10304     class generator can set the classification in the grid.
10305     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
10306     editing of a group properties class into a wxWindows control.
10307    
10308     * Thuban/UI/dock.py: It was decided that if the user closes
10309     a dockable window the window should simply hide itself. That
10310     way if the user wants to show the dock again it appears in the
10311     same place as it was when it was closed.
10312     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
10313     (DockableWindow._OnButtonClose): Hide the window instead of
10314     destroying it.
10315     (DockableWindow._OnClose): Hide the window instead of
10316     destroying it.
10317    
10318     * Thuban/UI/legend.py (LegendTree): Use a private method to
10319     consistently set the font and style of the text. Fixes RTbug #1786.
10320    
10321     * Thuban/UI/mainwindow.py: Import just the Classifier class.
10322    
10323 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
10324    
10325 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
10326     to the map module
10327    
10328     2003-04-07 Bernhard Herzog <[email protected]>
10329    
10330 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
10331     favor of ToggleSessionTree
10332     (MainWindow.ToggleSessionTree): New method to toggle visibility of
10333     the session tree.
10334     (MainWindow.SessionTreeShown): New method to return whether the
10335     session tree is currently shown.
10336     (MainWindow.ToggleLegend): New method to toggle visibility of the
10337     legend
10338     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
10339     LegendShown
10340     (MainWindow.LegendShown): New method to return whether the legend
10341     is currently shown.
10342     (_method_command): Add checked parameter so we can define check
10343     menu items
10344     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
10345     mainwindow methods.
10346     (show_session_tree, show_legend commands): Removed.
10347     (toggle_session_tree, toggle_legend commands): New commands to
10348     toggle the visibility of the dialogs
10349    
10350 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
10351    
10352 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
10353    
10354     * Thuban/UI/dock.py: Fix Windows problem.
10355    
10356     * Thuban/UI/mainwindow.py: Use False instead of false.
10357     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
10358    
10359     2003-04-07 Jonathan Coles <[email protected]>
10360    
10361 jonathan 612 Since we now say that the order of the groups in a classification
10362     matters, it makes sense to be able to manipulate that order. Most
10363     of the changes to Thuban/Model/classification.py are to that end.
10364    
10365     * Thuban/Model/classification.py (Classification.AppendGroup,
10366     Classification.InsertGroup, Classification.ReplaceGroup,
10367     Classification.RemoveGroup, Classification.GetGroup): Do as the
10368     names imply.
10369     (Classification.FindGroup): This was called GetGroup, but GetGroup
10370     takes an index, while FindGroup takes a value.
10371     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
10372     REFERENCE. Currently there is a cyclic reference between the layer
10373     and its classification. If the classification doesn't need to know
10374     its owning layer we can change this, since it may make sense to be
10375     able to use the same classification with different layers.
10376    
10377     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
10378    
10379     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
10380     not AddGroup()
10381    
10382     * Thuban/UI/classifier.py: Now that we can depend on the order in
10383     a Classification and have methods to manipulate that order we don't
10384     need to use our own data structures in the grid. We can simply make
10385     the grid/table access the information they need from a copy of
10386     the classification object.
10387     (Classifier._OnCloseBtn): Event handler for when the user clicks
10388     'Close'. This is needed so if the user applies changes and then
10389     continues to change the table the user has the option of discarding
10390     the most recent changes and keeping what they applied.
10391    
10392     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
10393     into the same group.
10394    
10395     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
10396     with a really old version of proj, PJ_VERSION won't even be defined.
10397     If it isn't defined then just compile so that the function always
10398     returns Py_False.
10399    
10400     * test/test_classification.py: Fix tests to use the renamed methods.
10401     Still need to write tests for the new methods.
10402    
10403 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
10404 jonathan 608
10405 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
10406     call to SetSelection out of the method and before the call
10407     to __SelectField in __init__. This prevents a recursion of events
10408     when _OnFieldSelect is triggered by the user.
10409    
10410     2003-04-04 Jonathan Coles <[email protected]>
10411    
10412 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
10413     Color.Transparent.
10414     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
10415     Don't bother copying the color, since Colors are immutable.
10416    
10417     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
10418     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
10419     Thuban/UI/renderer.py, Thuban/UI/view.py:
10420     Rename Color.None to Color.Transparent.
10421    
10422     * test/test_classification.py, test/test_load.py: Rename Color.None
10423     to Color.Transparent.
10424    
10425     2003-04-04 Jonathan Coles <[email protected]>
10426 jonathan 603
10427     * Thuban/Model/classification.py: Fix assert calls.
10428     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
10429     Copy the color parameter rather than hold onto a reference.
10430 jonathan 601
10431 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
10432     the color object.
10433     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
10434     are sure there exists only one refernce to Color.None in the system.
10435     This allows us to use 'is' rather than the comparision functions.
10436    
10437     * Thuban/Model/save.py: Fix assert calls.
10438    
10439     * Thuban/UI/classifier.py: Fix assert calls.
10440     (ClassGrid._OnCellDClick): Call up to the classifier to open the
10441     dialog to edit the groups properties.
10442     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
10443     correctly if a cell is resized.
10444     (ClassTable.SetClassification): New. Changes the classification
10445     that is in the table.
10446     (ClassTable.__SetRow): Allow groups to be prepended.
10447     (Classifier): New code for opening the EditProperties and
10448     GenerateRanges dialogs.
10449     (SelectPropertiesDialog.__GetColor): Only set the color in the
10450     color dialog if the current color is not None.
10451    
10452     * Thuban/UI/dock.py: Fix assert calls.
10453    
10454     * Thuban/UI/legend.py: Fix assert calls.
10455    
10456     * Thuban/UI/renderer.py: Fix assert calls.
10457    
10458     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
10459     classifications.
10460     (GenRangePanel): Panel specific to range generation.
10461     (GenSingletonPanel): Panel specific to singleton generation.
10462     (ClassGenerator): Class responsible for actually generating
10463     the classification from the data gathered in the dialog box.
10464     (PropertyRamp): Generates properties whose values range from
10465     a starting property to an ending property.
10466 jonathan 601
10467 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
10468    
10469     * test/support.py (print_garbage_information): New function that
10470     prints information about still connected messages and memory
10471     leaks.
10472     (run_suite): Removed.
10473     (run_tests): New function for use as a replacement of
10474     unittest.main in the test_* files. This one calls
10475     print_garbage_information at the end.
10476    
10477     * test/runtests.py (main): Use support.print_garbage_information
10478    
10479     * test/test_layer.py: Use support.run_tests instead of
10480     unittest.main so we get memory leak information
10481     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
10482     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
10483     (TestLayerLegend.test_visibility): Call the layer's Destroy method
10484     to fix a memory leak.
10485    
10486     * test/test_classification.py: Use support.run_tests instead of
10487     unittest.main so we get memory leak information
10488     (TestClassification.test_classification): Call the layer's Destroy
10489     method to fix a memory leak.
10490    
10491 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
10492    
10493 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
10494     Handle the reference counts of the return value and errors in
10495     PyArg_ParseTuple correctly.
10496    
10497 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
10498     sure the filename is absolute to avoid problems when saving the
10499     session again
10500    
10501 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
10502    
10503 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
10504    
10505 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
10506 jonathan 587 that there actually are points in the returned list of points
10507     before trying to index into the list. The list may be empty if
10508     the shape is a Null Shape.
10509    
10510 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
10511    
10512     * test/test_map.py: Don't use from <module> import *
10513    
10514 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
10515    
10516     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
10517     LAYER_LEGEND_CHANGED
10518    
10519     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
10520     self.Destroy() to close the window after yesterday's changes.
10521    
10522     * test/test_map.py, test/test_session.py: Fix messages that
10523     are sent from maps and layers.
10524    
10525 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
10526    
10527     * Thuban/UI/classifier.py: Commented out some debugging statements.
10528     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
10529     RTbug #1769.
10530    
10531     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
10532     position (although position doesn't work yet under GTK).
10533     (DockableWindow.Destroy): New. Called when the window must be
10534     closed. Namely needed when the DockFrame closes and must close
10535     its children.
10536     (DockFrame): Listen for EVT_CLOSE and destroy all children.
10537    
10538     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
10539     when then window is told to close.
10540     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
10541     comment in source for more info.
10542    
10543     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
10544    
10545     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
10546     symmetry with other such methods.
10547     (MainWindow.ShowLegend): Show the legend docked by default.
10548    
10549 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
10550    
10551     * Thuban/UI/classifier.py: Support for highlighting a specific
10552     group within the grid when the classification dialog is opened.
10553     Also contains a lot of debugging printouts which will later
10554     be removed.
10555    
10556     * Thuban/UI/dock.py: Complete rework on the dock code so that
10557     that it is fairly removed from the rest of the Thuban application.
10558     It is easy to add new docks which the rest of the program having
10559     to be aware of them.
10560    
10561     * Thuban/UI/legend.py: Modifications to support selecting a
10562     specific group in the classification dialog. Changed how layers
10563     are drawn when the layer is visible/invisible.
10564    
10565     * Thuban/UI/mainwindow.py: Removed legend specific code and
10566     replaced it with calls to the new dock code.
10567    
10568     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
10569     to check if scale > 0. Trying to track down a divide by zero.
10570    
10571 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
10572    
10573 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
10574     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
10575     now part of DockableWindow.
10576     (LegendPanel.DoOnSelChanged): Select the current layer in the
10577     map.
10578     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
10579     with the selected layer and/or group.
10580    
10581     2003-03-26 Jonathan Coles <[email protected]>
10582    
10583 jonathan 557 This putback contains the code for dockable windows. There is
10584     no support in wxWindows as of this date for windows that can
10585     attach themselves to other windows.
10586    
10587     The current model contains a DockableWindow which has a parent
10588     window for when it is detached and a dock window that it puts
10589     its contents in when it is docked. The contents of a DockableWindow
10590     must be a DockPanel. DockPanel itself derives from wxPanel.
10591    
10592     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
10593     message, not a LAYER_LEGEND_CHANGED message.
10594    
10595     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
10596    
10597     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
10598     as one of the style properties for the fieldTypeText item to
10599     be sure that its size is correct when the text changes.
10600    
10601     * Thuban/UI/dock.py: New. Classes for the DockPanel and
10602     DockableWindow.
10603    
10604     * Thuban/UI/legend.py: Added some more buttons and made the
10605     LegendPanel a DockPanel.
10606    
10607     * Thuban/UI/mainwindow.py: Added sash windows to the main window
10608     and supporting functions for manipulating the sashes.
10609     (MainWindow.ShowLegend): Create a DockableWindow with the
10610     LegendPanel as the contents.
10611    
10612     * Thuban/UI/messages.py: Added DOCKABLE_* messages
10613    
10614     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
10615     not LAYER_LEGEND_CHANGED, messages.
10616    
10617 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
10618    
10619     * setup.py: Added custom script bdist_rpm_build_script so that
10620     when the rpm is built the path to wx-config is correct.
10621    
10622     * setup.cfg: Added line saying to use the custom build script
10623    
10624 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
10625    
10626     Initial implementation of the Legend.
10627    
10628     * Thuban/UI/legend.py: New. Creates a window that shows the map's
10629     Legend information and allows the user to add/modify classifications
10630     and how the layers are drawn on the map.
10631    
10632     * setup.py: New command 'build_docs' which currently uses
10633     happydoc to generate html documentation for Thuban.
10634    
10635     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
10636     Returns a string which is appropriately describes the group.
10637    
10638     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
10639     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
10640    
10641     * Thuban/Model/map.py (Map): Rename messages and use new, more
10642     specific, messages.
10643    
10644     * Thuban/Model/messages.py: New message to indicate that a layer's
10645     data has changed (LAYER_CHANGED). New map messages to indicate
10646     when layers have been added/removed/changed or if the stacking order
10647     of the layers has changed.
10648    
10649     * Thuban/Model/session.py: Rename and use new messages.
10650    
10651     * Thuban/UI/classifier.py: Remember if any changes have actually
10652     been applied so that if the dialog is cancelled without an application
10653     of changes we don't have to set a new classification.
10654     (ClassDataPreviewer): Pulled out the window specific code and put it
10655     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
10656     symbols on any DC.
10657    
10658     * Thuban/UI/mainwindow.py: New code to open the legend.
10659    
10660     * Thuban/UI/view.py: Use new message names.
10661    
10662 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
10663    
10664     * Thuban/UI/main.py (verify_versions): New. Checks the versions
10665     of Python, wxPython, and some other libraries.
10666    
10667     * extensions/thuban/wxproj.cpp (check_version): Checks the given
10668     version against what wxproj was compiled with.
10669     (check_version_gtk): If wxproj was compiled with gtk then check
10670     the given version against the version of the gtk library
10671     currently being used.
10672    
10673 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
10674    
10675     * test/test_command.py: Run the tests when the module is run as a
10676     script
10677    
10678     2003-03-14 Bernhard Herzog <[email protected]>
10679    
10680     Implement selection of multiple selected shapes in the same layer:
10681    
10682     - Introduce a new class to hold the selection. This basically
10683     replaces the interactor which was nothing more than the
10684     selection anyway. A major difference is of course that the new
10685     selection class supports multiple selected shapes in one layer
10686    
10687     - Move the object that represents the selection from the
10688     application to the canvas. The canvas is a better place than the
10689     application because the selection represents which shapes and
10690     layer of the map displayed by the canvas are selected and
10691     affects how the map is drawn.
10692    
10693     - Make the selection and its messages publicly available through
10694     the mainwindow.
10695    
10696     - The non-modal dialogs do not get a reference to the interactor
10697     anymore as they can simply refer to their parent, the
10698     mainwindow, for the what the interactor had to offer.
10699    
10700     * Thuban/UI/selection.py: New module with a class to represent the
10701     selection.
10702    
10703     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
10704     these unused messages
10705    
10706     * Thuban/UI/application.py (ThubanApplication.OnInit)
10707     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
10708     interactor is gone now.
10709     (ThubanApplication.CreateMainWindow): There is no interactor
10710     anymore so we pass None as the interactor argument for now for
10711     compatibility.
10712    
10713     * Thuban/UI/view.py (MapCanvas.delegated_messages)
10714     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
10715     Unsubscribe, delegate messages according to the delegated_messages
10716     class variable.
10717     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
10718     attributes from instance variables as described with the
10719     delegated_methods class variable.
10720     (MapCanvas.__init__): New instance variable selection holding the
10721     current selection
10722     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
10723     pass them on to the renderer
10724     (MapCanvas.SetMap): Clear the selection when a different map is
10725     selected.
10726     (MapCanvas.shape_selected): Simple force a complete redraw. The
10727     selection class now takes care of only issueing SHAPES_SELECTED
10728     messages when the set of selected shapes actually does change.
10729     (MapCanvas.SelectShapeAt): The selection is now managed in
10730     self.selection
10731    
10732     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
10733     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
10734     Unsubscribe, delegate messages according to the delegated_messages
10735     class variable.
10736     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
10737     attributes from instance variables as described with the
10738     delegated_methods class variable.
10739     (MainWindow.__init__): The interactor as ivar is gone. The
10740     parameter is still there for compatibility. The selection messages
10741     now come from the canvas.
10742     (MainWindow.current_layer, MainWindow.has_selected_layer):
10743     Delegate to the the canvas.
10744     (MainWindow.LayerShowTable, MainWindow.Classify)
10745     (MainWindow.identify_view_on_demand): The dialogs don't need the
10746     interactor parameter anymore.
10747    
10748     * Thuban/UI/tableview.py (TableFrame.__init__)
10749     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
10750     (LayerTableFrame.row_selected): The interactor is gone. It's job
10751     from the dialog's point of view is now done by the mainwindow,
10752     i.e. the parent. Subscribe to SHAPES_SELECTED instead
10753     of SELECTED_SHAPE
10754    
10755     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
10756     is gone. It's job from the dialog's point of view is now done by
10757     the mainwindow, i.e. the parent.
10758    
10759     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
10760     gone. It's job from the dialog's point of view is now done by the
10761     mainwindow, i.e. the parent.
10762    
10763     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
10764     gone. It's job from the dialog's point of view is now done by the
10765     mainwindow, i.e. the parent.
10766     (SessionTreeCtrl.__init__): New parameter mainwindow which is
10767     stored as self.mainwindow. The mainwindow is need so that the tree
10768     can still subscribe to the selection messages.
10769     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
10770     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
10771     selection is now accessible through the mainwindow. Subscribe to
10772     SHAPES_SELECTED instead of SELECTED_SHAPE
10773    
10774     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
10775     SHAPES_SELECTED message now.
10776     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
10777     so deal with multiple shapes
10778     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
10779     gone. It's job from the dialog's point of view is now done by the
10780     mainwindow, i.e. the parent.
10781    
10782     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
10783     parameter is now a list of shape ids.
10784     (RecordTable.SetTable): The second parameter is now a list of
10785     indices.
10786    
10787     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
10788     selected_shape parameter and ivar to selected_shapes. It's now a
10789     list of shape ids.
10790     (MapRenderer.draw_label_layer): Deal with multiple selected
10791     shapes. Rearrange the code a bit so that the setup and shape type
10792     distinctions are only executed once.
10793    
10794     * test/test_selection.py: Test cases for the selection class
10795    
10796 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
10797    
10798     * Thuban/Model/load.py: Temporary fix so that the xml reader
10799     doesn't cause Thuban to crash.
10800    
10801     * Thuban/Model/layer.py: Handle the cyclic references between
10802     a layer and its classification better, and be sure to disconnect
10803     the classification from the layer when the layer is destroyed
10804     so that we don't maintain a cyclic reference that may not be
10805     garbage collected.
10806    
10807     * Thuban/Model/classification.py: See comment for layer.py.
10808    
10809 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
10810    
10811     * HOWTO-Release: New. Information on the steps for releasing
10812     a new version of Thuban.
10813    
10814 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
10815    
10816     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
10817     Use True instead of true.
10818     (Classifier): Should have a single panel in which all the controls lie.
10819    
10820     * Thuban/UI/proj4dialog.py: Add normal border.
10821    
10822     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
10823    
10824     * Thuban/UI/mainwindow.py: Use True instead of true.
10825    
10826     * setup.py: Update some definitions to use wxWindows2.4 files
10827    
10828     * Data/iceland_sample_class.thuban: Fixed file so that the
10829     field_type information is present.
10830    
10831 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
10832    
10833 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
10834     field type label grow so that when the text changes the
10835     size is updated correctly. This may be a wxWindows bug.
10836    
10837     2003-03-10 Jonathan Coles <[email protected]>
10838    
10839 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
10840     SESSION_REPLACED.
10841    
10842     * Thuban/UI/classifier.py: Wrap text with _().
10843     (ClassGrid.CreateTable): Set dimensions and size hints here,
10844     instead of in Reset, so we only set the size once.
10845    
10846     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
10847    
10848     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10849     Call Close() instead of Shutdown().
10850    
10851     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10852    
10853     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10854     Go back to using OnClose() instead of Shutdown().
10855    
10856     2003-03-10 Jonathan Coles <[email protected]>
10857    
10858 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
10859     to know the old field index as well as the new one.
10860    
10861     2003-03-10 Jonathan Coles <[email protected]>
10862    
10863 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
10864     to correctly set the table information and call this from
10865     __init__ and from _OnFieldSelect so that all the information
10866     is up to date when the dialog opens and when a field is changed.
10867    
10868     2003-03-10 Jonathan Coles <[email protected]>
10869    
10870 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
10871     layer's message function directly, use the ClassChanged() method
10872     when then classification changes. SetField/SetFieldType/SetLayer
10873     must keep the information about field name and field type in
10874     sync when an owning layer is set or removed.
10875    
10876     * Thuban/Model/layer.py: Added ClassChanged() so that the
10877     classification can tell the layer when its data has changed.
10878     (Layer.SetClassification): Accepts None as an arguement to
10879     remove the current classification and correctly handles
10880     adding a new classification.
10881    
10882     * Thuban/Model/load.py: Comment out print statement
10883    
10884     * test/test_classification.py, test/test_save.py: New and
10885     improved tests.
10886    
10887 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
10888    
10889     * Thuban/Model/classification.py: Implemented __copy__ and
10890     __deepcopy__ for ClassGroup* and ClassGroupProperites so
10891     they can easily be copied by the classifier dialog.
10892     (ClassGroupProperites.__init__): The default line color should
10893     have been Color.Black.
10894    
10895     * Thuban/UI/classifier.py: Setting and Getting table values now
10896     uses a consistent set of functions.
10897     (Classifier): Now non-modal. Has field type label which changes
10898     as the field changes. Keep track of buttons in a list so that
10899     we can enable/disable the buttons when the None field is selected.
10900     (SelectPropertiesDialog): Add buttons to make the colors transparent.
10901    
10902     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
10903     does what OnClose did, but can be called by the application to
10904     close a window. Needed when a session changes, and we have to
10905     close the classifier windows.
10906    
10907     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10908     Shuts down open dialogs. Used when a new session is created
10909     or a session is opened.
10910     (MainWindow.SaveSession): Should only call application.SaveSession()
10911     if we don't call SaveSessionAs first.
10912     (MainWindow.Classify): Allow different classifier dialogs for
10913     different layers.
10914    
10915     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
10916     the parent class handle it. Add Shutdown() to unsubscibe from
10917     event notification and call the parent Shutdown(). This was
10918     necessary so the application can close the tree window.
10919    
10920 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
10921    
10922     * Thuban/Model/classification.py: Minor documentation changes,
10923     Addition of __eq__ and __ne__ methods.
10924     (Classification.SetLayer): prevent recursion between this method
10925     and Layer.SetClassification().
10926    
10927     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
10928    
10929     * Thuban/Model/layer.py (SetClassification): prevent recursion
10930     between this method and Classification.SetLayer().
10931    
10932     * test/test_classification.py, test/test_load.py,
10933     test/test_session.py: Fixed and added tests for the classification
10934     classes.
10935    
10936 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
10937    
10938     * Thuban/UI/classifier.py (ClassGrid.__init__)
10939     (ClassGrid.CreateTable): Move the SetSelectionMode call to
10940     CreateTable because otherwise it triggers an assertion in
10941     wxPython/wxGTK 2.4.
10942    
10943 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
10944    
10945 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
10946 jonathan 471
10947 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
10948 jonathan 471
10949 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
10950 jonathan 471
10951 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
10952 jonathan 471
10953     2003-03-05 Jonathan Coles <[email protected]>
10954    
10955 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
10956     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
10957     Store just the groups in the table and generate the other
10958     column information when it is requested. Add "None" field
10959     to pull-down to select no classification.
10960    
10961     * Thuban/common.py: Moved FIELDTYPE constants from table.py
10962     (Str2Num): Only catch ValueError exceptions.
10963    
10964     * Thuban/Model/classification.py: Class documentation. Renaming
10965     of methods with Stroke to Line. Groups are stored in a single
10966     list with the default as the first element. Groups are searched
10967     in the order they appear in the list.
10968    
10969     * Thuban/Model/color.py: Documentation.
10970    
10971     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
10972     the kind of data represented by a field.
10973    
10974     * Thuban/Model/load.py (ProcessSession): Use proper string
10975     conversion function; fixes RTbug #1713.
10976    
10977     * Thuban/Model/save.py (Saver): Store field type information.
10978    
10979     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
10980     (Table): Add field_info_by_name() to retrieve field information
10981     by specifying the field name, not the number.
10982    
10983     * Thuban/UI/mainwindow.py: Function name changes.
10984    
10985     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10986     get the layer classification once. Don't try to classify
10987     values when the field is None: just use the default properties.
10988    
10989     * Thuban/UI/view.py: Function name changes.
10990    
10991     * Doc/thuban.dtd: Add field_type attribute to a classification.
10992    
10993 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
10994    
10995 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
10996     the fill and stroke layer attributes optional with suitable
10997     default values. Add the stroke_width layer attribute. Use correct
10998     syntax for empty elements. Make the attribute list for labels
10999     refer to the label element.
11000    
11001     2003-03-04 Bernhard Herzog <[email protected]>
11002    
11003 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
11004     Python 2.3 containing some of the functionality we implement in
11005     setup.py ourselves.
11006    
11007     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
11008     before the selection mode. Doing it the other way round triggers
11009     an assertion in wxWindows.
11010    
11011     * Thuban/Model/save.py (escape): Fix typo in doc-string
11012    
11013     * Thuban/Model/classification.py: Remove unnecessary wxPython
11014     import
11015    
11016 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
11017    
11018     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
11019     Parameter 'value' should default to None.
11020    
11021     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
11022     the class attribute __classification is now private.
11023    
11024     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
11025     Classifier to ClassGrid. Added support for removing selected rows,
11026     which including code for keeping track of when cells are selected,
11027     and deselected.
11028     (ClassTable): Support for added/removing rows. Fixed a problem
11029     with __ParseInput whereby it would not allow strings (only numbers)
11030     to be entered.
11031     (Classifier): Added button and supporting code for removing
11032     selected rows.
11033    
11034 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
11035 jonathan 434
11036     * Thuban/common.py: Moved color conversion functions into
11037     Thuban/UI/common.py.
11038     (Str2Num): Now converts the float (not the string) to a long/int
11039     so that an exception isn't thrown.
11040    
11041     * Thuban/UI/common.py: Common functions used in several UI modules
11042    
11043     * Thuban/Model/classification.py: Changed the class hierarchy
11044     so that a Classification consists of Groups which return
11045     Properties when a value matches a Group.
11046    
11047     * Thuban/Model/layer.py: Fixed name resolution problem.
11048    
11049     * Thuban/Model/load.py: Use new Classification and Group functions.
11050    
11051     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
11052     failure.
11053     (Saver.write_classification): Use new Classification and Group
11054     functions.
11055    
11056     * Thuban/UI/classifier.py: Changes to use new Classification and Group
11057 jonathan 445 functions. Fix to create a tuple with a single value instead of
11058     simply returning the value.
11059 jonathan 434
11060     * Thuban/UI/renderer.py: Use new Classification and Group functions.
11061     Use common.py functions.
11062    
11063 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
11064 jonathan 447
11065     * test/test_classification.py: Use new Classification and Group
11066     classes.
11067 jonathan 434
11068 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
11069    
11070     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
11071     functions from Thuban color objects to wxWindow colour objects.
11072    
11073     * Thuban/Model/classification.py (Classification): Renamed
11074     GetProperties() to GetClassData(). Used the new iterator
11075     in TreeInfo().
11076     (ClassIterator): Iterator implementation to iterate over the
11077     ClassData objects in a classification object.
11078    
11079     * Thuban/Model/save.py (Saver.write_classificaton): Uses
11080     the new iterator to save the classification information.
11081    
11082     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
11083     for changing the stroke and fill colors and previewing the
11084     changes.
11085    
11086     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
11087     MainWindow.SaveSessionAs): Text string changes so the dialogs
11088     have more meaningful titles.
11089    
11090     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
11091     Classification method name from GetProperties to GetClassData.
11092    
11093     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
11094     instead of accessing now non-existent class variables.
11095    
11096 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
11097    
11098     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
11099     unneeded Shape() call. Rendering is substantially faster without
11100     it and it avoids some problems with broken shape files.
11101    
11102 frank 423 2003-02-20 Frank Koormann <[email protected]>
11103    
11104     Force minimal size of identify and label dialogs. The autosizing
11105     looked too ugly.
11106    
11107     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
11108     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
11109     Set size of listctrl.
11110     * Thuban/UI/identifyview.py (IdentifyView.__init__):
11111     Set size of dialog.
11112    
11113 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
11114    
11115     * test/test_classification.py, test/test_layer.py,
11116     test/test_load.py, test/test_map.py, test/test_session.py:
11117     Updated the tests to use the new functions that are in the
11118     respective classes.
11119    
11120     * Thuban/Model/classification.py (Classification):
11121     Uses the new ClassData* classes. Modification messages are
11122     passed up to the parent layer (if it exists).
11123     (ClassData): New class to encapsulate the common data in each
11124     classification property.
11125     (ClassDataDefault): Represents the Default class. data.
11126     (ClassDataPoint): Represents a single class. data point
11127     (ClassDataRange): Represents a class. range
11128     (ClassDataMap): Represents a class. map (unused).
11129    
11130     * Thuban/Model/color.py: Added Color.None to represent something
11131     with no color. Color.Black represents the color black.
11132     (NoColor): Helper class derived from Color to represent something
11133     with no color.
11134    
11135     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
11136     stroke_width attributes. Made the 'classification' attribute private.
11137     New methods for setting/getting the classification.
11138    
11139     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
11140     to get the classifcation and use the new ClassData* classes to
11141     hold the classification data. Use Str2Num to convert numbers
11142     properly.
11143    
11144     * Thuban/Model/save.py (Saver): Use new Color and Classification
11145     methods
11146    
11147     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
11148     custom grid.
11149     (ClassTable): Support for editing Values and Labels and for
11150     changing what type (point or range) of data is stored in each
11151     property based on how the user enters the data.
11152     (Classifier): Support for saving the new classifications and
11153     launching the dialog to edit a property.
11154     (SelectPropertiesDialog): New class for editing the visual
11155     properties of a classification (stroke color, width, and fill color)
11156     (ClassPreviewer): Took the Draw method from ClassRenderer and
11157     made most of it into this new class. Intend to use this class in
11158     the SelectPropertiesDialog for previewing changes.
11159    
11160     * Thuban/UI/renderer.py: Use new Color and Classification methods.
11161    
11162     * Thuban/UI/tree.py: Formatting changes.
11163    
11164     * Doc/thuban.dtd: Add 'label' element
11165    
11166     * Thuban/common.py: New. Contains common routines used throughout
11167     the code.
11168     (Str2Num): Takes a string and converts it to the "best" type of
11169     number.
11170    
11171 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
11172    
11173     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
11174     dragging flag is always set to 0 even when the tool implementation
11175     raises an exception
11176    
11177 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
11178    
11179     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
11180     method to create a splash screen.
11181     (ThubanApplication.ShowMainWindow): New. Show the main window.
11182     Needed so the splash screen can display the mainwindow
11183     (ThubanApplication.OnInit): Call the
11184     new splash_screen method to determine whether the application
11185     should display a splash screen. If it displays a splash screen do
11186     not immediately show the main window.
11187    
11188 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
11189    
11190     * Thuban/Model/classification.py: Added import line to fix
11191     feature conflicts between running on python2.2 and python2.1.
11192    
11193     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
11194     onto the clinfo parameter, so removed the deepcopy().
11195    
11196 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
11197    
11198 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
11199 jonathan 396 Added element_open variable to track opening and closing of tags
11200     so that tags that don't span more than one line are closed with
11201     /> instead of </tag_name>. Use the GetDefault*() methods of
11202     the Classification class.
11203    
11204     * Thuban/Model/classification.py (Classificaton): Added set and
11205     get methods for the default data. The class also takes a layer
11206     reference so that modification messages can be sent. Fixed the
11207     methods to use the new ClassData class.
11208     (ClassData): New class to encapsulate the classification data
11209    
11210     * Thuban/Model/layer.py (Layer): Remove the
11211 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
11212 jonathan 396 SetDefault*() methods on the layer's classification object.
11213 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
11214 jonathan 396 Classification class.
11215    
11216     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
11217     object instead of a dictionary.
11218    
11219 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
11220 jonathan 396 draw the classifications in the dialog box's table.
11221     (Classifier): Modified to use the ClassRenderer class.
11222    
11223 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
11224     methods of the Classification class.
11225 jonathan 396
11226     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
11227     of the ClassData class.
11228    
11229     * test/test_classification.py, test/test_layer.py,
11230     test/test_map.py, test/test_session.py: Fix the tests to work
11231     with the above code changes.
11232    
11233 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
11234    
11235     * Thuban/Model/classification.py (Classification): Added getNull()
11236     to return the NullData reference
11237    
11238     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
11239     Layer.SetStrokeWidth): Modified these functions to change the
11240     null data in the classification rather than keep these values
11241     directly in the Layer class. Menu options to change these values
11242     work again.
11243    
11244 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
11245    
11246 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
11247 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
11248 jonathan 380 classification data.
11249    
11250 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
11251     Colors in the tree view.
11252    
11253     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
11254     the tree info for classifications. Commented out unnecessary lines.
11255    
11256     * Thuban/Model/classification.py (Classification.TreeInfo): New
11257     function to add information about the classification into the
11258     tree view.
11259    
11260 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
11261 jan 375
11262 tkoester 403 * Thuban/__init__.py (_): New.
11263 jan 375
11264     * Thuban/Model/classification.py, Thuban/Model/extension.py,
11265     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
11266 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
11267     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
11268     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
11269     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
11270     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
11271     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
11272 jan 375
11273 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
11274    
11275 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
11276 jonathan 370
11277 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
11278     a layer classification. Supports specific data points and
11279     ranges.
11280 jonathan 370
11281 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
11282     information.
11283 jonathan 370
11284 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
11285     information.
11286 jonathan 370
11287 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
11288     specifying classification information.
11289 jonathan 370
11290 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
11291     dialog.
11292 jonathan 370
11293 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
11294     classification information.
11295 jonathan 370
11296 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
11297     classification data.
11298 jonathan 370
11299 tkoester 403 * test/test_classification: Tests for the Classification class.
11300 jonathan 370
11301 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
11302    
11303 bh 361 * test/test_command.py: New. Tests for the command classes.
11304    
11305 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
11306     (Command.IsTool): New method to distinguish between command
11307     switching tools and other commands.
11308    
11309     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
11310     the tool to avoid direct assignments to instance variables
11311     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
11312     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
11313     change the tool
11314    
11315     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
11316     active tool's command turns insensitive, disable the tool.
11317     (_tool_command): Use the new ToolCommand class
11318    
11319     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
11320     SelectTool method to change the tool
11321     (iconfile): Use the ToolCommand class
11322    
11323 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
11324    
11325     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
11326     the case of selected items that are not children of Layers or Maps
11327     properly. Previously this bug would trigger an assertion in
11328     wxWindows.
11329    
11330 frank 352 2002-11-06 Frank Koormann <[email protected]>
11331    
11332 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
11333     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
11334     Full Extent).
11335 tkoester 403
11336 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
11337    
11338     * setup.py (setup call): version now 0.1.3
11339    
11340     * MANIFEST.in: Add the files in test/
11341    
11342     * test/README: Add note about tests requiring the iceland data
11343    
11344     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
11345     copyright notice.
11346    
11347 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
11348    
11349     * test/test_map.py
11350     (TestMapWithContents.test_projected_bounding_box): Use an explicit
11351     epsilon.
11352    
11353     * test/support.py (FloatComparisonMixin.assertFloatEqual)
11354     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
11355     message if the assertion fails and don't return the return value
11356     of self.assert_. In assertFloatSeqEqual the return meant that not
11357     all items of the sequence were compared.
11358    
11359 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
11360    
11361 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
11362    
11363     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
11364    
11365 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
11366     the string with the bounding box on the fly because of platform
11367     differences in the way %g is handled.
11368    
11369     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
11370     DBFfile too because Thuban layers can't yet cope missing DBF
11371     files.
11372    
11373     2002-09-20 Bernhard Herzog <[email protected]>
11374    
11375 bh 326 * test/test_menu.py: Use initthuban instead of
11376     add_thuban_dir_to_path to initialize Thuban.
11377    
11378     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
11379     Mixin class for float comparisons
11380     (SubscriberMixin): New. Mixin class to test messages sent through
11381     the Connector class
11382    
11383     * test/README: Fix a typo and add the -v flag to the command for
11384     individual tests
11385    
11386 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
11387    
11388     * test/test_proj.py: New. Test cases for Thuban.Model.proj
11389    
11390     * test/test_map.py: New. Test cases for Thuban.Model.map
11391    
11392     * test/test_layer.py: New. Test cases for Thuban.Model.layer
11393    
11394     * test/test_label.py: New. Test cases for Thuban.Model.label
11395    
11396     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
11397    
11398     * test/test_color.py: New. Test cases for Thuban.Model.color
11399    
11400     * test/test_base.py: New. Test cases for Thuban.Model.base
11401    
11402 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
11403    
11404     * Thuban/Model/session.py (Session.forwarded_channels): Forward
11405     the CHANGED channel too.
11406    
11407     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
11408     CHANGED channel too.
11409     (Map.__init__): Call the Modifiable constructor as well.
11410    
11411     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
11412     event if the modified flag changes.
11413     (Modifiable.changed): Tweak the doc-string.
11414    
11415     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
11416     (MainWindow.set_position_text): Put the code that puts the text
11417     with the mouse position into the status bar into the new method
11418     set_position_text so that it can overwritten in derived classes.
11419    
11420 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
11421    
11422     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
11423     message box on the main window.
11424    
11425 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
11426    
11427     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
11428     the 'E' because it's less likely to interfere with other menu
11429     entries.
11430 bh 315 (MainWindow.build_menu): remove an incorrect comment.
11431 bh 313
11432 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
11433    
11434     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
11435     (_tool_command): Add sensitive parameter
11436     (_has_visible_map): Sensitivity callback to tools and other
11437     commands that require a visible map. Use it in map_zoom_in_tool,
11438     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
11439     and map_full_extent
11440    
11441 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
11442    
11443     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
11444     VIEW_POSITION
11445    
11446 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
11447 frank 306
11448     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
11449    
11450 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
11451    
11452 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
11453     wxWindows already and our implementation doesn't work correctly
11454     with wxGTK 2.3:
11455     (MapCanvas.__init__): Remove the instance variable
11456     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
11457     be drawin
11458     (MapCanvas.OnIdle): Removed.
11459    
11460 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
11461     a parameter to determine the size of the rectangle.
11462     (MapCanvas.find_shape_at): Create the box around the point on a
11463     layer by layer basis and make the size depend on the shape type.
11464     This solves a problem with the selection of point shapes at the
11465     border of the layer's bounding box
11466    
11467 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
11468    
11469 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
11470     for the sensitivity of remove layer.
11471     (_can_remove_layer): New. Sensitivity callback for remove layer
11472     (Command layer_remove): Use _can_remove_layer
11473    
11474     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
11475     determine whether a given layer can be deleted.
11476    
11477 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
11478     (MapCanvas.do_redraw): Get rid of the unused update_region
11479     instance variable
11480    
11481 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
11482    
11483 bh 292 * test/: new subdirectory with a bunch of unit tests.
11484    
11485     * test/README, test/test_table.py, test/test_save.py,
11486     test/test_menu.py, test/test_load.py: Initial set of tests and
11487     brief instructions on how to run them
11488    
11489 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
11490    
11491 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
11492     arcs with multiple parts.
11493    
11494 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
11495     Handle degenrate rectangles.
11496    
11497 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
11498     (Table.__init__): Keep track of whether the DBF is open for
11499     writing
11500     (Table.write_record): Open the DBF file for writing when necessary
11501    
11502 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
11503    
11504     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
11505     dbf files only for reading by default. Use a new writable dbf
11506     object for writing.
11507    
11508 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
11509    
11510 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
11511     (MainWindow.Context): New method to return a context
11512     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
11513     new method
11514    
11515 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
11516     layer table specific code from TableGrid into LayerTableGrid
11517     (TableFrame, LayerTableFrame): Split the layer table specific code
11518     from TableFrame into LayerTableFrame
11519 bh 280 (LayerTableGrid.select_shape): Remove a debug print
11520 bh 278
11521     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
11522     LayerTableFrame
11523    
11524 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
11525    
11526     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
11527     absolute filename.
11528    
11529 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
11530    
11531 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
11532     records.
11533 tkoester 403 (Table.__init__): Open the DBF file for writing too.
11534 bh 275
11535     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
11536     into the underlying table.
11537    
11538     * extensions/shapelib/shapefil.h (DBFCommit),
11539     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
11540     commit any changes made to the DBF file.
11541    
11542 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
11543     (_tool_command): Put the code that generates the "checked"
11544     callback into a separate function so that we can reuse it
11545     elsewhere
11546    
11547 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
11548     session into an XML file. The main reason to introduce a class is
11549     that applications built on Thuban can derive from it so that they
11550     can save additional information in a session file.
11551     (save_session): Delegate almost all the work to the Saver class.
11552     Rename the filename argument to file because it may be a file like
11553     object now.
11554    
11555     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
11556     code. Remove the little test code which would be executed when the
11557     module is run as a script which didn't work anymore since it can't
11558     import the other Thuban modules.
11559     (ProcessSession, load_session): Refactor the ProcessSession to
11560     have one method for each element start and end tag so that derived
11561     classes can easily override the processing of individual tags.
11562     Also, always parse with namespaces enabled because applications
11563     built on top of Thuban will likely use namespaces if they extend
11564     the session file format.
11565    
11566 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
11567    
11568     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
11569     because thubaninit_contents will do it for us.
11570    
11571 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
11572 jan 265
11573     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
11574     tree window already open
11575    
11576 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
11577    
11578 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
11579     with self.
11580    
11581     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
11582     when we have actually captured it.
11583    
11584 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
11585     shapefile and destroy the table.
11586    
11587     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
11588    
11589 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
11590    
11591 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
11592     instance variable columns
11593     (RecordTable.GetTypeName): row and col may be negative in some
11594     cases.
11595    
11596 bh 254 * setup.py (InstallLocal.initialize_options)
11597     (InstallLocal.finalize_options, InstallLocal.user_options): New
11598     option create-init-file to build a thubaninit.py when running
11599     install_local
11600     (InstallLocal.run): Create the thubaninit.py module when requested
11601     (thubaninit_contents): Split the template into several parts and
11602     create a new function thubaninit_contents that creates the
11603     contents of a thubaninit module.
11604     (ThubanInstall.run): Use the new function to create the thubaninit
11605     module.
11606    
11607 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
11608    
11609     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
11610     cleanup.
11611     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
11612    
11613     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
11614     direct base class' Destroy method.
11615    
11616     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
11617     layers.
11618     (Map.Destroy): Destroy the label_layer as well and call the
11619     inherited Desatroymethod first so that no more messages are
11620     issued.
11621     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
11622     message if the stacking order actually has changed. Add
11623     doc-strings.
11624     (Map.BoundingBox): Correct the doc-string.
11625     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
11626     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
11627    
11628     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
11629     all labels.
11630    
11631 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
11632    
11633     * Thuban/Model/map.py (Map.subscribe_layer_channels)
11634     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
11635     to a layer's channels into separate methods.
11636     (Map.RemoveLayer, Map.AddLayer): Call the new methods
11637     (Map.Destroy): Unsubscribe from a layer's channels before
11638     destroying it.
11639    
11640     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
11641     selected_layer parameter to searched_layer which is the layer to
11642     search in.
11643     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
11644     search to that layer. Return the selected layer and shape.
11645    
11646     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
11647     typo
11648    
11649 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
11650    
11651 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
11652     Extend the doc string.
11653     (ThubanApplication.subscribe_session)
11654     (ThubanApplication.unsubscribe_session): New methods to
11655     subscribe/unsubscribe to/from session channels.
11656     (ThubanApplication.SetSession): Call the new methods here.
11657     (ThubanApplication.maps_changed, ThubanApplication.set_map):
11658     Renamed set_map to maps_changed. Its now a subscriber for
11659     MAPS_CHANGED.
11660    
11661     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
11662     x-coordinate in case of simple clicks
11663    
11664     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
11665     don't pass it as a parameter
11666    
11667     * Thuban/Model/session.py (Session.RemoveMap): New
11668    
11669 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
11670     window size into a parameter.
11671    
11672 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
11673    
11674 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
11675     just commands.
11676    
11677 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
11678     parameter list a bit to allow setting the window title and the
11679     initial message in the status bar. Update the callers.
11680    
11681     * Thuban/UI/application.py (ThubanApplication.OnInit)
11682     (ThubanApplication.CreateMainWindow): Put the mainwindow
11683     instantiation into a separate method so that it can be overridden
11684     by a subclass.
11685    
11686 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
11687    
11688 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
11689     another changed message is issued to make it easier to get
11690     notified of changes.
11691     (Session): Update the doc string
11692     (Session.forward): Issue changed-events as CHANGED as well.
11693     (Session.changed): Overwrite the inherited version to issue
11694     CHANGED events as well.
11695    
11696     * Thuban/UI/tree.py: We can now simply subscribe to the session's
11697     CHANGED channel to be informed of changes.
11698     (SessionTreeCtrl.session_channels): Not needed any longer.
11699 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
11700 bh 234 Only have to (un)subscribe CHANGED
11701    
11702     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
11703    
11704 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
11705     for the wxPython locale bug to __init__.py so that it's
11706     automatically executed by anybody using UI code from Thuban.
11707    
11708 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
11709    
11710 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
11711    
11712     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
11713     as parameter and store it in an instance variable
11714     (MainWindow.invoke_command, MainWindow.update_command_ui)
11715     (MainWindow.save_modified_session, MainWindow.NewSession)
11716     (MainWindow.OpenSession, MainWindow.SaveSession)
11717     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
11718     application object.
11719    
11720     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
11721     the main window with self.
11722    
11723 bh 225 * Thuban/UI/context.py: New module with the context class
11724    
11725     * Thuban/UI/command.py (Command): Update doc string.
11726    
11727     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
11728     MainWindow.update_command_ui): Pass an instance of the context
11729     class to the command's methods
11730     (check_current_tool, call_method): Handle the new context
11731     implementation
11732    
11733     * Examples/simple_extensions/simple_tool.py (simple_tool,
11734     check_simple_tool): Handle the new context implementation
11735    
11736     * Examples/simple_extensions/simple_command.py (simple_command):
11737     Handle the new context implementation. Update the comments about
11738     the context.
11739    
11740     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
11741     doc-string
11742     (ThubanApplication.Session): New method to return the session
11743     object
11744    
11745     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
11746     interactor's selected_layer may not be a layer of the current
11747     session when the tree is updated while a new session is being set.
11748    
11749 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
11750    
11751     * Thuban/UI/tree.py (color_string): Removed. No longer used.
11752     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
11753     update_tree into update_tree and add_items. The tree now uses a
11754     more generic way to display the contents of the tree.
11755     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
11756    
11757     * Thuban/Model/layer.py (Layer.TreeInfo),
11758     Thuban/Model/extension.py (Extension.TreeInfo),
11759     Thuban/Model/map.py (Map.TreeInfo),
11760 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
11761 bh 217 Add TreeInfo methods to implement the new tree view update scheme
11762    
11763 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
11764    
11765     * Thuban/UI/application.py: Don't use "import from" for the
11766     MainWindow. It can't always be resolved.
11767     (ThubanApplication.OnInit): change reference to MainWindow
11768     accordingly.
11769    
11770     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
11771     completely
11772    
11773 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
11774    
11775     * setup.py (create_init_module): New configurable variable whose
11776     default depends on the platform we're running on.
11777     (ThubanInstall.initialize_options): Initialize
11778     self.create_init_module from the global create_init_module
11779     (ThubanInstall.user_options): indictate that the options
11780     create-init-module and init-module-dir have arguments.
11781    
11782     * setup.py: In the setup call change the version number to include
11783     cvs.
11784    
11785     * MANIFEST.in: Add the files in Examples
11786    
11787 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
11788    
11789 bh 210 * setup.py: In the setup call, use the thuban homepage as the
11790     value of the url parameter.
11791    
11792 bh 208 * Examples: New subdirectory for examples.
11793    
11794     * Examples/simple_extensions/simple_tool.xpm,
11795     Examples/simple_extensions/simple_tool.py,
11796     Examples/simple_extensions/simple_command.py,
11797     Examples/simple_extensions/README: Simple examples showing how to
11798     add new commands and tools.
11799    
11800 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
11801     bdist_rpm that we also have an install script.
11802     (bdist_inno): Add 2002 to the copyright notice.
11803    
11804 bh 205 * setup.py: Create a file in python's site-packages directory to
11805     make installation of Thuban as a library easier.
11806     (ThubanInstall.user_options): Add two new options,
11807     create-init-module and init-module-dir
11808     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
11809     filenames for installation in the default directories.
11810     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
11811     the inherited methods to capture some filenames before they're
11812     transformed too much by distutils.
11813     (ThubanInstall.run): Create the init module if requested.
11814     (ThubanInstall.thuban_init_filename): New method to return the
11815     full name of the init module.
11816     (ThubanInstall.get_outputs): Append the filename of the init
11817     module.
11818    
11819 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
11820    
11821 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
11822     handle the prefix properly which means that the default for the
11823     installation prefix should be /usr for RPMs and /usr/local when
11824     doing a normal source install.
11825     (bdist_rpm_install_script): Script to override the default install
11826     commands in the specfile generated by the bdist_rpm command.
11827     (thuban_bdist_rpm.user_options): Add a prefix option
11828     (thuban_bdist_rpm.initialize_options): Init the prefix option.
11829     Create the script files for the spec files as empty files here
11830     (thuban_bdist_rpm._make_spec_file): Override the inherited method
11831     to fill the script files with content.
11832    
11833 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
11834     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
11835     argument. save_session now automatically uses this version,
11836     solving a problem when saving to a relative filename.
11837    
11838     * setup.py: In the setup call, make sure that the library
11839     directories are under $prefix/lib not directly under $prefix.
11840    
11841 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
11842 jan 199
11843     * Thuban/Model/extension.py: new module to handle extension objects.
11844     * Thuban/Model/messages.py: new messages for extensions.
11845     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
11846     Session.AddExtension): new for handling extensions.
11847     Also some other minor changes to round up extension handling.
11848     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
11849     of Extension titles and title and names of its objects.
11850    
11851 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
11852    
11853     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
11854 bh 202 the events for a command.
11855 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
11856     Call bind_command_events to bind the events. add_toolbar_command
11857     can now bind events too so that it's possible to have commands
11858     that are only available through the toolbar.
11859     (MainWindow.init_ids): New instance variable events_bound to keep
11860     track of for which commands events have been bound.
11861    
11862 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
11863    
11864     * Thuban/UI/menu.py: New module to build and manage menus.
11865    
11866     * Thuban/UI/mainwindow.py: Remove some unused imports.
11867     (MainWindow.__init__, main_menu): move the definition of the main
11868     menu from __init__ to the Menu instance main_menu.
11869     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
11870     build the menu bar and sub-menus from a menu description.
11871    
11872     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
11873     startup file
11874     (ThubanApplication.read_startup_files): New method to run
11875     ~/.thuban/thubanstart.py
11876    
11877 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
11878     Move the toolbar definition to the Menu instance main_toolbar.
11879     (MainWindow.build_toolbar): New method to build the toolbar
11880     similar to the build_menu methods
11881    
11882 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
11883    
11884 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
11885     layer_outline_color. Fix it in the definition of the command too.
11886    
11887 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
11888    
11889 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
11890    
11891     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
11892     in the docstring
11893    
11894 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
11895    
11896 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
11897     when the shapefile is empty.
11898     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
11899     now return None for empty shapefiles. Update doc-strings.
11900    
11901     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
11902     the layer's bbox being None.
11903    
11904     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
11905     layer's bbox being None.
11906    
11907 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
11908     necessary.
11909     (MapCanvas.__init__): New instance variables, last_selected_layer
11910     and last_selected_shape to determine how the selection has
11911     changed.
11912    
11913     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
11914     AutoSizeColumns because it will cause a traversal of the entire
11915     table which for large .dbf files will take a very long time.
11916    
11917 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
11918    
11919     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
11920     maximum depth for the tree than shapelib does by default.
11921    
11922 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
11923    
11924     * setup.py (py_modules): The shptree modules doesn't have a
11925     wrapper, so don't include it in the py_modules
11926    
11927 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
11928    
11929     * extensions/shapelib/shptree.c (compare_ints): Make arguments
11930     const void * as in the qsort prototype
11931     (SHPTreeFindLikelyShapes): Remove some unused variables.
11932    
11933     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
11934     maintains to redraw the window during a drag.
11935     (MapCanvas.unprojected_rect_around_point): New method to determine
11936     a small region around a point for hit-testing.
11937     (MapCanvas.find_shape_at): Only test the shapes in a small region
11938     around the point.
11939    
11940     * setup.py: Increment the version to 0.1.2
11941    
11942     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
11943     debug print and set session to None after unsubscribing
11944    
11945 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
11946    
11947 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
11948     the file to have a .thuban extension.
11949    
11950 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
11951     all the session channels to subscribe to to update the tree
11952     (SessionTreeCtrl.session_changed): Remember the session so that we
11953     can unsubscribe properly. Use the new class constant to
11954     unsubscribe from the old session and subscribe to the new one.
11955     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
11956     subscriptions of the SessionTreeCtrl.
11957     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
11958    
11959     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
11960     Session Tree" command to the file menu.
11961    
11962     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
11963     as update_region to the renderer.
11964    
11965     * Thuban/UI/renderer.py
11966     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
11967     update box is now directly a tuple, not a wxRect anymore.
11968    
11969     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
11970     prints.
11971    
11972     2002-05-07 Bernhard Herzog <[email protected]>
11973    
11974 bh 146 * setup.py: Add the shptree extension module. See
11975     extensions/pyshapelib/ChangeLog for more details.
11976    
11977     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
11978     extensions/shapelib/dbfopen.c: Really update to the versions of
11979     shapelib 1.2.9. For some reason it wasn't really done on
11980     2002-04-11.
11981    
11982     * extensions/shapelib/shptree.c: Modified version of shptree.c of
11983     shapelib 1.2.9. The only real difference is the use of qsort
11984     instead of a bubble sort implementation
11985    
11986     * Thuban/Model/layer.py (Layer.__init__): New instance variable
11987     shapetree to hold the shapelib quadtree for the shapefile
11988     (Layer.open_shapefile): Create the quad tree.
11989     (Layer.ShapesInRegion): New method to return the ids of shapes in
11990     a given region using the quad tree.
11991    
11992     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
11993     comment
11994     (draw_polygon_shape): Accept both arcs and polygons.
11995     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
11996     the api.
11997    
11998     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
11999     return the shape ids to be rendered in a given layer.
12000     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
12001     ids. Use draw_polygon_shape to draw arc shapes as well.
12002     (ScreenRenderer.RenderMap): New parameter for the rectangle that
12003     has to be updated
12004     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
12005     calling it's ShapesInRegion method.
12006    
12007     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
12008     update_region for the update region.
12009     (MapCanvas.OnPaint): Maintain the update region
12010     (MapCanvas.do_redraw): Pass the bounding box of the update_region
12011     to the renderer when drawing the bitmap. Reset the update_region.
12012    
12013 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
12014    
12015 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
12016     MainWindow.OpenSession): Change the file extension of the session
12017     files to .thuban
12018    
12019 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
12020     Move the map channels to be forwarded by the session into the
12021 bh 146 class constant with forwarded_channels. Also add
12022     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
12023     forwarded_channels
12024 bh 129
12025     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
12026     typo and some rewording).
12027    
12028 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
12029    
12030     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
12031     around to speed up most redraws:
12032     (MapCanvas.__init__): New instance variable bitmap which holds the
12033     bitmap
12034     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
12035     self.bitmap to draw.
12036     (MapCanvas.full_redraw): New method to force a full redraw
12037     including the bitmap
12038     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
12039     make sure the bitmap is redrawn.
12040     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
12041     MapCanvas.shape_selected): Call full_redraw instead of readraw to
12042     make sure the bitmap is redrawn.
12043     (MapCanvas.OnSize): New method to handle size events so that the
12044     bitmap can be redrawn.
12045    
12046 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
12047    
12048     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
12049     canvas' VIEW_POSITION event
12050     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
12051     Update the text in the status-bar accordingly.
12052    
12053     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
12054     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
12055     called.
12056     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
12057     current_position
12058     (MapCanvas.set_current_position): New method to set
12059     current_position. Issue a VIEW_POSITION event
12060     (MapCanvas.CurrentPosition): New public method to return the value
12061     of current_position. Should be called when the VIEW_POSITION event
12062     is processed.
12063     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
12064     Update the position.
12065     (MapCanvas.OnLeaveWindow): Set the position to None.
12066    
12067     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
12068     position in the statusbar
12069    
12070 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
12071 frank 120
12072     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
12073    
12074 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
12075    
12076 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
12077    
12078     * Resources/Bitmaps/fullextent.xpm: new
12079 jan 116
12080 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
12081 jan 116
12082 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
12083     box
12084 jan 114
12085 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
12086    
12087 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
12088    
12089     * Thuban/UI/tree.py (update_tree): added added map extent
12090    
12091     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
12092 tkoester 403 icon; added map_full_extend as tool
12093 jan 114
12094 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
12095 jan 107
12096     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
12097     saving _new_ sessions
12098    
12099     * Thuban/Model/session.py (create_empty_session): new session
12100     don't have a filename (set to None)
12101    
12102     * Thuban/UI/tree.py (update_tree): added filename and modified flag
12103    
12104     * Thuban/Model/load.py (ProcessSession): convert projection
12105     parameters from unicode to regular string
12106    
12107     * Data/iceland_sample.session: Added UTM Zone 26 projection.
12108    
12109 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
12110    
12111     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
12112     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
12113     1.2.9
12114    
12115     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
12116     the pyshapelib directoy into the list of include dirs, so that
12117     pyshapelib_api.h can be found.
12118    
12119     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
12120     holds the pyshapelib C-API
12121     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
12122     pyshapelib_api to access the shapelib functions.
12123     (initwxproj): Import the c_api from the shapelib module and
12124     initialize pyshapelib_api.
12125    
12126 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
12127    
12128 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
12129     initialize_options to create the scripts for the rpm.
12130    
12131 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
12132    
12133 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
12134    
12135 bh 87 * setup.py: Increment version to 0.1.1
12136    
12137 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
12138     Layer" and "Remove Layer" commands from the layer menu to the map
12139     menu
12140    
12141 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
12142    
12143     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
12144     argument (python <= 1.5.2 erroneously accepted multiuple
12145     arguments)
12146    
12147 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
12148    
12149     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
12150     RecordGrid in the identifyview.
12151     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
12152     IdentifyListCtrl. The grid allows editing of the values.
12153    
12154     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
12155     implementing a grid for a single row of a thuban table.
12156    
12157     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
12158     layers by default. Easier to use than the previous default of only
12159     searching through the select layer which meant that if no layer
12160     was selected, you couldn't select a shape.
12161    
12162     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
12163    
12164     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
12165     stroke_width attribute
12166    
12167     * Thuban/Model/save.py (save_session): Write the new stroke_width
12168     attribute
12169    
12170     * Thuban/Model/load.py (ProcessSession.startElement): Read the
12171     stroke_width attribute
12172    
12173     * Thuban/Model/layer.py (Layer.__init__): New parameter and
12174     instance variable stroke_width
12175     (Layer.SetStrokeWidth): Set the stroke_width.
12176    
12177 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
12178    
12179     * extensions/thuban/wxproj.cpp (project_points): Fix two
12180     off-by-one errors in the last loop that joins the various parts
12181     together.
12182    
12183 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
12184    
12185     * setup.py (data_dist.make_distribution): Fix some typos
12186    
12187 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
12188    
12189     * README: Slight tweaking in preparation for the 0.1 release
12190    
12191     * setup.cfg: Add section for sdist to create both tgz and zip
12192     archives
12193    
12194     * setup.py: increase version number to 0.1
12195     (data_dist): New command class for data distribution
12196    
12197 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
12198    
12199 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
12200     Handle the case of no layer (i.e. layer is None) properly.
12201    
12202 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
12203 bh 70 Set the initial selection of the combo boxes to reflect the
12204     projection we're starting with in a way that works on windows,
12205     too.
12206    
12207 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
12208     puiblisher's ids in hex to make it easier to compare them to the
12209     standard repr of python methods
12210    
12211     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
12212     messages
12213    
12214 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
12215    
12216 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
12217     deselect the layer if no layer is selected
12218    
12219 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
12220     idle time when there actually is something to draw. If there's
12221     nothing to draw simply clear the window
12222     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
12223     (MapCanvas.SetMap): force a redraw in all cases because
12224     FitMapToWindow doesn't always do it.
12225     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
12226     specify the point to move into the center of the window
12227     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
12228     dragged, zoon in/out by a factor of 2
12229 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
12230     index, i.e. reversed drawing order) so that objects appearing to
12231     be in from of others are selected first. This is probably mostly
12232     relevant for point shapes where the symbols used may overlap
12233 bh 59
12234     * Thuban/Model/session.py (create_empty_session): Unset the
12235     modified bit before returning it
12236    
12237     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
12238     create_empty_session session to create the new, empty session.
12239    
12240     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
12241     the tool bitmaps.
12242     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
12243     the code that asks whether the session should be saved into the
12244     new method save_modified_session.
12245     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
12246     method to save modified session here too.
12247    
12248 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
12249    
12250     * setup.py (InnoIconItem): fix typo
12251    
12252     (thuban_bdist_inno.run):
12253     (bdist_inno.run): Move the decision not to create symlinks on
12254     non-nt platforms to thuban_bdist_inno and do it unconditinally
12255     since we never want to create the symlinks here
12256    
12257 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
12258    
12259 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
12260     identify view immediately
12261    
12262     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
12263     and SelectableRecordListCtrl that implement the code shared by the
12264     identify view and the label dialog
12265    
12266     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
12267     new class RecordListCtrl
12268    
12269     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
12270     return value of GetValue is None instead of using it as a boolean
12271     directly so that Zero numbers are handled properly.
12272     (LabelListCtrl): Derive from the new class
12273     SelectableRecordListCtrl
12274    
12275 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
12276     (Proj4Dialog.dialogLayout): Make the window resizable and set the
12277     size of the text control explicitly to make the sizers work on
12278     both Windows and X.
12279    
12280 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
12281    
12282     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
12283     that can limit the search to the currently selected layer.
12284     (MapCanvas.SelectShapeAt): Make sure that the currently selected
12285     layer stays selected even when no shape is found
12286 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
12287     height do nothing (avoids zero division errors)
12288 bh 44
12289 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
12290    
12291 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
12292     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
12293     convenient :-)
12294     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
12295     a new instvar layer_to_item to map layers to tree items
12296     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
12297     to match the current selection in the interactor
12298    
12299 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
12300     (Interactor.HasSelectedLayer): New methods to query the current
12301     selection
12302    
12303     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
12304     (MainWindow.has_selected_layer): Simply call the appropriate
12305     interactor method
12306    
12307     * Thuban/UI/mainwindow.py (MainWindow.__init__):
12308     (MainWindow.LayerShowTable):
12309     (MainWindow.identify_view_on_demand): Store the interactor in an
12310     instvar and use that reference instead of going through main.app
12311    
12312 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
12313     * Thuban/UI/application.py (ThubanApplication.OnInit):
12314 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
12315     with the new mainwindow method ShowSessionTree and not directly
12316     the application's OnInit method
12317    
12318     * Thuban/UI/tree.py (myTreeCtrlPanel):
12319     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
12320     TreeCtrl isntead of a panel. This affects most method since we now
12321     refer to self instead of self.tree
12322     (SessionTreeView): New class implementing a non-modal dialog
12323     showing the session tree.
12324    
12325 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
12326     layer to the tableview dialog.
12327    
12328     * Thuban/UI/tableview.py: Add some doc-strings
12329 tkoester 403 (TableGrid):
12330 bh 35 (TableGrid.OnRangeSelect):
12331     (TableGrid.OnSelectCell):
12332     (TableFrame.__init__):
12333     (TableFrame.row_selected):
12334     Selecting rows in the grid view now updates the selected shapes
12335     through the TableFrame. To achieve this we derive TableGrid from
12336     Publisher and introduce the message type ROW_SELECTED which the
12337     TableFrame subscribes to and which is issued by OnRangeSelect and
12338     OnSelectCell
12339    
12340     (DataTable.SelectRow): Removed because it's no longer needed in
12341     the row/shape selection scheme
12342    
12343 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
12344     dialogs
12345    
12346     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
12347     the SELECTED_SHAPE message anymore. This is now handled by the
12348     parent.
12349     (TableGrid.select_shape): Only update the selection if the shape
12350     is not None.
12351     (TableFrame): Inherit from the new NonModalDialog class.
12352     (TableFrame.__init__, TableFrame.select_shape): Handle the
12353     SELECT_SHAPE message.
12354     (TableFrame.OnClose): Extend the inherited method to unsubscribe
12355     SELECT_SHAPE
12356    
12357     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
12358     (MainWindow.add_dialog):
12359     (MainWindow.dialog_open):
12360     (MainWindow.remove_dialog):
12361     (MainWindow.get_open_dialog): New methods to maintain a dictionary
12362     of opened non-modal dialogs.
12363    
12364     (MainWindow.__init__): Initialize the new non-modal dictionary
12365     management code
12366     (MainWindow.LayerShowTable): maintain separate dialogs for each
12367     table using the non-modal dialog management code to only open a
12368     view once for each table.
12369    
12370     (MainWindow.IdentifyTool):
12371     (MainWindow.__init__):
12372     (MainWindow.identify_view_on_demand): Don't open the identify view
12373     in IdentifyTool anymore. This will be done automatically by the
12374     new method identify_view_on_demand which handles the
12375     SELECTED_SHAPE message so that the identify view will be opened on
12376     demand
12377    
12378     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
12379     the interactor argument. The SELECTED_SHAPE message is now handled
12380     by the parent.
12381     (IdentifyView.__init__): Add the interactor argument so that we
12382     can handle the SELECTED_SHAPE message here
12383     (IdentifyView.selected_shape): New method to handle the
12384     SELECTED_SHAPE messages
12385    
12386     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
12387     NonModalDialog class
12388     (IdentifyView.OnClose): Extend the inherited version to
12389     unsubscribe SELECT_SHAPE
12390    
12391     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
12392    
12393 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
12394    
12395     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
12396 tkoester 403
12397 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
12398     interactor to pass through to the MapCanvas
12399 tkoester 403
12400 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
12401     argument to the MainWindow constructor to get rid of the ugly hack
12402     that made main.app available early just so that the mapcanvas
12403     could access the interactor object.
12404    
12405 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
12406    
12407 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
12408     that runs a modal message box
12409     (MainWindow.OnClose): Use the new method
12410     (MainWindow.RemoveLayer): Just do nothing in case no layer is
12411     selected. The command should be grayed out anyway, so there's no
12412     need to pop up a message box.
12413     (MainWindow.AddLayer): Pop up a message box with an error message
12414     if the shape file can't be opened
12415    
12416     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
12417     immediately. This will cause an exception in case the file can't
12418     be opened and we can display an appropriate message.
12419    
12420 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
12421    
12422     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
12423     specific bdist_rpm command.
12424    
12425     * Thuban/UI/main.py: Catch ImportError exceptions when importing
12426     the locale module because it may not be available on some
12427     installations.
12428    
12429     * extensions/pyprojection/LICENSE: Copy of the license text in
12430     Projection.i. Having it in a separate file makes it easier to
12431     refer to license text in e.g. RPMs
12432    
12433 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
12434    
12435 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
12436     more generic
12437    
12438     * setup.py (ThubanInstall.get_outputs): Add the symlink in
12439     <prefix>/bin to the outputs
12440     (ThubanInstall.link_file): New method to link files. We need this
12441     because the standard copy_files refuses to link non-existing
12442     files.
12443     (ThubanInstall.run): Remove the leading install root from the
12444     script filename if an install root was specified and use the new
12445     link_file method
12446 tkoester 403
12447 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
12448     the window when the first layer is added to the map.
12449    
12450     * setup.py (ThubanInstall.run): Honor the build root (self.root)
12451     when linking thuban.py to <prefix>/bin
12452    
12453 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
12454    
12455     * setup.py: In the setup call, the install parameters shouldn't
12456     have trailing slashes because distutils on non-posix platforms
12457     doesn't like that. The same applies to other directories like
12458     "Resources/Bitmaps"
12459    
12460     In the configuration section for nt, move the wxWindows directory
12461     optins into the part clearly marked as editable.
12462    
12463     (InstallLocal.initialize_options):
12464     (InstallLocal.user_options): remove the currently unused debug
12465     flag
12466     (thuban_build_py.find_all_modules): Add this method so that it
12467     works for our case of having packages and modules in one
12468     distribution as well.
12469     (ThubanInstall.initialize_options):
12470     (ThubanInstall.finalize_options):
12471     (ThubanInstall.user_options):
12472     (ThubanInstall.boolean_options): Add new options, do-symlink and
12473     extra files. Since these are the first ThubanInstall specific
12474     options, override user_options and boolean_options
12475     (ThubanInstall.run): Honor the new do-symlink and extra-files
12476     options.
12477     (ThubanInstall.get_outputs): Add to override the base-class's
12478     version and add the extra-files to the outputs
12479     (bdist_inno): New class for windows distributions with Inno Setup
12480     (InnoIconItem): Helper class for bdist_inno
12481     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
12482     this together with the appropriate parameters, to the setup call.
12483 tkoester 403
12484 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
12485     installer
12486    
12487     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
12488     changing_selection to avoid recursive selection events when
12489     modifying the selection in response to a selection event.
12490     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
12491     changing the tree's selection.
12492     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
12493     we're not being called indirectly from normalize_selection.
12494    
12495     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
12496     event.Check only if the command is actuall checkable.
12497     (MainWindow.__init__): Call the toolbar's Realize method to make
12498     sure that the items are actually shown
12499    
12500 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
12501    
12502 bh 9 * setup.py: Fix some doc strings
12503    
12504 bh 7 * ChangeLog: started
12505    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26