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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2731 - (hide annotations)
Mon Feb 26 23:00:14 2007 UTC (18 years ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 479733 byte(s)
Doc/ThubanModel.xmi: Updated the format of the umbrello file.
Loaded and saved with umbrello 1.3.2, manually changed the
codegeneration tag to be empty again and change the XMI.model
to not contain a local path.
Now umbrello 1.5.5 also opens the file without crashing. 
Thanks to Philippe LeGrand who discovered the problem and the
solution and filed report 141279 on bugs.kde.org for this umbrello
problem.

1 bernhard 2731 007-02-26 Bernhard Reiter <[email protected]>
2    
3     * Doc/ThubanModel.xmi: Updated the format of the umbrello file.
4     Loaded and saved with umbrello 1.3.2, manually changed the
5     codegeneration tag to be empty again and change the XMI.model
6     to not contain a local path.
7     Now umbrello 1.5.5 also opens the file without crashing.
8     Thanks to Philippe LeGrand who discovered the problem and the
9     solution and filed report 141279 on bugs.kde.org for this umbrello
10     problem.
11    
12 dpinte 2730 2007-02-21 Didrik Pinte <[email protected]>
13    
14     * Extensions/umn_mapserver/__init__.py : UTF8 locales bugfix
15    
16 bernhard 2723 2007-02-20 Bernhard Reiter <[email protected]>
17    
18 bernhard 2729 * Thuban/version.py, setup.py: Getting ready for release 1.2.0.
19     Using this version number.
20    
21 bernhard 2728 * Doc/README: fixed a typo.
22    
23     * Doc/technotes/release_process.txt: Updated. Reference platform
24     is Debian Etch now. If windows, it should be window XP.
25     Marked a few entries in the instructions as "Old:".
26    
27     * README: Bumped requirements to wxWidgets 2.6.3.2 and gdal 1.3.2..
28     Added urls for homepage and infrastructure on wald. Fixed a typo.
29    
30     * MANIFEST.in: Added subdir packaging which should be in the tarball.
31    
32     * NEWS: Completed changes from 1.1.0 until today as gathered from
33     the Changelog entries. Added small section about OGR known problems
34     because we do not have a release-notes file so far.
35    
36 bernhard 2727 * Doc/manual/thuban-manual.xml: Removed the installation instructions
37     as they are outdated and they should be only in one place.
38     Bumped version number of the document to 1.2.0. Marked it as Draft
39     in the title.
40    
41 bernhard 2726 * Extensions/svgexport/: Get ready for release. Bump version
42     number to 1.0.1. Adjusted numbers in TODO.
43    
44 bernhard 2725 * Thuban/UI/about.py: Reworked the about text. It shows now
45     when somebody was active on Thuban. Added a list of maintainers.
46     Bernhard Reiter is the current maintainer, following up on Bernhard
47     Herzog.
48    
49 bernhard 2724 * Extensions/export_shapefile/export_shapefile.py: untabify.
50 bernhard 2723
51 bernhard 2724 * test/README: Added example how to set the PATH for postgis on
52     Debian Etch.
53    
54 dpinte 2721 2007-01-13 Didrik Pinte <[email protected]>
55    
56     bboxdump, gns2shp, importAPR, mouseposition, ogr, profiling, svgexport
57     extensions migrated to wxPython 2.6
58    
59     * Extensions/bboxdump/bboxdump.py:
60     updated wx statements
61    
62     * Extensions/gns2shp/gns2shp.py:
63     updated wx statements
64    
65     * Extensions/importAPR/importAPR.py:
66     updated wx statements
67    
68     * Extensions/mouseposition/mouseposition.py:
69     updated wx statements
70    
71     * Extensions/ogr/
72     ogrdialog.py, ogrstart.py:
73     updated wx statements
74    
75     * Extensions/profiling/profiling.py:
76     updated wx statements
77    
78     * Extensions/svgexport/
79     maplegend.py, svgsaver.py:
80     updated wx statements
81    
82    
83 dpinte 2719 2007-01-08 Didrik Pinte <[email protected]>
84    
85 dpinte 2720 export_shapefile extension migrated to wxPython 2.6
86    
87     * Extensions/export_shapefile/export_shapefile.py:
88     updated wx statements, changed the FileDialog to wx.SAVE (was wx.OPEN)
89    
90     2007-01-08 Didrik Pinte <[email protected]>
91    
92 dpinte 2719 umn_mapserver extension migrated to wxPython 2.6
93    
94     * Extensions/umn_maserver/
95     mf_handle.py, mf_import.py, mf_export.py:
96     update wx imports to 2.6 policy
97    
98 dpinte 2718 2007-01-06 Didrik Pinte <[email protected]>
99    
100 bernhard 2722 UTF-8 locales support reading non utf-8 files.
101     This is a workaround and not a real bugfix. See
102     http://wald.intevation.org/tracker/index.php?func=detail&aid=118
103     for more details
104 dpinte 2718
105 bernhard 2722 * Thuban/UI/tableview.py, controls.py, baserenderer.py, view.py:
106     decode text from iso-8859-1 encoding.
107 dpinte 2718
108 bernhard 2717 2007-01-01 Bernhard Reiter <[email protected]>
109 bernhard 2722
110 bernhard 2717 * test/postgissupport.py, test/test_postgis_db.py: adding an
111     explicit WITH OIDS to the create table commands. This fixes tests
112     that rely on an oid column to be present for postgresql >=8.0.
113     Thanks for Frank Koormann for the hint.
114    
115 dpinte 2716 2006-11-06 Didrik Pinte <[email protected]>
116    
117     * libraries/thuban/wxproj.cpp: bugfix - allow compilation with
118     msvc++ toolkit 2003
119    
120 bernhard 2714 2006-11-06 Bernhard Reiter <[email protected]>
121    
122 bernhard 2715 Made it easier to run PostGIS test on Debian Etch. Improving
123     https://wald.intevation.org/tracker/index.php?func=detail&aid=173 .
124 bernhard 2714
125     * test/postgissupport.py: Taking pg_ctl and initdb commands
126     from internal variables now. Adding deactivated example values
127     for Debian Etch.
128     find_postgis_sql(): Added special line for Debian Etch postgresql-8.1.
129     Added copyright year 2006.
130    
131 bernhard 2713 2006-10-25 Bernhard Reiter <[email protected]>
132    
133     Moved ogr Extension to Extension menu.
134    
135     * Extensions/ogr/
136     __init__.py, ogrstart.py, ogrshapes.py, ogrdialog.py
137     test/test_OGRShapestore.py, test/__init__.py:
138     adding encoding information and made sure Autor's names
139     with an umlaut are actually written with an umlaut.
140    
141     * Extensions/ogr/ogrstrat.py: now registering in menu "Extensions",
142     having a "(testing)" string before the submenu to prepare for 1.2.0
143     release. Bumped copyright year to 2006.
144    
145 bernhard 2712 2006-10-15 Bernhard Reiter <[email protected]>
146    
147     * Thuban/UI/renderer.py: Added module variable verbose and
148     added verbose output before doing a raster projection.
149     Minor: Added (c) year 2006.
150    
151     * test/test_baserenderer.py: Added new function
152     test_projected_raster_decimalcommalocale()
153     Added new author Bernhard Reiter and new copyright year 2006.
154    
155     * libraries/thuban/gdalwarp.cpp(ProjectRasterFile): Adding
156     switching to LC_NUMERIC "C" and back before calling GDAL functions -
157     only #if python >=2.4 .
158    
159 dpinte 2710 2006-10-10 Didrik Pinte <[email protected]>
160 dpinte 2711
161     Win32 build updates
162    
163     * setup.py :
164     - update to the latest libs for win32 setup tasks
165     - added gdal and Lib content to the inno setup build task
166     - added stable and experimental extensions to setup packages
167    
168     * thuban.py :
169     - gdal support for win32 inno installation
170    
171     2006-10-10 Didrik Pinte <[email protected]>
172    
173 dpinte 2710 * Thuban/Model/layer.py (Layer.GetLabelPosFromShape): new method
174     extracted from Thuban/UI/viewport.py
175     * Thuban/UI/viewport.py (Viewport.LabelShapeAt): uses new method
176    
177 dpinte 2709 2006-09-28 Didrik Pinte <[email protected]>
178    
179     * Thuban/UI/classgen.py: bugfix due to wx2.6 update
180    
181     * Thuban/UI/view.py: removed non needed declaration
182    
183     * Thuban/UI/selection.py : typo correction
184    
185 bernhard 2705 2006-09-24 Bernhard Reiter <[email protected]>
186    
187 bernhard 2708 * Thuban/Model/proj.py(_do_we_have_to_work_around_broken_proj):
188     Making the test more robust for observed python 2.3 problems
189     with setlocale().
190    
191 bernhard 2705 * test/runtests.py: Added new option ---setdecimalcommalocale
192 bernhard 2712 to run all tests with an LC_NUMERIC that uses comma as decimal_point.
193 bernhard 2705 Minor: Added (c) year 2006. Fixed typo in a docstring.
194    
195     * test/test_transientdb.py: Minor: Added (c) year 2006. Fixed typo in
196     a docstring.
197    
198 bernhard 2702 2006-09-23 Bernhard Reiter <[email protected]>
199    
200     * Extensions/ogr/test/test_OGRShapestore.py: fixed skip_if_no_ogr()
201     and added it to TestOGRTable.setUp() so that all tests get skipped
202     if ogr cannot be imported. Added (c) year 2006.
203    
204 dpinte 2701 2006-09-18 Didrik Pinte <[email protected]>
205    
206     * wxPython 2.6 update : wx 2.4 syntax has been updated to 2.6
207    
208 bernhard 2696 2006-09-18 Bernhard Reiter <[email protected]>
209    
210 bernhard 2698 Fixed proj behaviour with python >=2.4 when decimal_point != '.'.
211    
212 bernhard 2697 * Thuban/UI/application.py: Fixed warning dialog when gdal is missing.
213    
214     * test/test_proj.py: new test_lc_numeric_robustness(). Added author
215     Bernhard Reiter and new copyright year 2006.
216    
217 bernhard 2698 * Thuban/Model/proj.py: New _do_we_have_to_work_around_broken_proj()
218     and Projection.assuregoodlocale(), Projection.assureinitlocale().
219     Added author Bernhard Reiter and (c) 2006.
220    
221 bernhard 2694 2006-09-15 Bernhard Reiter <[email protected]>
222 bernhard 2692
223     * README: added RXP and pyRXP as optional for tests.
224 bernhard 2697
225 bernhard 2694 * test/localessupport.py: New. Contains a helper function
226     to find a locale with comma used as decimal_point.
227 bernhard 2692
228 bernhard 2690 2006-08-31 Bernhard Reiter <[email protected]>
229 bernhard 2691
230 bernhard 2690 * README: fixed URLs to sqlite and pysqlite.
231 bernhard 2697
232 bernhard 2691 * Thuban/UI/about.py: Added Didrik Pinte as contributor. Extended
233     copyright range to include 2006.
234 bernhard 2690
235 dpinte 2689 2006-06-29 Didrik Pinte <[email protected]>
236    
237     * Thuban/UI/main.py: circular import fix.
238    
239 frank 2688 2006-06-27 Frank Koormann <[email protected]>
240    
241     New Classification "Pattern": Classify text attributes by regexp.
242    
243     * Thuban/Model/classification.py (class ClassGroupPattern):
244     New, group is associated with a regular expression.
245     (Classification._compile_classification): Store compiled regexp and
246     original group for pattern.
247     (Classification.FindGroup): Added pattern.
248    
249     * Thuban/UI/classifier.py
250     (ClassGrid._OnLabelRightClicked, ClassGrid.labelPopup):
251     New, add popup to select singleton/pattern.
252     (ClassTable.GetRowLabelValue, ClassTable.GetValueAsCustom,
253     ClassTable.SetValueAsCustom): Added pattern.
254     (ClassTable.__ParseInput): Autodetect singleton/pattern.
255    
256     * Thuban/Model/save.py (SessionSaver.write_classification):
257     Added pattern.
258    
259     * Thuban/Model/load.py (SessionLoader.start_clpattern,
260     SessionLoader.end_clpattern): New, process pattern elements.
261    
262     * test/test_classification.py (class TestClassGroupPattern): New.
263     (TestClassification.test_add_pattern,
264     TestClassification.test_multiple_groups_textual,
265     TestClassification.test_deepcopy_textual): New.
266     (TestClassification.test_multiple_groups_numerical):
267     Renamed test_multiple_groups.
268     (TestClassification.test_deepcopy_numerical): Renamed test_deepcopy.
269    
270     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
271     Added pattern.
272    
273     * test/test_load.py (ClassificationTest.TestLayers, TestClassification):
274     Added pattern.
275    
276     * test/test_layer.py
277     (TestLayerModification.test_set_classification_textual): New
278     (TestLayerModification.test_set_classification_numerical):
279     Renamed test_set_classification.
280    
281     * Doc/manual/thuban-manual.xml: Added pattern to layer classification
282     description.
283    
284     * Resources/XML/thuban-1.1.dtd: Added clpattern element and attribs.
285    
286 dpinte 2687 2006-06-29 Didrik Pinte <[email protected]>
287    
288     * Thuban/version.py: Bugfix determination of SQLite, the wright one !
289    
290 dpinte 2685 2006-06-28 Didrik Pinte <[email protected]>
291    
292 dpinte 2686 * packaging/windows/thubanstart.py: sample file loading all the stable
293     extensions
294    
295     2006-06-28 Didrik Pinte <[email protected]>
296    
297 dpinte 2685 * Thuban/version.py: Bugfix determination of SQLite on old and recent
298     systems (support pysqlite1 and pysqlite2)
299    
300 frank 2684 2006-06-27 Frank Koormann <[email protected]>
301    
302     * Thuban/version.py: Bugfix determination of SQLite on old systems.
303    
304 dpinte 2683 2006-05-17 Didrik Pinte <[email protected]>
305     * Extensions/ogr/__init__.py : updated test for win32 and correct
306     imports
307    
308 dpinte 2680 2006-05-15 Didrik Pinte <[email protected]>
309 dpinte 2682 Ashamed ... still some tabs in the files
310    
311 bernhard 2722 * Thuban/version.py : tabs removed
312     * Thuban/Model/transientdb.py : tabs removed
313 dpinte 2682
314     2006-05-15 Didrik Pinte <[email protected]>
315    
316 bernhard 2722 * Thuban/version.py : coding style correction
317     * Thuban/Model/transientdb.py : coding style correction
318 dpinte 2681
319     2006-05-15 Didrik Pinte <[email protected]>
320 dpinte 2682
321 bernhard 2722 * Thuban/version.py : Updated imports to support pysqlite2
322 dpinte 2682
323 bernhard 2722 * Thuban/Model/transientdb.py : Updated imports to support pysqlite2
324 dpinte 2680 Patched the querying system to support the param style of pysqlite2
325    
326 dpinte 2679 2006-04-24 Didrik Pinte <[email protected]>
327 bernhard 2722
328     * Extensions/svgexport/__init__.py: The extension now works on win32
329 dpinte 2679 architecture. Bug #87 corrected.
330    
331 bernhard 2678 2006-04-20 Bernhard Reiter <[email protected]>
332 bernhard 2722
333 bernhard 2678 * Doc/technotes/coding_guidelines.txt: Changed text from CVS to SVN.
334     Removed emacs specific hint and replaced it with a general hint
335     that editors might support writing changelogs.
336    
337 bernhard 2677 2006-04-12 Bernhard Reiter <[email protected]>
338 bernhard 2678
339 bernhard 2677 * Thuban/version.py: Changed thuban_release mechanism to use "svn"
340     instead of "cvs".
341    
342 bernhard 2676 2006-03-31 Bernhard Reiter <[email protected]>
343    
344     * libraries/thuban/wxproj.cpp: including proj_api.h instead of
345     projects.h now. According the Frank Warmerdam and man pj_init
346     this is the public interface to proj. Thus I have changed PJ to projPJ.
347     And I could remove the hack to avoid clashes with typedef PVALUE
348     and #define LP in projects.h clashing with symbols when trying to
349     build on windows. The file is cleaner and nicer now.
350    
351 bernhard 2675 2006-03-29 Bernhard Reiter <[email protected]>
352 bernhard 2678
353 bernhard 2675 * libraries/thuban/wxproj.cpp: undef LP to avoid clash when
354     trying to build with mingw.
355    
356 bernhard 2673 2005-10-18 Bernhard Reiter <[email protected]>
357    
358 bernhard 2674 * Thuban/UI/about.py: remove unused import of getdefaultlocale.
359     Added display of internal encoding to the about dialog text.
360    
361     * Extensions/svgexport/__init__.py: changed version to "1.0.0+cvs".
362    
363     2005-10-18 Bernhard Reiter <[email protected]>
364    
365 bernhard 2673 Startup improved: We fail right away if the internal encoding could
366     not be determined.
367    
368     * Thuban/__init__.py (get_internal_encoding): new.
369    
370     * test/test_stringrepresentation.py (class TestInternalEncoding):
371     Preserve the internal encoding for the tests in this class.
372    
373 bernhard 2671 2005-10-17 Bernhard Reiter <[email protected]>
374    
375 bernhard 2672 * test/test_stringrepresentation.py: New file, for now testing
376     that set_internal_coding() is throwing an exception for bad exceptions.
377    
378     * Thuban/__init__.py (set_internal_encoding): added a forwards
379     and backward translation, so that we fail early if the
380     internal_encoding is bad.
381    
382     2005-10-17 Bernhard Reiter <[email protected]>
383    
384 bernhard 2671 svgexport 1.0.0cvs: Fixed ARC layer writing: No filling is done.
385     You could actually get polylines with filling in between,
386     when the classification for the lines had a fill color.
387     E.g. this happens when you generate a classification from a ramp.
388    
389     * Extensions/svgexport/test/test_svgmapwriter.py:
390     New test_export_arc_no_fill(). Extend copyright notice to 2005.
391    
392     * Extensions/svgexport/svgmapwriter.py
393     (SVGRenderer.draw_shape_layer_incrementally()):
394     Setting TRANSPARENT_BRUSH for shaptype ARC.
395     Extend copyright notice to 2005.
396    
397     * Extensions/svgexport/__init__.py: Extend copyright notice to 2005.
398    
399 frank 2670 2005-09-08 Frank Koormann <[email protected]>
400    
401     * Doc/manual/thuban-manual.xml (Map Management): Fixed typo reported
402     by Erik (sigra.at.home.se)
403    
404 jan 2669 2005-08-18 Jan-Oliver Wagner <[email protected]>
405    
406     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
407     Call the right method for the default size.
408    
409 jan 2667 2005-08-11 Jan-Oliver Wagner <[email protected]>
410    
411     * Extensions/export_shapefile: New.
412    
413     * Extensions/export_shapefile/__init__.py: New. Initialize
414     the export_shapefile extension.
415    
416     * Extensions/export_shapefile/export_shapefile.py: New.
417     Exports a layer as a Shapefile.
418    
419 jan 2664 2005-08-08 Jan-Oliver Wagner <[email protected]>
420    
421     * po/de.po: String fixes. This fixes Debian bug #313843.
422    
423 jan 2660 2005-07-27 Jan-Oliver Wagner <[email protected]>
424    
425     Remove the attributes from the layer element in
426     .thuban files for the save routine.
427     This also solves RT bug #3149,
428     https://intevation.de/rt/webrt?serial_num=3149
429    
430     * test/test_load.py: (TestSingleLayer, TestNonAsciiColumnName,
431     TestLayerVisibility, TestSymbolSize, TestClassification, TestLabels,
432     TestLayerProjection, TestJoinedTable, TestLabelLayer): Removed
433     attributes from layer element to classification clnull element.
434    
435     * test/test_save.py (SaveSessionTest.testSingleLayer,
436     SaveSessionTest.testLayerProjection,
437     SaveSessionTest.testClassifiedLayer,
438     SaveSessionTest.test_joined_table, SaveSessionTest.test_save_postgis):
439     Removed attributes from layer element to classification clnull element.
440     (test_save_postgis.NonConnectionStore._fetch_table_information):
441     added pretending to have a shape_type.
442    
443     * Resources/XML/thuban-1.1.dtd: Make the attributes field
444     and field_type of classification optional.
445    
446     * Thuban/Model/classification.py (Classification.TreeItem.build_info):
447     Added output of size.
448    
449     * Thuban/Model/load.py (SessionLoader.start_classification):
450     Change attribute 'field' and 'field_type' from obligatory to
451     optional to allow empty classes (ie. only with a default=clnull).
452    
453     * Thuban/Model/save.py (SessionSaver.write_layer): Don't write
454     any attributes anymore for the layer element.
455     (SessionSaver.write_classification): Even if there is no
456     classification field, still write the classification because
457     the clnull (default) symbol will not be defined anymore as
458     part of the layer element.
459    
460 bh 2643 2005-07-05 Bernhard Herzog <[email protected]>
461    
462 bh 2652 * setup.py (setup call): Version 1.1.0
463    
464     * NEWS: Update for 1.1.0
465    
466     * MANIFEST.in: Add *.txt to files taken from Doc. Otherwise the
467     technores won't be included
468    
469     * Thuban/UI/about.py (About.__init__): Extend copyright notice to
470     2005
471    
472     * po/de.po: Updated.
473    
474     2005-07-05 Bernhard Herzog <[email protected]>
475    
476 bh 2645 * README: gdal 1.1.8 is too old. 1.2.5 works.
477    
478     2005-07-05 Bernhard Herzog <[email protected]>
479    
480 bh 2650 * Resources/XML/thuban-1.1.dtd (rasterlayer): Add the opacity and
481     masktype attributes.
482    
483     2005-07-05 Bernhard Herzog <[email protected]>
484    
485 bh 2644 * Thuban/Model/layer.py (Layer.__mangle_bounding_box)
486     (Layer.ClipBoundingBox): Rename ClipBoundingBox to
487     __mangle_bounding_box. See the comments in the code and RT #2845
488    
489     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
490     Remove the explicit test of ClipBoundingBox. The method isn't
491     public anymore and the direct call in the test wasn't necessary in
492     the first place. If ClipBoundingBox (now __mangle_bounding_box)
493     isn't called, the return value of ShapesInRegion will be
494     different.
495    
496     2005-07-05 Bernhard Herzog <[email protected]>
497    
498 bh 2643 * Thuban/UI/viewport.py (ViewPort.set_view_transform): Handle
499     ZeroDivisionError exceptions. I don't know when they happen
500     exactly. It probably happens when the projections aren't set
501     properly.
502    
503 bh 2642 2005-07-01 Bernhard Herzog <[email protected]>
504    
505     First step towards unicode. With this roughly we're at step 1
506     string_representation.txt
507    
508     * Doc/technotes/string_representation.txt: New. Document how
509     strings are represented in Thuban and how to get to a Unicode
510     Thuban.
511    
512     * Thuban/__init__.py (set_internal_encoding)
513     (unicode_from_internal, internal_from_unicode): New. The first few
514     functions for the internal string representation
515    
516     * Thuban/UI/about.py (unicodeToLocale): Removed. Use
517     internal_from_unicode instead.
518    
519     * Thuban/UI/__init__.py (install_wx_translation): Determine the
520     encoding to use for the internal string representation. Also,
521     change the translation function to return strings in internal
522     representation even on unicode builds of wxPython
523    
524     * Thuban/Model/load.py (SessionLoader.check_attrs): Decode
525     filenames too.
526     (SessionLoader.start_clrange): Use check_attrs to decode and check
527     the attributes.
528    
529     * Thuban/Model/xmlreader.py (XMLReader.encode): Use
530     internal_from_unicode to convert unicode strings.
531    
532     * Thuban/Model/xmlwriter.py (XMLWriter.encode): Use
533     unicode_from_internal when applicable
534    
535     * test/runtests.py (main): New command line option:
536     internal-encoding to specify the internal string encoding to use
537     in the tests.
538    
539     * test/support.py (initthuban): Set the internal encoding to
540     latin-1
541    
542     * test/test_load.py (TestSingleLayer.test, TestClassification.test)
543     (TestLabelLayer.test): Use the internal string representation when
544     dealing with non-ascii characters
545    
546     * test/test_load_1_0.py (TestSingleLayer.test)
547     (TestClassification.test, TestLabelLayer.test): Use the internal
548     string representation when dealing with non-ascii characters
549    
550     * test/test_load_0_9.py (TestSingleLayer.test)
551     (TestClassification.test): Use the internal string representation
552     when dealing with non-ascii characters
553    
554     * test/test_load_0_8.py (TestUnicodeStrings.test): Use the
555     internal string representation when dealing with non-ascii
556     characters
557    
558     * test/test_save.py (XMLWriterTest.testEncode)
559     (SaveSessionTest.testClassifiedLayer): Use the internal string
560     representation when dealing with non-ascii characters where
561     applicable
562    
563 bh 2638 2005-06-30 Bernhard Herzog <[email protected]>
564    
565 bh 2641 * test/runtests.py: Untabify.
566    
567     2005-06-30 Bernhard Herzog <[email protected]>
568    
569 bh 2639 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
570     untabify.
571    
572     2005-06-30 Bernhard Herzog <[email protected]>
573    
574 bh 2638 * Extensions/ogr/test/__init__.py: Add missing coding directive
575    
576 jan 2631 2005-06-28 Jan-Oliver Wagner <[email protected]>
577    
578 jan 2636 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
579     Use the default size for rendering selected items of default type.
580     Fixes part 2 of https://intevation.de/rt/webrt?serial_num=3149
581    
582     2005-06-28 Jan-Oliver Wagner <[email protected]>
583    
584 jan 2631 * Extensions/importAPR/apr.py (APR_BShSym): Extend by 'Stripple'.
585     (APR_TClr.GetThubanColor): Fix bug in color interpretation.
586     Thanks to Frank Koormann who identified this problem.
587    
588     * Extensions/importAPR/importAPR.py (APR_VShSym): New. Just
589     another symbol identified.
590    
591 jan 2628 2005-06-27 Jan-Oliver Wagner <[email protected]>
592    
593     * Doc/manual/thuban-manual-de.xml: More translations.
594    
595 jonathan 2626 2005-05-12 Jonathan Coles <[email protected]>
596    
597     * Thuban/UI/projdialog.py: Add missing import, which led to an
598     exception when opening a layer's projection.
599    
600 bh 2623 2005-05-09 Bernhard Herzog <[email protected]>
601    
602 bh 2624 * test/support.py (FileLoadTestCase.filename): Fix doc-string.
603    
604     2005-05-09 Bernhard Herzog <[email protected]>
605    
606 bh 2623 * Thuban/Model/postgisdb.py (PostGISConnection.connect): Set the
607     connection to autoconnect. Fixes RT#3148.
608    
609     * test/test_postgis_db.py
610     (TestPostGISSpecialCases.test_simple_error_handling): New test
611     that attempts to reproduce RT#3148.
612    
613 jonathan 2622 2005-05-06 Jonathan Coles <[email protected]>
614    
615     Add support for saving and loading the opacity and mask type
616     properties of RasterLayers. Also add support for proper use
617     of alpha information while drawing images not in 'RAW' format.
618     If transparency in an image format (e.g, PNG) is supported by
619     wxWidgets then the image would previously have been draw with
620     transparent regions, but the opaque regions would have been
621     unaffected by a change in the layer's opacity. This patch
622     corrects the problem.
623    
624     * Thuban/Model/layer.py (RasterLayer): Added opacity and
625     masktype parameters to the constructor, and set the
626     appropriate variables to those values.
627    
628     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Added
629     code to read the opacity and mask type of the layer and construct
630     a new layer with the additional parameters.
631    
632     * Thuban/Model/save.py (SessionSaver.write_layer): Added code
633     to save the opacity and mask type of a layer.
634    
635     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
636     the opacity of the layer to draw_raster_data rather than the layer.
637     (BaseRenderer.draw_raster_data): Remove the layer parameter because
638     the function doesn't need to know about the layer. Add the optional
639     opacity parameter whose default is 1.0. Add 'PNG' as a supported
640     graphics format.
641    
642     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Fixed
643     signature to match that in BaseRenderer. Use the new opacity argument
644     in place of calling layer.Opacity(). In the case where the
645     format is not 'RAW', alpha_data is None and the loaded image has
646     alpha information, use the file's alpha information. This is
647     still subject to the layer's opacity setting.
648    
649     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
650     Fixed signature to match that in BaseRenderer.
651    
652     * test/test_load.py (TestRasterLayer): Change file_contents to
653     include opacity and masktype variables.
654     (TestRasterLayer.test): Include tests for opacity and masktype
655     changes.
656    
657     * test/test_save.py (SaveSessionTest.testRasterLayer): Restructure
658     test to cover a variety of combinations of masktype and opacity
659     settings.
660    
661 jan 2612 2005-05-02 Jan-Oliver Wagner <[email protected]>
662    
663     * debian/rules: add --use-wx-python-swig-hack
664     to the build command.
665     Thanks to Moritz Lennert for pointing this out.
666    
667 jan 2610 2005-04-28 Jan-Oliver Wagner <[email protected]>
668    
669     Introduce OGRFileShapeStore in ogr extension.
670     This allows at least that loaded shapefile shape stores
671     can be saved correctly in the thuban session file
672     and reloaded again (reload is via core shapefile
673     routine, not OGR). For other types, .thuban files
674     can not be reloaded for the time being.
675    
676     * Extensions/ogr/ogrshapes.py (OGRFileShapeStore): New. This
677     class ist to be used for any file-based shape stores
678     accessed through OGR.
679    
680     * Extensions/ogr/ogrstart.py (open_with_ogr): Added
681     forgotten _ for i18n. Adapted call OpenFileShapestore
682     regarding new parameter.
683     (OpenFileShapestore): Use OGRFileShapeStore instead of
684     OGRShapeStore. Fix return value (None instead of null).
685     Add new parameter "mainwindow" to avoid accessing global
686     context.
687    
688 jan 2607 2005-04-27 Jan-Oliver Wagner <[email protected]>
689    
690     Introduce FileShapeStore as generalization for
691     file-based shape stores. In a first instance
692     this allows additional modules to handle shapefile
693     format as well, namely the OGR extension.
694    
695     * Thuban/Model/data.py: Various small fixes in doc-strings.
696     (FileShapeStore): New class.
697     (ShapefileStore): Derive from FileShapeStore.
698     (ShapefileStore.__init__): Call __init__ of FileShapeStore,
699     rename self.table to self._table, initialize self._bbox
700     (ShapefileStore._open_shapefile): Use self._bbox instead of self.bbox
701     and self.FileName() instead of self.filename.
702     (ShapefileStore.Table): Use self._table instead of self.table.
703     (ShapefileStore.FileName): Removed (moved to FileShapeStore).
704     (ShapefileStore.BoundingBox): Use self._bbox instead of self.bbox.
705    
706     * Thuban/Model/save.py: Replace ShapefileStore by FileShapeStore.
707     (SessionSaver.write_data_containers): Only use methods of the
708     base class FileShapeStore.
709    
710 joey 2604 2005-04-26 Martin Schulze <[email protected]>
711    
712     * Extensions/wms/wms.py (render_wms_layer): Adjusted the render
713     function to the modified render engine
714    
715     2005-04-25 Martin Schulze <[email protected]>
716    
717     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
718     Added a description according to the CVS log message
719    
720     2005-04-23 Martin Schulze <[email protected]>
721    
722     * Thuban/UI/renderer.py: Added a missing import
723    
724 russell 2600 2005-04-23 Russell Nelson <[email protected]>
725    
726 russell 2613 * Thuban/UI/view.py (MapCanvas.OnMiddle{Up,Down}): Changed the
727     way the previous tool is remembered, so that middle-button
728     panning works even if you haven't selected a tool.
729 russell 2600
730 bh 2598 2005-04-11 Bernhard Herzog <[email protected]>
731    
732     * libraries/thuban/wxproj.cpp: Move the compatibility code that
733     deals with the wxPython 2.4 version of wxPython.h into the #ifdef
734     branch that includes wxPython.h because it's only needed when
735     wxPython.h is used. Also, it won't compile when
736     USE_WX_PYTHON_SWIG_HACK is set otherwise.
737    
738 bh 2597 2005-04-07 Bernhard Herzog <[email protected]>
739    
740     * Thuban/UI/classifier.py (ClassGrid.__init__): Use -1 as the ID.
741     (ID_CLASS_TABLE): Removed. It wasn't used anywhere except in
742     ClassGrid.__init__ and it's value is outside of the valid
743     range (must be < 32768). wxPython 2.5 complains about it with an
744     exception.
745    
746 jan 2596 2005-04-05 Jan-Oliver Wagner <[email protected]>
747    
748     * Doc/manual/thuban-manual-de.xml: More translations.
749    
750 bh 2590 2005-04-05 Bernhard Herzog <[email protected]>
751    
752 bh 2591 * libraries/thuban/wxproj.cpp: Make it work with a wxPython.h from
753     wxPython 2.4 as well. Also, remove a now obsolete comment.
754    
755     2005-04-05 Bernhard Herzog <[email protected]>
756    
757 bh 2590 Use wxPython.h by default but provide a workaround when it isn't
758     available.
759    
760     * setup.py (wxproj_extension): New variable. Assign the Extension
761     instance for Lib.wxproj to this variable instead of putting it
762     directly into the listso that it can be accessed by other code
763     later.
764     (thuban_build_ext.user_options): Added boolean option
765     --use-wx-python-swig-hack.
766     (thuban_build_ext.initialize_options): Initialize the new option
767     to False.
768     (thuban_build_ext.finalize_options): If the new option was given,
769     define the preprocesser macro USE_WX_PYTHON_SWIG_HACK.
770     (thuban_build_ext): Update the doc-string
771    
772     * libraries/thuban/wxproj.cpp: Normally we use
773     wx/wxPython/wxPython.h now. Only if USE_WX_PYTHON_SWIG_HACK is
774     defined, use swigPtrConvertHack.h instead.
775    
776     * libraries/thuban/swigPtrConvertHack.h: Remove the code that was
777     copied over from wxPython.h.
778     (decode_pointer_new): New. Equivalent of decode_pointer for
779     wxPython 2.5.
780     (wxPyConvertSwigPtr): Modified to cope with wxPython 2.5 as well.
781    
782     * README: Add section on potential build problems which explains
783     how the work-around for a missing wxPython.h is activated.
784    
785 bh 2588 2005-03-29 Bernhard Herzog <[email protected]>
786    
787 bh 2589 * test/postgissupport.py (find_postgis_sql): Added yet another
788     potential location for (lw)postgis.sql because the file has moved
789     again in postgis 1.0.0 rc4.
790    
791     2005-03-29 Bernhard Herzog <[email protected]>
792    
793 bh 2588 * Thuban/UI/legend.py (BMP_SIZE_W, BMP_SIZE_H): Set both to 16 to
794     match the site of the legend_icon_layer icon. Otherwise wxpython
795     2.5 complains when the legend is created with the error:
796    
797     PyAssertionError: C++ assertion "(bitmap.GetWidth() == m_width &&
798     bitmap.GetHeight() == m_height) || (m_width == 0 && m_height ==
799     0)" failed in ./src/generic/imaglist.cpp(81): invalid bitmap size
800     in wxImageList: this might work on this platform but definitely
801     won't under Windows.
802    
803 jonathan 2587 2005-03-23 Jonathan Coles <[email protected]>
804    
805     These changes add support for adjusting the opacity of a raster layer.
806    
807     * Thuban/Model/layer.py (RasterLayer.Opacity): Replaces AlphaOpacity.
808     (RasterLayer.SetOpacity): Replaces SetAlphaOpacity. Also triggers
809     a LAYER_CHANGED event if the opacity actually changes.
810    
811     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_data): Added
812     layer parameter needed in the implementation of this method in
813     renderer.py.
814    
815     * Thuban/UI/layerproperties.py (LayerProperties.dialog_layout): Fixed
816     typo 00 -> 0.
817    
818     * Thuban/UI/rasterlayerproperties.py (RasterLayerProperties): Added
819     control to adjust opacity.
820    
821     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Scale the
822     alpha data based on the opacity level of the layer.
823    
824     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Now
825     accepts a layer parameter.
826    
827     * test/test_layer.py (TestLayerModification.test_raster_layer):
828     Rename opacity method calls and add test for LAYER_CHANGED.
829    
830 bh 2586 2005-03-16 Bernhard Herzog <[email protected]>
831    
832     * test/test_connector.py (DeletionTestMixin.check_deletions)
833     (DeletionTestMixin.check_deletetions): renamed to check_deletions.
834     update the callers.
835    
836 jan 2585 2005-03-14 Jan-Oliver Wagner <[email protected]>
837    
838     * Doc/manual/thuban-manual-de.xml: More translations.
839    
840 jan 2584 2005-03-10 Jan-Oliver Wagner <[email protected]>
841    
842     Introducing initialization callbacks for extensions.
843    
844     * Thuban/UI/extensionregistry.py (ExtensionDesc.__init__): Added
845     optional parameter init_callback.
846     (ExtensionDesc.init_ext): New. Executes the callback and sets
847     a status.
848    
849     * Thuban/UI/application.py (ThubanApplication.OnInit): Add the
850     initialization of the extensions.
851     (ThubanApplication.init_extensions): Init all extensions.
852    
853     * Thuban/UI/about.py (About.__init__): Added status of the extensions
854     to the about text.
855    
856     * Extensions/gns2shp/__init__.py: Added init method for Extension
857     description.
858     (init): New. Contains the initialization of the module.
859    
860 nhueffme 2577 2005-03-04 Nina Hüffmeyer <[email protected]>
861    
862     * Extensions/ogr/ogrdialog.py: Added a dialog, which asks for
863     OGRConnection to open a datasource. Removed dialog to display all
864     available drivers. Added some doc strings.
865    
866     * Extensions/ogr/ogrstart.py: Added menu entry for opening an
867     OGRDatasource with a string. Added two opening methods which return an
868     OGRDatasource (either data from file or from DB).
869    
870     * Extensions/ogr/ogrshapes.py: Added class OGRGeometry, which
871     represents a geometry reference of an OGRFeature. OGRShape now has a
872     list of referenced geometry objects (important for geometry
873     collections).
874     For OGRShapeStores loaded from a DB an ID column can be specified now.
875    
876 jan 2576 2005-02-22 Jan-Oliver Wagner <[email protected]>
877    
878     * test/test_map.py (TestMapWithContents.test_tree_info):
879     Added label layer for comparison.
880    
881 jonathan 2574 2005-02-18 Jonathan Coles <[email protected]>
882    
883     * libraries/thuban/gdalwarp.cpp (GetImageData): Optimize the loop
884     which builds a mask. Handle the majority of an image in a loop,
885     creating 8 bits at a time. Later, handle the edge case where less
886     than 8 bits are packed.
887    
888 bh 2573 2005-02-18 Bernhard Herzog <[email protected]>
889    
890     * test/test_baserenderer.py (TestBaseRenderer.setUp): Fix
891     doc-string
892    
893 jonathan 2571 2005-02-18 Jonathan Coles <[email protected]>
894    
895 jonathan 2572 * setup.py: Remove wx_cs_params from gdal compile options.
896    
897     2005-02-18 Jonathan Coles <[email protected]>
898    
899 jonathan 2571 Refactored baserenderer.py and renderer.py to remove baserenderer.py's
900     dependencies on wxPython. Added a new method projected_raster_layer()
901     that returns a raster layer image in projected space. This must be
902     implemented in classes derived from BaseRenderer. This also eliminates
903     the dependency on gdal in baserenderer.py.
904    
905     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
906     new projected_raster_layer() to get projected raster image instead
907     of directly calling ProjectRasterFile().
908     (BaseRenderer.projected_raster_layer): New. This must be implemented
909     by derived classes. It takes almost the same arguments as ProjectRasterFile
910     did and returns a projected image with mask and alpha data (if requested).
911     (BaseRenderer.render_map_incrementally): Remove the check for gdal since
912     that check will be done in MapRenderer.projected_raster_layer(). This
913     also allows other implementations to use different projection code.
914    
915     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
916     Implementation of BaseRenderer.projected_raster_layer. Checks for
917     gdal support and wxPython version. Also handles exceptions from
918     ProjectRasterFile.
919    
920     * libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
921     and added a variable which can be set through the options argument
922     of ProjectRasterFile.
923    
924     * test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
925     Calls ProjectRasterFile and returns the result.
926     (TestBaseRenderer.test_projected_raster_layer): New. Tests the results
927     of calling projected_raster_layer() with different options.
928     (TestBaseRenderer.test_raster_no_projection): Removed tests based on
929     wxPython version and all tests of masks and alpha channels. These are
930     now in test_projected_raster_layer().
931    
932 jan 2565 2005-02-17 Jan-Oliver Wagner <[email protected]>
933    
934 jan 2570 * Thuban/Model/map.py, Thuban/Model/label.py: Fixed
935     doc-strings to comply with coding_guidelines.
936    
937     2005-02-17 Jan-Oliver Wagner <[email protected]>
938    
939 jan 2565 Docstring improvements and minor fixes for labellayer.
940    
941     * Thuban/Model/map.py:
942     (Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
943     Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
944     Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
945     Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
946     doc string.
947     (Map.BoundingBox): Removed superfluous test for label_layer
948     and improved doc string.
949     (Map.TreeInfo): Added label_layer and improved sdo string.
950    
951     * Thuban/Model/label.py: Added import of _.
952     (Label, Label.__init__): Improved/added doc string.
953     (LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
954     LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
955     Improved/added doc string.
956     (LabelLayer.AddLabel): Use already defined names for
957     align strings and improved doc string.
958     (LabelLayer.TreeInfo): New. Return the object data for
959     the tree view.
960    
961 jonathan 2562 2005-02-16 Jonathan Coles <[email protected]>
962    
963     Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
964     so that that wxproj doesn't crash. Added GUI support for selecting
965     alpha channel (opacity can't be selected yet).
966    
967     NOTE: If wxPython.h is including in future distribution packages
968     then it will not be necessary to have the files swigPtrConvertHack.h
969     and wxPython_int.h included with Thuban. This is hopefully
970     a temporary workaround.
971    
972     * setup.py (thuban_build_ext.finalize_options): gdalwarp needs
973     access to the macro wxCHECK_VERSION so that it will properly
974     generate a bit mask. There was a problem between wx2.4 and wx2.5
975     that this works around.
976    
977     * Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
978     of RasterLayer.MaskType.
979     (RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
980     (RasterLayer.MaskType): New. Returns the type of mask to use. Can
981     specify none, a bitmap, or an alpha channel.
982     (RasterLayer.SetMaskType): New. Set what kind of mask to use.
983    
984     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
985     Set the raster warping options for the mask based on the value
986     of RasterLayer.MaskType.
987    
988     * Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
989     deprecated calls to SetItemSelectedImage in favor of SetItemImage
990     with wxTreeItemIcon_Selected.
991    
992     * Thuban/UI/rasterlayerproperties.py: Support selecting to use
993     an alpha channel for the mask.
994    
995     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
996     data if it is available and an alpha channel is supported under
997     the current version of wxPython.
998    
999     * libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
1000     to select whether 1's or 0's select the desired portion of an image
1001     in the bit mask. wx2.4 has a bug where the documentation is the opposite
1002     from behavior.
1003     (ProjectRasterFile): Only generate an alpha channel if the version
1004     of wxPython is >= 2.5.3.
1005    
1006     * libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
1007     When wxPython >= 2.5.3 use the special swig functions to decode an
1008     object's address.
1009    
1010     * libraries/thuban/swigPtrConvertHack.h: Includes conditional code
1011     based on the version of wxPython. If >= 2.5.3 use the special swig
1012     functions from wxPython to decode wxPython objects, otherwise use
1013     the old method of retrieving the address from the object __repr__ string.
1014    
1015     * libraries/thuban/wxPython_int.h: Copied from wxPython source.
1016     Unnecessary code was removed to make it smaller.
1017    
1018     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1019     Add tests for returning an alpha channel.
1020    
1021     * test/test_layer.py (TestLayerModification.test_raster_layer): Fix
1022     tests that used removed functions UseMask and SetUseMask
1023    
1024    
1025 bh 2560 2005-02-08 Bernhard Herzog <[email protected]>
1026    
1027 bh 2561 More wxPython 2.5 changes. This time taken from a patch from
1028     Daniel Calvelo Aros.
1029    
1030     * Thuban/UI/tableview.py (QueryTableFrame.__init__)
1031     (QueryTableFrame.__init__): Pass the size of a spacer as a single
1032     item.
1033    
1034     * Thuban/UI/projdialog.py (ProjFrame.build_dialog)
1035     (ProjFrame.build_dialog): Pass the size of a spacer as a single
1036     item.
1037    
1038     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
1039     size of a spacer as a single item.
1040    
1041     * Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
1042     size of a spacer as a single item.
1043    
1044     2005-02-08 Bernhard Herzog <[email protected]>
1045    
1046 bh 2560 Compatibility with wxPython 2.5. The changes should make it work
1047     better with 2.5 while still keeping compatibility with 2.4. There
1048     are still problems with 2.5, though.
1049    
1050     * Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
1051     of a spacer as a single item.
1052    
1053     * Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
1054     from wxControl
1055    
1056     * Thuban/UI/legend.py (LegendTree): When running with wxPython <
1057     2.5, add an implementation of the GetFirstChild method that does
1058     not require the second parameter.
1059     (LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
1060     (LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
1061     (LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
1062     pass the second parameter to GetFirstChild
1063    
1064 nhueffme 2559 2005-02-08 Nina Hüffmeyer <[email protected]>
1065    
1066     * Extensions/ogr/ogrshapes.py: Removed some print commands.
1067    
1068     * Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
1069     additional menu but appears as a possibility in the menu Map.
1070    
1071 jonathan 2558 2005-02-07 Jonathan Coles <[email protected]>
1072     * libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
1073     and PYTHON_ERRF since they were no longer necessary.
1074    
1075 bernhard 2556 2005-02-07 Bernhard Reiter <[email protected]>
1076     * Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
1077     Enable translation for message string.
1078    
1079 joey 2555 2005-02-06 Martin Schulze <[email protected]>
1080    
1081     * Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
1082     the arguments of the contstructor to fit the global scheme
1083    
1084 nhueffme 2554 2005-01-31 Nina Hüffmeyer <[email protected]>
1085    
1086     * Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
1087     some dialogs needed to start ogr.
1088    
1089     * Extensions/ogr/__init__.py: Changed comments to avoid encoding
1090     warnings.
1091    
1092     * Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
1093     encoding warnings.
1094    
1095 jonathan 2552 2005-01-28 Jonathan Coles <[email protected]>
1096    
1097 jonathan 2553 * libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
1098     mask is packed into a bit array. It's now slightly faster.
1099    
1100     2005-01-28 Jonathan Coles <[email protected]>
1101    
1102 jonathan 2552 * Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
1103     default to true.
1104    
1105     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
1106     code that loads the state of the layer's use_mask flag. Its
1107     usefulness is still being debated.
1108    
1109     * Thuban/Model/save.py (SessionSaver.write_layer): Remove
1110     code that saves the state of the layer's use_mask flag. Its
1111     usefulness is still being debated.
1112    
1113     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
1114     options to ProjectRasterFile based on the state of layer.UseMask().
1115     Catch more exceptions from ProjectRasterFile so that Thuban doesn't
1116     quit is there is a problem projecting.
1117     (BaseRenderer.draw_raster_data): Change the documentation to
1118     describe the new format (XBM) that the mask data will be in.
1119    
1120     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
1121     data is in XBM format when format='RAW' which means it doesn't
1122     need to be converted to a wxImage before being used as a mask
1123     for a wxBitmap. Assume that if format != 'RAW' that the image
1124     data and mask data are in the same format.
1125    
1126     * libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
1127     and a mask is requested, convert the alpha band to a bit array in
1128     XBM format. if an alpha channel is requested, simply return the
1129     data in the alpha band. Provide better error handling by returning
1130     python error messages (also fixes RT #2947).
1131     (ProjectRasterFile): Support multiple mask options, rather than simply
1132     a flag indicating that a mask should or should not be used. Provide
1133     better error handling by returning python error messages.
1134    
1135     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1136     Add mask data to test.
1137    
1138     * test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
1139     should use the mask by default.
1140     (TestLayerModificaton.test_raster_layer): Test that a layer should use
1141     the mask by default.
1142    
1143     * test/test_load.py (TestRasterLayer.test): Remove testing for
1144     use_mask flag in file.
1145    
1146     * test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
1147     for use_mask in file.
1148    
1149     * test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
1150    
1151 jonathan 2551 2005-01-26 Jonathan Coles <[email protected]>
1152    
1153     Add a new dialog box for raster layers. The dialog box allows
1154     the user to toggle a mask that is generated by ProjectRasterFile
1155     and is used to only draw the real parts of the projected image.
1156    
1157     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
1158     Instruct the warping code to generate a mask if the raster layer
1159     requests one.
1160     (BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
1161    
1162     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
1163     obsolete optional mask argument.
1164    
1165     * Thuban/UI/classifier.py (Classifier): Change the parent class
1166     to LayerProperties and rework the code to support layout calls
1167     from the parent.
1168     (Classifier.dialog_layout): New. Layout the dialog box.
1169     (Classifier.map_layers_removed): Removed. Moved to parent class.
1170     (Classifier.map_replaced): Removed. Moved to parent class.
1171     (Classifier._OnTry): Renamed to OnTry to support parent class.
1172     (Classifier.OnClose): Removed. Supplied in parent class.
1173     (Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
1174     (Classifier._OnOK): Renamed to OnOK to support parent class.
1175     (Classifier._OnRevert): Renamed to OnRevert to support parent class.
1176    
1177     * Thuban/UI/layerproperties.py: New. Base class for layer properties
1178     dialog boxes.
1179    
1180     * Thuban/UI/rasterlayerproperties.py: New. Class for displaying
1181     raster layer properties.
1182    
1183     * libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
1184     with the non-simple version supplied with gdal. This allows added
1185     features such as creating an alpha band.
1186     (GetImageData): Generate a mask array from the alpha band that is
1187     generated by gdal if the user has selected it. Try to support images
1188     that have more than three bands, such as images with RGB plus an
1189     alpha band.
1190     (ProjectRasterFile): Convert python argument for mask and tell
1191     gdal to enable or disable an alpha band.
1192    
1193     * Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
1194     describing what kind of layer the class is. Defaults to "Unknown",
1195     but should be overridden by subclasses.
1196     (Layer.Type): New. Override base class method.
1197     (RasterLayer.__init__): Create a flag for using a mask. Record extra
1198     data from gdal for display in the properties dialog.
1199     (RasterLayer.Type): New. Override base class method.
1200     (RasterLayer.UseMask): New. Returns True if the mask should be used.
1201     (RasterLayer.SetUseMask): New. Set if the mask should be used.
1202     (RasterLayer.ImageInfo): New. Return extra information about the image.
1203    
1204     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
1205     the mask information.
1206    
1207     * Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
1208    
1209     * Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
1210     Classifier classes as dialogs to use with the proper layer types.
1211    
1212     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1213     Fix test.
1214    
1215     * test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
1216     (TestLayerModification.build_path): New. Support function.
1217     (TestLayerModification.test_raster_layer): New. Test new methods.
1218    
1219     * test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
1220    
1221     * test/test_load.py (TestRasterLayer): Add tests for mask.
1222    
1223     * test/test_load_1_0_1.py: New. Copied from test_load.py.
1224    
1225     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
1226     obsolete optional mask argument.
1227    
1228 nhueffme 2549 2005-01-26 Nina Hüffmeyer <[email protected]>
1229    
1230     * Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
1231     which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
1232     RowOrdinalToId() and ReadRowAsDict().
1233    
1234     * Extensions/ogr/ogrstart.py: Added menu item which opens database
1235     layers for existing database connections.
1236    
1237     * Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
1238    
1239    
1240 jan 2548 2005-01-26 Jan-Oliver Wagner <[email protected]>
1241    
1242     * Doc/manual/thuban-manual-de.xml: More translations.
1243    
1244 bh 2544 2005-01-24 Bernhard Herzog <[email protected]>
1245    
1246     Rework the status bar updates a bit to make sure the message about
1247     the projections is produced at the right times.
1248    
1249     * Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
1250     New class variable with messages that may require a status bar
1251     update.
1252     (MainWindow.view_position_changed)
1253     (MainWindow.update_status_bar): Rename from view_position_changed
1254     to update_status_bar. It's meaning has changed now that it may
1255     also generate messages about problems with projection settings.
1256     (MainWindow.__init__): Use the new update_status_bar_messages
1257     class variable to subscribe update_status_bar
1258     (MainWindow.set_position_text): Update doc-string. This method
1259     has to be renamed at some point. See doc-string and comments.
1260     (MainWindow.OnClose): Unsubscribe update_status_bar from all
1261     messages in update_status_bar_messages
1262    
1263     * Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
1264     class attribute. map messages to be forwarded by the viewport.
1265     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
1266     the messages in forwarded_map_messages
1267    
1268 bh 2543 2005-01-21 Bernhard Herzog <[email protected]>
1269    
1270     * test/postgissupport.py (PostGISDatabase.__init__): Tweak
1271     doc-string
1272     (find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
1273     different name for the initialization SQL file.
1274    
1275 jonathan 2537 2005-01-21 Jonathan Coles <[email protected]>
1276 jan 2542
1277     * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
1278     a projection and returns a formatted string representing the
1279     parameters to feed to gdalwarp. This function eliminates
1280     redundancy in draw_raster_layer().
1281     (BaseRenderer.render_map_incrementally): Removed the optimization which
1282     drew the top most raster layer first and then only those vector-
1283     based layers that are above it. With the support for transparency
1284     this optimization breaks correct behaviour.
1285     (BaseRenderer.draw_raster_layer): Reorganize code to support possible
1286     future enhancements to raster layer bounding box. The old behaviour has
1287     not changed. Also, change calling parameters to draw_raster_data()
1288     to specify new RAW data format and mask.
1289     (BaseRenderer.draw_raster_data): Change signature to include an optional
1290     parameter for mask information. Change documentation to mention
1291     support for new parameter and added option for RAW data format.
1292     The data argument is now a list of [width, height, data].
1293    
1294     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
1295     mask parameter. Add new condition for RAW format, which
1296     significantly reduces rendering time. Add condition for
1297     mask parameter.
1298    
1299     * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
1300 jonathan 2537 data array of RGB values from the projected image returned from
1301     the gdal warping functions. In the case of palette based images, it
1302 jan 2542 converts the NO_DATA index to the mask color.
1303     (ProjectRasterFile): Removed all custom memory driver references
1304     and replaced it with the standard in-memory dataset provided
1305     by gdal. The return data is no longer a BMP file, but an array
1306     of RGB values, one set triple per pixel.
1307 jonathan 2537
1308     * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
1309     * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
1310     * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
1311    
1312 jan 2542 * setup.py (thuban_build_ext.finalize_options): Removed mention
1313     of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
1314     files. These are obsolete with the new version of gdalwarp.cpp
1315    
1316     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
1317     Updated signature.
1318     (TestBaseRenderer.test_raster_no_projection): Changed the test
1319     data to be data in the uncompressed RAW format returned from
1320     ProjectRasterFile.
1321    
1322 jan 2535 2005-01-21 Jan-Oliver Wagner <[email protected]>
1323    
1324 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
1325     string available for i18n.
1326 jan 2535
1327 russell 2532 2005-01-20 Russell Nelson <[email protected]>
1328    
1329     * Resources/Projections/defaults.proj: Ruin the speling of the
1330 russell 2533 Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
1331     It's the wrong thing to do in the long run, but it's necessary for
1332     those users until that bug is fixed. Otherwise the projection
1333     dialog segfaults. Better to annoy some Lambert-93 users with a
1334     spelling mistake than every Fedora Core 3 user of Thuban-CVS.
1335 russell 2532
1336 bernhard 2531 2005-01-20 Bernhard Reiter <[email protected]>
1337    
1338 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
1339     docstring and comment that the warning code here is a hack.
1340 bernhard 2531
1341 russell 2529 2005-01-20 Russell Nelson <[email protected]>
1342    
1343 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
1344     user about misprojected layers when their lat/lon bounding
1345 russell 2529 box exceeds rational lat/lon values.
1346    
1347 bernhard 2525 2005-01-20 Bernhard Reiter <[email protected]>
1348    
1349 jan 2542 * Thuban/UI/about.py (unicodeToLocale): Improved:
1350 bernhard 2528 Use 'ascii' and then 'replace' for other characters
1351     when getdefaultlocale returns None. Thanks to Bernhard H. .
1352 jan 2542
1353 bernhard 2528 2005-01-20 Bernhard Reiter <[email protected]>
1354    
1355 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
1356 bernhard 2527 that OnRangeText might be called twice and using None as argument.
1357 jan 2542
1358 bernhard 2527 2005-01-20 Bernhard Reiter <[email protected]>
1359    
1360 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
1361     OnRangeText(0) to work around a different in wx Behaviour noticed
1362     on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
1363    
1364 bernhard 2526 2005-01-20 Bernhard Reiter <[email protected]>
1365    
1366     * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
1367 bernhard 2525 None. (Fixes rt#2910.)
1368    
1369 frank 2524 2005-01-18 Frank Koormann <[email protected]>
1370    
1371     New Extension: mouseposition
1372     Tool to collect mouse click positions (map coordinates) in a dialog.
1373    
1374     * Extensions/mouseposition/__init__.py: New, extension registration
1375    
1376     * Extensions/mouseposition/mouseposition.py: New, implements the
1377     dialog and adds a tool to Thuban mainwindow.
1378    
1379     * Extensions/mouseposition/position.xpm: New, icon for tool.
1380    
1381 jan 2522 2005-01-14 Jan-Oliver Wagner <[email protected]>
1382    
1383     * Doc/manual/thuban-manual-de.xml: More translations.
1384    
1385 frank 2520 2005-01-11 Frank Koormann <[email protected]>
1386    
1387     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1388     Fix indention bug.
1389    
1390 frank 2517 2005-01-09 Frank Koormann <[email protected]>
1391    
1392     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1393 frank 2520 BugFix 2901: Explicitly copy layers ClassificationColumn since it
1394 frank 2517 is not part of the layers Classification.
1395    
1396 frank 2515 2005-01-03 Frank Koormann <[email protected]>
1397    
1398 frank 2517 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
1399     BugFix 2883: Former implementation only worked on classified point
1400     layers: KeyError was raised, now use the default size if field is None.
1401 frank 2515
1402 bernhard 2513 2004-12-27 Bernhard Reiter <[email protected]>
1403    
1404     svgexport 1.0.0cvs: Fixed label export.
1405    
1406     * Extensions/svgexport/test/test_svgmapwriter.py:
1407     class TestSVGRenderer(): New class; new test test_label_font().
1408    
1409     * Extensions/svgexport/svgmapwriter.py
1410     (SVGRenderer.label_font()): initialised Font size with self.factor now,
1411     makes test_label_font happy.
1412    
1413     * Extensions/svgexport/TODO: crossed out fixed label export item.
1414     Added item for options.
1415    
1416     * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
1417    
1418 russell 2511 2004-12-27 Russell Nelson <[email protected]>
1419    
1420 jan 2512 Middle mouse button pans.
1421 russell 2511
1422 jan 2512 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
1423     OnMiddleDown and OnMiddleUp events.
1424     (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
1425     previously used tool.
1426     (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
1427     pressing the middle mouse button.
1428    
1429 jan 2509 2004-12-27 Jan-Oliver Wagner <[email protected]>
1430    
1431     * Doc/manual/thuban-manual-de.xml: More translations.
1432    
1433 jan 2506 2004-12-23 Jan-Oliver Wagner <[email protected]>
1434    
1435     * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
1436     \n to stderr after the warnings. Thanks to Russell Nelson.
1437    
1438 nhueffme 2493 2004-12-20 Nina Hueffmeyer <[email protected]>
1439    
1440     * Extensions/ogr/ogrshapes.py: Fixed some issues from
1441     Bernhard (coding guidelines etc.). Additionally it is now possible to
1442     display shapefiles containing feature collections (e.g.polygons
1443     with holes). Works with gdal 1.2.1 now.
1444    
1445     * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
1446     from Bernhard (coding guidelines etc.). If ogr can't be imported,
1447     tests are skipped now.
1448    
1449     * Extensions/ogr/ogrstart.py: Fixed some typings.
1450    
1451 bernhard 2490 2004-12-20 Bernhard Reiter <[email protected]>
1452    
1453     * Extensions/svgexport/TODO: updated to add support for
1454     raster layers and labels for 1.0.1.
1455    
1456     * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
1457     Issue a warning now.
1458    
1459 bernhard 2488 2004-12-19 Bernhard Reiter <[email protected]>
1460    
1461 bernhard 2489 * Extensions/svgexport/TODO: Added idea to support triggering
1462     the application down the pipe.
1463    
1464     2004-12-19 Bernhard Reiter <[email protected]>
1465    
1466 bernhard 2488 svgexport: Improved code quality, mainly by better naming.
1467    
1468     * Extensions/svgexport/svgmapwriter.py:
1469     DrawPath() renamed to DrawPolygonPath(),
1470     added documentation, improved comments and variable names.
1471    
1472     * Extensions/svgexport/svgmapwriter.py,
1473     Extensions/svgexport/test/test_svgmapwriter.py:
1474     All using DrawPolygonPath() now, the default parameter closed=True
1475     omitted.
1476    
1477     * Extensions/svgexport/test/test_svgmapwriter.py:
1478     renamed test_polygon_opened() to test_polyline()
1479     renamed test_transparent_polygon() to test_transparent_polyline()
1480    
1481 jan 2487 2004-12-18 Jan-Oliver Wagner <[email protected]>
1482    
1483     Some fixes of gns2shp extension.
1484    
1485     * Extensions/gns2shp/test/__init__.py: New. Make this directory a
1486     package.
1487    
1488     * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
1489     dynamically.
1490    
1491     * Extensions/gns2shp/test/README: Simplified description how to test.
1492    
1493     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
1494     fixed some dimensions of fields according to the GNS documentation
1495     which seems to change undocumented.
1496     Now killing trailing \n and/or \r from MODIFY_DATE.
1497     This fixes RT#2453.
1498    
1499 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
1500 bernhard 2480
1501 bernhard 2482 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
1502    
1503     * Extensions/svgexport/test/test_svgmapwriter.py:
1504     Added new tests: test_export_polygon_with_hole()
1505     and test_polygon_with_hole().
1506    
1507     * Extensions/svgexport/svgmapwriter.py
1508     (draw_polygon_shape()): Uses DrawPath correctly now.
1509    
1510     * Doc/manual/thuban-manual.xml: Added documentation for stable
1511     extention svgexport.
1512     * Doc/manual/thuban-manual-de.xml: Copied English section about
1513     svexport over.
1514    
1515 jan 2509 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
1516 bernhard 2482
1517     * Extensions/svgexport/svgsaver.py,maplegend.py:
1518     Moved from experimental to stable extension menu.
1519    
1520     * Extensions/svgexport/TODO: updated.
1521    
1522    
1523     2004-12-18 Bernhard Reiter <[email protected]>
1524    
1525 bernhard 2481 Added Extensions/svgexport/TODO
1526    
1527     2004-12-18 Bernhard Reiter <[email protected]>
1528    
1529 bernhard 2480 Refactored in svgexport:
1530     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
1531    
1532     * Extensions/svgexport/svgmapwriter.py
1533     Added verbosity level 3 to print out polygon points.
1534     (class Point): added __repr__
1535     (class Brush, __str__()): Added space after ,.
1536     (DrawPolygon): Renamed to DrawPath()
1537     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
1538     (DrawLines): Using DrawPath now.
1539    
1540     * Extensions/svgexport/test/test_svgmapwriter.py:
1541     Replaced DrawPolygon() calls with DrawPath() and put the first argument
1542     inside another list. Adapted test data with a newline before "M".
1543    
1544     2004-12-18 Bernhard Reiter <[email protected]>
1545 bernhard 2479
1546     Refactored svgexport tests: 9 double tests runs eliminated;
1547     code size reduced by 8 lines.
1548    
1549     * Extensions/svgexport/test/test_svgmapwriter.py:
1550     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
1551     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
1552     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
1553     this fixed the double running of the nine tests of TestVirtualDC.
1554     (class TestVirtualDC): Using self.dc and self.file from setUp().
1555    
1556 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
1557    
1558     Two windows specific fixes ported from thuban-1­0-branch:
1559    
1560     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
1561     instead of getlocale because getlocale doesn't return a usable
1562     encoding name on a german windows 2000
1563    
1564     * setup.py: windows build: Removed the absolute path names and
1565     made all prfixes relative to the directory containing setup.py.
1566     Makes it a little easier to adapt to a different system.
1567    
1568 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
1569    
1570 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
1571 bh 2472 Fixes RT#2299
1572    
1573     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
1574    
1575     * test/postgissupport.py
1576     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
1577     table to "roads-multi" because it now uses MULTILINESTRING
1578     geometries and introduce a new "roads" table that uses LINESTRING
1579     (coords_to_multilinestring): Make the doc string more precise
1580     (coords_to_linestring): New. Create a LINESTRING WKT
1581     representatin
1582     (wkt_converter): Add coords_to_linestring
1583     (upload_shapefile): Rephrase the doc-string a bit.
1584    
1585     * test/test_postgis_db.py (TestPostGISShapestoreArc)
1586     (LineStringTests)
1587     (TestPostGISShapestoreLineString)
1588     (TestPostGISShapestoreMultiLineString): Split
1589     TestPostGISShapestoreArc into a base class LineStringTests and two
1590     derived classes TestPostGISShapestoreLineString for LINESTRING
1591     geometries and TestPostGISShapestoreMultiLineString for
1592     MULTILINESTRING geometries. Most test methods are in the base
1593     class with the exception of tests that explicitly check the raw
1594     format.
1595    
1596     2004-12-16 Bernhard Herzog <[email protected]>
1597    
1598 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
1599    
1600     * test/postgissupport.py (find_postgis_sql): Different postgis
1601     versions put the postgis.sql file into slightly different places
1602     so we have to look in both. The updated doc string describes this
1603     is more detail.
1604    
1605     * test/test_postgis_db.py
1606     (TestPostGISSpecialCases.test_column_name_quoting): The return
1607     value of UniqueValues is unsorted, so it has to be sorted for
1608     comparison.
1609    
1610     2004-12-16 Bernhard Herzog <[email protected]>
1611    
1612 bh 2470 Fix for RT#2237
1613    
1614     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
1615     panel to be shown is the UnknownProjPanel disable the OK and Try
1616     buttons. Otherwise enable them.
1617     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
1618     the parameters. In that case __GetProjection also returns None
1619     now.
1620    
1621 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
1622    
1623 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
1624     minimum number of classes to 2. The calculate_quantiles needs at
1625     least two and raises an exception otherwise.
1626     Fixes RT#2549
1627    
1628     2004-12-15 Bernhard Herzog <[email protected]>
1629    
1630 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
1631     so that it returns a result for select statements.
1632     (PostgreSQLServer.server_version): New. Return the version of the
1633     server software.
1634     (PostgreSQLServer.require_authentication): The format of
1635     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
1636     server version and generate the file in the correct format
1637    
1638     2004-12-15 Bernhard Herzog <[email protected]>
1639    
1640 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
1641     in the doc string and rephrase it a little.
1642    
1643 frank 2457 2004-12-15 Frank Koormann <[email protected]>
1644    
1645     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
1646     session has been loaded successfully. The check is called by the relevant
1647     tests after executing load_session().
1648    
1649 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
1650    
1651 bh 2454 Make sure the region used to determine which shapes are visible
1652     actually matches the region on the printed page. If this isn't
1653     done properly some shapes might not be printed.
1654     Fixes RT #2692
1655    
1656     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
1657     renderer has to be at the same position as the mapregion
1658    
1659     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
1660     has to be moved by (self.shiftx, self.shifty) too.
1661    
1662     2004-12-13 Bernhard Herzog <[email protected]>
1663    
1664 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
1665     generated python code which leads to exception in the __del__
1666     method when the constructor fails. See the comments in the code
1667     for more details.
1668    
1669     * libraries/pyprojection/Projection.py: Updated from Projection.i
1670     with SWIG.
1671    
1672     2004-12-13 Bernhard Herzog <[email protected]>
1673    
1674 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
1675     (TestAltPath.test_02_path_error_fix_from_list)
1676     (TestAltPath.test_05_path_error_fix_from_list_changed)
1677     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
1678     is destroyed in tearDown, so there's no need to do it in a test
1679     case.
1680    
1681     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
1682     debug print
1683    
1684     2004-12-13 Bernhard Herzog <[email protected]>
1685    
1686 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
1687     (TestDrawSplines.setUp): Do not use super with the unittest
1688     classes because in Python 2.2 they're still old-style classes.
1689    
1690 frank 2448 2004-12-13 Frank Koormann <[email protected]>
1691    
1692     Alternative Path feature: When loading a (moved) session where
1693     shapefiles cannot be found, ask the user. Use the specified path
1694     if further shapefiles are missing. However, ask the usr for confirmation
1695     in such cases.
1696    
1697     * test/test_load.py (TestAltPath): New, tests for alternative path feature
1698     in load_session()
1699     (Shapefile_CallBack): Helper, implements controllable callback.
1700    
1701     * Thuban/UI/application.py (ThubanApplication.OnInit):
1702     Added "alt_path" to self.path
1703     (ThubanApplication.OpenSession): Added shapefile_callback as second
1704     callback similar to db_connection_callback.
1705     (ThubanApplication.run_alt_path_dialog): New, implementaion of
1706     shapefile_callback. In addition to raising the dialog the control of
1707     self.path('alt_path') is implemented here.
1708    
1709     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
1710     (SessionLoader.open_shapefile): Open shapefile, eventually with
1711     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
1712     formerly used in start_fileshapesource()/start_layer().
1713     (SessionLoader.start_fileshapesource): Call open_shapefile().
1714     (SessionLoader.start_layer): Call open_shapefile().
1715     (load_session): Added shapefile_callback.
1716    
1717     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
1718     feature (search / check).
1719    
1720     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
1721    
1722 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
1723    
1724 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
1725    
1726     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
1727     (def draw_point_shape): new parameter size defaults to 2 as before.
1728     (draw_shape_layer_incrementally): Moved draw_func log line higher.
1729     Added draw_func call with size when dealing with a point layer.
1730    
1731     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
1732    
1733     2004-12-11 Bernhard Reiter <[email protected]>
1734    
1735 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
1736     to raise the chance that the line length will be below 255 characters,
1737     as recommended by REC SVG 1.1 in section 8.3.1.
1738    
1739     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
1740     Adding \n before L's and changed whitespace handling.
1741    
1742     * Extensions/svgexport/test/test_svgmapwriter.py:
1743     Adapted tests to new whitespace handling of DrawPolygon.
1744    
1745     2004-12-11 Bernhard Reiter <[email protected]>
1746    
1747 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
1748    
1749     * Extensions/svgexport/test/test_svgmapwriter.py:
1750     Removed test_drawbezier in favour of new test_drawspline3 and
1751     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
1752     All only to test DrawSpline.
1753    
1754     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1755     New implementation now really using the strange algorithm of
1756     xfig 3.1's approximated splines and its conversion to postscript
1757     with one twist: SVG can do quadratic beziers, so skipped translation
1758     to cubic beziers.
1759     (TestWithDC): Typo in comment fixed.
1760    
1761 joey 2442 2004-12-09 Martin Schulze <[email protected]>
1762    
1763     * Thuban/Model/classgen.py: Added missing character encoding
1764    
1765     * Extensions/wms/properties.py (OpenWMSProperties): removed
1766    
1767     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
1768     support for get_srs_discrepancies() since there are no
1769     discrepancies anymore (was a thinko)
1770    
1771     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
1772     format priority now that more formats are supported globally by
1773     the render engine.
1774    
1775 silke 2437 2004-12-08 Silke Reimer <[email protected]>
1776     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
1777     because it is not available in all versions of ogr
1778    
1779 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
1780     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
1781     global tests until a real one is commited.
1782    
1783 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
1784    
1785     * /Extensions/ogr/: Adding a new extension to read shapefiles with
1786     ogr. It is planned to add other vector formats.
1787    
1788     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
1789    
1790 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
1791    
1792     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
1793     part of a (non-)fix to renable that the tests are always
1794     executed.
1795    
1796 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
1797    
1798     * Extensions/svgexport/test/test_svgmapwriter.py:
1799     Added test_drawbezier() to test DrawSpline().
1800    
1801     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1802     Really implemented bezier drawing.
1803    
1804     * Extensions/svgexport/__init__.py: Bumped version of svgexport
1805     to 0.9.1 because now the legend examples lines styles
1806     will be drawing with beziers.
1807    
1808 joey 2431 2004-12-05 Martin Schulze <[email protected]>
1809    
1810     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
1811     GIF as supported bitmap image formats (helpful for the WMS extension)
1812    
1813 joey 2430 2004-11-30 Martin Schulze <[email protected]>
1814    
1815     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
1816     Improved the test for the internal compare method
1817    
1818 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
1819    
1820     * Thuban/UI/about.py (About.__init__): Added
1821     Norbert Solymosi for hungarian translation and Ole Rahn
1822 bernhard 2722 as contributor. Moved Bernhard Reiter from Contributor
1823 jan 2429 to Developer.
1824    
1825 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
1826    
1827     * Extensions/svgexport/test/test_svgmapwriter.py:
1828     Removed Jan from author list as he did not change enough significant
1829     lines yet.
1830    
1831     * Extensions/svgexport/__init__.py: Added Bernhard as author
1832     of the Extension.
1833    
1834 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
1835    
1836     * po/hu.po: New. Hungarian translation. Contributed
1837     by Norbert Solymosi.
1838    
1839 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
1840    
1841     * Extensions/svgexport/test/test_svgmapwriter.py
1842     (Testobjectexport.test_transparent_polygon): Commented out some
1843     debug prints
1844    
1845 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
1846    
1847     Fix broken tests for svg extension and added svg legend
1848     to Experimental menu.
1849    
1850     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
1851     the test run correctly even if the extension is a package.
1852     Also removed the "import Thuban" which makes no sense.
1853    
1854     * Extensions/svgexport/__init__.py: Fix to have the extensions'
1855     test module also be executed from the global test routine.
1856     This is done by looking for the absense of the DISPLAY variable.
1857    
1858     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
1859     to Experimental menu since this module has yet not reached a stable
1860     status (ie. 1.0).
1861    
1862 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
1863    
1864     * Extensions/svgexport/svgmapwriter.py:
1865     Added verbose variable and some logging depending on it.
1866     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
1867     because counting i is not necessary.
1868     (class Pen, class Brush): Added simple __str__ methods.
1869     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
1870     not exported to svg file) Note: holes still unhandled.
1871    
1872     * Extensions/svgexport/test/test_svgmapwriter.py:
1873     Made a baseclass TestWithDC for test needed a DC.
1874     Added tests for bug #2698 (transparent polygons are not
1875     exported to svg file):
1876     Testobjectexport.test_transparent_polygon()
1877    
1878     * Thuban/Model/base.py (UnsetModified):
1879     Fixed some typos in docstring.
1880    
1881     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
1882     Added hints on the used algorithm for handling holes.
1883    
1884 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
1885    
1886 jan 2412 Some face lifting for the examples.
1887    
1888     * Examples/__init__.py: Make this directory a package.
1889    
1890     * Examples/simple_extensions/__init__.py: Make this directory a package.
1891    
1892     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
1893     menu to Examples menu.
1894    
1895     * Examples/simple_extensions/simple_command.py: Some more comments,
1896     minor changes.
1897    
1898     * Examples/simple_extensions/simple_tool.py: Minor changes.
1899    
1900     2004-11-20 Jan-Oliver Wagner <[email protected]>
1901    
1902 jan 2407 Changed way of extension registry for wms and added extension
1903     registry for umn_mapserver extension.
1904    
1905     * Extensions/wms/__init__.py: Added registry entry and the importing
1906     of the actual wms module. Included a test for the required PyOGCLib.
1907    
1908     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
1909    
1910     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
1911     importing of the actual umn mapserver management modules.
1912     Included a test for the required Python MapScript.
1913    
1914     2004-11-20 Jan-Oliver Wagner <[email protected]>
1915    
1916 jan 2403 Changed way of extension registry for importAPR, bboxdump
1917     and added extension registry for svgexport.extension registry for
1918     svgexport.
1919    
1920     * Extensions/importAPR/__init__.py: Added registry entry and the importing
1921     of the actual importAPR module.
1922    
1923     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
1924     __init__.py).
1925    
1926     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
1927     »···of the actual bboxdump module.
1928    
1929     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
1930     »···__init__.py).
1931    
1932     * Extensions/svgexport/__init__.py: Added registry entry and the importing
1933     of the svgsaver module.
1934    
1935     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
1936     to Experimental menu since this module has yet not reached a stable
1937     status (ie. 1.0).
1938    
1939 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
1940    
1941     Now the hit test considers the size of point symbols.
1942    
1943     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
1944     'size' defaulting to the previously fixed value 5.
1945     Extended doc-string.
1946     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
1947     for symbols.
1948     Now the size of the largest point symbol is determined to find out
1949     about whether the point has been hit.
1950     This fixes the problem that only clicks inside a fixed distance of
1951     5 where found.
1952    
1953 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
1954    
1955 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
1956 jan 2395 selected symbols.
1957    
1958     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
1959     Added consideration of the specific size of point symbols.
1960     The property for each point symbol is retrieved and the size applied
1961     for the rendering method.
1962     Added doc-string.
1963    
1964 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
1965    
1966     Changed way of Extension Registry for gns2shp and profiling.
1967    
1968     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
1969     __init__.py).
1970    
1971     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
1972     of the actual gns2shp module.
1973    
1974     * Extensions/profiling/profiling.py: Removed registry entry (moved to
1975     __init__.py).
1976    
1977     * Extensions/profiling/__init__.py: Added registry entry and the importing
1978     of the actual profiling module.
1979    
1980 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
1981    
1982     * Extensions/svgexport/: Minor improvements to doc strings.
1983    
1984 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
1985    
1986     Further elements for sizable point objects now
1987     making this feature usable though not yet complete.
1988    
1989     * Thuban/Model/save.py (SessionSaver.write_classification): Write
1990     attribute 'size' for cldata when the shape layer is of point type.
1991     This also now make the test_load.py tests happy.
1992    
1993     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
1994     gradient.
1995    
1996     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
1997     ID_SELPROP_SPINCTRL_LINEWIDTH.
1998     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
1999     (ID_SELPROP_SPINCTRL_SIZE): New Id.
2000     (SelectPropertiesDialog.__init__): Added a second spin control
2001     for the size in case the corresponding layer is of point type.
2002     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
2003     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
2004     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
2005     and refresh preview.
2006    
2007    
2008    
2009 joey 2381 2004-10-04 Martin Schulze <[email protected]>
2010    
2011     * Extensions/wms/test/test_parser.py
2012     (TestWMSCapabilitiesParser.test_compareLists): Added missing
2013     self-test for compareLists()
2014     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
2015     self-test for compareDicts()
2016 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
2017     to verify the test routine fails with non-equal arguments
2018     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
2019     to verify the test routine fails with non-equal arguments
2020 joey 2381
2021 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
2022    
2023 jan 2380 First elements for sizeable point objects.
2024    
2025     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
2026    
2027     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
2028    
2029     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
2030     of a corresponding argument is given.
2031     (TestSymbolSize): New. Test the size attribute of cldata.
2032    
2033     * Thuban/Model/classification.py: Removed some trailing whitespaces.
2034     (ClassGroupProperties.__init__): Set default size.
2035     (ClassGroupProperties.SetProperties): Set the size.
2036     (ClassGroupProperties.GetSize): New. Return the size.
2037     (ClassGroupProperties.SetSize): New. Set the size.
2038     (ClassGroupProperties__eq__): Compare also size.
2039     (ClassGroupProperties__repr__): Print also size.
2040    
2041     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
2042     the size attribute.
2043    
2044     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
2045     Also, now there is a return value that indicates whether the drawing
2046     size exceeded the given rect extent and if so the new extent.
2047     Finally, point objects are drawn depending on the size. If either
2048     the width or height is exceeded, the new extent is returned.
2049     (ClassRenderer.Draw): Now when calling the previewer drawing function,
2050     evaluate the return value and, if not None, adapt the grid widget size
2051     accordingly and redraw again.
2052    
2053     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
2054     If the draw function is for points, call it with the size as additional
2055     parameter.
2056     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
2057     the size. Compute the radius using the size.
2058    
2059     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
2060     that Thuban supports size, apply this correctly.
2061    
2062     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
2063    
2064     2004-10-03 Jan-Oliver Wagner <[email protected]>
2065    
2066 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
2067     Map chapter.
2068    
2069 joey 2368 2004-10-01 Martin Schulze <[email protected]>
2070    
2071     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
2072     argument for general use through properties-dialog selector
2073    
2074     * Thuban/UI/classifier.py: Register properties dialog classes for
2075     both provided layer classes/types.
2076    
2077     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
2078     map can be retrieved through the parent which is passed to the
2079     constructor anyway and doesn't require an argument of its own,
2080     required for the unification of arguments for general use through
2081     properties-dialog selector.
2082     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
2083     whether a dialog is already opened (and raising it to the users
2084     attention) and creating a new dialog into a function of its own
2085     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
2086     method
2087     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
2088     global registration of properties dialog classes (which are indeed
2089     layer-specific).
2090    
2091     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
2092     for general use through properties-dialog selector, the map can be
2093     retrieved through the parent and doesn't require an argument of
2094     its own.
2095    
2096     * Extensions/wms/wms.py: Register the properties dialog class for
2097     the provided WMS layer
2098    
2099 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
2100    
2101     New feature: Registry for Extensions.
2102    
2103     * Thuban/UI/extensionregistry.py: This module defines a registry for
2104     Extensions.
2105    
2106     * Thuban/UI/about.py (About.__init__): Added description
2107     of the registered extensions with all of the information.
2108    
2109     * Thuban/Model/extension.py (Extension): Improved doc-string.
2110    
2111     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
2112     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
2113     Extensions/wms/wms.py: Added registration of the extension.
2114    
2115 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
2116    
2117     More fixes to svgexport to make used ids unique and
2118     conforming to XML's Name production.
2119    
2120     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
2121     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
2122     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
2123     Added Bernhard R. as author.
2124     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
2125     concatenation char now (makes test_make_ide_nosetbaseid() valid).
2126     Also transform second id part with "%d" and catch the TypeError
2127     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
2128     Corrected typo inBernhard's author line.
2129     (SetBaseID): Return the transformed base id. Transform characters
2130     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
2131     import binascii. If to be set string starts with "xml" or so, add "t".
2132     (draw_shape_layer_incrementally): use the returned value of SetBaseID
2133     for used_baseids checks.
2134    
2135 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
2136    
2137     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
2138     Remove a debug print and some tab characters.
2139    
2140 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
2141    
2142     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
2143     (SetBaseID, SetID, make_id): Improved docstring comments to explain
2144     the interaction of the three functions and the XML id contrains.
2145    
2146 bernhard 2352
2147 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
2148    
2149 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
2150     Module.
2151    
2152     * Doc/README: Added info on ThubanModel.xmi.
2153    
2154     2004-09-23 Jan-Oliver Wagner <[email protected]>
2155    
2156 jan 2346 * Doc/README: New. Some info about how to generate technical
2157     documentation from the source code.
2158     This text was send to the Thuban developer mailing list on
2159     September 21st 2004 by Bernhard Reiter.
2160    
2161 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
2162    
2163     Improved the svgexport to only use unique ids. Will issues
2164     an error message dialoge when two layer names are the same.
2165     ShapeIDs are now added with a dash within the svg ids.
2166    
2167     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
2168     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
2169     (TestSVGRenderer): New test class with test_make_in() and
2170     test_check_for_layer_name_clash()
2171     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
2172     and draw_shape_layer_incrementally() to not use a baseid twice,
2173     satisfying test_check_for_layer_name_clash()
2174     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
2175     test_make_in().
2176     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
2177     and wxICON_HAND.
2178     (write_to_svg): Put dc and rendering in a try statement and on
2179     catching SVGmapWriterError notify the user and delete the target file.
2180    
2181 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
2182    
2183     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
2184    
2185 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
2186    
2187     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
2188     small bug with the line color. Now the line color will now only set
2189     if it is set in Thuban an not Transparent.
2190    
2191     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
2192     deleting the layers from mapfile. Now all layers will delete backwards
2193     from the last.
2194    
2195 silke 2339 2004-08-20 Silke Reimer <[email protected]>
2196 silke 2338
2197 silke 2339 * Thuban/Model/layer.py:
2198     Fixes bug in projection handling: Otherwise very large region might not
2199     have valid values in the layer's projection.
2200    
2201     2004-08-20 Silke Reimer <[email protected]>
2202    
2203 silke 2338 * Thuban/UI/about.py:
2204     small changes to be consistent with coding style.
2205    
2206 joey 2337 2004-08-13 Martin Schulze <[email protected]>
2207    
2208     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
2209     Adjusted a comment
2210    
2211 silke 2335 2004-08-11 Silke Reimer <[email protected]>
2212 silke 2334
2213 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
2214     too many and too enhanced imports of locale
2215    
2216 silke 2334 2004-08-10 Silke Reimer <[email protected]>
2217    
2218     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
2219 silke 2339 function unicodeToLocale() to convert special characters to users
2220     locale encoding
2221 silke 2334
2222 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
2223    
2224     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
2225     lower case letter'
2226    
2227 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
2228    
2229     * ChangeLog: Rewrite the last ChangeLog entry to follow
2230     the standard way.
2231    
2232     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
2233     the function where it is needed, because it don't works if it stands
2234     at the beginning.
2235     (MF_Layer.__init__): Removed the extra numclassed variable. Now
2236     numclasses from the mapscript will be used.
2237     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
2238     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
2239     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
2240     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
2241     (MF_Map.create_new_layer): New. A new Layer is created and associated
2242     with the mapscript object.
2243     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
2244     the mapscript.
2245     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
2246     linked to the layer in thuban, else the layerobject linked to the
2247     thubanlayer will be used.
2248     AnnotationLayer will now store the filename of the shapefile.
2249     (MF_Map.remove_layer): If a layer is removed the associated object
2250     must be set new.
2251    
2252     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
2253     layers which are exists in thuban to the mapobj. All removed Layers
2254     will be removed from the mapobj.
2255     Added comments to all functions.
2256     (thuban_to_map): No layer will be removed here.
2257    
2258     * Extensions/umn_mapserver/mf_handle.py
2259     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
2260     Layersettings for the mapserver kann be edited.
2261    
2262     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
2263     imported, will be linked with the associated MF_Layer.
2264     (import_mapfile): All layers, which are not selected, will be removed.
2265     Disable the "import layer from mapfile" menu option.
2266    
2267     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
2268     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
2269     layer on permanently.
2270    
2271 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
2272    
2273 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
2274     New. This function removes all metadata
2275     (MF_Layer.set_group): New. Set the group setting.
2276     (MF_Layer.get_group): New. Get the group setting.
2277     (MF_Map): Removed the extra numlayers variable, used the mapscript
2278     parameter instead.
2279     (MF_Map.get_numlayers): New. This get numlayers.
2280     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
2281 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
2282     if the object is an instance. Also added the annotation layer here to
2283     export, but only the layer is created in the mapfile.
2284    
2285 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
2286     the check if a mapobj exist, because its not needed anymore. The
2287     export function is only available if a mapobj exist.
2288     Use the new function to remove all layers.
2289 jschuengel 2323
2290 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
2291     option and the metadata button. The layer dialog is temporary disabled.
2292     (Metadata_CustomDataTable): Added some functions to show the grid
2293 jschuengel 2323 correct.
2294    
2295 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
2296     the number of layer from import_mapfile to this function.
2297     (AnnotationLayer): New. This Class shows the Annotation layer in
2298     thuban. The layer don't do anything. It's only to show the layer
2299     and to save the layer order.
2300     (add_annotationlayer): New. Import an annotation layer to thuban.
2301     (select_layer2import): New. Import only layers to thuban and not
2302     the other settings like projection or scalebar.
2303     (create_new_mapfile): Moved the _has_umn_mapobj function and the
2304     create_new_mapfile functions from mf_handle.py to mf_import.py.
2305 jschuengel 2323
2306     * Extensions/umn_mapserver/sample/iceland.map: Added the group
2307     parameter to the roads and cultural layers. Also added a new
2308     Annotation Layer for the cultural points.
2309    
2310     * Extensions/umn_mapserver/sample/iceland.html: Added the select
2311     option for the annotation layer.
2312    
2313     * Extensions/umn_mapserver/sample/index.html: Added the start
2314     parameter for the annotation layer.
2315    
2316 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
2317    
2318     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
2319     translation completed.
2320    
2321     * Doc/manual/thuban-manual.xml (Chapter Session Management):
2322     Fixed unprecise description for Save Session.
2323    
2324 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
2325    
2326     Started translation of Users Manual into german.
2327    
2328     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
2329    
2330     * Doc/manual/Makefile: Added build instructions for german
2331     users manual.
2332    
2333     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
2334    
2335 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
2336    
2337     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
2338     functions. Now all metadata will handle by the function and its not
2339     needed to initialize it from outside. Therefor the associated mapobj
2340     will be stored in the Metadata Object. So we can use the special
2341     functions from the associated mapobj to get the Metadata.
2342     Therefor all initialization code for the metadata is removed from the
2343     other classes.
2344     (MF_Layer): Added a function to get the metadata object.
2345     (MF_Map): Added a function to set the mappath, the path where
2346     the mapfile ist stored.
2347    
2348     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
2349     to set the extent in the mapfile. Now the code is set by the displayed
2350     data in the Thuban-view.
2351     (export_mapfile): The shapepath is now set empty, until relative
2352     pathnames are supported.
2353    
2354     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
2355     metadata. Yet only mapfile metadata are supported. Layer and class
2356     supported are not implemented.
2357     Added a dialog to handle layer informations. The dialog only shows the
2358     selected layer at the moment.
2359    
2360     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
2361     code for setting the extent in thuban. Now the extent is set to the
2362     given extent from the mapfile.
2363     Fixed a logical mistake. Now the extent is set when realy a layer is
2364     loaded, and not if one is selected to load.
2365    
2366     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
2367     move the shown map in the browser.
2368    
2369     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
2370     line to the mapobj and added metadata to the political layer.
2371    
2372     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
2373     for Metadata.
2374    
2375 joey 2300 2004-07-26 Martin Schulze <[email protected]>
2376    
2377     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
2378     ClassMapper
2379    
2380     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
2381     case for the new ClassMapper
2382    
2383    
2384 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
2385    
2386 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
2387     visible extent of the map in projected coordinates
2388    
2389     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
2390     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
2391     tests.
2392     (SimpleViewPortTest.test_visible_extent): New. The real test for
2393     VisibleExtent()
2394    
2395     2004-07-22 Bernhard Herzog <[email protected]>
2396    
2397 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
2398     function when running asa script.
2399    
2400 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
2401    
2402     * Extensions/umn_mapserver/mf_export.py: Added "import os"
2403     Removed the old "import Thuban.UI.mainwindow" code.
2404     (tbextent_to_map): Removed the extra function and at the code direct
2405     to "thuban_to_map" function.
2406     (write_creatorcomment): Added. Now a short comment is added to the
2407     beginning of an generated mapfile.
2408     (export_mapfile): Now the Path and filename are saved in to variables,
2409     and not together in one variable. This is needed for the new
2410     write_creatorcomment function.
2411    
2412     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
2413     import module "re". Also added Range and the ClassGroupRange import
2414     from Thuban. Both are needed for the new range expression import.
2415     (create_rangeexpression): Added. Creates a Range Expression in Thuban
2416     style from a given mapfile expression.
2417     (added_rasterlayer): Make some small code changes. The shapepath is
2418     now stored in an extra variable and the clazz_name is set empty if no
2419     class name set in the mapfile.
2420     Changed the Error message for Range Expressions, becaus the new
2421     function create a error string which will be shown in the dialog.
2422    
2423     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
2424     range expression import.
2425 jan 2312
2426 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
2427    
2428     * Extensions/umn_mapserver/README: Added hint that
2429     installation as root can be avoided. Removed all tabs.
2430    
2431 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
2432    
2433     * test/test_viewport.py
2434     (ViewPortTest.test_changing_map_projection): Check that changing
2435     the projection of an empty map shown in a viewport doesn't lead to
2436     exceptions in the viewport's handler for the
2437     MAP_PROJECTION_CHANGED messages
2438    
2439     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
2440     try to keep the same region visible when the map actually contains
2441     something
2442    
2443 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
2444    
2445     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
2446     mappath directly from the mapobj. Is needed because of the changes
2447     in mf_import.py.
2448     (MF_Layer.add_thubanclass): Added a new comment.
2449     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
2450     mapobj is empty there is no extent get from thuban an so no one can
2451     set to th mapobj.
2452    
2453     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
2454     the discription.
2455     Split the funktion in to three smaller ones. The new functions are
2456     add_rasterlayer, add_polygonlayer and select_layer2import.
2457     Removed the mapfilepath and filepath initialisation, because its know
2458     include in the new functions.
2459     Now nothing will be imported if cancel is pressed in the
2460     layer choice dialog.
2461    
2462 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
2463    
2464     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
2465     import.
2466     (MF_Symbolset): Removed the extra variable for numsymbols.
2467     (MF_Class.__init__): Added a comment to the exception clause.
2468     Removed the extent init, because it was not needed anymore.
2469     (MF_Layer.add_thubanclass): Added the code to set the class name to
2470     the expression value from thuban if no label is defined.
2471     Added the code to export Range expressions from thuban to the mapfile.
2472     (MF_Map.set_extent): Removed the exception and replace it by some if
2473     code. If the size of a map is not defined the size will be set to 1,1.
2474     This is necessary because if the extent is set, mapscript checks if
2475     the size is greater than zero.
2476     (MF_Web): Added the get and set function for the template.
2477    
2478     * Extensions/umn_mapserver/mf_export.py: Added the function to check
2479     if a mapobject exists and used it to set the status of the menu items.
2480     If no mapfile exists the settings could not be edditied.
2481     Define after which menuitem the exportitem will include.
2482    
2483     * Extensions/umn_mapserver/mf_handle.py: Removed the import
2484     Thuban.UI.mainwindow clause, because it is not needed.
2485     Added the command Refresh() to all "OnChangeColor()" functions,
2486     because the color preview window was not updated on a color change.
2487     Added the function to check if a mapobject exists and used it to set the
2488     status of the menu items. If no mapobject exists the settings could not
2489     be edditied.
2490     (Map_Dialog): Moved the imagetype selector from the
2491     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
2492     (Web_Dialog): Removed the name label and added the template textbox.
2493    
2494     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
2495     the exception handling on loading the layers by an if statement. It
2496     is not necessary to us the exception there.
2497     The Filepath creation now use os.path.join to build the path.
2498    
2499     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
2500     definition from global to the setUp function. Now the testMap will
2501     initialize new on each test.
2502    
2503     * Extensions/umn_mapserver/sample/iceland.map: Include three new
2504     classes in the Line Layer, to test logical Expressions.
2505     Set the status of the class "Point9" in the Point Layer to off
2506    
2507 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
2508    
2509     * Thuban/UI/baserenderer.py
2510     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
2511     optimization that tries not to draw layers under a raster layer.
2512     The bug was harmless. All it effectively did was to produce The a
2513     strange messages about not being able to draw Layer instances for
2514     all vector layers below a raster layer which would be invisible
2515     anyway because the raster layer currently always covers the entire
2516     window
2517    
2518 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
2519    
2520     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
2521     a list of supported outputformats. This formats are not alle supported
2522     because there is no possibility to get the outputformat without the
2523     name known. Make some formal changes to the code.
2524     (MF_Map.set_name()): Fixed a bug if the name is None.
2525    
2526     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
2527     statement, because its not needed anymore. The Outputformat is now
2528     given as string from the object. Make some formal changes to the code.
2529    
2530     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
2531     most of the new setting which were added during the last changes.
2532     Removed the MF_Size Test.
2533    
2534     * Extensions/umn_mapserver/test/test.map: Added a new class to the
2535     cultural Layer to test expressions and the the status of that layer
2536     from on to default.
2537     Changed the data path the the correct Thuban Data
2538     Added the Outputformat Object and Symbol Object
2539    
2540 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
2541    
2542     * Extensions/umn_mapserver/mapfile.py: Added some new
2543     settings to edit (outputformat, label, imagetype)
2544    
2545     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
2546     the Label Dialog and add the OutputDialog.
2547     Make some changes to the code order.
2548    
2549 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
2550    
2551     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
2552     and line Obj and add the scalebar_status_type, scalebar_style_type and
2553     scalebar_position_type.
2554     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
2555     are only used to create a Symbol like the circle in Thuban.
2556     Added the scalebarObject (MF_Scalebar)
2557     (MF_Class): Added set_status and get_status.
2558     (MF_Layer.add_thubanclass): Added code to set the class status
2559     (MF_Map): Added code to handle the symbols and scalebar
2560     (MF_Label): Added the set_partials and get_partials functions
2561    
2562     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
2563     from mapfile. Added a function to create a circle object like the one
2564     from thuban if no one exists.
2565    
2566     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
2567     press ok in the assosiated dialog and not at the end of the
2568     colordialog.
2569     Added the Dialog for the Scalebar.
2570     (Label_Dialog): Added the offset option
2571    
2572     * Extensions/umn_mapserver/mf_import.py: Added code to import the
2573     status of the Classes.
2574     Fixed a bug with the projection. Now the to_meter parameter will be
2575     added to the Projection only if it doesn't exists.
2576    
2577 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
2578    
2579     Added the functionality to handle the content thuban is not
2580     able to handle directly.
2581    
2582     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
2583     Thuban with the possibility to edit the mapfile content.
2584    
2585     * Extensions/umn_mapserver/mf_import.py: Added the possibility
2586     to import mapfiles without any layer selected. So it is possible
2587     to edit the other settings in a mapfile.
2588     (import_mapfile): Added code to use the editing functions.
2589     Added the possibility to import the projection to a layer if one
2590     is defined.
2591     Status settings (On,Off) will now set in thuban (visible, invisible).
2592     fixed a bug with with classnames. If no classname is set in mapfile
2593     the value in Thuban will set to the expression.
2594    
2595     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
2596     possibility to save a new mapfile or use the old one which is
2597     imported or new created.
2598     Added code to use the editing functions.
2599     Remove some not needed import statements
2600    
2601     * Extensions/umn_mapserver/mapfile.py: Added new types which are
2602     need for the editing functions.
2603     Added needed set-functions for the editing functions.
2604     Added the possibility to export rasterimages.
2605     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
2606     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
2607     moment.
2608     (MF_Class.set_thubanstyle): Now point layers will set to a default
2609     symbol to show a circle in mapserver and not only a 1px dot.
2610     (MF_Style.__init__): Fixed a bug with the color. Color was not set
2611     correct before.
2612     (MF_Size): Removed, because it is not needed.
2613    
2614     * Extensions/umn_mapserver/README: Added the hints to use the
2615     export and editing functions, too.
2616    
2617     * Extensions/umn_mapserver/sample/iceland.map: Added the
2618     new parameter "UNITS METERS".
2619     Change the political layer to status OFF.
2620    
2621     * Extensions/umn_mapserver/sample/README: Added some
2622     more details to setup the sample in the MapServer.
2623    
2624 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
2625    
2626     * Extensions/svgexport/test/test_svgmapwriter.py:
2627     Removed class VFile and used standard StringIO instead.
2628    
2629 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
2630    
2631     Add the export function to the umn_mapserver extension.
2632    
2633     * Extension/umn_mapserver/mf_export.py: New. This module extents
2634     Thuban with the possibility to export the Thuban content.
2635    
2636     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
2637     with the export module. Especially added the possibility to
2638     add thuban objects directly to the map objects.
2639    
2640     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
2641     because of the hint from Bernhard Herzog.
2642     Corrected the handling of absolute pathnames.
2643     Changed the Text of the Menu-Item, now the beginning is upper case.
2644    
2645     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
2646    
2647 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
2648 jschuengel 2242
2649 jschuengel 2250 Add a sample and make some changes.
2650    
2651     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
2652     import from * to explicit used statements. Changed the
2653     Thuban.UI.mainwindow import phrase, too.
2654     (import_mapfile):Corrected a clerical mistake.
2655     Added wxCHANGE_DIR in OpenFile Dialog.
2656     Added a MultipleChoiceDialog, to select the layers to load from
2657     mapfile into thuban. Thereby the projection is only set if one layer
2658     is selected.
2659     Added the possibility to handle relative pathnames which uses
2660     up-level references.
2661     Removed some doubled code.
2662     Corrected an error with integer values used as label in thuban
2663     ClassGroup.
2664    
2665     * Extensions/umn_mapserver/sample: New.
2666    
2667     * Extensions/umn_mapserver/sample/README: New. Describes the
2668     usage of the sample files.
2669    
2670     * Extensions/umn_mapserver/sample/iceland.map: New. This is
2671     a suitable .map-file for the iceland data.
2672    
2673     * Extensions/umn_mapserver/sample/index.html: New. The template
2674     for the mapfile.
2675    
2676     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
2677     file for the Iceland Application on web.
2678    
2679     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
2680     some details.
2681    
2682     * Extensions/umn_mapserver/test/test_mapserver
2683     (mapserver_import_Test_generalClasses.test_MF_Color):
2684     Corrected the thubancolor test.
2685    
2686     2004-06-15 Jan Schüngel <[email protected]>
2687    
2688 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
2689    
2690 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
2691    
2692     * libraries/thuban/cpl_mfile.h: Added copyright header.
2693    
2694     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
2695     Free Software License so that it is most useful with gdalwarp
2696     and bmpdataset.
2697    
2698 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
2699    
2700     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
2701     import of wxPython.wx itself (as opposed to the contents of
2702     wxPython.wx). For some reason wxPython.wx is available as
2703     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
2704     wrt. wxPython 2.4.
2705    
2706 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
2707    
2708     Initial version of new extension "umn_mapserver". This extension aims
2709     to manage configuration for the UMN MapServer application. This
2710     inital version just imports the .map-files and displays all, Thuban is
2711     capable of.
2712    
2713     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
2714    
2715     * Extensions/umn_mapserver/test/README: New. Describes how to run the
2716     tests.
2717    
2718     * Extensions/umn_mapserver/test/test.map: New. This is a test
2719     .map-file for automated tests of the umn_mapserver extension of
2720     Thuban.
2721    
2722     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
2723     UMN Mapserver classes.
2724    
2725     * Extensions/umn_mapserver/__init__.py: New. Init to make this
2726     directory a package.
2727    
2728     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
2729     '.map'-file objects.
2730    
2731     * Extensions/umn_mapserver/mf_import.py: New. This module extends
2732     Thuban with the possibility to handle UMN MapServer mapfiles.
2733    
2734 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
2735    
2736     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
2737     to a tuple before using it as arguments to the % operator. This
2738     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
2739     reported today on thuban-list by Jan Schüngel
2740    
2741     * test/test_layer.py (TestLayerModification.setUp): Save the
2742     filename as an instance variable so we can refer to it in tests
2743     (TestLayerModification.test_tree_info): Uncomment this method
2744     again and make it work. This tests for the formatting issue
2745     filed in RT#2239 on 2004-01-13
2746    
2747 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
2748    
2749     * Thuban/UI/baserenderer.py: Fix some typos.
2750    
2751 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
2752    
2753     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
2754     by increasing a field size.
2755    
2756 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
2757    
2758     Update to newest shapelib and get rid of Thuban specific
2759     extensions, i.e. use the new DBFUpdateHeader instead of our
2760     DBFCommit kludge
2761    
2762     * libraries/shapelib/shpopen.c: Update to version from current
2763     shapelib CVS.
2764    
2765     * libraries/shapelib/shapefil.h: Update to version from current
2766     shapelib CVS.
2767    
2768     * libraries/shapelib/dbfopen.c: Update to version from current
2769     shapelib CVS.
2770     (DBFCommit): Effectively removed since shapelib itself has
2771     DBFUpdateHeader now which is better for what DBFCommit wanted to
2772     achieve.
2773     We're now using an unmodified version of dbfopen.
2774    
2775     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
2776     value '1' to the Lib.dbflibc extension. This simply reflects the
2777     shapelib and pyshapelib updates
2778    
2779 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
2780    
2781     Finished introduction of Menu.FindOrInsertMenu.
2782    
2783     * Extensions/drawshape/drawshape.py: Add the command
2784     to the experimental menu additionally to the toolbar.
2785    
2786     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
2787     finding menu on its own.
2788    
2789     * Doc/manual/thuban-manual.xml: updated sample file
2790     to use FindOrInsertMenu().
2791    
2792     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
2793     instead of finding menu on its own.
2794    
2795 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
2796    
2797     * test/test_menu.py (MenuTest.test): Added testing
2798     of method Menu.FindOrInsertMenu.
2799    
2800 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
2801    
2802     Introduce and use Menu.FindOrInsertMenu.
2803    
2804     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
2805     given menu or, if not found, insert it.
2806    
2807     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
2808     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
2809     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
2810     menu on its own.
2811    
2812 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
2813    
2814     Introduce a abstract ColorDialog class and remove
2815     and outdated file.
2816    
2817     * Thuban/UI/proj4dialog.py: Removed. It is has been
2818     replaced by projdialog for quite a while and is not used
2819     anymore.
2820    
2821     * Thuban/UI/colordialog.py: New. Abstraction for color selection
2822     dialog(s).
2823    
2824     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
2825     Now calls the abstract ColorDialog instead of wxColourDialog.
2826     This also removed the dependency to Color class conversion
2827     from this function.
2828    
2829 frank 2197 2004-05-04 Frank Koormann <[email protected]>
2830    
2831     * Extensions/bboxdump/__init__.py: Fixed string left over from
2832     copying.
2833    
2834     * Extensions/bboxdump/bboxdump.py (bboxdump):
2835     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
2836     xrange(layer.NumShapes()). Compile the bboxmessage from a list
2837     of formatted outputs (string.join) instead of appending to the
2838     message. Two progress bar dialogs to report progress on the sometimes
2839     lenghty processing.
2840    
2841 frank 2196 2004-04-22 Frank Koormann <[email protected]>
2842    
2843     New Extension to dump bounding boxes of all shapes of the selected
2844     layer. An optional column can be specified to group the objects,
2845     in this case the bounding box is a union of the separate boxes.
2846     Dump can be displayed in a ScrolledMessageDialog or written to file.
2847     The Extension is simply a combination of available and well tested
2848     Thuban functionality.
2849    
2850     * Extensions/bboxdump/__init__.py: New: Init to make this
2851     directory a package.
2852    
2853     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
2854     all shapes of the selected layer.
2855    
2856 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
2857    
2858     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
2859     strings to be i18n now.
2860    
2861 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
2862    
2863     Changing popup menu of legend from direct building
2864     to using the Menu construction as used for the mainwindow.
2865    
2866     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
2867     layer_to_bottom, layer_visibility
2868     (MainWindow.LayerToTop): New. Put current layer to the top.
2869     (MainWindow.LayerToBottom): New. Put current layer to bottom.
2870     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
2871     Replace 1,0 by True, False.
2872     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
2873     current layer.
2874     (MainWindow.LayerShowTable): Removed raising of dialog.
2875     (_has_selected_layer_visible): New. Support function.
2876    
2877     * Thuban/UI/legend.py: ID_POP_xxx: removed.
2878     (LegendPanel.__init__): Removed EVT_MENU bindings.
2879     (LegendTree._OnRightClick): Replace direct creation of
2880     menu via wx Classes by applying the menu definition
2881     as of Menu class of menu.py.
2882    
2883 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
2884    
2885     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
2886     button string to stronger clearify that Thuban will be closed when hitting
2887     the button.
2888    
2889     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
2890     Now for layers without a ShapeStore a corresponding message is given
2891     to the user, that this layer has no table to show.
2892    
2893 joey 2182 2004-04-15 Martin Schulze <[email protected]>
2894    
2895     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
2896     recalculate the format for the internal render engine as well.
2897    
2898     * Extensions/wms/properties.py (wmsProperties): First start for a
2899     properties dialog. It's functional for a first selection of
2900     layers, but still has some weired wxWidgets/GTK problems but
2901     beautification can be done later.
2902    
2903     * Extensions/wms/layer.py: Added more documentation
2904     (WMSLayer.getFormats): New: Return list of supported image formats
2905     by the WMS server
2906     (WMSLayer.getLayers): New: Return the list of layer names
2907     supported by the WMS server
2908     (WMSLayer.getLayerTitle): New: Return the title of the named layer
2909     (WMSLayer.getWMSFormat): New: Return the image format that is used
2910     for WMS GetMap requests
2911     (WMSLayer.setWMSFormat): New: Set the image format that is used
2912     for WMS GetMap requests
2913     (WMSLayer.__init__): Move away from using only one layer to using
2914     a list of layers (unsorted at the moment, though).
2915     (WMSLayer.getVisibleLayers): New: Return the list of names for all
2916     visible layers
2917     (WMSLayer.setVisibleLayers): New: Set the list of names for all
2918     visible layers
2919    
2920     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
2921     order to establish a clean structure.
2922    
2923     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
2924     own in order to establish a clean structure.
2925    
2926 joey 2174 2004-04-13 Martin Schulze <[email protected]>
2927    
2928     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
2929     support for oldstyle (WMS 1.0 apparently) image format
2930     specification.
2931    
2932     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
2933     supported graphic formats back to JPEG and BMP, PNG and others are
2934     too *cough* experimental... Sorry, I meant to filter this out
2935     before I committed this part. This should make the WMS extension
2936     run from CVS again.
2937     (wms_dialog): Reset an empty URL to None so that the subsequent
2938     program can depend on this, since the dialog will indeed return an
2939     empty URL, causing another declaration of love by Python.
2940    
2941     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
2942     Whenever a native BoundingBox request cannot be fulfilled, check
2943     whether the requested SRS is EPSG:3426, in which case return the
2944     LatLonBoundingBox values.
2945    
2946     * Extensions/wms/test/test_parser.py
2947     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
2948     ignoring AUTO:* SRS.
2949     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
2950     Added another test method to test whether the LatLonBoundingBox
2951     values will be returned if BoundingBox values are requested with
2952     SRS set to EPSG:3426.
2953    
2954     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
2955     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
2956     the moment by placing them into a variable which is currently
2957     unused. Also test whether the EPSG SRS is numerical as it should
2958     be and add an error message if it is not.
2959    
2960     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
2961     appear in the real world as well. Since we cannot handle them yet
2962     (OGCLib can't either), we will ignore them for the moment.
2963    
2964     * Extensions/wms/parser.py: Use a variable for denoting the sample
2965     filename
2966     (WMSCapabilitiesParser.peekLayers): Added support for error
2967     messages during grok(). They will be aggregated in an array and
2968     may be displayed later. We may have to add a classification
2969     "Warning" and "Error" to this. That requires more experience,
2970     though, since not every error may be lethal.
2971    
2972     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
2973     ShowTable() dialog/frame when the user attempts to display it
2974     while it has been opened before already and not closed again.
2975    
2976 joey 2161 2004-04-11 Martin Schulze <[email protected]>
2977    
2978     * Extensions/wms/infodialog.py: Adjusted the class documentation
2979    
2980     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
2981     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
2982     wxWidgets variants.
2983     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
2984    
2985     * Extensions/wms/infodialog.py: Added an information dialog that
2986     will display various information about the WMS current resource,
2987     so that additional information such as the title, the abstract,
2988     fees and access constraints can be displayed for the user if they
2989     are documented in the WMS XML.
2990    
2991 joey 2156 2004-04-10 Martin Schulze <[email protected]>
2992    
2993     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
2994     string handling. It's "foo".lower() and not lower(foo) without
2995     lower imported from strings or something.
2996    
2997     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
2998     from capabilities.py and parser.py. Implement priority list for
2999     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
3000     and GIF are supported here, but not yet by main Thuban. Hence,
3001     support for them may be removed later. Special contribution to
3002     usability: get wxWidgets to change the cursor when we're waiting
3003     for data from the network so the user won't start to worry. This
3004     causes a redrawing error/warning, though.
3005    
3006     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
3007     the DOM object.
3008    
3009     2004-04-01 Martin Schulze <[email protected]>
3010    
3011     * Extensions/wms/capabilities.py: Adjusted documentation
3012     (WMSCapabilities.__init__): Improved documentation, fixed syntax
3013     (WMSCapabilities.saveCapabilities): Only catch IOError when
3014     handling files
3015     (WMSCapabilities.loadCapabilities): Only catch IOError when
3016     handling files
3017     __main__: corrected variable naming
3018     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
3019     class a specialisation of WMSCapabilitiesParser as well. Also
3020     execute grok() after loading or fetching capabilities, if that
3021     went well, so that subsequent calls can already access the data.
3022     (WMSCapabilities.getVersion): Export the used version of the
3023     GetCapabilities request, so we can use it for subsequent calls,
3024     i.e. for GetMap requests.
3025     (WMSCapabilities.fetchCapabilities): Added proper error handling
3026     when the GetCapabilities request failed, so that the surrounding
3027     program can act accordingly.
3028    
3029 joey 2146 2004-03-30 Martin Schulze <[email protected]>
3030    
3031     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
3032     Adjusted the getLayerSRS method to return the list of SRSes
3033     extracted from <SRS> elements instead of <BoundingBox> elements.
3034     Added a bit of documentation as well.
3035     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
3036     since it was only implemented due to a misunderstanding.
3037    
3038     * Extensions/wms/test/test_parser.py
3039     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
3040     reflect the corrected interpretation of the standard: i.e. a layer
3041     does not have to define a BoundingBox for all SRSes it supports.
3042     Hence the <SRS></SRS> specification is authoritative, not the list
3043     of BoundingBoxes.
3044     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
3045     to ensure None is returned for a non-existing SRS.
3046     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
3047     since it is not applicable anymore. Listing more SRSes in <SRS>
3048     elements is valid according to the specs.
3049    
3050 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
3051 joey 2146
3052 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
3053     Reflected wxWidgets name change.
3054    
3055     * Thuban/UI/about.py: Extended copyright to 2004 and added
3056     information about the thuban-devel mailinglist.
3057    
3058 joey 2138 2004-03-24 Martin Schulze <[email protected]>
3059 joey 2120
3060 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
3061     'WMS', also added a linebreak where required
3062    
3063     * Extensions/wms/parser.py: Finally added the XML parser for the
3064     GetCapabilities response.
3065    
3066     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
3067     <SRS> elements match the <BoundingBox> elements, except for the
3068     layer 'beschriftung'.
3069    
3070     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
3071     since Python uses unicode strings internally, otherwise
3072     comparisons will fail. Removed tests for getLayerBBoxSRS() since
3073     the SRS will be calculated anyway and this method is obsoleted by
3074     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
3075     Move loading the sample file into the setUp method. Added a test
3076     for finding the integrity problem in the sample response.
3077     Improved formatting.
3078    
3079     * Extensions/wms/domutils.py: Added convenience routines for
3080     handling of Document Object Model (DOM) nodes.
3081    
3082     * Extensions/wms/test/test_domutils.py: Added a test for the
3083     domutils module
3084    
3085     2004-03-19 Martin Schulze <[email protected]>
3086    
3087 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
3088     Moved path detection and adding into a module of its own,
3089     adjustpath, which exports thubandir as main Thuban directory.
3090    
3091     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
3092     detection and adding into a module of its own, adjustpath, which
3093     exports thubandir as main Thuban directory. Reorganised the
3094     module in order to support the SkipTest feature for Thuban test
3095     cases.
3096    
3097     * Extensions/wms/test/adjustpath.py: Moved path detection and
3098     adding into a module of its own.
3099    
3100 joey 2115 2004-03-18 Martin Schulze <[email protected]>
3101    
3102     * Extensions/wms/test/test_parser.py: Added another test for
3103     checking whether the WMS XML parser (to be implemented) returns
3104     the information we expect. This requires a sample WMS WML file
3105     (sample.xml) which has been extracted from the frida server and
3106     "improved" manually.
3107    
3108     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
3109     main Thuban directory to the path in order to be able to import
3110     random modules. Adjusted the PyOGCLib detection to reuse the
3111     information gathered. Also added a note about the PYTHONPATH
3112     environment variable.
3113    
3114     * Extensions/wms/test/test_ogclib.py: The format specification is
3115     a mime-type, not a graphic format, hence image/jpeg wou ld be the
3116     proper format and not JPEG. We'll also have to take care of the
3117     encoding of / as %2F.
3118    
3119 joey 2111 2004-03-16 Martin Schulze <[email protected]>
3120    
3121     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
3122     comprehensive test for the getMapURL method, built compare URLs
3123     according to the documentation in OGC 01-068r3
3124    
3125     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
3126     class WMSCapabilities to manage capabilites, will incorporate
3127     parsing the capabilities response and provide details for other
3128     classes.
3129    
3130 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
3131    
3132 bh 2107 Support views in addition to normal tables in the postgis
3133     shapestore
3134    
3135     * Thuban/Model/postgisdb.py
3136     (PostGISShapeStore._fetch_table_information): Add a fallback for
3137     the case where the table name is not in the geometry_columns
3138     table. This is usually the case for views. Also, set
3139     self.shapestore here.
3140     (PostGISShapeStore.ShapeType): No need to query the database all
3141     the time. The shape type is now determined in
3142     _fetch_table_information
3143    
3144     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
3145     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
3146     New parameter to specify views.
3147     (PostGISDatabase.has_data): Also compare the views. New views
3148     parameter
3149     (PostGISDatabase.initdb): Create the views.
3150     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
3151     view
3152    
3153     * test/test_postgis_db.py
3154     (TestPostGISShapestorePointFromViews): New. Test a
3155     PostGISShapeStore with a view
3156     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
3157     the geometry_column explicitly to test whether that works
3158    
3159     2004-03-12 Bernhard Herzog <[email protected]>
3160    
3161 bh 2105 Final step for explicit id/geometry columns: Loading and saving
3162    
3163     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
3164     with the following changes:
3165     (dbshapesource): Two new attributes id_column and geometry_column
3166    
3167     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
3168     (SessionSaver.write_session): Use the new namespace
3169     (SessionSaver.write_data_containers): Write the new dbshapesource
3170     parameters
3171    
3172     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
3173     the new file format version
3174     (SessionLoader.start_dbshapesource): Handle the new db parameters
3175    
3176     * test/test_save.py: Update to the new dtd and namespace
3177     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
3178     mock object to provide a working IDColumn method.
3179    
3180     * test/test_load_1_0.py: New. Copy of the test_load.py before
3181     today's changes but with the round-trip tests removed.
3182    
3183     * test/test_load_0_9.py: Update doc-string.
3184    
3185     * test/test_load.py: Update all .thuban files to the new dtd and
3186     namespace.
3187     (TestPostGISLayer.file_contents): Add the new dbshapesource
3188     paramters
3189    
3190 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
3191    
3192 bh 2103 Next step for explicit id/geometry columns: User interaction
3193    
3194     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
3195     the dialog is constructed. Add combo boxes to select id and
3196     geometry column. Rename some instance variables.
3197     (ChooseDBTableDialog.GetTable): Return id and geometry column
3198     names
3199     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
3200     selections in the table list
3201    
3202     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
3203     and geometry_column
3204    
3205     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
3206     parameters for id_column and geometry column of PostGISShapeStore
3207     here as well.
3208    
3209     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
3210     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
3211     (PostGISConnection.GeometryTables): Use a better query to
3212     determine which relations in the database might be usable for
3213     shapestores. Now supports views as well but is more PostgreSQL
3214     specific
3215     (PostGISConnection.table_columns): New. Somewhat experimental
3216     method to let the db dialogs provide lists of columns to users so
3217     that they can select id and geometry columns.
3218     (PostGISTable.__init__): The default value of the id_column
3219     parameter is now None it still means "gid" effectively, though.
3220     (PostGISTable.IDColumn): New introspection method to return a
3221     column object for the id column
3222     (PostGISShapeStore.GeometryColumn): New introspection method to
3223     return a column object for the geometry column
3224    
3225     * test/test_postgis_db.py
3226     (TestPostGISConnection.test_gis_tables_non_empty):
3227     Removed. Subsumed by the new:
3228     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
3229     New. Tes the GeometryTables and table_columns methods with actual
3230     tables and views.
3231     (PointTests.test_id_column, PointTests.test_geometry_column):
3232     New. tests for the new methods.
3233     (TestPostGISShapestorePoint.setUp)
3234     (TestPostGISShapestorePointSRID.setUp)
3235     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
3236     instance variables needed by the new tests
3237    
3238     2004-03-11 Bernhard Herzog <[email protected]>
3239    
3240 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
3241     numbers given to ReadValue are ordinals.
3242    
3243     2004-03-11 Bernhard Herzog <[email protected]>
3244    
3245     Elimiate the requirement for PostGIS tables to have a column
3246     called "gid".
3247    
3248     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
3249     id_column to specify which column to use to identify rows. Also
3250     new instance variables id_column and quoted_id_column
3251     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
3252     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
3253     (PostGISTable.SimpleQuery): Use the id column name provided to the
3254     constructor instead of "gid"
3255     (PostGISShapeStore.__init__): New parameter id_column analogously
3256     to PostGISTable.__init__. This parameter is simply passed through
3257     to the base class constructor
3258     (PostGISShapeStore._create_col_from_description): Fix typo in
3259     doc-string
3260     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
3261     (PostGISShapeStore.ShapesInRegion): Use the id column name
3262     provided to the constructor instead of "gid"
3263    
3264     * test/postgissupport.py
3265     (PostgreSQLServer.get_default_static_data_db): New static table
3266     landmarks_point_id with an id column != "gid. Update the comments
3267     a bit.
3268     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
3269     doc-
3270     (upload_shapefile): New parameter gid_column to use a name other
3271     than "gid" for the column to store the shape ids
3272    
3273     * test/test_postgis_db.py (TableTests): New. Mixin-class
3274     containing all tests previously in TestPostGISTable. The actual
3275     tests are the same but the code is a bit more configurable to
3276     allow for different id columns etc.
3277     (TestPostGISTable): Derive from TableTests now for the actual
3278     tests.
3279     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
3280     except that it the landmarks_point_id table to test the id_column
3281     parameter
3282     (PointTests): Extend the doc-string
3283     (TestPostGISShapestorePointExplicitGIDColumn)
3284     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
3285     from PointTests to test the explicit id_column parameter. One
3286     tests with the name of the column holding the shape ids, the other
3287     uses PostgreSQL's OID column. For the latter a number of methods
3288     have to be overwritten to make them independent of the actual id
3289     values.
3290    
3291 silke 2095 2004-03-08 Silke Reimer <[email protected]>
3292    
3293     Update debian directory:
3294    
3295     * debian/changelog: Added new version.
3296     * deiban/rules: Updated management of patches (with cbds)
3297     * debian/control: Added cbds to dependencies
3298     * debian/patches/*: New. Adds better support for patches of thuban in
3299     debian
3300     * debian/menu: Syntax of menu changed slightly
3301     * debian/setup.py.patch: removed because it has been moved to
3302     debian/patechs/setup.py.patch
3303    
3304    
3305 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
3306    
3307     Create the Doc/technotes directory for text files with information
3308     for developers
3309    
3310     * Doc/technotes/README: New. README for the technotes
3311    
3312     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
3313     Thuban
3314    
3315     * Doc/technotes/release_process.txt: New. Used to be
3316     HOWTO-Release. Now slightly adapted to technote formatting style.
3317    
3318     * HOWTO-Release: Removed. It's contents are now in
3319     Doc/technotes/release_process.txt
3320    
3321 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
3322    
3323     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
3324     version of wxWindows the module was compiled with so we can check
3325     that against the wxPython version.
3326    
3327     * Thuban/version.py (thuban_branch, thuban_release): New variables
3328     controlling which and how Thuban versions are shown. See the
3329     comments for details.
3330     (verify_versions): Also check that the wx version that wxproj is
3331     compiled against matches that of the wxPython we use at runtime
3332    
3333 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
3334    
3335 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
3336     get_system_proj_file to read the epsg projections. The old way
3337     depended on the current directory being the top Thuban directory.
3338    
3339     2004-02-20 Bernhard Herzog <[email protected]>
3340    
3341 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
3342     (TestVirtualDC.test_clippath): Remove a debug print
3343    
3344     2004-02-20 Bernhard Herzog <[email protected]>
3345    
3346 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
3347     Extensions/svgexport into a package.
3348    
3349     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
3350     doc-string a bit. The doc-string must come first, otherwise it's
3351     not a doc-string. The __future__ import must be the first thing
3352     after the doc-string. Use only double quotes in doc-strings.
3353     Single quotes trip up emacs syntax highlighting if the text
3354     contains apostrophes.
3355    
3356     2004-02-20 Bernhard Herzog <[email protected]>
3357    
3358 bh 2080 * Extensions/svgexport/test/__init__.py,
3359     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
3360     suite for svgexport
3361    
3362     * test/runtests.py (find_test_modules): New. Function with the
3363     module finding code from main.
3364     (main): Use find_test_modules to figure out the default test
3365     modules and take modules from Extensions.svgexport.test too.
3366    
3367 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
3368    
3369 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
3370     the mainwindow has a reference to the map of the initial session.
3371     This fixes a bug introduced with the fix for RT#2245
3372    
3373     2004-02-19 Bernhard Herzog <[email protected]>
3374    
3375 bh 2075 * Extensions/svgexport/svgsaver.py,
3376     Extensions/svgexport/svgmapwriter.py,
3377     Extensions/svgexport/maplegend.py: Added again. This time in the
3378     correct place.
3379    
3380 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
3381    
3382 bh 2073 Fix for RT#2245
3383    
3384     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
3385     instance variables before trying to create any windows. Creating
3386     windows can start an event loop if e.g. message boxes are popped
3387     up for some reason, and event handlers, especially EVT_UPDATE_UI
3388     may want to access things from the application.
3389     (ThubanApplication.maps_changed): The mainwindow may not have been
3390     created yet, so check whether it has been created before calling
3391     its methods
3392    
3393     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
3394     have a map
3395    
3396     2004-02-17 Bernhard Herzog <[email protected]>
3397    
3398 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
3399     Extensions/svgmapwriter.py, Extensions/maplegend.py,
3400     extensions/svgexport/svgsaver.py,
3401     extensions/svgexport/svgmapwriter.py,
3402     extensions/svgexport/maplegend.py: Removed. These files were in
3403     the wrong places or didn't work at all.
3404    
3405 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
3406    
3407 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
3408     line
3409    
3410     2004-02-16 Bernhard Herzog <[email protected]>
3411    
3412 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
3413    
3414 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
3415    
3416     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
3417     to write a session to a file in SVG format.
3418     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
3419     to write a SVG map of a session.
3420     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
3421     in SVG format for the current session.
3422    
3423 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
3424    
3425     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
3426     can't be created, return immediately after displaying the error
3427     message.
3428    
3429 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
3430    
3431     Handle postgis tables with more than one geometry column.
3432    
3433     * Thuban/Model/postgisdb.py
3434     (PostGISTable._fetch_table_information): Delegate the creation of
3435     column objects to a different method so that we can extend that in
3436     derived classes
3437     (PostGISTable._create_col_from_description): New. Column object
3438     creation part of _fetch_table_information
3439     (PostGISShapeStore._create_col_from_description): New. Extend
3440     inherited method to handle geometry columns
3441     (PostGISShapeStore.__init__): New parameter geometry_column to
3442     specify which geometry column to use. Optional but mandatory for
3443     tables with more than one geometry column
3444     (PostGISShapeStore._fetch_table_information): Also use the name of
3445     the geometry column when looking for the srid
3446     (PostGISShapeStore.ShapeType): Also use the name of the geometry
3447     column when looking for the shape type
3448    
3449     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
3450     NonConnectionStore to changes in the PostGISShapeStore
3451    
3452     * test/test_postgis_db.py
3453     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
3454     PostGISShapeStore with tables having two geometry columns.
3455    
3456 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
3457    
3458     Fix some postgis problems. What remains to be done is real
3459     handling of SRIDs as they affect how reprojection is done
3460    
3461     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
3462     doc-string
3463     (PostGISShapeStore._fetch_table_information): New. Extend
3464     inherited method to retrieve srid
3465     (PostGISShapeStore.BoundingBox): Handle tables without data.
3466     extent yields NULL for those
3467     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
3468    
3469     * test/test_postgis_db.py
3470     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
3471     for the special case of a table without any data
3472     (TestPostGISShapestorePointSRID): New class with tests for a table
3473     that uses srids
3474     (PolygonTests): Fix a doc-string typo
3475    
3476     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
3477     reference_systems with a specification of spacial reference
3478     systems to create in the new db.
3479     (PostgreSQLServer.new_postgis_db)
3480     (PostgreSQLServer.get_static_data_db): New parameter
3481     reference_systems to be passed through ultimately to
3482     PostGISDatabase. In new_postgis_db also check whether an existing
3483     db already has the right srids
3484     (PostgreSQLServer.get_default_static_data_db): Add srids and a
3485     table that uses srids
3486     (PostGISDatabase.initdb): Create the entries for the reference
3487     systems
3488     (PostGISDatabase.has_data): Add reference_systems parameter to
3489     check for those too
3490     (upload_shapefile): New parameter srid to create tables with a
3491     specific srid
3492    
3493 frank 2055 2004-02-06 Frank Koormann <[email protected]>
3494    
3495     * po/pt_BR.po: Fixed charset
3496    
3497 frank 2054 2004-02-05 Frank Koormann <[email protected]>
3498    
3499     * po/pt_BR.po: Fixed format string for error message, missing %s
3500     added (Thuban/UI/application.py:273)
3501    
3502 frank 2053 2004-02-03 Frank Koormann <[email protected]>
3503    
3504     First version of Portuguese (Brazilian) translation
3505    
3506     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
3507     Brazilian Portuguese by Eduardo Patto Kanegae.
3508    
3509     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
3510     translators.
3511    
3512    
3513 frank 2052 2004-01-22 Frank Koormann <[email protected]>
3514    
3515     * Doc/manual/thuban-manual.xml: Added section on installation of
3516     Thuban under Win32 systems. Fixed image path references in the postgis
3517     section. Some minor source formattings.
3518    
3519 frank 2051 2004-01-21 Frank Koormann <[email protected]>
3520    
3521     Make Thuban remember path selections (at least for one application run).
3522    
3523     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
3524     attribute of application object. Path is a dictionary of
3525     strings, currently with the items "data" and "projection".
3526     (Application.SetPath): New, stores path for the specified item.
3527     (Application.Path): New, return path for the specified item.
3528    
3529     * Thuban/UI/mainwindow.py
3530     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
3531     MainWindow.AddLayer, MainWindow.AddRasterLayer,
3532     MainWindow.TableOpen): Access "data" path information of the
3533     application.
3534    
3535     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
3536     Access "projection" path information of the application.
3537    
3538 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
3539    
3540 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
3541    
3542     2004-01-05 Bernhard Herzog <[email protected]>
3543    
3544 bh 2048 * po/Makefile, po/README: Move the description of how to generate
3545     the translation statistics to the README.
3546    
3547 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
3548    
3549 bh 2045 * NEWS: Update for 1.0.0
3550    
3551     * po/it.po: Another update from Maurizio Napolitano
3552    
3553     2003-12-23 Bernhard Herzog <[email protected]>
3554    
3555 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
3556    
3557     2003-12-23 Bernhard Herzog <[email protected]>
3558    
3559     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
3560     for translation
3561    
3562     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
3563     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
3564     strings for translation
3565    
3566     * po/de.po: Update with the newly marked strings.
3567    
3568 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
3569    
3570 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
3571     updated
3572    
3573     2003-12-22 Bernhard Herzog <[email protected]>
3574    
3575 bh 2037 * setup.py (setup call): 1.0.0, yeah!
3576    
3577     * Thuban/version.py (longversion): 1.0.0, yeah!
3578    
3579     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3580     1.0.0 namespace too
3581    
3582     * Thuban/Model/save.py (SessionSaver.write_session): Save with
3583     1.0.0 namespace
3584    
3585     * test/test_load.py (LoadSessionTest.dtd)
3586     (TestSingleLayer.file_contents)
3587     (TestNonAsciiColumnName.file_contents)
3588     (TestLayerVisibility.file_contents)
3589     (TestClassification.file_contents, TestLabels.file_contents)
3590     (TestLayerProjection.file_contents)
3591     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3592     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
3593     (TestPostGISLayerPassword.file_contents)
3594     (TestLoadError.file_contents, TestLoadError.test): Update for
3595     1.0.0 namespace
3596    
3597     * test/test_save.py (SaveSessionTest.dtd)
3598     (SaveSessionTest.testEmptySession)
3599     (SaveSessionTest.testSingleLayer)
3600     (SaveSessionTest.testLayerProjection)
3601     (SaveSessionTest.testRasterLayer)
3602     (SaveSessionTest.testClassifiedLayer)
3603     (SaveSessionTest.test_dbf_table)
3604     (SaveSessionTest.test_joined_table)
3605     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
3606    
3607     2003-12-22 Bernhard Herzog <[email protected]>
3608    
3609 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
3610     alignment flags are byte strings not unicode and that they have
3611     valid values
3612    
3613     * test/test_load.py (TestLabelLayer): New. Test loading (and
3614     indirectly saving) of maps with labels.
3615    
3616     2003-12-22 Bernhard Herzog <[email protected]>
3617    
3618 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
3619     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
3620     unsubscribe all subscribers.
3621     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
3622     self.grid since it may already have been destroyed.
3623     Fixes RT #2256
3624    
3625 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
3626    
3627     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3628    
3629 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
3630 silke 2029
3631     * debian/bitmappath.patch, debian/setup.py.patch:
3632     added to ensure compliance with FHS for debian
3633     * debian/rules, debian/changelog:
3634     added patches in rules to ensure compliance with FHS for debian
3635 bh 2028
3636 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
3637    
3638 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
3639     statistics about the translations. Add a comment how produce even
3640     nicer statistics with sed.
3641    
3642 frank 2026 2003-12-09 Frank Koormann <[email protected]>
3643    
3644     * Resources/Projections/defaults.proj:
3645     French projection sample with correct accents (UNICODE).
3646    
3647 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
3648    
3649     * MANIFEST.in: Add the devtools directory
3650    
3651     * setup.py (setup call): Use license instead of licence. This
3652     silences a deprecation warning on Python 2.3
3653    
3654 frank 2022 2003-12-05 Frank Koormann <[email protected]>
3655    
3656 frank 2023 Documentation synced with 1.0rc1
3657    
3658     * Doc/manual/thuban-manual.xml:
3659     Minor formatting changes and references to database layers .
3660     Introduction.Internationalization: New section on i18n.
3661     MapManagement.AddingandRemovingLayers: Added item on database layers.
3662     MapManagement.TheLegend: Added section and screenshot on popup menu.
3663     ProjectionManagement: Updated screenshot and sentence on EPSG.
3664     Appendix.SupportedDataSources: Added PostGIS.
3665     Appendix.WorkingwithPostGIS: New section.
3666    
3667     * Doc/manual/images/6_projection.png: Updated screenshot including
3668     EPSG checkboxes.
3669    
3670     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
3671    
3672     * Doc/manual/images/app_postgis_add_layer.png,
3673     Doc/manual/images/app_postgis_db_add.png,
3674     Doc/manual/images/app_postgis_db_management.png:
3675     New screenshots focussing on database layers
3676    
3677     2003-12-05 Frank Koormann <[email protected]>
3678    
3679 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
3680     write warning to stderr instead of rising a warning dialog
3681    
3682 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
3683    
3684 bh 2021 Fix for RT #2243
3685    
3686 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
3687     New. Like has_selected_layer but for shape layers only
3688     (_has_selected_shape_layer): New. Like _has_selected_layer but for
3689     shape layers only
3690     (layer_show_table command, layer_jointable command): Use these
3691     commands should only be available for shape layers
3692    
3693     2003-12-03 Bernhard Herzog <[email protected]>
3694    
3695 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
3696     publishers that are wx objects and may have been destroyed by wx
3697     already. Fixes RT #2242.
3698    
3699     2003-12-03 Bernhard Herzog <[email protected]>
3700    
3701 bh 2016 * po/ru.po: Updates from Alex Shevlakov
3702    
3703 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
3704    
3705     * debian/control, debian/changelog: Added gdal-support to
3706     debian package, updated to new thuban version
3707    
3708    
3709 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
3710    
3711     * Thuban/Lib/version.py: New. Module for version number
3712     manipulations. The version of make_tuple here also deals better
3713     with more unusual version number strings, such as e.g.
3714     "1.2+cvs20031111"
3715    
3716     * Thuban/version.py (make_tuple): Removed. It's now in
3717     Thuban.Lib.version. Use that implementation instead.
3718    
3719     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
3720    
3721 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
3722    
3723 bh 2010 * MANIFEST.in: Add debian files
3724    
3725 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
3726     they're installed too
3727     (data_files): Add READMEs and sample data from some Extensions
3728    
3729     * NEWS: Add note about the extensions in binary packages
3730    
3731     2003-12-02 Bernhard Herzog <[email protected]>
3732    
3733 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
3734     with the thuban-1.0rc1
3735    
3736     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
3737     thuban-1.0rc1 namespace too
3738    
3739     * test/test_save.py (SaveSessionTest.dtd)
3740     (SaveSessionTest.testEmptySession)
3741     (SaveSessionTest.testSingleLayer)
3742     (SaveSessionTest.testLayerProjection)
3743     (SaveSessionTest.testRasterLayer)
3744     (SaveSessionTest.testClassifiedLayer)
3745     (SaveSessionTest.test_dbf_table)
3746     (SaveSessionTest.test_joined_table)
3747     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
3748     namespace
3749    
3750     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
3751     namespace
3752     (TestSingleLayer.file_contents)
3753     (TestNonAsciiColumnName.file_contents)
3754     (TestLayerVisibility.file_contents)
3755     (TestClassification.file_contents, TestLabels.file_contents)
3756     (TestLayerProjection.file_contents)
3757     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3758     (TestPostGISLayer.file_contents)
3759     (TestPostGISLayerPassword.file_contents)
3760     (TestLoadError.file_contents, TestLoadError.test): Update to
3761     thuban-1.0rc1 namespace
3762    
3763 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
3764    
3765 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
3766     nt to better match Intevation's current w32 setup
3767    
3768 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
3769    
3770     * MANIFEST.in: Add the Extensions
3771    
3772 bh 1998 * NEWS: Update for 1.0rc1
3773    
3774     2003-12-01 Bernhard Herzog <[email protected]>
3775    
3776 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
3777     cards for the dialog so that shapefiles ending in all uppercase
3778     SHP are listed too
3779    
3780 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
3781    
3782 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
3783    
3784     * setup.py (setup call): Update version to 1.0rc1. Use the
3785     [email protected] email address as author email instead of my
3786     personal one.
3787    
3788     2003-11-28 Bernhard Herzog <[email protected]>
3789    
3790 bh 1992 * po/de.po: Update german translation.
3791    
3792     2003-11-28 Bernhard Herzog <[email protected]>
3793    
3794 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
3795     files are more platform independend
3796    
3797     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
3798     that they can be used on both windows and unix
3799     (SessionSaver.prepare_filename): New. Handle all filename
3800     transformations for filenames stored in the thuban file
3801     (SessionSaver.write_data_containers, SessionSaver.write_layer):
3802     Use prepare_filename
3803    
3804     * test/test_save.py (SaveSessionTest.testSingleLayer)
3805     (SaveSessionTest.testLayerProjection)
3806     (SaveSessionTest.testRasterLayer)
3807     (SaveSessionTest.testClassifiedLayer)
3808     (SaveSessionTest.test_dbf_table)
3809     (SaveSessionTest.test_joined_table): Filenames are always stored
3810     with slashes on all currently supported platforms so adapt all
3811     tests to this
3812    
3813     * test/test_load.py (LoadSessionTest.filenames): With the new
3814     filename scheme the filenames in the tests should be
3815     understandable on all currently supported platforms so we turn
3816     this into an empty list because we don't have to normalize them
3817     anymore
3818    
3819     2003-11-28 Bernhard Herzog <[email protected]>
3820    
3821 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
3822     Add the ellipsoid to the projection since some Proj versions
3823     complain if it's missing.
3824    
3825 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
3826    
3827     Corect some bounding box projection problems
3828    
3829     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
3830     version of ForwardBBox
3831     (Projection._transform_bbox): New. common implementation of
3832     ForwardBBox and InverseBBox
3833     (Projection.ForwardBBox): Use _transform_bbox.
3834    
3835     * test/test_proj.py (TestProjection.test): Add test for
3836     InverseBBox
3837    
3838     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
3839     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
3840     new InverseBBox method to determine the unprojected bounding box
3841     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
3842     bbox.
3843    
3844     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3845     Removed.
3846     (TestLayer.test_arc_layer_with_projection): New. This test is
3847     better able to test whether bounding boxes are projected correctly
3848     than test_point_layer_with_projection
3849    
3850 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
3851     InverseBBox to unproject bboxes
3852    
3853 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
3854    
3855 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
3856     source code.
3857    
3858     2003-11-25 Bernhard Herzog <[email protected]>
3859    
3860 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
3861     there for backwards compatibility and all code relying on that
3862     should have been updated by now.
3863    
3864     2003-11-25 Bernhard Herzog <[email protected]>
3865    
3866 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
3867     round trip test.
3868     (TestClassification.file_contents): Update to the newest file
3869     format
3870    
3871     2003-11-25 Bernhard Herzog <[email protected]>
3872    
3873 bh 1975 Add very experimental (and possibly dangerous) extension to draw
3874     polygons:
3875    
3876     * Extensions/drawshape/README: New. Brief installation
3877     instructions
3878    
3879     * Extensions/drawshape/drawshape.py: New. Implementation of the
3880     drawshape extensions
3881    
3882     * Extensions/drawshape/patch.diff: Patch to apply before the
3883     extension can be used.
3884    
3885 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
3886    
3887 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
3888     (ShapefileStore.__init__): Factor opening the shapefile into a
3889     separate method (the new _open_shapefile). This makes the code a
3890     bit more readable but the real reason is that it makes some evil
3891     hacks easier. :-)
3892    
3893     2003-11-24 Bernhard Herzog <[email protected]>
3894    
3895 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
3896     converter is specified for an attribute assume it's a string
3897     containing only Latin1 characters. Update doc-string accordingly.
3898     This change should fix many places where unicode objects might
3899     accidentally enter Thuban.
3900    
3901     * test/test_load.py (TestNonAsciiColumnName): New test to check
3902     what happens with column names in DBF files that contain non-ascii
3903     characters
3904    
3905 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
3906    
3907     Enable the experimental attribute editing again and introduce a
3908     command line switch to actually activate it
3909    
3910     * Thuban/UI/main.py (options): New. Container for options set on
3911     the commmand line
3912     (main): Add the --enable-attribute-editing flag.
3913    
3914     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
3915     editing is enabled use the grid ctrl which allows editing of the
3916     values
3917    
3918     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
3919     New. Just delegate this to the underlying table.
3920    
3921 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
3922    
3923     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
3924     Skip this test if run under non-posix systems since it only works
3925     there
3926    
3927 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
3928    
3929 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
3930     determined so that we can give a reason in the about why gdal is
3931     not supported.
3932     (gdal_support_status): New. Variable holding a string with the
3933     reason for no gdal support
3934    
3935     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
3936     not supported to the message
3937    
3938     2003-11-19 Bernhard Herzog <[email protected]>
3939    
3940 bh 1963 Remove the old table interface and its test cases
3941    
3942     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
3943     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
3944     anymore
3945    
3946     * Thuban/Model/transientdb.py (TransientTableBase)
3947     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
3948     anymore
3949    
3950     * test/test_table.py: Removed since the old interface it tests is
3951     gone.
3952    
3953     * test/runtests.py (main): The old table interface is gone and
3954     with it the deprecation warnings so remove the code that turns
3955     these warnings into errors
3956    
3957     2003-11-19 Bernhard Herzog <[email protected]>
3958    
3959 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
3960     tests to use the new table interface is completely wrong since the
3961     whole purpose of the tests in this module is to test the old
3962     interface.
3963    
3964 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
3965    
3966 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
3967     New. Test whether the connection matches a set of connection
3968     parameters
3969    
3970     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
3971     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
3972     for existing connections with the same parameters and break out of
3973     the loop correctly.
3974    
3975     * test/test_postgis_db.py (TestBriefDescription)
3976     (TestPostGISSimple.test_brief_description): Rename
3977     TestBriefDescription to TestPostGISSimple and the test method to
3978     test_brief_description so that we can add more test methods.
3979     (TestPostGISSimple.test_matches_parameters): New. Test the new
3980     MatchesParameters method
3981    
3982     2003-11-18 Bernhard Herzog <[email protected]>
3983    
3984 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
3985 bh 1954 _was_destroyed, to indicate whether an publisher instance has
3986     already been destroyed.
3987     (Publisher.Unsubscribe): Only disconnect if the publisher has not
3988     been destroyed yet.
3989     (Publisher.Destroy): Set the _was_destroyed flag to true.
3990    
3991     * test/test_connector.py
3992     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
3993     calling Unsubscribe after Destroy doesn't raise an exception
3994    
3995 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
3996    
3997     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
3998     typo in doc-string
3999    
4000 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
4001    
4002     Quote table and column names properly for postgis.
4003    
4004     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
4005     quote an identifier for use in an sql statement
4006     (PostGISColumn.__init__): Add the quoted_name attribute
4007     (PostGISTable.__init__): New instance variable quoted_tablename
4008     (PostGISTable._fetch_table_information): Use the quoted table
4009     name. New isntance variable quoted_geo_col with a quoted version
4010     of geometry_column
4011     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
4012     (PostGISTable.RowOrdinalToId): Use the quoted table name
4013     (PostGISTable.ReadValue, PostGISTable.ValueRange)
4014     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
4015     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
4016     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
4017     Use quoted table and column names
4018    
4019     * test/test_postgis_db.py (TestPostGISSpecialCases)
4020     (TestPostGISIgnoredColumns): Rename the class to
4021     TestPostGISSpecialCases because that better describes the new
4022     cases
4023     (TestPostGISSpecialCases.test_unsupported_types)
4024     (TestPostGISSpecialCases.test): Rename the method to
4025     test_unsupported_types because we need a more descriptive name now
4026     that there are more methods
4027     (TestPostGISSpecialCases.test_table_name_quoting)
4028     (TestPostGISSpecialCases.test_column_name_quoting)
4029     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
4030     cases to test quoting of table and column names in PostGISTable
4031     and PostGISShapeStore
4032    
4033     * test/postgissupport.py
4034     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
4035     AddGeometryColumn desn't support table or column names with sapces
4036     or double quotes
4037    
4038 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
4039    
4040     * Extensions/wms/__init__.py: New: Init to make this
4041     directory a package.
4042    
4043     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
4044    
4045 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
4046    
4047 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
4048     Constant for the file woth deprecated epsg projections
4049     (get_system_proj_file): Update doc-string
4050    
4051     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
4052     above the EPS widgets, introduce a check box for the deprecated
4053     eps projections and a label for the epsg widgets
4054     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
4055     too
4056    
4057     2003-11-11 Bernhard Herzog <[email protected]>
4058    
4059 bh 1939 Avoid warnings when run under Python 2.3
4060    
4061     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
4062     (BaseRenderer.draw_label_layer): Coordinates must be ints.
4063    
4064     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
4065     real method so that we can convert to int.
4066     (MapRenderer.label_font): The font size mist be an int.
4067    
4068     * Thuban/UI/common.py (Color2wxColour): The color values must be
4069     ints. Also, remove the unnecessary asserts.
4070    
4071     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
4072     (TestUnicodeStrings.test): Python source code should not contain
4073     non-ascii characters unless an encoding is specified in the file.
4074     Therefore use \x escapes in the string literals for non-ascii
4075     characters.
4076    
4077     2003-11-11 Bernhard Herzog <[email protected]>
4078    
4079 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
4080     parameter so that this function can be used for all proj files in
4081     Resource/Projections
4082     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
4083     get_system_proj_file
4084    
4085     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
4086     ProjFile self.__sysProjFile use a dictionary of system ProjFile
4087     objects self._sys_proj_files
4088     (ProjFrame.build_dialog): Adapt to the new changes in the
4089     ProjectionList constructor. Add a check button to toggle whether
4090     EPSG projections are shown
4091     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
4092     events.
4093     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
4094     the busy cursor if the files have not yet been loaded by the
4095     dialog.
4096     (ProjFrame.load_system_proj): Add a parameter for the name of the
4097     proj file. Maintain the dictionary of system projections
4098     self._sys_proj_files
4099    
4100     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
4101     user_projs parameters into one parameter proj_files which is a
4102     list of proj files.
4103     (ProjectionList._subscribe_proj_files)
4104     (ProjectionList._unsubscribe_proj_files): New. Move
4105     subscription/unsubscription of projfile messages to separate
4106     methods
4107     (ProjectionList.Destroy): The unsubscribe is now done in
4108     _unsubscribe_proj_files
4109     (ProjectionList.update_projections): We now have a list of proj
4110     file objects
4111     (ProjectionList.SetProjFiles): New method to set a new list of
4112     proj file objects
4113    
4114     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
4115     Specify explicitly which system proj file to load.
4116    
4117     2003-11-11 Bernhard Herzog <[email protected]>
4118    
4119 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
4120     instance variables to cut cyclic references. The GC would have
4121     collected the loader eventually but it can happen that it doesn't
4122     run at all until thuban is closed (2.3 but not 2.2 tries a bit
4123     harder and forces a collection when the interpreter terminates)
4124     (load_session): Call the handler's Destroy method to make sure
4125     that it gets garbage collected early. Otherwise it will be
4126     collected very late if at all and it holds some references to e.g.
4127     shapestores and the session which can lead to leaks (of e.g. the
4128     temporary files)
4129    
4130     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
4131     resource leak in load_session
4132    
4133 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
4134    
4135     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
4136     extensions are to be rendered.
4137     (_renderer_extensions): New. List with renderer for layers in
4138     extensions
4139     (add_renderer_extension): New. Add a renderer extension
4140     (init_renderer_extensions): New. Init the renderer extensions
4141     (BaseRenderer.render_map_incrementally): Search
4142     _renderer_extensions for how to draw unknown layer types
4143     (BaseRenderer.draw_raster_data): Add format parameter so that
4144     formats other than BMP can be drawn
4145     (BaseRenderer.draw_raster_layer): Pass an explicit format to
4146     draw_raster_data
4147    
4148     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
4149     strings of the format parameter of draw_raster_data method to wx
4150     constants
4151     (MapRenderer.draw_raster_data): Add the format parameter and use
4152     raster_format_map to map it to the right wxwindows constant for
4153     wxImageFromStream
4154    
4155     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
4156     the format parameter and record it
4157     (TestBaseRenderer.test_raster_no_projection): check the format
4158     paramter of the draw_raster_data method
4159     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
4160     extension facility
4161    
4162 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
4163    
4164     Tweak the usage of the sqlite database to make common use cases
4165     more responsive. In most cases copying the data to the sqlite
4166     database takes so long that using sqlite doesn't have enough
4167     advantages.
4168    
4169     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
4170     comments about performance and query the min and max in separate
4171     statements because only that way will indexes be used.
4172     (TransientTableBase.UniqueValues): Add some comments about
4173     performance.
4174     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
4175     Do not copy the data to the transient DB but use the transient
4176     copy if it exists. See the new comments for the performance trade
4177     offs
4178    
4179     * test/test_transientdb.py
4180     (TestTransientTable.test_auto_transient_table): Make sure that the
4181     data is copied to the transient database at some point.
4182    
4183 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
4184    
4185 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
4186     globals to locals so that it's a bit faster
4187    
4188     2003-11-03 Bernhard Herzog <[email protected]>
4189    
4190 bh 1920 * Thuban/UI/baserenderer.py
4191     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
4192     method. ReadValue is faster than ReadRowAsDict since it only reads
4193     one cell especially now that the dbf file objects actually
4194     implement it.
4195    
4196     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
4197     read_attribute method of the dbf objects
4198    
4199     2003-11-03 Bernhard Herzog <[email protected]>
4200    
4201 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
4202     variable to indicate whether the result should be shown in a
4203     dialog box
4204     (profile_screen_renderer, time_screen_renderer): Only show a
4205     dialog box if popup_dialog_box is true.
4206     (profile_screen_renderer): Flush stdout after the printing the
4207     first part of the "profiling..." message
4208    
4209     * Thuban/UI/baserenderer.py
4210     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
4211     brushes for the groups so that they're not created over and over
4212     again
4213    
4214 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
4215     (Classification._compile_classification)
4216     (Classification._clear_compiled_classification): New. Methods to
4217     manage a 'compiled' representation of the classification groups
4218     which is created on demand
4219     (Classification.InsertGroup, Classification.RemoveGroup)
4220     (Classification.ReplaceGroup): reset the compiled representation
4221     (Classification.FindGroup): Use the compiled representation to
4222     find the matching group
4223     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
4224    
4225 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
4226    
4227 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
4228     Send a CLASS_CHANGED message
4229     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
4230     not return the removed group since it wasn't used.
4231    
4232     * test/test_classification.py
4233     (TestClassification.test_set_default_group): New. Test the
4234     SetDefaultGroup method
4235     (TestClassification.test_insert_group): New. Test the InsertGroup
4236     method
4237     (TestClassification.test_remove_group): New. Test the RemoveGroup
4238     method
4239     (TestClassification.test_replace_group): New. Test the
4240     ReplaceGroup method
4241    
4242     2003-10-31 Bernhard Herzog <[email protected]>
4243    
4244 bh 1908 * test/test_classification.py (TestClassification.setUp):
4245     Subscribe to the CLASS_CHANGED messages
4246     (TestClassification.tearDown): New. Destroy the classification
4247     properly
4248     (TestClassification.test_defaults): Add tests for the default line
4249     width and whether no messages were sent yet
4250     (TestClassification.test_set_default_properties): Add tests for
4251     messages and setting the default line width
4252     (TestClassification.test_add_singleton)
4253     (TestClassification.test_add_range)
4254     (TestClassification.test_multiple_groups): Add tests for messages
4255    
4256     2003-10-31 Bernhard Herzog <[email protected]>
4257    
4258 bh 1906 Some more refactoring in preparation for new tests:
4259    
4260     * test/test_classification.py (TestClassification.setUp): New.
4261     Instantiate the classification here. Update the test methods
4262     accordingly.
4263     (TestClassification.test_multiple_groups): Make sure that the two
4264     singletons matching 1 are considered different.
4265    
4266     2003-10-31 Bernhard Herzog <[email protected]>
4267    
4268 bh 1904 * test/test_classification.py (red, green, blue): New. These
4269     constants were used in several cases. Update the relevant methods.
4270     (TestClassification.test_defaults)
4271     (TestClassification.test_set_default_properties)
4272     (TestClassification.test_add_singleton)
4273     (TestClassification.test_add_range)
4274     (TestClassification.test_multiple_groups)
4275     (TestClassification.test_deepcopy): New. These were formerly all
4276     part of the single method test.
4277     (TestClassification.test_deepcopy): Removed.
4278     (TestClassIterator): Removed. The test case is now a method of
4279     TestClassification since it tests part of the public interface of
4280     Classification
4281     (TestClassification.test_iterator): New. Used to be
4282     TestClassIterator effectively
4283    
4284 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
4285    
4286     GUIfied the functions of the profiling extension.
4287    
4288     * /Extensions/profiling/__init__.py: New: Init to make this
4289     directory a package.
4290    
4291     * Extensions/profiling/profiling.py: Moved menu entries to
4292     the Extensions menu. Applied _() for strings.
4293     (profile_screen_renderer): Catch the detailed printout and present
4294     it in a dialog.
4295 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
4296 jan 1902 of printing it to stdout.
4297    
4298 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
4299    
4300 bh 1899 * test/test_classification.py (TestClassGroupProperties)
4301     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
4302     (TestClassGroupSingleton, TestClassIterator, TestClassification):
4303     Split TestClassification into several classes, one for each class
4304     being tested. TestClassification itself now only tests
4305     Classification. This split makes changes to the tests a bit easier
4306    
4307     2003-10-31 Bernhard Herzog <[email protected]>
4308    
4309 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
4310     Thuban performance
4311    
4312 frank 1895 2003-10-31 Frank Koormann <[email protected]>
4313    
4314     Added two items to legend popup menu: Remove Layer and Show Layer Table
4315    
4316     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
4317     LegendPanel._OnShowTable): New event handlers, call the corresponding
4318     mainwindow methods.
4319     (LegendTree._OnRightClick): Added items to popup menu.
4320    
4321 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
4322    
4323     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
4324     EVT_WINDOW_DESTROY
4325     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
4326     nothing but is convenient for the derived classes.
4327    
4328     * Thuban/UI/tableview.py
4329     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
4330     Unsubscribe the messages here not in OnClose because that might
4331     get called multiple times. Fixes RT #2196
4332     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
4333     anymore.
4334    
4335     * README: Update the minimum requirement for wxPython. Since we
4336     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
4337     the version in which that was introduced for all platforms
4338    
4339 frank 1890 2003-10-30 Frank Koormann <[email protected]>
4340    
4341     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
4342     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
4343     frame.
4344    
4345 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
4346    
4347     Improved APR import extension, added further EPSG definitions
4348     and some cleanup regarding string class.
4349    
4350     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
4351     Added test for alias 'longlat'.
4352    
4353     * Resources/Projections/epsg-deprecated.proj: New. Contains
4354     deprecated EPSG definitions.
4355    
4356     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
4357     the variable names for objects.
4358    
4359     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
4360     Copied from importAPR and provided with documentation.
4361    
4362     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
4363     Moved to apr.py.
4364     (APR_View): Added object ref 'ITheme'.
4365    
4366     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
4367     split function by corresponding use of the string class method.
4368    
4369     * Thuban/Model/xmlwriter.py: Replaced string replace function by
4370     corresponding string method.
4371    
4372 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
4373    
4374     * Thuban/UI/baserenderer.py
4375     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
4376     special case of a classification that only has the default group
4377    
4378 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
4379    
4380 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
4381    
4382 bh 1876 * po/de.po: Update.
4383    
4384     * Thuban/UI/application.py
4385     (ThubanApplication.ShowExceptionDialog): Handle translation of the
4386     dialog message properly
4387    
4388     2003-10-27 Bernhard Herzog <[email protected]>
4389    
4390 bh 1873 Rework how localization works so that we use wx's translation
4391     functions when running Thuban as a normal application but not when
4392     we don't need any UI, such as in the test suite. See the comment
4393     in Thuban/__init__.py for details
4394    
4395     * Thuban/__init__.py (_): Add one level of indirection to make the
4396     translation handling more flexible and to make it possible to use
4397     either wx's translation services or not.
4398     (gettext_identity, translation_function_installed)
4399     (install_translation_function): New function to help with this
4400    
4401     * Thuban/UI/__init__.py: Install the wx specific translation
4402     function if it's OK to do that
4403    
4404     * test/support.py (initthuban): Install a dummy translation
4405     function so that importing Thuban.UI doesn't install a wx specific
4406     one for which would need to import wxPython
4407    
4408     2003-10-27 Bernhard Herzog <[email protected]>
4409    
4410 bh 1870 * HOWTO-Release: Source archives should be created first and the
4411     binary packages should be created from the source archives.
4412     There's an official debian package now so there's no need to test
4413     the rpm on debian anymore
4414    
4415     2003-10-27 Bernhard Herzog <[email protected]>
4416    
4417 bh 1868 Several rendering changes:
4418    
4419     - Render the selection into a separate bitmap so that only that
4420     bitmap needs to be redrawn when the selection changes
4421    
4422     - Render incrementally showing previews and allowing interaction
4423     before rendering is complete
4424    
4425     - Update the renderer interface a bit. Most parameters of
4426     RenderMap are now parameters of the constructor
4427    
4428     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
4429     and the update region as parameters. Update the doc-string
4430     (BaseRenderer.render_map_incrementally): New. Generator function
4431     to renders the map incrementally
4432     (BaseRenderer.render_map): Remove the map argument (it's now in
4433     the constructor) and simply iterate over the
4434     render_map_incrementally generator to draw the map.
4435     (BaseRenderer.draw_shape_layer_incrementally)
4436     (BaseRenderer.draw_shape_layer): Renamed to
4437     draw_shape_layer_incrementally and changed into a generator that
4438     yields True every 500 shapes. Used by render_map_incrementally to
4439     render shape layers incrementally
4440    
4441     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
4442     map and region parameters which are now in the constructor
4443     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
4444     the inherited render_map_incrementally.
4445     (BaseRenderer.draw_shape_layer): Removed.
4446     (ScreenRenderer.draw_selection_incrementally): New. The selection
4447     drawing part of the removed draw_shape_layer as a generator
4448     (ScreenRenderer.layer_shapes): Update because of the region
4449     parameter change
4450     (ExportRenderer.__init__): New. Extend the inherited constructor
4451     with the destination region for the drawing
4452     (ExportRenderer.RenderMap): Removed the map and region parameters
4453     which are now in the constructor
4454    
4455     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
4456     bitmap suitable for a preview in a tool
4457     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
4458     bitmap
4459     (MapPrintout.draw_on_dc): Adapt to new renderer interface
4460     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
4461     exists
4462     (MapCanvas.OnIdle): Update the logic to deal with incremental
4463     rendering and the selection bitmap
4464     (MapCanvas._do_redraw): Handle the instantiation of the render
4465     iterator and the redraws during rendering
4466     (MapCanvas._render_iterator): New. Generator to incrementally
4467     redraw both bitmaps
4468     (MapCanvas.Export): Adapt to new renderer interface.
4469     (MapCanvas.full_redraw): Reset the selection bitmap and the
4470     renderer iterator too
4471     (MapCanvas.redraw_selection): New. Force a redraw of the selection
4472     bitmap
4473     (MapCanvas.shape_selected): Only redraw the selection bitmap
4474    
4475     * test/test_baserenderer.py
4476     (TestBaseRenderer.test_polygon_no_projection)
4477     (TestBaseRenderer.test_raster_no_projection)
4478     (TestBaseRenderer.test_point_map_projection)
4479     (TestBaseRenderer.test_point_layer_and_map_projection)
4480     (TestBaseRenderer.test_point_layer_projection)
4481     (TestBaseRenderer.test_point_with_classification): Adapt to new
4482     renderer interface
4483    
4484 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
4485    
4486     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
4487     (point_in_polygon_shape, shape_centroid): Raise an exception if
4488     the shape can't be read. Previously invalid shape ids would lead
4489     to a segfault.
4490    
4491     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
4492     New. test whether an exception is raised for invalid shape ids
4493    
4494 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
4495    
4496 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
4497     as alias for 'latlong'.
4498    
4499     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
4500     as alias for 'latlong'.
4501    
4502     2003-10-24 Jan-Oliver Wagner <[email protected]>
4503    
4504 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
4505     the projection even for the UnknownPanel.
4506     (UnknownProjPanel.__init__): Define the text and create the textctrl
4507     widget.
4508     (UnknownProjPanel._DoLayout): Replaced static text widget by the
4509     textctrl created in __init__.
4510     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
4511     including the parameters of the projection.
4512    
4513     2003-10-24 Jan-Oliver Wagner <[email protected]>
4514    
4515 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
4516     EPSG codes with parameters for proj. The list has been
4517     generated using devtools/create_epsg.py based on the
4518     file nad/epsg of the proj 4.4.7 package. Four projection
4519     definitions have been deleted as they are not accepted by proj:
4520     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
4521     and "HD72 / EOV".
4522    
4523 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
4524    
4525     Some more tweaks to the projection dialog which should fix RT
4526     #1886.
4527    
4528     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
4529     the ProjFile's messages and call the base class methods correctly
4530     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
4531     flag on the newly selected item too. Otherwise some other item is
4532     focused and the first time the focus is moved with the keyboard
4533     the selection moves in unexpected ways.
4534    
4535     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
4536     focus on the OK button, only on the projection list. That way the
4537     list really has the focus initially
4538     (ProjFrame.OnClose): Call the projection list's Destroy method to
4539     make it unsubscribe all messages
4540    
4541 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
4542    
4543 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
4544     and most of 2168
4545    
4546     * Thuban/UI/projlist.py: New. The class ProjectionList is a
4547     special wxListCtrl to show a list of projections in a more MVC
4548     fashion
4549    
4550     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
4551     throughout the class. The main change is to use the ProjectionList
4552     class instead of a normal wxListBox. Also, add an explicit
4553     "Unknown" projection to the projection choice control.
4554     (ProjPanel.__init__): Add an "unknown" ellipsoid
4555     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
4556     instantiation of the panel's controls to make the tab-order more
4557     natural
4558    
4559     2003-10-21 Bernhard Herzog <[email protected]>
4560    
4561 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
4562     (TestSingleLayer.test): Add non-ascii characters to the titles of
4563     session, map and layer. This is effectively a port of the
4564     TestUnicodeStrings test in test_load_0_8.py which for some reason
4565     was only added there.
4566    
4567     * test/test_load_0_9.py (TestSingleLayer.file_contents)
4568     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
4569     characters to the titles of session, map and layer,.
4570    
4571     2003-10-21 Bernhard Herzog <[email protected]>
4572    
4573 bh 1847 Add EPSG projection handling to .thuban files
4574    
4575     * test/test_save.py (SaveSessionTest.dtd)
4576     (SaveSessionTest.testEmptySession)
4577     (SaveSessionTest.testLayerProjection)
4578     (SaveSessionTest.testRasterLayer)
4579     (SaveSessionTest.testClassifiedLayer)
4580     (SaveSessionTest.test_dbf_table)
4581     (SaveSessionTest.test_joined_table)
4582     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
4583     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
4584     use a and epsg projection to test saving them
4585    
4586     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
4587     namespace
4588     (TestLayerVisibility.file_contents, TestLabels.file_contents)
4589     (TestLayerProjection.file_contents)
4590     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4591     (TestPostGISLayer.file_contents)
4592     (TestPostGISLayerPassword.file_contents)
4593     (TestLoadError.file_contents, TestLoadError.test): Update to use
4594     1.0-dev namespace
4595     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
4596     use 1.0-dev namespace and use an EPSG projection to test whether
4597     loading it works
4598    
4599     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
4600     as of Thuban 0.9. These are now tests to determine whether Thuban
4601     can still read files generated by Thuban 0.9
4602    
4603     * Thuban/Model/save.py (SessionSaver.write)
4604     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
4605     namespace
4606     (SessionSaver.write_projection): Write the projection's epsg
4607     attribute
4608    
4609     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
4610     thuban-1.0-dev.dtd namespace
4611     (SessionLoader.check_attrs): Allow a callable object as conversion
4612     too
4613     (SessionLoader.start_projection, SessionLoader.end_projection)
4614     (SessionLoader.start_parameter): Handle the epsg attribute and
4615     rename a few instance variables to lower case
4616    
4617     * Resources/XML/thuban-1.0.dtd: New. Only difference to
4618     thuban-0.9.dtd is the epsg attribute for projections.
4619    
4620     2003-10-21 Bernhard Herzog <[email protected]>
4621    
4622 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
4623     on the command line
4624    
4625     * test/support.py (ThubanTestResult.getDescription): Override to
4626     give a better short description. The description can be used as a
4627     parameter to run_tests to run that particular test in isolation.
4628    
4629 frank 1837 2003-10-21 Frank Koormann <[email protected]>
4630    
4631     Popup menu for legend. Scheduled for the 1.2 release this was too
4632     simple to implement: The popup menu is bound to the legend tree, while
4633     the events are hanlded by its anchestor, the legend panel. This
4634     allows reuse of all the event handlers already implemented for the
4635     legend toolbar buttons.
4636    
4637     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
4638     to add handlers for the events issued by the popup menu.
4639     (LegendPanel._OnToggleVisibility): Handler for toggling layer
4640     visibility event
4641     (LegendPanel._OnProjection): Handler for layer projection event.
4642     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
4643     (LegendTree._OnRightClick): Event handler for right click, select item
4644     and pop up menu.
4645     (LegendTree.ToggleVisibility): Toggle layer visibility
4646     (LegendTree.LayerProjection): Raise layer projection dialog for
4647     current layer.
4648    
4649 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
4650    
4651     * Resources/Projections/defaults.proj: Use correct DOCTYPE
4652     declaration. The top-level element is projectionlist not projfile
4653    
4654 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
4655    
4656     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
4657     method to write a projfile and display a busy cursor and error
4658     dialogs.
4659     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
4660     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
4661     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
4662     busy cursor while loading the user and system prj files.
4663    
4664 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
4665    
4666     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
4667     ProjFile objects
4668     (clear_proj_file_cache): New function to clear the cache. Mainly
4669     useful for use by the test suite
4670     (read_proj_file): Use the cache.
4671    
4672     * test/test_proj.py (TestProjFile): Clarify the doc-string
4673     (ProjFileReadTests): Update doc-string
4674     (ProjFileReadTests.test_get_system_proj_file): Check whether the
4675     system proj files is cached.
4676     (ProjFileLoadTestCase): New base class for the proj file tests
4677     derived from support.FileLoadTestCase to provide some common
4678     behavior.
4679     (TestLoadingProjFile)
4680     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
4681     (TestProjFileWithInvalidParameters.file_contents): Derive from
4682     ProjFileLoadTestCase
4683     (TestLoadingProjFile.test_caching): New. Test whether the cache
4684     works
4685    
4686 silke 1829 2003-10-16 Silke Reimer <[email protected]>
4687    
4688     * debian/*: New directory with configuration files for building a thuban
4689     deb-package.
4690    
4691 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
4692    
4693 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
4694     __main__ so that missing unsubscribes are detected
4695     (TestProjFile.tearDown): Destroy the proj_file properly
4696    
4697     2003-10-14 Bernhard Herzog <[email protected]>
4698    
4699 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
4700     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
4701     the ProjFile objects
4702    
4703     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
4704     easily send messages when the projections change
4705     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
4706     when the change was successful
4707    
4708     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
4709     proj file messages
4710     (TestProjFile.test_add_remove)
4711     (TestProjFile.test_remove_non_existing)
4712     (TestProjFile.test_replace)
4713     (TestProjFile.test_replace_non_existing): Test whether the right
4714     messages are sent
4715    
4716     2003-10-14 Bernhard Herzog <[email protected]>
4717    
4718 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
4719     tests
4720     (TestProjFile.test_add_remove)
4721     (TestProjFile.test_remove_non_existing)
4722     (TestProjFile.test_replace)
4723     (TestProjFile.test_replace_non_existing): Some of the new
4724     individual test cases
4725     (TestProjFileSimple): New class for the rest of the test cases
4726     that came out of the refactoring
4727     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
4728     derived classes don't have to
4729    
4730 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
4731    
4732 bh 1820 Add an optional EPSG code to the projection objects and extend the
4733     .proj file format accordingly.
4734    
4735     * Resources/XML/projfile.dtd (element projection): Add epsg
4736     attribute
4737    
4738     * Thuban/Model/proj.py (Projection.__init__): New parameter and
4739     instance variable epsg. Update doc-string
4740     (Projection.EPSGCode, Projection.Label): New methods to provide
4741     access to EPSG code and a label for use in dialogs
4742    
4743     * Thuban/Model/resource.py (ProjFileReader.start_projection)
4744     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
4745     Handle the epsg code attribute when reading or writing proj files
4746    
4747     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
4748     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
4749     (ProjFrame.__FillAvailList): Use the projection's Label method to
4750     get the string for the list box
4751    
4752     * test/test_proj.py (TestProjection.test_label)
4753     (TestProjection.test_label_epsg)
4754     (TestProjection.test_epsgcode_for_non_epsg_projection)
4755     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
4756     for the label and EPSGCode methods
4757     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
4758     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
4759     objects in the test cases and put the expected contents into the
4760     test case methods too. Update doTestWrite accordingly
4761     (TestLoadingProjFile)
4762     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
4763     read tests from TestProjFile.
4764     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
4765     tests are now in the new classes.
4766     (sample_projfile, sample_projfile_data)
4767     (sample_projfile2, sample_projfile_data2): Removed. Not used
4768     anymore.
4769     (TestProjFile.test_read_unreadable_file): No need to reset the
4770     permissions at the end anymore since we use a unique filename
4771    
4772     2003-10-13 Bernhard Herzog <[email protected]>
4773    
4774 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
4775     (ProjFileTest): New base class for the proj file tests.
4776     (TestProjFile): Derive from ProjFileTest
4777     (TestProjFile.test_read_unreadable_file)
4778     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
4779     the new filename method to get a unique filename
4780     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
4781     (WriteProjFileTests): New class for proj file write tests.
4782     Contains the write test that were in TestProjFile originally.
4783    
4784     2003-10-13 Bernhard Herzog <[email protected]>
4785    
4786 bh 1812 * test/test_proj.py (TestProjFile.testRead)
4787     (TestProjFile.test_read_non_existing_file)
4788     (TestProjFile.test_read_unreadable_file)
4789     (TestProjFile.test_read_empty_file): Split into several methods.
4790    
4791 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
4792    
4793 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
4794    
4795     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
4796     all projection type specific panels and put them into a
4797     NotebookLikeSizer. This way the dialog doesn't change its size
4798     when a different projection is selected
4799     (ProjFrame.__init__): Rename projection_panels
4800     projection_panel_defs and reuse projection_panels for a list of
4801     the instantiated panels.
4802     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
4803     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
4804     the panels
4805     (UnknownProjPanel._DoLayout): Place the newlines in the message
4806     differently to make the panel narrower.
4807     (TMPanel._DoLayout): Layout the parameters in one column.
4808    
4809     2003-10-10 Bernhard Herzog <[email protected]>
4810    
4811 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
4812     that contains all the setup for the dialog's widgets, layout and
4813     event handling.
4814     (__): Call build_dialog to build the dialog.
4815     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
4816     Their functionality is now in build_dialog
4817     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
4818     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
4819     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
4820     different widget names and hierarchy introduced with build_dialog.
4821    
4822     2003-10-10 Bernhard Herzog <[email protected]>
4823    
4824 bh 1805 * README: Fix typo.
4825    
4826 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
4827    
4828     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
4829     projection is already in the list. This is *a lot* faster when
4830     loading files with hundreds of projections since it saves a linear
4831     search. OTOH this will allow adding the same projection to the
4832     user.proj file multiple times in the projection dialog but we'll
4833     deal with that later
4834    
4835 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
4836    
4837     * devtools: New. Directory for developer tools that are not intended
4838     for the regular user.
4839    
4840     * devtools/create_epsg.py: New. Convert the epsg file of proj into
4841     a python .proj file.
4842    
4843 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
4844    
4845     * test/test_proj.py
4846     (TestProjection.test_get_parameter_without_equals_sign): New. Test
4847     whether GetParameter handles parameters without "=" sign correctly
4848    
4849     * Thuban/Model/proj.py (Projection.GetParameter): Handle
4850     parameters that do not contain a "=". Update the doc-string
4851    
4852 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
4853    
4854 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
4855     length limit on the projname text control
4856    
4857     2003-10-08 Bernhard Herzog <[email protected]>
4858    
4859 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
4860     (TestProjection.test_get_projection_units_normal): New. Tests for
4861     the Projection.GetProjectedUnits method
4862    
4863 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
4864    
4865     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
4866     Added missing 'val' parameter.
4867    
4868 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
4869    
4870 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
4871     projection type of the currently selected projection is not known,
4872     i.e. there's no panel for it, use the UnknownProjPanel
4873     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
4874     the actual replacing of the proj panel into the new method
4875     _show_proj_panel.
4876     (UnknownProjPanel): Add doc-string.
4877     (UnknownProjPanel._DoLayout): Insert a newline into the text so
4878     that the panel is not so wide.
4879    
4880     2003-10-08 Bernhard Herzog <[email protected]>
4881    
4882 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
4883     too. Update the doc-string
4884     (get_proj_files): Removed. It wasn't used anywhere
4885     (get_system_proj_files, get_system_proj_file): Rename to
4886     get_system_proj_file and return the ProjFile object and not a list
4887     of ProjFile objects. Update the callers.
4888     (get_user_proj_files, get_user_proj_file): Rename to
4889     get_user_proj_file return the ProjFile object and not a list of
4890     ProjFile objects. Update the callers.
4891     (ProjFileReader.__init__): New instance variable for the warnings.
4892     Rename the __pf ivar to projfile. Update the methods referring to
4893     __pf
4894     (ProjFileReader.end_projection): Catch any errors raised when
4895     instantiating the projection and record that as an error. The
4896     projection will not be in the final ProjFile object.
4897     (ProjFileReader.GetWarnings): New method to return the warnings.
4898    
4899     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
4900     show the warnings from the projfile reader
4901     (ProjFrame._OnImport): Deal with any warnings returned by
4902     read_proj_file
4903     (ProjFrame.__FillAvailList): Deal with any warnings returned by
4904     get_system_proj_file or get_user_proj_file.
4905    
4906     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
4907     (TestProjFileWithInvalidParameters.file_contents): New test cases
4908     to test whether read_proj_file handles invalid projection
4909     parameters correctly
4910     (TestProjFile.test_get_system_proj_file): New. Simple test for
4911     resource.get_system_proj_file
4912    
4913 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
4914    
4915     * test/test_derivedshapestore.py
4916     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
4917     properly so that the temporary directories get deleted correctly
4918    
4919 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
4920    
4921 bh 1783 Handle the title changes in a proper MVC way.
4922    
4923     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4924     canvas' TITLE_CHANGED messages
4925     (MainWindow.update_title): New. Update the main window's title
4926     (MainWindow.__SetTitle): Removed. Use update_title instead.
4927     (MainWindow.SetMap): Use update_title instead of __SetTitle
4928     (MainWindow.RenameMap): Do change the window title explicitly
4929     here. That's handled in a proper MVC way now.
4930     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
4931     messages
4932    
4933     * Thuban/Lib/connector.py (Conduit): New class to help classes
4934     that forward messages
4935    
4936     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
4937     (ViewPort): Derive from Conduit instead of Publisher
4938     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
4939     when calling the inherited versions
4940     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
4941     methods to subscribe and unsubscribe map messages
4942     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
4943     handle the map subscriptions
4944     (ViewPort.Map, ViewPort.map_projection_changed)
4945     (ViewPort.layer_projection_changed): Add or update doc-strings
4946    
4947     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
4948     typo
4949     (MyConduit): Helper class for the Conduit test.
4950     (TestConduit): Test cases for Conduit
4951    
4952     * test/test_connector.py: Use support.run_tests as main.
4953    
4954     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
4955     the TITLE_CHANGED messages
4956     (ViewPortTest.test_forwarding_title_changed): New test to check
4957     whether the viewport forwards the map's TITLE_CHANGED messages
4958     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
4959     after the port's because the latter may require a still functional
4960     map.
4961    
4962     2003-10-06 Bernhard Herzog <[email protected]>
4963    
4964 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
4965     doc-string
4966    
4967     2003-10-06 Bernhard Herzog <[email protected]>
4968    
4969 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
4970     (SimpleViewPortTest.test_init_with_size): Move the test for the
4971     initial size as a constructor parameter from ViewPortTest.setUp
4972     method to a new separate test in SimpleViewPortTest.
4973    
4974     2003-10-06 Bernhard Herzog <[email protected]>
4975    
4976 bh 1773 * test/test_viewport.py (MockView): New class derived from
4977     ViewPort with a mock implementation of GetTextExtent to be used in
4978     the test cases
4979     (ViewPortTest.setUp): Use MockView instead of ViewPort
4980    
4981     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
4982     into what would be a "pure virtual function" in C++: always raise
4983     NotImplementedError. Mock implementations for test cases don't
4984     belong into the real code
4985    
4986 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
4987    
4988     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
4989     close the dbf file we create so that it's contents have been
4990     written properly.
4991    
4992     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
4993     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
4994     Update to shapelib 1.2.10
4995    
4996 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
4997    
4998     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
4999     it annoys lintian which warns about these files not being
5000     executable. The #! isn't necessary here since if you absolutely
5001     must execute them you can always say "python <filename>".
5002    
5003 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
5004    
5005 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
5006     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
5007     is ported to a newer the import will fail, so it should be noticed
5008     immediately that this function is gone.
5009     Fixes RT#1919
5010    
5011     2003-09-26 Bernhard Herzog <[email protected]>
5012    
5013 bh 1757 Add a DTD for the projection files and make thuban write valid
5014     projection files
5015    
5016     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
5017     files
5018    
5019     * Thuban/Model/resource.py (ProjFileSaver.write): Use
5020     'projectionlist' as the name in the document type declaration so
5021     that it matches the element type of the root element.
5022    
5023     * test/test_proj.py (sample_projfile, sample_projfile2): Use
5024     'projectionlist' as the name in the document type declaration just
5025     as it is done now in the files thuban would write
5026     (sample_projfile, sample_projfile_data): Fix spelling of
5027     "Mercator"
5028     (TestProjFile.doTestWrite): Validate the written and the expected
5029     XML data
5030     (TestProjFile): Derive from ValidationTest so that we can run xml
5031     validation tests
5032    
5033 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
5034    
5035     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
5036     modify the list returned by map.Layers() in place since it is the
5037     actual list of layers used by the map.
5038    
5039 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
5040    
5041     * Doc/manual/thuban-manual.xml: Added subsection to chapter
5042     Extensions to describe the extensions coming with the Thuban
5043     standard package (gns2shp and importAPR).
5044    
5045 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
5046    
5047     * libraries/thuban/wxproj.cpp (project_point): if there's an
5048     inverse but no forward projection, convert to degrees after
5049     applying the inverse projection. Fixes RT#2096
5050    
5051     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
5052     implicitly tests for the fix to RT#2096
5053    
5054     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
5055     Check that the sequences have the same lengths
5056    
5057     * Resources/Projections/defaults.proj (Geographic projection): Use
5058     a much more precise value for the to_meter attribute.
5059    
5060 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
5061    
5062     * test/support.py (initthuban): Make sure to unset the LANG env.
5063     var. so that tests that compare translated strings work. Solves RT
5064     #2094
5065    
5066 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
5067    
5068 jan 1735 Small improvement of APR import.
5069    
5070     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
5071     Added tests for text-ranges.
5072    
5073     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
5074     returns a string object if the range is based on text.
5075    
5076     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
5077     range retrieval.
5078    
5079     2003-09-22 Jan-Oliver Wagner <[email protected]>
5080    
5081 jan 1730 Initial version of the importAPR extension which is in
5082     experimental state.
5083    
5084     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
5085     /Extensions/importAPR/test/: New directories.
5086    
5087     * /Extensions/importAPR/samples/README: New: Howto load the samples.
5088    
5089     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
5090     file which refers to the Thuban Iceland demo data.
5091    
5092     * /Extensions/importAPR/test/README: New: Howto execute the tests.
5093    
5094     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
5095    
5096     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
5097     as in '.apr'-files.
5098    
5099     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
5100     ODB Objects as in '.apr', '.avl' and other files.
5101    
5102     * /Extensions/importAPR/__init__.py: New: Init to make this
5103     directory a package.
5104    
5105     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
5106     project file (.apr) and convert it to Thuban.
5107    
5108     2003-09-22 Jan-Oliver Wagner <[email protected]>
5109    
5110     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
5111    
5112 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
5113    
5114     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
5115     with description on RPM installation and RPM binary package
5116     creation.
5117    
5118 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
5119    
5120     * setup.py (data_files): Only add the mo files if the Locales
5121     directory actually exists, so that setup.py works with a fresh CVS
5122     checkout
5123    
5124 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
5125    
5126     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
5127     in viewport, not anymore in view
5128    
5129 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
5130    
5131     Introducing first Extension (gns2shp).
5132    
5133     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
5134    
5135     * Extensions/__init__.py: New. init to make this dir a package.
5136    
5137     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
5138    
5139     * Extensions/gns2shp/test/README: New. some info on this test directory.
5140    
5141     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
5142    
5143     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
5144     of Shapefile from GNS text file format
5145    
5146 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
5147    
5148 jan 1707 Fix/workaround for bug #2019:
5149     https://intevation.de/rt/webrt?serial_num=2019
5150    
5151     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
5152     (IdentifyView.__init__): Added another button that allows to
5153     stop the identify mode.
5154     (IdentifyView.OnStop): New. Stops the identify mode.
5155    
5156     2003-09-03 Jan-Oliver Wagner <[email protected]>
5157    
5158 jan 1705 Introducing a new exception dialog that allows to exit the
5159     application immediately.
5160     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
5161    
5162     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
5163    
5164     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
5165     Made strings available to translations. Exchanged the simple
5166     ScrolledMessageDialog by the new ExceptionDialog.
5167    
5168 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
5169    
5170 bh 1701 * NEWS: New. Summary of changes and release notes.
5171    
5172     * MANIFEST.in: Add NEWS
5173    
5174     2003-09-01 Bernhard Herzog <[email protected]>
5175    
5176 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
5177     include the documentation too.
5178    
5179     * setup.py (data_files): Add the .mo files
5180     (setup call): Up to version 0.9.0
5181    
5182     2003-09-01 Bernhard Herzog <[email protected]>
5183    
5184 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
5185     parameter list to just parent and session
5186     (ChooseDBTableDialog.__set_properties): Removed. Setting the
5187     selection of empty list boxes is not allowed (and produces C++
5188     assertion errors) and the rest of the setup is better done in
5189     __init__ anyway.
5190     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
5191     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
5192     builtins True/False for booleans to avoid warnings from wxPython
5193    
5194     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
5195     ChooseDBTableDialog constructor parameters.
5196    
5197     2003-09-01 Bernhard Herzog <[email protected]>
5198    
5199 bh 1694 * Thuban/Model/postgisdb.py
5200     (PostGISTable): Extend doc-string
5201     (PostGISTable._fetch_table_information): Set the column index
5202     correctly, pretending ignored columns don't exist.
5203    
5204     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
5205     for postgis tables with data types not yet supported by thuban.
5206    
5207 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
5208    
5209     * HOWTO-Release: Tweak item about running the tests.
5210    
5211 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
5212    
5213     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
5214    
5215 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
5216    
5217     Add some missing parameters to projections. Proj complains about
5218     them on windows but for some reason not on Linux.
5219    
5220     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
5221     missing required projection parameters
5222    
5223     * test/test_proj.py (TestProjFile.test): Add missing required
5224     projection parameters
5225    
5226     * test/test_load_0_8.py (TestLayerProjection.file_contents)
5227     (TestLayerProjection.test): Add missing required projection
5228     parameters and tests for them
5229    
5230     * test/test_load.py (TestLayerProjection.file_contents)
5231     (TestLayerProjection.test): Add missing required projection
5232     parameters and tests for them
5233    
5234     * test/test_layer.py (TestLayer.test_base_layer): Add missing
5235     required projection parameters
5236    
5237     2003-08-29 Bernhard Herzog <[email protected]>
5238    
5239     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
5240     access the pj_errno because directly accessing pj_errno doesn't
5241     work on windows if the proj library is in a DLL
5242    
5243     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
5244    
5245 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
5246    
5247 bh 1685 * test/test_proj.py: Import things from Thuban after calling
5248     initthuban
5249    
5250     * test/test_load.py (LoadSessionTest.filenames): New class
5251     variable with the filename attributes to normalize
5252     (LoadSessionTest.check_format): Pass self.filenames to
5253     sax_eventlist to normalize the filename attributes
5254    
5255     * test/xmlsupport.py: Add cvs keywords
5256     (SaxEventLister.__init__): New parameter filenames which indicates
5257     attributes that contain filenames
5258     (SaxEventLister.startElementNS): Normalize the filename attributes
5259     with os.path.normpath
5260     (sax_eventlist): New parameter filenames to pass through to
5261     SaxEventLister
5262    
5263     * test/test_derivedshapestore.py: Make this file callable as a
5264     program to execute the tests
5265     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
5266     the session to self.session so that it gets destroyed properly
5267    
5268     * test/test_layer.py (TestLayer.tearDown): Call the session's
5269     Destroy method
5270    
5271     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
5272     too if it exists
5273     (TestMapAddLayer.test_add_layer): Bind the session to self.session
5274     so that it gets destroyed properly
5275    
5276     * test/postgissupport.py (reason_for_not_running_tests): Add a
5277     test for the existence of popen2.Popen4.
5278    
5279     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
5280     reliable way to destroy the sessions created in the test cases
5281     (SaveSessionTest.test_dbf_table): Bind the session to self.session
5282     so that it gets destroyed properly
5283     (SaveSessionTest.testLayerProjection): Bind the session to
5284     self.session so that it gets destroyed properly
5285    
5286     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
5287     sure that the session is destroyed properly
5288    
5289     * test/test_shapefilestore.py: Make this callable as a program to
5290     execute the tests
5291    
5292     * test/test_scalebar.py: Remove unnecessary import of _ from
5293     Thuban
5294    
5295     * test/support.py (print_garbage_information): Call initthuban
5296     here because it may be called indirectly from test cases that test
5297     test support modules which do not use anything from thuban itself
5298     (ThubanTestProgram.runTests): Remove unnecessary debug print
5299    
5300     2003-08-28 Bernhard Herzog <[email protected]>
5301    
5302 bh 1672 * Thuban/version.py (longversion): Update to 0.9
5303    
5304     * Thuban/UI/mainwindow.py: Remove some unused imports
5305    
5306     * README: Add section about required additional software. Add date
5307     and revision CVS keywords
5308    
5309     * HOWTO-Release: Add item about the translations. Add date and
5310     revision CVs keywords and change formatting to match README a bit
5311     better
5312    
5313     * po/de.po: Update for 0.9
5314    
5315     * test/README: Tweak the wording a little because many tests are
5316     not really unittest.
5317    
5318 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
5319    
5320 bh 1665 As preparation for the 0.9 release, switch thuban files to a
5321     non-dev namespace
5322    
5323     * Thuban/Model/save.py (SessionSaver.write_session): Write files
5324     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
5325     namespace
5326    
5327     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
5328     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
5329    
5330     * test/test_save.py (SaveSessionTest.dtd)
5331     (SaveSessionTest.testEmptySession)
5332     (SaveSessionTest.testSingleLayer)
5333     (SaveSessionTest.testLayerProjection)
5334     (SaveSessionTest.testRasterLayer)
5335     (SaveSessionTest.testClassifiedLayer)
5336     (SaveSessionTest.test_dbf_table)
5337     (SaveSessionTest.test_joined_table)
5338     (SaveSessionTest.test_save_postgis): Update for new namespace
5339    
5340     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
5341     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5342     (TestLayerProjection.file_contents)
5343     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5344     (TestPostGISLayer.file_contents)
5345     (TestPostGISLayerPassword.file_contents)
5346     (TestLoadError.file_contents, TestLoadError.test): Update for new
5347     namespace
5348    
5349     2003-08-27 Bernhard Herzog <[email protected]>
5350    
5351 bh 1663 Make the table interface distinguish between row ids (an integer
5352     that uniquely identifies a row) and row ordinals (a simple row
5353     count from 0 to NumRows() - 1)
5354    
5355     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
5356     (PostGISTable.RowOrdinalToId): New methods to conver between row
5357     ids and row ordinals
5358     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
5359     parameter row_is_ordinal to indicate whether the row parameter is
5360     the row id or the ordinal
5361    
5362     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
5363     (TransientTableBase.RowOrdinalToId)
5364     (AutoTransientTable.RowIdToOrdinal)
5365     (AutoTransientTable.RowOrdinalToId): Same new methods as in
5366     PostGISTable.
5367     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
5368     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
5369     Same new parameter as in PostGISTable.
5370    
5371     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
5372     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
5373     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
5374     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
5375     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
5376     parameter as in PostGISTable.
5377    
5378     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
5379     (DataTable.RowOrdinalToId): New methods to convert between row ids
5380     and row ordinals.
5381     (TableGrid.SelectRowById): New method to select a row based on its
5382     ID as opposed to its ordinal
5383     (DataTable.GetValue, TableGrid.OnRangeSelect)
5384     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
5385     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
5386     (LayerTableFrame.__init__): Convert between row ids and row
5387     ordinals as appropriate
5388    
5389     * test/postgissupport.py (PostGISDatabase.__init__): Add
5390     doc-string.
5391     (PostGISDatabase.initdb): The optional third item in a tuple in
5392     tables is now a (key, value) list with additional arguments to
5393     pass to upload_shapefile
5394     (upload_shapefile): New parameter gid_offset to allow gids that
5395     are not the same as the shapeids in the shapefile
5396     (PostgreSQLServer.get_default_static_data_db): Use the new
5397     gid_offset to make the gids in landmarks 1000 higher than the
5398     shapeids in the shapefile
5399    
5400     * test/test_viewport.py
5401     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
5402     new shapeids in the landmarks table
5403    
5404     * test/test_transientdb.py
5405     (TestTransientTable.run_iceland_political_tests)
5406     (TestTransientTable.test_transient_joined_table): Add tests for
5407     the new table methods and new keywords arguments.
5408    
5409     * test/test_postgis_db.py
5410     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
5411     (TestPostGISTable.test_read_value_row_count_mode)
5412     (TestPostGISTable.test_row_id_to_ordinal)
5413     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
5414     table methods and the new arguments
5415     (TestPostGISShapestorePoint.test_shapes_in_region)
5416     (TestPostGISShapestorePoint.test_shape_raw_data)
5417     (TestPostGISShapestorePoint.test_shape_points)
5418     (TestPostGISShapestorePoint.test_shape_shapeid)
5419     (TestPostGISShapestorePoint.test_all_shapes)
5420     (TestPostGISTable.test_simple_query)
5421     (TestPostGISTable.test_simple_query)
5422     (TestPostGISTable.test_simple_query)
5423     (TestPostGISTable.test_read_value)
5424     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
5425     shapeids in the landmarks table
5426    
5427     * test/test_memory_table.py
5428     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
5429     (TestMemoryTable.test_read_value_row_count_mode)
5430     (TestMemoryTable.test_row_id_to_ordinal)
5431     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
5432     table methods and the new arguments
5433    
5434     * test/test_dbf_table.py
5435     (TestDBFTable.test_read_row_as_dict_row_count_mode)
5436     (TestDBFTable.test_read_value_row_count_mode)
5437     (TestDBFTable.test_row_id_to_ordinal)
5438     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
5439     methods and the new arguments
5440    
5441 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
5442    
5443 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
5444     more postgis specific but much faster method to get the bounding
5445     box
5446    
5447     2003-08-26 Bernhard Herzog <[email protected]>
5448    
5449 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
5450     (PostGISShapeStore.AllShapes): Add these missing methods.
5451     (PostGISShapeStore.ShapesInRegion): No need to raise
5452     StopIteration. We can simply return
5453    
5454     * test/test_postgis_db.py (TestPostGISTable.test_title)
5455     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
5456     new methods
5457    
5458 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
5459    
5460 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
5461    
5462     * test/test_postgis_db.py (PolygonTests): New class containing
5463     those tests from TestPostGISShapestorePolygon that can also be
5464     used to test MUTLIPOLYGON tables
5465     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
5466     so derive from that
5467     (TestPostGISShapestoreMultiPolygon): New class with tests for
5468     MUTLIPOLYGON tables
5469    
5470     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
5471     tables argument to have tuples with three items to override the
5472     WKT type used.
5473     (PostgreSQLServer.get_default_static_data_db): Use the above to
5474     create a polygon table with MUTLIPOLYGONs
5475     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
5476     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
5477     coords_to*
5478     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
5479     (wkt_converter): New. Map WKT types to converters
5480     (upload_shapefile): New parameter force_wkt_type to use a
5481     different WKT type than the default
5482    
5483     2003-08-25 Bernhard Herzog <[email protected]>
5484    
5485 bh 1655 * Thuban/UI/application.py
5486     (ThubanApplication.run_db_param_dialog): New. Suitable as a
5487     db_connection_callback. Main difference is that the dialog run
5488     from this method doesn't have a parent so it can be used even when
5489     there is no main window
5490     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
5491     no db_connection_callback was given. This way the dialog pops up
5492     even when the .thuban file was given as a command line parameter.
5493    
5494     2003-08-25 Bernhard Herzog <[email protected]>
5495    
5496 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
5497     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
5498     which leads to an effectively frozen X session because the user
5499     can only interact with the dialog but the mouse is still grabbed
5500     by the canvas.
5501     Also, call the tool's Hide method before MouseLeftUp because
5502     MouseLeftUp may change the tool's coordinates.
5503    
5504     2003-08-25 Bernhard Herzog <[email protected]>
5505    
5506 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
5507     LoadCancelled exceptions and handle them by returning immediately.
5508    
5509     2003-08-25 Bernhard Herzog <[email protected]>
5510    
5511 bh 1649 GUI part of loading sessions with postgis connections which may
5512     require user interaction to get passwords or updated parameters
5513    
5514     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
5515     bit nucer and be more generic.
5516     (DBFrame.OnAdd): Adapt to new DBDialog interface
5517    
5518     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
5519     optional parameter db_connection_callback which is passed to
5520     load_session.
5521    
5522     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
5523     Suitable as a db_connection_callback
5524     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
5525     db_connection_callback of the application's OpenSession method
5526    
5527    
5528     2003-08-25 Bernhard Herzog <[email protected]>
5529    
5530 bh 1647 Basic loading of sessions containing postgis connections:
5531    
5532     * Thuban/Model/load.py (LoadError): Add doc-string
5533     (LoadCancelled): New exception class to indicate a cancelled load
5534     (SessionLoader.__init__): Add the db_connection_callback parameter
5535     which will be used by the loader to get updated parameters and a
5536     password for a database connection
5537     (SessionLoader.__init__): Add the new XML elements to the
5538     dispatchers dictionary
5539     (SessionLoader.check_attrs): Two new conversions, ascii to convert
5540     to a byte-string object and idref as a generic id reference
5541     (SessionLoader.start_dbconnection)
5542     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
5543     elements
5544     (load_session): Add the db_connection_callback to pass through the
5545     SessionLoader
5546    
5547     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
5548     New classes to test loading of sessions with postgis database
5549     connections.
5550    
5551     2003-08-25 Bernhard Herzog <[email protected]>
5552    
5553 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
5554     replace it and the comment with __BuildDate__ by the Source: and
5555     Id: cvs keywords as used in the other files.
5556    
5557     2003-08-25 Bernhard Herzog <[email protected]>
5558    
5559 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
5560     LoadError when a required attribute is missing. The code used to
5561     be commented out for some reason, but probably should have been
5562     active.
5563    
5564     * test/test_load.py (TestLoadError.test): Test the message in the
5565     LoadError too to make sure it really is about the missing
5566     attribute
5567    
5568 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
5569 bh 1641
5570     * test/test_save.py (SaveSessionTest.test_dbf_table)
5571     (SaveSessionTest.test_joined_table): Add XML validation tests.
5572    
5573     2003-08-22 Bernhard Herzog <[email protected]>
5574    
5575 bh 1639 Implement saving a session with a postgis connection
5576 bh 1632
5577 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
5578     elements for database connections and shapestores using db
5579     connections
5580     (session): Add the dbconnections to the content model
5581    
5582     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
5583     Write the db connections
5584     (SessionSaver.write_session): Call write_db_connections to write
5585     the connection before the data sources
5586     (SessionSaver.write_data_containers): Handle postgis shapestores
5587    
5588     * test/test_save.py (SaveSessionTest.thubanids)
5589     (SaveSessionTest.thubanidrefs): Update for new DTD
5590     (SaveSessionTest.test_save_postgis): New. Test saving a session
5591     with postgis connections
5592    
5593     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
5594     (PostGISTable.TableName): New accessor methods for the connection
5595     and table name
5596    
5597     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
5598     (TestPostGISTable.test_dbname): New methods to test the new
5599     PostGISConnection methods
5600    
5601     2003-08-22 Bernhard Herzog <[email protected]>
5602    
5603 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
5604     for exceptions occurring when establishing a Database connection
5605     (PostGISConnection.connect): Catch psycopg.OperationalError during
5606     connects and raise ConnectionError.
5607    
5608     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
5609     tests for database exceptions
5610    
5611     2003-08-22 Bernhard Herzog <[email protected]>
5612    
5613 bh 1635 Prepare the test suite for tests with required authentication
5614    
5615     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
5616     variables with two predefined users/passwords, one for the admin
5617     and one for a non-privileged user.
5618     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
5619     the non-privileged user to the database and set the admin password
5620     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
5621     Better error reporting
5622     (PostgreSQLServer.connection_params)
5623     (PostgreSQLServer.connection_string): New methods to return
5624     information about how to connect to the server
5625     (PostgreSQLServer.execute_sql): New. Convenience method to execute
5626     SQL statements
5627     (PostgreSQLServer.require_authentication): Toggle whether the
5628     server requires authentication
5629     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
5630     Add or alter users
5631     (PostGISDatabase.initdb): Pass the admin name one the
5632     subprocesses' command lines. Grant select rights on
5633     geometry_columns to everybody.
5634     (upload_shapefile): Use the admin name and password when
5635     connecting. Grant select rights on the new table to everybody.
5636    
5637     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
5638     server's new methods to get the connection parameters.
5639    
5640     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
5641     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
5642     server's new methods to get the connection parameters.
5643    
5644     * test/test_postgis_db.py
5645     (TestPostGISConnection.test_gis_tables_empty)
5646     (TestPostGISConnection.test_gis_tables_non_empty)
5647     (PostGISStaticTests.setUp): Use the server's new methods to get
5648     the connection parameters.
5649    
5650     2003-08-22 Bernhard Herzog <[email protected]>
5651    
5652 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
5653    
5654     * Thuban/version.py: Add psycopg version
5655    
5656     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
5657     version of the psycopg module
5658    
5659     2003-08-22 Bernhard Herzog <[email protected]>
5660    
5661     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
5662     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
5663     at the moment. The functionality should probably be implemented
5664     some time, though.
5665 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
5666     removed because it's still in use.
5667 bh 1632
5668 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
5669    
5670     * Thuban/UI/about.py (About.__init__): split up the huge about
5671     text into elements/lists for easier translation. This fixes bug
5672     https://intevation.de/rt/webrt?serial_num=2058
5673     Also, made some forgotten string available for the i18n.
5674    
5675 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
5676    
5677     Make postgis support really optional including insensitive menu
5678     items.
5679    
5680     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
5681     whether the postgis is supported.
5682    
5683     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
5684     to make postgis support optional
5685    
5686     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
5687     version of Thuban.Model.postgisdb.has_postgis_support
5688     (database_management command): Make it only sensitive if postgis
5689     is supported.
5690    
5691 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
5692    
5693 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
5694     (section Adding and Removing Layers): Added text and described
5695     multi-selection.
5696     (chapter Extensions): New.
5697    
5698     2003-08-21 Jan-Oliver Wagner <[email protected]>
5699    
5700 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
5701     settings to allow multiple files to load into the map.
5702     Also reduced selection to *.shp as a default.
5703    
5704 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
5705    
5706     Add dialogs and commands to open database connections and add
5707     database layers.
5708    
5709     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
5710     method to open the database connection management dialog
5711     (MainWindow.AddDBLayer): New method to add a layer from a database
5712     (_has_dbconnections): New helper function to use for sensitivity
5713     (database_management command, layer_add_db command): New commands
5714     that call the above new methods.
5715     (main_menu): Add the new commands to the menu.
5716    
5717     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
5718     (PostGISConnection.connect): Establish the actual connection in a
5719     separate method and call it in __init__. This makes it easier to
5720     override the behavior in test cases
5721     (PostGISConnection.BriefDescription): New method to return a brief
5722     description for use in dialogs.
5723    
5724     * test/test_postgis_db.py (NonConnection): DB connection that
5725     doesn't actually connect
5726     (TestBriefDescription): New class with tests for the new
5727     BriefDescription method
5728    
5729 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
5730    
5731     Moved anything from extensions to libraries.
5732    
5733     * libraries: New.
5734    
5735     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
5736    
5737     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
5738     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
5739     been moved here from thuban/extensions/pyprojection/
5740     See there in the Attic for the older history.
5741    
5742     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
5743     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
5744     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
5745     have been moved here from thuban/extensions/pyshapelib/
5746     See there in the Attic for the older history.
5747    
5748     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
5749     files have been moved here from thuban/extensions/shapelib/
5750     See there in the Attic for the older history.
5751    
5752     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5753     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
5754     thuban/extensions/thuban/
5755     See there in the Attic for the older history.
5756    
5757     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
5758    
5759     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5760     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
5761    
5762     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
5763     Moved to libraries/shapelib.
5764    
5765     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
5766     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
5767     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
5768     Moved to libraries/pyshapelib.
5769    
5770     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
5771     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
5772     Moved to libraries/pyprojection.
5773    
5774     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
5775    
5776     * extensions: Removed.
5777    
5778 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
5779    
5780 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
5781     facilities of FileTestMixin so don't derive from it.
5782     (TestViewportWithPostGIS): New class with tests for using a
5783     viewport on a map with postgis layers.
5784    
5785     2003-08-19 Bernhard Herzog <[email protected]>
5786    
5787     Add the db connection management to the session.
5788    
5789     * Thuban/Model/session.py (Session.__init__): New instance
5790     variable db_connections
5791     (Session.AddDBConnection, Session.DBConnections)
5792     (Session.HasDBConnections, Session.CanRemoveDBConnection)
5793     (Session.RemoveDBConnection): New methods to manage and query the
5794     db connections managed by the session
5795     (Session.OpenDBShapeStore): New method to open a shapestore from a
5796     db connection
5797    
5798     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
5799     messages for the db connection handling in the session
5800    
5801     * test/test_postgis_session.py: New. test cases for the session's
5802     db connection handling with postgis connections
5803    
5804     2003-08-19 Bernhard Herzog <[email protected]>
5805    
5806 bh 1606 Add very basic postgis database support and the corresponding test
5807     cases. The test cases require a PostgreSQL + postgis installation
5808     but no existing database. The database will be created
5809     automatically by the test cases
5810    
5811     * test/README: Add note about skipped tests and the requirements
5812     of the postgis tests.
5813    
5814     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
5815    
5816     * test/test_postgis_db.py: New. Test cases for the postgis
5817     support.
5818    
5819     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
5820     format
5821    
5822     * test/test_wellknowntext.py: New. Test cases for the
5823     wellknowntext parser
5824    
5825     * test/postgissupport.py: New. Support module for tests involving
5826     a postgis database.
5827    
5828     * test/support.py (execute_as_testsuite): Shut down the postmaster
5829     if it's still running after the tests
5830    
5831     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
5832     well known text format
5833    
5834 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
5835    
5836     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
5837     message dialog.
5838    
5839 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
5840    
5841 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
5842     reason for the skips in the output to make it a bit more readable.
5843     (execute_as_testsuite): New helper function to run a test suite
5844     and print some more information.
5845     (run_tests): Use execute_as_testsuite to run the tests
5846    
5847     * test/runtests.py (main): Use execute_as_testsuite to run the
5848     tests
5849    
5850     2003-08-18 Bernhard Herzog <[email protected]>
5851    
5852 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
5853     changes introduced in Python 2.3:
5854    
5855     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
5856     filename is an absolute name
5857    
5858     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
5859     filename is an absolute name
5860    
5861     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
5862     unique filename to save to and use the correct relative filename
5863     in the expected output.
5864     (SaveSessionTest.test_dbf_table): Use the correct relative
5865     filename in the expected output.
5866    
5867     * test/test_layer.py (TestLayer.test_raster_layer): Update the
5868     test to check whether the filename is absolute.
5869    
5870 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
5871    
5872     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
5873    
5874 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
5875    
5876 bh 1594 Change the way shapes are returned by a shape store. The
5877     ShapesInRegion method returns an iterator over actual shape
5878     objects instead of a list of shape ids.
5879    
5880     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
5881     id.
5882     (ShapefileStore.ShapesInRegion): Return an iterator over the
5883     shapes which yields shape objects instead of returning a list of
5884     shape ids
5885     (ShapefileStore.AllShapes): New. Return an iterator over all
5886     shapes in the shape store
5887     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
5888    
5889     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
5890     doc-string.
5891    
5892     * Thuban/UI/baserenderer.py
5893     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
5894     layer_shapes and make it return an iterator containg shapes
5895     instead of a list of ids.
5896     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
5897     layer_shapes() change
5898    
5899     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
5900     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
5901    
5902     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
5903     changes in the ShapesInRegion return value.
5904     (ViewPort._get_hit_tester): Remove commented out code
5905    
5906     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
5907     new return value.
5908     (SimpleShapeStore.AllShapes): New. Implement this method too.
5909    
5910     * test/test_layer.py (TestLayer.test_arc_layer)
5911     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5912     (TestLayer.test_point_layer_with_projection)
5913     (TestLayer.test_derived_store): Adapt to changes in the
5914     ShapesInRegion return value.
5915    
5916     * test/test_shapefilestore.py
5917     (TestShapefileStoreArc.test_shapes_in_region)
5918     (TestShapefileStorePolygon.test_shapes_in_region)
5919     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
5920     in the ShapesInRegion return value.
5921     (TestShapefileStorePoint.test_all_shapes)
5922     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
5923     methods
5924    
5925     * test/test_derivedshapestore.py
5926     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
5927     the ShapesInRegion return value.
5928     (TestDerivedShapeStore.test_all_shapes)
5929     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
5930     methods
5931    
5932     2003-08-15 Bernhard Herzog <[email protected]>
5933    
5934 bh 1592 Make the renderers deal correctly with raw vs. python level
5935     representation of shape geometries
5936    
5937     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
5938     Return a flag useraw in addition to the callable and the parameter
5939     to indicate whether the callable can deal with the raw shape data
5940     or uses the higher level python lists of coordinates. The callable
5941     now should accept either the raw data or the return value of the
5942     shape's Points() method.
5943     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
5944     change
5945     (BaseRenderer.projected_points): Instead of the shape id use the
5946     points list as parameter.
5947     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
5948     (BaseRenderer.draw_point_shape): Adapt to projected_points()
5949     change and accept the points list as parameter instead of the
5950     shape id.
5951    
5952     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
5953     the useraw flag as required by the BaseRenderer
5954     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
5955     changes.
5956    
5957     * test/test_baserenderer.py
5958     (TestBaseRenderer.test_point_with_classification): New test for
5959     rendering a map with classifications.
5960    
5961     2003-08-15 Bernhard Herzog <[email protected]>
5962    
5963 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5964     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
5965     (ViewPort._get_hit_tester, ViewPort.projected_points)
5966     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
5967     (ViewPort._find_label_at): Split the find_shape_at method into
5968     several new methods and use the functions in the hit-test module.
5969    
5970     * Thuban/UI/hittest.py: New module with Python-level hit-testing
5971     functions
5972    
5973     * test/test_hittest.py: New. Test for the new hittest module
5974    
5975     2003-08-15 Bernhard Herzog <[email protected]>
5976    
5977 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
5978     projection to all corners of the bounding box to get a better
5979     approximation of the projected bounding box
5980    
5981     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
5982     New. Test coordinate handling of a layer with a projection.
5983     Catches the bug fixed in Layer.ShapesInRegion
5984    
5985     2003-08-15 Bernhard Herzog <[email protected]>
5986    
5987 bh 1586 Move some of the mock objects in test_baserenderer into their own
5988     module so they can easily be used from other tests
5989    
5990     * test/mockgeo.py: New test helper module with some mock objects
5991     for geometry related things like shapes, shapestores and
5992     projections.
5993    
5994     * test/test_mockgeo.py: New. Tests for the new helper module
5995    
5996     * test/test_baserenderer.py: Some of the mock-objects are in
5997     mockgeo now.
5998    
5999 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
6000    
6001     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
6002    
6003 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
6004    
6005 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
6006    
6007     2003-08-12 Bernhard Herzog <[email protected]>
6008    
6009 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
6010     strings have to be one string literal.
6011    
6012 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
6013    
6014 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
6015     New. This method was used in various derived classes, but it's
6016     better to have it here.
6017    
6018     * test/test_shapefilestore.py
6019     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
6020     FloatComparisonMixin
6021    
6022     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
6023     It's now in FloatComparisonMixin
6024    
6025     * test/test_derivedshapestore.py
6026     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
6027     in FloatComparisonMixin
6028    
6029     2003-08-11 Bernhard Herzog <[email protected]>
6030    
6031 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
6032     error message
6033    
6034 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
6035    
6036 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
6037     with version number.
6038     Changed title to reflect version number of Thuban.
6039    
6040     2003-08-08 Jan-Oliver Wagner <[email protected]>
6041    
6042 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
6043     the list corresponds to the "About" web page.
6044    
6045 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
6046    
6047     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
6048     Make sure translated strings are recognized as one string literal.
6049    
6050     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
6051     Make sure translated strings are recognized as one string literal.
6052    
6053     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
6054     translated strings are recognized as one string literal.
6055    
6056     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
6057     sure translated strings are recognized as one string literal.
6058    
6059 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
6060    
6061 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
6062     Simply delegates to the original shapestore.
6063    
6064     * test/test_derivedshapestore.py
6065     (TestDerivedShapeStore.test_raw_format): New. Test case for
6066     DerivedShapeStore.RawShapeFormat
6067    
6068     2003-08-07 Bernhard Herzog <[email protected]>
6069    
6070 bh 1561 Add raw data interface to shape objects.
6071    
6072     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
6073     class to ShapefileShape which now holds shapefile specific
6074     information.
6075     (ShapefileShape.compute_bbox): Simplified to not cache any
6076     information. The way this method is used that shouldn't matter
6077     performance wise.
6078     (ShapefileShape.RawData): New. Return the shapeid which is the raw
6079     data format for shapes from shapefiles.
6080     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
6081     in the shape objects returned by a shapestore. For a
6082     ShapefileStore this is always RAW_SHAPEFILE.
6083     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
6084     method.
6085    
6086     * test/test_shapefilestore.py
6087     (TestShapefileStore.test_raw_format): New test to test the raw
6088     format feature of shapes.
6089    
6090 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
6091     data. It was only there for interface compatibility but it's not
6092 bh 1561 used inside of Thuban and the generic Shape class has gone away.
6093 bh 1560
6094 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
6095     the raw data format and only use an optimized version of its a
6096     shapefile.
6097    
6098 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
6099    
6100 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
6101     tests.
6102     (SimpleShapeStore.Shape): Use SimpleShape instead of
6103     Thuban.Model.data.Shape to make the tests independed of the coming
6104     changes.
6105    
6106     2003-08-07 Bernhard Herzog <[email protected]>
6107    
6108 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
6109     (ThubanTestProgram): New classes that extend the respective
6110     classes from unittest. These new version support skipping tests
6111     under certain expected conditions. In the Thuban test suite we
6112     uses this for tests that require the optional gdal support.
6113     (run_tests): Use ThubanTestProgram instead of the unittest.main()
6114    
6115     * test/runtests.py (main): Use the new ThubanTestRunner instead of
6116     the normal one from unittest
6117    
6118     * test/test_layer.py (TestLayer.test_raster_layer): If this test
6119     is not run because gdal support isn't available report this to the
6120     runner.
6121    
6122     * test/test_baserenderer.py
6123     (TestBaseRenderer.test_raster_no_projection): Do not run this test
6124     if gdal support isn't available and report this to the runner.
6125    
6126 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
6127    
6128     Rearrange the renderers a bit, partly in preparation for changes
6129     required for the postgis merge, partly to make it more testable.
6130     Also make the representation of coordinates in Shapes more
6131     consistent.
6132    
6133     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
6134     this class is now in BaseRenderer. This class is now practically
6135     only a specialization of BaseRenderer for rendering to an actual
6136     wx DC.
6137     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
6138     to get the shapetype specific rendering functions.
6139    
6140     * Thuban/UI/baserenderer.py: New file with the basic rendering
6141     logic. The code in this file is completely independend of wx.
6142     (BaseRenderer): Class with the basic rendering logic
6143    
6144     * test/test_baserenderer.py: New. Test cases for BaseRenderer
6145    
6146     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
6147     error_on_redraw to guard agains endless loops and stack overflows
6148     when there's a bug in the rendering code that raises exceptions.
6149     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
6150     rendering into a separate method _do_redraw so that error handling
6151     is a bit easier. When an exception occurs, set error_on_redraw to
6152     true. When it's true on entry to OnIdle do nothing and return
6153     immediately.
6154    
6155     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
6156     Shape object will always have the coordinates as a list of list of
6157     coordinate pairs (tuples).
6158     (Shape.compute_bbox): Adapt to new representation.
6159    
6160     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
6161     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
6162     Shape objects.
6163    
6164     * test/test_shapefilestore.py
6165     (ShapefileStoreTests.assertFloatTuplesEqual)
6166     (ShapefileStoreTests.assertPointListEquals): Rename to
6167     assertPointListEquals and change purpose to checking equality of
6168     the lists returned by Shape.Points().
6169     (TestShapefileStoreArc.test_shape)
6170     (TestShapefileStorePolygon.test_shape)
6171     (TestShapefileStorePoint.test_shape): Use the new
6172     assertPointListEquals instead of assertFloatTuplesEqual
6173    
6174     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
6175     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
6176     and change purpose to checking equality of the lists returned by
6177     Shape.Points().
6178     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
6179     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
6180     (TestLayer.test_derived_store): Use the new assertPointListEquals
6181     instead of assertFloatTuplesEqual
6182    
6183     * test/test_derivedshapestore.py
6184     (TestDerivedShapeStore.assertFloatTuplesEqual)
6185     (TestDerivedShapeStore.assertPointListEquals): Rename to
6186     assertPointListEquals and change purpose to checking equality of
6187     the lists returned by Shape.Points().
6188     (TestDerivedShapeStore.test_shape): Use the new
6189     assertPointListEquals instead of assertFloatTuplesEqual
6190    
6191 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
6192    
6193     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
6194     a bounding box. A dialog is raised in case, no bounding box
6195     is found. This fixes bug #2043:
6196     https://intevation.de/rt/webrt?serial_num=2043
6197    
6198 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
6199    
6200     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
6201     object look like a Color instantiation. Formerly it looked like a
6202     tuple.
6203    
6204     * test/test_color.py (TestColor.test_repr)
6205     (TestColor.test_equality, TestColor.test_inequality): New. test
6206     some more apects of the Color class
6207     (TestTransparent.test_repr, TestTransparent.test_hex)
6208     (TestTransparent.test_equality): New. Test cases for the
6209     Transparent object.
6210    
6211 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
6212    
6213     * Doc/manual/thuban-manual.xml: a number of small improvements.
6214     The resulting file is the version submitted for GREAT-ER II.
6215    
6216 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
6217    
6218 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
6219     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
6220     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
6221    
6222     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
6223     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
6224     (ThubanEndBusyCursor): Add doc-strings
6225    
6226     2003-08-01 Bernhard Herzog <[email protected]>
6227    
6228 bh 1540 First step towards PostGIS integration. More abstraction by movin
6229     more code from the layer to the shapestore. More methods of the
6230     layer are now simply delegated to the equivalent method of the
6231     shapestore. The SHAPETYPE_* constants are now in data not in
6232     layer.
6233    
6234     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6235     (SHAPETYPE_POINT, Shape): Move these constants and classes from
6236     layer.py to data.py
6237     (ShapefileStore.__init__): More Initialization for the new methods
6238     and functionality.
6239     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
6240     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
6241     (ShapefileStore.Shape): New methods that were formerly implemented
6242     in the layer.
6243     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
6244     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
6245     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
6246     equivalents of the new shape methods. These versions are simply
6247     delegated to the original shapstore.
6248    
6249     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6250     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
6251     (Layer.SetShapeStore): Removed the initializatin of instance
6252     variables that were needed for the stuff that's now in
6253     ShapefileStore
6254     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
6255     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
6256     shapestore.
6257    
6258     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
6259     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
6260     instead of layer.
6261    
6262     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
6263    
6264     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
6265    
6266     * test/test_layer.py: Import the SHAPETYPE_* constants from data
6267     instead of layer.
6268     (TestLayer.test_derived_store): Remove the test for the exception
6269     when instantiating the DerivedShapeStore with an incompatible
6270     table which is now in test_derivedshapestore.py. Add some more
6271     tests of the layer methods to determine whether they work for a
6272     DerivedShapeStore as well.
6273    
6274 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
6275    
6276     * Doc/manual/thuban-manual.xml: Fix the list of required packages
6277     by just listing the name and where they can be found.
6278    
6279 frank 1532 2003-07-31 Frank Koormann <[email protected]>
6280    
6281     * Doc/manual/thuban-manual.xml:
6282     Changed the screenshot elements to figure.
6283     Changed some variablelist elements to itemizedlist.
6284     Added section on GDAL formats.
6285    
6286 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
6287    
6288     * Doc/manual/thuban-manual.xml: Added a few sentences about
6289     the Fix Border Color option when generating classes.
6290    
6291 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
6292    
6293     * Thuban/Model/classgen.py: Add docstrings. Rename specific
6294     Ramp instances to use lower_case_style.
6295    
6296     * Thuban/UI/classgen.py: Use renamed Ramp instances.
6297    
6298     * Thuban/UI/classifier.py: Add docstrings.
6299    
6300     * Thuban/UI/dock.py: Add docstrings.
6301    
6302     * test/test_classgen.py: Use renamed Ramp instances.
6303    
6304 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
6305    
6306 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
6307     was never used in Thuban.
6308    
6309     2003-07-30 Bernhard Herzog <[email protected]>
6310    
6311 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
6312     method directly instead of going through the transient_table
6313     method. This faster because transient_table may force the copy of
6314     a DBF file into the transient database and setting a table's title
6315     doesnm't affect the title of the associated transient table, so
6316     this fixes RT #2042
6317    
6318     * Thuban/UI/main.py (__version__): Don't import the already
6319     removed show_exception_dialog.
6320    
6321 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
6322    
6323 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6324     Put back this method and remove the equivalent function since we
6325     are setting the exception hook from within this class (OnInit).
6326    
6327     2003-07-29 Jonathan Coles <[email protected]>
6328    
6329 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
6330     Doc/manual/images/5_2_quantiles.png,
6331     Doc/manual/images/5_2_uniform_dist.png,
6332     Doc/manual/images/5_2_unique_values.png,
6333     Doc/manual/images/8_int_error.png: New screen shots.
6334    
6335     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
6336     some points, and added more screen shots.
6337    
6338 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
6339    
6340 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
6341    
6342     2003-07-29 Bernhard Herzog <[email protected]>
6343    
6344 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
6345     deprecated since before the 0.8 release and isn't used in Thuban
6346     itself anymore.
6347    
6348 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
6349    
6350 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
6351 jonathan 1506
6352     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
6353     python exception hook here so that we are sure to catch any
6354     Thuban exception that happen during initialization.
6355    
6356     * Thuban/UI/main.py (main): Don't set the exception hook here,
6357     it will get set in ThubanApplication.OnInit.
6358    
6359     2003-07-29 Jonathan Coles <[email protected]>
6360 jonathan 1503
6361     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6362     Removed and called it show_exception_dialog() so that the exception
6363     handler can be set before the class is created.
6364    
6365     * Thuban/UI/main.py (main): Install the exception handler before
6366     a ThubanApplication is created.
6367    
6368 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
6369    
6370     * po/it.po: New. Italian translation by Maurizio Napolitano
6371    
6372     * po/ru.po: New. Russian translation by Alex Shevlakov
6373    
6374 frank 1497 2003-07-29 Frank Koormann <[email protected]>
6375    
6376 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
6377     projections.
6378    
6379     2003-07-29 Frank Koormann <[email protected]>
6380    
6381 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
6382    
6383 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
6384    
6385 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
6386     on white background.
6387    
6388     2003-07-29 Jonathan Coles <[email protected]>
6389    
6390 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
6391     descriptions for the legend toolbar.
6392    
6393     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
6394     cursor from dialog box.
6395    
6396     2003-07-28 Jonathan Coles <[email protected]>
6397    
6398     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
6399    
6400     * Doc/manual/images/2_4_session_tree.png,
6401     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
6402     Doc/manual/images/4_2_layer_properties.png,
6403     Doc/manual/images/4_2_raster_layer_properties.png,
6404     Doc/manual/images/5_3_genclass.png,
6405     Doc/manual/images/5_classification.png,
6406     Doc/manual/images/6_projection.png,
6407     Doc/manual/images/7_1_table_view.png,
6408     Doc/manual/images/7_2_5_join.png: New screenshots.
6409    
6410     2003-07-24 Jonathan Coles <[email protected]>
6411    
6412     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
6413    
6414     2003-07-24 Jonathan Coles <[email protected]>
6415    
6416     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
6417     chapter on Layer Management.
6418    
6419     * Doc/manual/Makefile: New. Makefile to generate all formats for the
6420     manual and images.
6421    
6422 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
6423    
6424     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
6425     it annoys lintian which warns about these files not being
6426 jan 1767 executable. The #! isn't necessary here since if you absolutely
6427 bh 1483 must execute them you can always say "python <filename>".
6428    
6429     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
6430     superfluous code to set brush and pen for point shapes
6431    
6432     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
6433     belong in viewport anyway
6434    
6435 frank 1479 2003-07-24 Frank Koormann <[email protected]>
6436    
6437     * Doc/manual/thuban-manual.xml: Added section on table management.
6438    
6439 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
6440    
6441     * test/runtests.py (main): Recognize the long "verbose" option
6442     correctly.
6443    
6444 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
6445    
6446     * Doc/manual/thuban-manual.xml: Continue to write first revision
6447     of the manual.
6448    
6449     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
6450     with Begin/EndDrawing() calls to ensure we aren't doing to
6451     many updates to the dc during rendering.
6452     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
6453     a pen and brush argument so they need to be passed to the function.
6454    
6455     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
6456     Calculates the minimum and maximum scale values. Factored out
6457     of set_view_transform so that it could be used to zoom all the
6458     way into a single point.
6459     (ViewPort.set_view_transform): Call calc_min_max_scales().
6460     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
6461     if only a single point is selected.
6462    
6463     * Doc/manual/images/1_2_legend_close.png,
6464     Doc/manual/images/1_2_legend_dock.png,
6465     Doc/manual/images/1_2_mainwindow.png,
6466     Doc/manual/images/1_2_mainwindow.ps,
6467     Doc/manual/images/1_2_mainwindow.sk,
6468     Doc/manual/images/3_2_fullextent.png,
6469     Doc/manual/images/3_2_fulllayerextent.png,
6470     Doc/manual/images/3_2_fullshapeextent.png,
6471     Doc/manual/images/3_2_pan.png,
6472     Doc/manual/images/3_2_zoomin.png,
6473     Doc/manual/images/3_2_zoomout.png,
6474     Doc/manual/images/3_3_identify.png,
6475     Doc/manual/images/3_3_label.png,
6476     Doc/manual/images/3_5_invisible.png,
6477     Doc/manual/images/3_5_movedown.png,
6478     Doc/manual/images/3_5_moveup.png,
6479     Doc/manual/images/3_5_props.png,
6480     Doc/manual/images/3_5_tobottom.png,
6481     Doc/manual/images/3_5_totop.png,
6482     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
6483    
6484 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
6485    
6486 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
6487    
6488     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
6489     after the new map has been assigned
6490    
6491     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
6492     Delegate MAP_REPLACED to the canvas too
6493     (MainWindow.prepare_new_session): Removed. Thanks to the new
6494     MAP_REPLACED message it's no longer needed
6495     (MainWindow.OpenSession, MainWindow.NewSession):
6496     prepare_new_session has been removed.
6497    
6498     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
6499     MAP_REPLACED so that we can close the dialog if a new map is set.
6500     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
6501     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
6502     dialog
6503    
6504     * test/test_viewport.py (SimpleViewPortTest)
6505     (SimpleViewPortTest.test_default_size): Add doc-strings
6506     (ViewPortTest.setUp): Bind map to self.map so we can use it in
6507     tests. Subscribe to MAP_REPLACED messages too.
6508     (ViewPortTest.tearDown): No need to explicitly unsubscribe
6509     (ViewPortTest.test_set_map): New test for the SetMap method.
6510    
6511     2003-07-18 Bernhard Herzog <[email protected]>
6512    
6513 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
6514     Move this test from ViewPortTest.setUp to this new separate test
6515     case. setUp is not the place for the actual tests.
6516     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
6517     more of the test from setUp to the new test test_inital_settings.
6518     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
6519     (ViewPortTest.test_proj_conv): Split test_proj_conv into
6520     test_win_to_proj and test_proj_to_win and make the tests easier to
6521     understand
6522     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
6523     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
6524     (ViewPortTest.test_unprojected_rect_around_point)
6525     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
6526     Reformat to increase readability.
6527    
6528     2003-07-18 Bernhard Herzog <[email protected]>
6529    
6530 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
6531    
6532     2003-07-18 Bernhard Herzog <[email protected]>
6533    
6534 bh 1459 * test/runtests.py: The test suite can now be run without an X
6535     connection. To make sure this remains true, remove the DISPLAY
6536     environment variable so that an error occurs if the wxGTK is
6537     imported accidentally
6538    
6539     2003-07-18 Bernhard Herzog <[email protected]>
6540    
6541 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
6542    
6543     * Thuban/UI/view.py: Remove unused imports
6544    
6545     2003-07-18 Bernhard Herzog <[email protected]>
6546    
6547 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
6548     function is now in viewport.py and is called output_transform
6549     (TestScalebar.test_output_transform)
6550     (TestScalebar.test_OutputTransform): Renamed to
6551     test_output_transform and updated to use output_transform instead
6552     of OutputTransform
6553    
6554     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
6555     renamed.
6556     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
6557     renamed to output_transform
6558    
6559     * Thuban/UI/viewport.py (OutputTransform, output_transform):
6560     Rename to output_transform
6561    
6562     2003-07-18 Bernhard Herzog <[email protected]>
6563    
6564 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
6565     classificationField to classificatin_column and init it here so
6566     that it can be used in SetClassificationColumn
6567     (Layer.GetClassificationColumn, Layer.GetClassificationField):
6568     Rename to GetClassificationColumn.
6569     (Layer.SetClassificationColumn, Layer.SetClassificationField):
6570     Rename to SetClassificationColumn and issue a LAYER_CHANGED
6571     message if the column changes.
6572     (Layer._classification_changed, Layer.ClassChanged): Rename to
6573     _classification_changed. Update the callers.
6574     (Layer.SetShapeStore): Further field->column renames.
6575    
6576     * Thuban/Model/load.py (SessionLoader.start_classification)
6577     (SessionLoader.start_clpoint): Updates because of
6578     field->column method name changes in the Layer class
6579    
6580     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
6581     because of field->column method name changes in the Layer class
6582    
6583     * Thuban/UI/classifier.py (Classifier.__init__)
6584     (Classifier._OnTry, Classifier._OnRevert): Updates because of
6585     field->column method name changes in the Layer class
6586    
6587     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
6588     because of field->column method name changes in the Layer class
6589    
6590     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
6591     of field->column method name changes in the Layer class
6592    
6593     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
6594     (SaveSessionTest.testClassifiedLayer): Update because of
6595     field->column method name changes in the Layer class
6596    
6597     * test/test_layer.py (SetShapeStoreTests.setUp)
6598     (SetShapeStoreTests.test_sanity): Update because of field->column
6599     method name changes in the Layer class
6600     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
6601     (TestLayerModification.test_sanity)
6602     (TestLayerModification.test_initial_settings): remove unsued code
6603     and rename to test_sanity.
6604     (TestLayerModification.test_set_classification): New test for
6605     SetClassification and SetClassificationField.
6606    
6607     2003-07-18 Bernhard Herzog <[email protected]>
6608    
6609 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
6610     the non-fixed values as well. The old test would have accepted a
6611     fixed ramp that only returnes the fixed properties
6612    
6613 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
6614    
6615     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
6616     shots for the manual. The XCF file is the source image and
6617     has additional layers to support changes.
6618    
6619     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
6620    
6621     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
6622     Return both the new class and the field name.
6623    
6624     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
6625     fit the map to the window as this changes any zoom level that
6626     the user may have set.
6627    
6628 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
6629    
6630     * Thuban/Model/classgen.py (generate_singletons,
6631     generate_uniform_distribution, generate_quantiles): Remove
6632     fixes parameter, but maintain the same functionality by having
6633     the calling function pass a FixedRamp object for the ramp.
6634     (FixedRamp): New. Adapts a ramp to have fixed property values.
6635    
6636     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
6637     (Classification): Inherit from Publisher.
6638     (Classification.__init__): Remove the layer parameter.
6639     Classifications no longer need to have a parent layer.
6640     (Classification.GetField, Classification.GetFieldType,
6641     Classification.SetFieldInfo): Removed. The field name is stored
6642     in the layer, and the type can be retreived by calling
6643     Layer.GetFieldType().
6644     (Classification._set_layer, Classification.GetLayer): Removed.
6645     Classifications no longer have a parent layer.
6646    
6647     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
6648     classification.
6649     (Layer.SetShapeStore): Reset the classification first while
6650     we still have the old shape store to work with.
6651     (Layer.GetClassificationField, Layer.SetClassificationField):
6652     New. Method for getting/setting the field to classify on.
6653     (Layer.SetClassification): Simplified now that the layer
6654     simply has to hold a reference to the classification and not
6655     tell the classification who owns it.
6656     Fixes RTbug #2023.
6657    
6658     * Thuban/Model/load.py (SessionLoader.start_classification):
6659     Set the field name on the layer, not the classification.
6660    
6661     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
6662     classification is modified.
6663    
6664     * Thuban/Model/save.py (SessionSaver.write_classification):
6665     Get the field name and type from the layer.
6666    
6667     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
6668     parameter records to rows and add docstring. Fixes RTbug #1997.
6669    
6670     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
6671     ramp when we need to fix certain values of a ramp rather than
6672     using the old fixes parameter. Fixes RTbug #2024.
6673    
6674     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
6675     parameter.
6676     (ClassTable.Reset): Add fieldType parameter and use it, rather
6677     than asking the classification.
6678     (Classifier.__init__): Remember the original class's field
6679     and ask the layer for the field type, rather than the classification.
6680     (Classifier.__SetGridTable): Retrieve the field and field type
6681     for the table because they are not in the classification.
6682     (Classifier._OnTry, Classifier._OnRevert): Set the classification
6683     field on the layer in addition to the classification itself.
6684    
6685     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
6686     classification field from layer.
6687    
6688     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
6689     classification field from layer. Split up tests and remove
6690     *-imports. Fixes RTbug #1992.
6691    
6692     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
6693    
6694     * test/test_classification.py
6695     (TestClassification.test_classification): Remove tests for methods
6696     that no longer exist.
6697    
6698     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
6699     __init__ no longer has a field parameter, use SetClassificationField.
6700     (SetShapeStoreTests.test_sanity): Use layer object to get class
6701     field info.
6702    
6703     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
6704     SetClassificationField on layer to set class field info.
6705    
6706     * test/test_viewport.py: Renamed from test/test_view.py.
6707    
6708 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
6709    
6710     * Doc/manual/thuban-manual.xml: Added authors and an initial
6711     coarse structure.
6712    
6713 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
6714    
6715 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
6716     and therefore should not be derived from any other class.
6717    
6718     * test/test_range.py (RangeTest): FloatComparisonMixin is a
6719     mix-in, so derive from TestCase as well.
6720    
6721     2003-07-15 Bernhard Herzog <[email protected]>
6722    
6723 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
6724     draw_func handling a bit to remove one layer of indirection. This
6725     makes the renderer about 10% faster in the non-classifying case
6726     and the code a bit cleaner
6727     (MapRenderer.draw_point_shape): Add the pen and brush parameters
6728     and set them in the dc. Now the draw_point_shape method and
6729     wxproj's draw_polygon_shape function have basically the same
6730     signature so that both can be directly used as draw_func
6731    
6732     2003-07-15 Bernhard Herzog <[email protected]>
6733    
6734 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
6735     string values (in addition to the labels) as UTF 8
6736    
6737     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
6738     values if the field type is string
6739    
6740     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
6741     saving a session with non-ascii string classification values.
6742    
6743     * test/test_load.py (TestClassification.file_contents)
6744     (TestClassification.test): Check for non-ascii values in string
6745     classifications
6746    
6747 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
6748    
6749     * test/test_view.py: New. Tests for ViewPort.
6750    
6751 frank 1409 2003-07-14 Frank Koormann <[email protected]>
6752    
6753     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
6754     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
6755    
6756 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
6757     unicode strings from session file: session title, map title and
6758     projection name.
6759    
6760 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
6761    
6762 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
6763     drag_stop, not drag_move when the mouse is released.
6764    
6765     2003-07-10 Jonathan Coles <[email protected]>
6766    
6767 jonathan 1403 The most important part of this is the seperation of view.py into
6768     two pieces. viewport.py now has a class called ViewPort which
6769     contains all the non-wx parts of view.py and can therefore be
6770     tested. view.py contains only the wx-specific parts and is fairly
6771     simple.
6772    
6773     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
6774     RTTbug #1992.
6775     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
6776     RTTbug #1992.
6777    
6778     * Thuban/Model/classgen.py (generate_singletons,
6779     generate_uniform_distribution, generate_quantiles):
6780     Added 'fixes' parameter so that property attributes can
6781     be held constant over the generated classification groups.
6782     (CustomRamp.GetProperties): Remove unused variables.
6783    
6784     * Thuban/Model/map.py (Map.SetProjection): Send the old
6785     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
6786     event.
6787    
6788     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
6789     parameter which is a list of records that restricts which
6790     records are saved. Fixes RTbug #1997.
6791    
6792     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6793     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
6794    
6795     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
6796     to allow the user to fix line color/width on generated groups.
6797     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
6798     functions to optionally fix group properties.
6799    
6800     * Thuban/UI/main.py (main): Set exception hook to the
6801     ShowExceptionDialog. Fixes RTbug #1993.
6802    
6803     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
6804     the table window when it is selectd to be shown.
6805    
6806     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
6807     Export Selection button and move the export buttons underneath
6808     the table.
6809     (QueryTableFrame.UpdateStatusText): Added event argument so
6810     that it can respond to grid selection events. The status text
6811     is now updated even when the table is not associated with a
6812     layer as was previously assumed.
6813     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
6814     UpdateStatusText responds to these events.
6815     (QueryTableFrame.OnSaveAs): Renamed to doExport.
6816     (QueryTableFrame.doExport): Helper function that saves the
6817     entire table, or selected rows, to a file.
6818     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
6819     Respond to export button events and call doExport.
6820    
6821     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
6822     the function doesn't return NULL without first setting a Python
6823     Error.
6824    
6825     * test/runtests.py (main): Only print "Unknown option" for
6826     unsupported options.
6827    
6828     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
6829     optional epsilon argument to specify floating point accuracy.
6830     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
6831     for each item test.
6832    
6833     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
6834     tests for saving selected records.
6835    
6836     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6837     tests for saving selected records.
6838    
6839     * test/test_map.py (TestMapWithContents.test_set_projection):
6840     MAP_PROJECTION_CHANGED events send the old projection.
6841    
6842     * test/test_session.py
6843     (TestSessionWithContent.test_forward_map_projection):
6844     MAP_PROJECTION_CHANGED events send the old projection.
6845    
6846     * test/test_table.py (TableTest): Update tests to use non-deprecated
6847     functions.
6848    
6849 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
6850    
6851 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
6852     constants in the column objects are the standard ones defined in
6853     the table module.
6854    
6855     * test/test_transientdb.py
6856     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
6857     exporting transient tables as DBF works. This should catch the bug
6858     just fixed in TransientTableBase.Width.
6859    
6860     2003-07-08 Bernhard Herzog <[email protected]>
6861    
6862 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
6863     interpolated colors correctly.
6864    
6865     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
6866     New. Test case for the fix in classgen.py
6867    
6868     2003-07-08 Bernhard Herzog <[email protected]>
6869    
6870 bh 1378 * test/runtests.py (main): Make the default output less verbose
6871     and add a verbosity option (-v) to get the old output
6872    
6873     2003-07-08 Bernhard Herzog <[email protected]>
6874    
6875 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
6876     0.9.
6877    
6878     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
6879     New. Return the join type
6880    
6881     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
6882     DTD
6883     (SessionSaver.write_data_containers): Save the join type for
6884     joined tables
6885    
6886     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
6887     namespace
6888     (SessionLoader.start_jointable): Handle the jointype attribute
6889    
6890     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
6891     as of Thuban 0.8. These are now tests to determine whether Thuban
6892     can still read files generated by Thuban 0.8
6893    
6894     * test/test_load.py (LoadSessionTest.dtd)
6895     (TestSingleLayer.file_contents)
6896     (TestLayerVisibility.file_contents, TestLabels.file_contents)
6897     (TestLayerProjection.file_contents)
6898     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
6899     (TestJoinedTable.file_contents)
6900     (TestLoadError.file_contents): Update for new DTD
6901     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
6902     for new join type attribute
6903    
6904     * test/test_save.py (SaveSessionTest.dtd)
6905     (SaveSessionTest.testEmptySession)
6906     (SaveSessionTest.testSingleLayer)
6907     (SaveSessionTest.testLayerProjection)
6908     (SaveSessionTest.testRasterLayer)
6909     (SaveSessionTest.testClassifiedLayer)
6910     (SaveSessionTest.test_dbf_table)
6911     (SaveSessionTest.test_joined_table): Update for new DTD
6912     (SaveSessionTest.test_joined_table): Add test for new join type
6913     attribute
6914    
6915 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
6916    
6917     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
6918     function for table_to_dbf
6919     (table_to_dbf): Deal with names longer than the 10 character limit
6920    
6921     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6922     doc-string
6923     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
6924     long column names
6925    
6926 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
6927    
6928 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
6929    
6930     2003-07-03 Bernhard Herzog <[email protected]>
6931    
6932 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
6933     for the Thuban manual and README with some basic information about
6934     the manual
6935    
6936     2003-07-03 Bernhard Herzog <[email protected]>
6937    
6938 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6939     Update doc-string
6940     (TransientJoinedTable.create): Do not modify the column objects of
6941     the input tables in place and copy all columns of the input tables
6942     into the joined table after all.
6943    
6944     * test/test_transientdb.py
6945     (TestTransientTable.test_transient_joined_table_same_column_name):
6946     Update to reflect the new behavior
6947     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6948     Update to reflect the new behavior
6949     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
6950     New test case for a bug which modified the column objects in place
6951    
6952 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
6953 jonathan 1349
6954 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
6955     generate_uniform_distribution, generate_quantiles,
6956 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
6957     one, otherwise we could divide by zero.
6958    
6959     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
6960     ClassGenTest.doClassSingleTest): Call doBoundsTest to
6961     check the end classification groups against the
6962     proper property values.
6963     (ClassGenTest.doBoundsTest): New. Checks the first and
6964     last classification groups to make sure their properties
6965     are the correct upper and lower bounds for a color ramp.
6966    
6967     2003-07-02 Jonathan Coles <[email protected]>
6968    
6969     * Thuban/Model/classgen.py (generate_singletons,
6970     generate_uniform_distribution, generate_quantiles,
6971 jonathan 1360 GenQuantiles0): The denominator was one to high when
6972     calculating the index for the ramp causing the index
6973     to never to reach one.
6974    
6975     2003-07-02 Jonathan Coles <[email protected]>
6976    
6977 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
6978     ClassGroupRange.SetRange() so that the min/max values are
6979     passed as a tuple. This makes a better calling scheme for
6980     when a Range object is passed instead.
6981    
6982     * Thuban/Model/classgen.py: Fixed parameters to
6983     ClassGroupRange constructor.
6984    
6985     * Thuban/Model/classification.py (ClassGroupRange.__init__):
6986     Consolidate the min/max parameters into a single _range which
6987     can either be a tuple or a Range object.
6988     (ClassGroupRange.SetRange): Consolidate the min/max parameters
6989     into a single _range which can either be a tuple or a Range object.
6990    
6991     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
6992     call to ClassGroupRange constructor to use a tuple.
6993    
6994     * Thuban/Model/layer.py (Layer.SetClassification): Switch
6995     the classification instance variable to the new class
6996     before calling _set_layer otherwise subscribers to a
6997     LAYER_CHANGED event will not see any difference.
6998    
6999     * test/test_classification.py: Fix tests of ClassGroupRange
7000     so that they use the new signature.
7001    
7002     * test/test_load.py: Fix use of ClassGroupRange so that it
7003     uses the new signature.
7004    
7005     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
7006     uses the new signature.
7007    
7008     * test/test_save.py: Fix use of ClassGroupRange so that it
7009     uses the new signature.
7010    
7011    
7012     2003-07-01 Jonathan Coles <[email protected]>
7013    
7014 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
7015     Import used objects/class from color.
7016     (generate_singletons): We don't
7017     need the numGroups parameter anymore because we are using
7018     the new ramps with GetProperties().
7019     (generate_uniform_distribution): Use new ramp method
7020     GetProperties().
7021     (generate_quantiles, GenQuantiles0): Use new ramp method
7022     GetProperties().
7023     (CustomRamp.SetNumGroups): Removed. The ramps now map
7024     a value from 0 to 1 to class properties so the number
7025     of groups is not needed ahead of time.
7026     (CustomRamp.next): Removed. CustomRamp does not support
7027     interation anymore.
7028     (CustomRamp.GetProperties): Returns a ClassGroupProperties
7029     object based on the index value from 0 to 1 that is
7030     passed to it.
7031     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
7032     Made into instances of Monochromatic class instread of
7033     deriving from it.
7034     (HotToCold.SetNumGroups): Removed. See CustomRamp.
7035     (HotToCold.next): Removed. See CustomRamp.
7036    
7037     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
7038     (Classification.SetField, Classification.SetFieldType):
7039     Replaced with SetFieldInfo.
7040     (Classification.SetFieldInfo): New. Does a better job of
7041     what SetField and SetFieldType used to do by combining
7042     their function since they should really always be done
7043     at the same time.
7044     (Classification.SetLayer): Renamed to _set_layer.
7045     (Classification._set_layer): Should only be called from
7046     Layer's SetClassification. This does not cause a recursive
7047     call as SetLayer did because we know that Layer knows about
7048     the classification.
7049    
7050     * Thuban/Model/color.py: Fixes RTbug #1971.
7051     (_Transparent): Renamed from Transparent so it doesn't
7052     conflict with the module variable.
7053     (Transparent, Black): Renamed from Color.Transparent,
7054     Color.Black so they are not class variables.
7055    
7056     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
7057     (Layer.Destroy): We don't need to call SetClassification
7058     anymore to clear out the back reference in the classifcation
7059     to the layer. It's better to set it to None using _set_layer,
7060     and we won't be creating another clas object too.
7061     (Layer.SetClassification): Classification._set_layer is not
7062     recursive so remove all the locking variables. Also clean
7063     up the code so that it remains unchanged if something fails.
7064    
7065     * Thuban/Model/load.py: Fixes RTbug #1971.
7066     (SessionLoader.start_classification): Call
7067     Classification.SetFieldInfo().
7068    
7069     * Thuban/Model/save.py: Removed import of Color which wasn't
7070     being used.
7071    
7072     * Thuban/UI/classgen.py: Fixes RTbug #1972.
7073     (ClassGenDialog.__init__): Color ramps are now instances
7074     already so we don't need to create any new objects.
7075     (ClassGenDialog.OnOK): Check for numGroups is no longer
7076     necessary because we never use it.
7077    
7078     * Thuban/UI/classifier.py: Fixes RTbug #1971.
7079     (Classifier.__BuildClassification, Classifier.__SetGridTable):
7080     Call Classification.SetFieldInfo() instead of SetFieldType.
7081    
7082     * Thuban/UI/renderer.py: Fixes RTbug #1971.
7083    
7084     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
7085     (MapCanvas.__init__): Subscribe to the idle time event. Set
7086     background color to white.
7087     (MapCanvas.OnPaint): Set a flag indicating that we should
7088     render the map during idle time. If we already have a bitmap
7089     just draw it now.
7090     (MapCanvas.OnIdle): New. Render the map only during idle time.
7091     This also fixes a problem with the busy cursor under gtk.
7092    
7093     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
7094     Fix calls to generate_singletons because the signature changed.
7095    
7096     * test/test_classification.py: Fix color references and
7097     change calls to Classification.[SetField|SetFieldType] to
7098     SetFieldInfo.
7099    
7100     * test/test_load.py: Fix color references.
7101    
7102     * test/test_load_0_2.py: Fix color references.
7103    
7104     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
7105     Change calls to Classification.[SetField|SetFieldType] to
7106     SetFieldInfo.
7107    
7108 frank 1334 2003-07-01 Frank Koormann <[email protected]>
7109    
7110     MERGE from the greater-ms3 branch.
7111    
7112     * test/test_transientdb.py
7113     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
7114     New. Test join of two tables with partly equal column names.
7115    
7116     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
7117     If duplicates in left and right tables column names are found,
7118     append '_' (underscores) to the name until it is unique.
7119     Create always new internal names for the resulting table and reference
7120     columns in the join statement with <table>.<column>
7121    
7122 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
7123    
7124     * test/test_transientdb.py
7125     (TestTransientTable.test_transient_joined_table_same_column_name):
7126     New. Test whether joining on columns with the same names in both
7127     tables works.
7128 frank 1334
7129 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
7130     sure to use the right internal names even when joining on field
7131     with the same names in both tables. Also, detect duplicate names
7132     in the joined table correctly.
7133    
7134 frank 1325 2003-07-01 Frank Koormann <[email protected]>
7135    
7136     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
7137     Reverse List of layers to render in same order as in desktop legend.
7138    
7139 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
7140    
7141 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
7142     and splits it into a tuple of at most three integers.
7143     Used make_tuple() to make tuple versions of the version
7144     numbers.
7145    
7146     * Thuban/UI/about.py: Add Thuban email addresses.
7147    
7148     2003-06-30 Jonathan Coles <[email protected]>
7149    
7150 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
7151     were too high.
7152    
7153     2003-06-30 Jonathan Coles <[email protected]>
7154    
7155 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
7156    
7157     * MANIFEST.in: Added Projections so that default.proj is
7158     included.
7159    
7160 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
7161    
7162     New About box with lots more information including library
7163     versions and credits. More/better version checking before
7164     Thuban starts.
7165    
7166     * Thuban/UI/about.py: New. New About box that displays
7167     library version information and credits.
7168    
7169     * Thuban/version.py: Added new 'versions' dictionary which
7170     contains the verions of various libraries which are checked
7171     when the module loads.
7172     (verify_versions): Check all version numbers and returns
7173     a list of errors.
7174    
7175     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
7176     Reset the status of the buttons as the situation warrants,
7177     but in a better more reliable way by not relying on the
7178     current status to determine what needs to change.
7179    
7180     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
7181     (verify_versions): Remove most of the code since it is
7182     now in Thuban.version.verify_versions.o
7183    
7184     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
7185     About box in Thuban.UI.about.
7186    
7187     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
7188     Returns the version of gdal library being used as a string.
7189    
7190     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
7191     Removed.
7192     (get_proj_version): Return the version of PROJ that the file
7193     was compiled with.
7194     (get_gtk_version): Return th version of GTK that the file
7195     was compiled with.
7196    
7197 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
7198    
7199     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
7200     of the SelectPropertiesDialog should be self so the window
7201     appears on top.
7202     (ClassGroupPropertiesCtrl.DoEdit): The parent
7203     of the SelectPropertiesDialog should be self so the window
7204     appears on top.
7205    
7206     * Thuban/UI/resource.py: Cleaned up how we determine file
7207     extensions.
7208     (GetImageResource): Return an wxImage from our Resources.
7209    
7210 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
7211    
7212     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
7213     Check that a layer has a classification before trying
7214     to get it. Raster layers don't have classifications.
7215    
7216 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
7217 jonathan 1297
7218     * setup.py: Add Resources/XML to resource list.
7219    
7220     2003-06-23 Jonathan Coles <[email protected]>
7221 jonathan 1286
7222 jonathan 1297 * setup.cfg: Fix copyright dates
7223    
7224     2003-06-23 Jonathan Coles <[email protected]>
7225    
7226 jonathan 1294 * MANIFEST.in: Update with Resources/XML
7227    
7228     * setup.py: Don't include Locale resources yet as we don't
7229     have any and it causes problems building the distribution
7230     for Windows. Update version to 0.8.0.
7231    
7232     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
7233    
7234     * Thuban/UI/mainwindow.py: Add blank line at the end because
7235     file was not being read correctly building the Windows
7236     distribution.
7237    
7238     2003-06-23 Jonathan Coles <[email protected]>
7239    
7240 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
7241    
7242     * Thuban/version.py: Temporarily update longversion for
7243     the 0.8 release so that it doesn't have the cvs revision.
7244    
7245     2003-06-23 Jonathan Coles <[email protected]>
7246    
7247 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
7248     to make sure that we don't create reentrant possibilities with
7249     wxYield.
7250    
7251     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
7252     directly to avoid the wxSafeYield() call which generates an
7253     OnPaint event causing infinite recursion. Don't try to catch
7254     exception anymore. This was for before there were limits on map
7255     scaling.
7256    
7257 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
7258    
7259     Bug fix for RT #1961:
7260    
7261     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
7262     Register DerivedShapestores with the session
7263    
7264     * Thuban/Model/session.py (Session.Tables): Make sure each table
7265     is only listed once.
7266    
7267     * test/test_load.py (TestJoinedTable.test): Add check_format call.
7268     Update file contents to match the one written out.
7269    
7270 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
7271    
7272     * test/xmlsupport.py (SaxEventLister.startElementNS)
7273     (SaxEventLister.endElementNS): Do not include the qname. Python
7274     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
7275     is (presumably incorrectly) None, whereas it's a string with the
7276     element name in the later versions.
7277    
7278     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
7279     (TestEventList.test_even_list_namespace): Update tests to reflect
7280     the new behaviour
7281     (TestEventList.test_even_list_id_normalization): Fix doc-string
7282    
7283 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
7284    
7285 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
7286     by deriving classes to determine if that layer supports shapes.
7287     (Layer): Override HasShapes and return true.
7288    
7289     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
7290     instead of a direct call to wx[Begin|End]CusyCursor().
7291     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
7292     table data.
7293    
7294     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
7295     New. Wrappers around the wxWindows functions that allow us to
7296     make additional calls such as wxYield which gives the native
7297     system a chance to update the cursor correctly.
7298    
7299     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
7300     instead of a direct call to wx[Begin|End]CusyCursor().
7301    
7302     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
7303     instead of a direct call to wx[Begin|End]CusyCursor().
7304     (MapCanvas.find_shape_at): Check if the current search layer
7305     support shapes, otherwise go on to the next layer.
7306    
7307     * test/test_layer.py: Add tests in each type of layer for
7308     HasClassification() and HasShapes()
7309    
7310     2003-06-20 Jonathan Coles <[email protected]>
7311    
7312 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
7313     turning on the busy cursor to allow the system to change the
7314     cursor before we begin painting. This fixes a problem that
7315     was occuring only under GTK. Fixes RTbug #1840.
7316    
7317 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
7318    
7319     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
7320     version.
7321    
7322     * Thuban/Model/save.py (sort_data_stores): New. Make topological
7323     sort of the data sources so they can be written with sources that
7324     data sources that depend on other data sources come after the
7325     sources they depend on.
7326     (SessionSaver.__init__): Add idmap instance variable to map from
7327     objects to the ids used in the file.
7328     (SessionSaver.get_id, SessionSaver.define_id)
7329     (SessionSaver.has_id): New. Methods to manage the idmap
7330     (SessionSaver.write): Use thuban-0.8.dtd
7331     (SessionSaver.write_session): Add a namespace on the session and
7332     write out the data sources before the maps.
7333     (SessionSaver.write_data_containers): New. Write the data
7334     containers.
7335     (SessionSaver.write_layer): Layer elements now refer to a
7336     shapestore and don't contain filenames anymore.
7337    
7338     * Thuban/Model/load.py (LoadError): Exception class to raise when
7339     errors in the files are discovered
7340     (SessionLoader.__init__): Define dispatchers for elements with a
7341     thuban-0.8 namespace too.
7342     (SessionLoader.check_attrs): New helper method to check and
7343     convert attributes
7344     (AttrDesc): New. Helper class for SessionLoader.check_attrs
7345     (SessionLoader.start_fileshapesource)
7346     (SessionLoader.start_derivedshapesource)
7347     (SessionLoader.start_filetable, SessionLoader.start_jointable):
7348     Handlers for the new elements in the new fileformat
7349     (SessionLoader.start_layer): Handle the shapestore attribute in
7350     addition to filename.
7351     (SessionLoader.start_table, SessionLoader.end_table): Removed.
7352     They were never used in the old formats and aren't needed for the
7353     new.
7354    
7355     * Thuban/Model/session.py (Session.DataContainers): New method to
7356     return all "data containers", i.e. shapestores and tables
7357    
7358     * test/xmlsupport.py (SaxEventLister.__init__)
7359     (SaxEventLister.startElementNS, sax_eventlist): Add support to
7360     normalize IDs.
7361    
7362     * test/test_xmlsupport.py
7363     (TestEventList.test_even_list_id_normalization): New test case for
7364     id normalization
7365    
7366     * test/test_load.py (LoadSessionTest.check_format): Use ID
7367     normalization
7368     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
7369     class atrributes used for ID normalization
7370     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
7371     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
7372     file format
7373     (TestJoinedTable): New test for loading sessions with joined
7374     tables.
7375     (TestLoadError): New. Test whether missing required attributes
7376     cause a LoadError.
7377    
7378     * test/test_save.py (SaveSessionTest.thubanids)
7379     (SaveSessionTest.thubanidrefs): New class attributes for ID
7380     normalization in .thuban files.
7381     (SaveSessionTest.compare_xml): Use id-normalization.
7382     (SaveSessionTest.testEmptySession)
7383     (SaveSessionTest.testLayerProjection)
7384     (SaveSessionTest.testRasterLayer)
7385     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
7386     (SaveSessionTest.testLayerProjection): The filename used was the
7387     same as for testSingleLayer. Use a different one.
7388     (SaveSessionTest.test_dbf_table)
7389     (SaveSessionTest.test_joined_table): New test cases for saving the
7390     new data sources structures.
7391     (TestStoreSort, MockDataStore): Classes to test the sorting of the
7392     data stores for writing.
7393    
7394     * test/runtests.py: Add CVS keywords
7395    
7396 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
7397    
7398 jonathan 1267 * test/test_session.py
7399     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
7400     Use the cultural_landmark-point.dbf file for the store so that
7401     the table rows and shape count match.
7402    
7403     2003-06-20 Jonathan Coles <[email protected]>
7404    
7405 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
7406     an exception if the number of shapes is different from the
7407     number of rows in the table. Address RTbug #1933.
7408    
7409     * test/test_layer.py (TestLayer.test_derived_store): Add
7410     a test for the new exception in DerivedShapeStore.__init__.
7411    
7412     * test/support.py (FloatTestCase): Removed since there is
7413     already FloatComparisonMixin. Fixes RTbug #1954.
7414     (FloatComparisonMixin.assertFloatEqual): Include test for
7415     infinity that was part of FloatTestCase.
7416    
7417     * test/test_range.py (RangeTest): Inherit from
7418     support.FloatComparisonMixin now that we don't have
7419     support.FloatTestCase.
7420    
7421 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
7422    
7423 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
7424     the implementation in xmlsupport instead.
7425     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
7426    
7427     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
7428     of test_save
7429    
7430     2003-06-20 Bernhard Herzog <[email protected]>
7431    
7432 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
7433     method to make sure the test files we load might have been written
7434     by the current thuban version.
7435     (ClassificationTest.TestLayers, TestSingleLayer.test)
7436     (TestLayerVisibility.test, TestClassification.test)
7437     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
7438     Add check_format() calls and fix the thuban data to match the data
7439     that would be written by saving the session loaded from it.
7440    
7441     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
7442     the same class and function in test_save.
7443    
7444     * test/test_xmlsupport.py (TestEventList): New. test cases for
7445     sax_eventlist
7446    
7447     2003-06-20 Bernhard Herzog <[email protected]>
7448    
7449 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
7450     Thuban are covered by this DTD
7451     (map): Fix content model for layers and raster layers. There can
7452     be any number or layers and raster layers in any order.
7453    
7454 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
7455    
7456 jonathan 1265 This is mainly about fixing RTbug #1949.
7457    
7458 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
7459     import statement since python 2.2 is the earliest supported
7460     version.
7461    
7462     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
7463     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
7464     depending on the units this projection *forwards* into.
7465    
7466     * Thuban/Model/save.py (SessionSaver.write_classification):
7467     Remove unnecessary use of lambdas and nested functions.
7468    
7469     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
7470     adjustment here if the map projection uses degrees.
7471    
7472     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
7473     scale adjust code since it is now done before calling
7474     this method. Don't do anything if the map projection
7475     is None.
7476    
7477 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
7478    
7479 bh 1248 Move version specific load tests to their own file.
7480    
7481     * test/test_load.py: Expand the doc-string to explain a bit how to
7482     handle file format changes.
7483     (TestClassification.test): Update the docstring as this test is
7484     not about Thuban 0.2 anymore.
7485    
7486     * test/test_load_0_2.py: New file with the load tests for thuban
7487     files created with Thuban 0.2 and earlier.
7488    
7489     2003-06-19 Bernhard Herzog <[email protected]>
7490    
7491 bh 1246 Add XML validation to some of the tests. Validation will only be
7492     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
7493     To make the DTD available to the test cases it's moved into
7494     Resources/XML
7495    
7496     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
7497     for versions up to and including 0.2. Two slight changes: added an
7498     encoding specification and fixed the comment which refered to
7499     GRASS, not Thuban
7500    
7501     * test/xmlsupport.py: New support module for tests involving XML.
7502     Currently there's a mix-in class for XML validation.
7503    
7504     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
7505    
7506     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
7507     so that we can validate the
7508     (SaveSessionTest.testEmptySession)
7509     (SaveSessionTest.testSingleLayer)
7510     (SaveSessionTest.testSingleLayer)
7511     (SaveSessionTest.testLayerProjection)
7512     (SaveSessionTest.testRasterLayer)
7513     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
7514    
7515     * test/runtests.py (main): Call print_additional_summary instead
7516     of print_garbage_information
7517    
7518     * test/support.py (resource_dir): New function to return the
7519     "Resource" subdirectory
7520     (print_additional_summary): New function to combine several
7521     summary functions
7522     (run_tests): Use print_additional_summary instead of calling
7523     print_garbage_information directly
7524    
7525     2003-06-19 Bernhard Herzog <[email protected]>
7526    
7527 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
7528     the classification element.
7529     (projection): Add the "name" attribute
7530    
7531 frank 1242 2003-06-19 Frank Koormann <[email protected]>
7532    
7533     MERGE from the greater-ms3 branch.
7534    
7535     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
7536     scale if projection is latlong to get better estimate.
7537    
7538     Fix problem of hidden properties dialog under windows after double
7539     click on layer tree:
7540     The tree control always gets an Expanded / Collapsed event after
7541 joey 2162 the ItemActivated on double click, which raises the main window again.
7542     We add a second ItemActivated event to the queue, which simply
7543 frank 1242 raises the already displayed window.
7544    
7545     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
7546     raiseProperties initialized to prevent endless loops
7547     (LegendTree._OnItemActivated): Depending on self.raiseProperties
7548     simply raise the properties or open the dialog and issue a second
7549     event.
7550    
7551 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
7552    
7553 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
7554    
7555     2003-06-18 Jonathan Coles <[email protected]>
7556    
7557 jonathan 1235 When Thuban loaded the map was redrawn twice because the
7558     legend was being opened after the mainwindow was created
7559     and not during its creation. This meant the map was drawn
7560     initially and then had to be redrawn when the legend
7561     caused the display to change. Now the legend is opened
7562     in the mainwindow constructor which resolves this issue.
7563    
7564     Also, although we were checking for the existence of
7565     gdal and gdalwarp modules, the gdalwarp extension was
7566     still being compiled (which may fail if the system doesn't
7567     have gdal installed). the build_ext command to setup.py
7568     now accepts the flags --with-gdal and --without-gdal.
7569     If --without-gdal is specified setup.py will try to
7570     use the gdal parameters specified by gdal-config. Under
7571     windows, those parameters have to be set in setup.py
7572     as with proj4 an wxWindows.
7573    
7574     * setup.py: Use a list instead of seperate variables for
7575     extension parameters so we can create a generic function
7576     that runs an appropriate *-config script.
7577     (run_cs_script): Renamed from run_wx_script and modified
7578     to accept a second argument which is a list of lists to
7579     be filled in by the values returned from running the command.
7580     (thuban_build_ext): New. Extends the build_ext command and
7581     provides the options --with-gdal/--without-gdal which then
7582     optionally includes the gdalwarp extension.
7583    
7584     * Thuban/Model/resource.py: First check if we can import
7585     the gdalwarp Thuban extension before checking for gdal.
7586     Also added some comments.
7587    
7588     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
7589     the map is None which may be the case if none has been loaded
7590     yet.
7591    
7592     * Thuban/UI/main.py (main): Remove call to ShowLegend.
7593    
7594     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
7595    
7596     * Thuban/UI/renderer.py: Check for gdal support before importing
7597     gdalwarp.
7598     (MapRenderer.render_map): Only try to optimize if we have gdal
7599     support otherwise nothing will get drawn.
7600    
7601 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
7602     during startup before a map has been created. Check if map is None
7603     before using it and do nothing if it is.
7604    
7605 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
7606    
7607     Fix the problem with raster layers under Windows that caused
7608     Thuban to crash. The view should respond to layer projection
7609     changed events to update the display. Changes to a projection
7610     should not cause the map to be set to full extent.
7611    
7612     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7613     current_map_proj to remember the current map projection so that
7614     when the projection changes we know what the previous projection
7615     was.
7616     (MapCanvas.SetMap): Unsubscribe and subscribe to
7617     LAYER_PROJECTION_CHANGED events.
7618     (MapCanvas.projection_changed): Split into two methods that respond
7619     to map and layer projection changes.
7620     (MapCanvas.map_projection_changed): New. Takes the current view and
7621     projects it using the new projection. This does not cause the
7622     map to be redrawn at full extent.
7623     (MapCanvas.layer_projection_changed): New. Cause a redraw which
7624     will draw each layer in its new projection.
7625    
7626     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
7627     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
7628     under Windows.
7629    
7630     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
7631     to twice sizeof(void*) because there are two digits for each
7632     hex byte.
7633    
7634 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
7635    
7636     Update to the layer interface: Direct access to the table,
7637     shapetable, shapefile and filename attributes is now actively
7638     deprecated by issuing deprecation warnings for all places where
7639     this happens.
7640    
7641     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
7642     to the instance variables table, shapetable, shapefile and
7643     filename via __getattr__ so that we can issue a deprecation
7644     warning.
7645     (Layer.SetShapeStore): Don't set the deprecated instance variables
7646     any more
7647     (Layer.SetShapeStore): Don't use deprecated layer instance
7648     variables
7649     (Layer.Destroy): No need to explicitly remove the instance
7650     variables any more
7651     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
7652     instance variables
7653    
7654     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7655     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
7656     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
7657     use deprecated layer instance variables
7658    
7659     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
7660     deprecated layer instance variables
7661    
7662     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7663     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
7664     instance variables
7665    
7666     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
7667     deprecated layer instance variables
7668    
7669     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
7670     deprecated layer instance variables
7671    
7672     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
7673     deprecated layer instance variables
7674    
7675     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
7676     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
7677     variables
7678    
7679     * test/runtests.py (main): Turn Thuban's deprecation warnings into
7680     errors so that they're cought by the tests
7681    
7682     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
7683     layer instance variables
7684    
7685 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
7686    
7687     Fix a problem under Windows whereby if the user double-clicks on a
7688     layer in the legend that tree item will expand or collapse as well
7689     as open the layer properties dialog. The state of the tree item
7690     should not be affected.
7691    
7692     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
7693     preventExpandCollapse and subscribe to expanding and collapsing
7694     events.
7695     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
7696     collapsing events and will veto the event if it has been triggered
7697     by the user double clicking on a layer.
7698     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
7699     that an expanding/collapsing event should be vetoed.
7700    
7701 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
7702    
7703     * Thuban/UI/classifier.py (Classifier.OnClose)
7704     (Classifier.map_layers_removed)
7705     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
7706     in OnClose and not in map_layers_removed or
7707     layer_shapestore_replaced to make sure it always happens when the
7708     dialog is closed
7709    
7710 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
7711    
7712 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
7713     the background of the table view appears correctly.
7714    
7715     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
7716     object that can be used by derived classes to place any
7717     controls (including the grid) onto.
7718     (QueryTableFrame.__init__): Use the panel as the parent window
7719     for all the controls. Reparent the grid so that the panel is
7720     the parent. Call UpdateStatusText() to correctly initialize
7721     the status bar.
7722    
7723     2003-06-13 Jonathan Coles <[email protected]>
7724    
7725 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
7726     from wxFrame (as opposed to wxDialog like the other classes)
7727     but otherwise behaves like the other classes. This is needed
7728     for the TableView which isn't really a dialog and needs to
7729     have a status bar and control buttons.
7730    
7731     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
7732     instance variable to keep track of how many rows are selected.
7733     Subscribe once to the the events we are interested in.
7734     (ThubanGrid.OnRangeSelect): Only handle event if event handling
7735     hasn't been turned off.
7736     (ThubanGrid.OnSelectCell): Only handle event if event handling
7737     hasn't been turned off.
7738     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
7739     as an event listener (which changes the event handler stack)
7740     simply set an instance variable to False. This is checked in
7741     the event handlers.
7742     (ThubanGrid.GetNumberSelected): Return the number of currently
7743     selected rows.
7744     (TableFrame): Inherit from ThubanFrame so we can have a
7745     status bar and control buttons.
7746     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
7747     Explicitly set which items are selected in the operator choice and
7748     action choice so there is always a valid selection. Fixes RTbug #1941.
7749     Subscribe to grid cell selection events so we can update the
7750     status bar.
7751     (QueryTableFrame.UpdateStatusText): Update the status bar with
7752     how many rows are in the grid, how many columns, and how many
7753     rows are selected.
7754     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
7755     Call UpdateStatusText when cells are (de)selected.
7756     (QueryTableFrame.OnQuery): Use the string value in the value
7757     combo if either the selected item index is 0 or if the string
7758     cannot be found in the predefined list (this happens if the
7759     user changes the text). Fixes RTbug #1940.
7760     Only turn off the grid event listeners if there a query comes
7761     back with a none empty list of ids. in the case that the list
7762     is empty this causes a grid.ClearSelection() call to actually
7763     clear the grid selection which causes the selected items in
7764     the map to be deselected. Fixes RTbug #1939.
7765    
7766     * test/test_save.py (XMLWriterTest.Encode): Check return values.
7767     Fixes RTbug #1851.
7768    
7769 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
7770    
7771     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
7772     self.selected_shape with the current selection to make sure the
7773     contents of the dialog are up to date when it's shown for the
7774     first time.
7775     The dialog used to work without this by luck. The recent fix to
7776     the connector module 'broke' a 'feature' the identify view was
7777     relying on, i.e that subscribing to a message in response to
7778     receiving a message of that type would mean that the new
7779     subscriber would also be called for the same message.
7780    
7781 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
7782 jonathan 1175
7783 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
7784     the image is rendered. Fixes RTbug #1937.
7785    
7786     2003-06-12 Jonathan Coles <[email protected]>
7787    
7788 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
7789 jonathan 1193 user directory if it doesn't exist on a posix system.
7790     Fixes RTbug #1815.
7791 jonathan 1191
7792     * Thuban/Model/resource.py (get_user_proj_files): Moved the
7793     called to get_application_dir here, so that the directory
7794     will only be called if this method is invoked.
7795    
7796     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
7797     the projfilepath if no projection is selected.
7798    
7799     2003-06-12 Jonathan Coles <[email protected]>
7800    
7801 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
7802     the scalebar if the current map has no projection set.
7803    
7804     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
7805     projfilepath label to just the basename of the projection file
7806     rather than include the entire path.
7807    
7808     * Thuban/Model/resource.py: Fix missed proj functions that
7809     needed to be renamed.
7810    
7811     2003-06-12 Jonathan Coles <[email protected]>
7812    
7813 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
7814     tested if the variable was an instance of Color.
7815    
7816     * Thuban/Model/color.py (Color): Remove commented code that isn't
7817     used.
7818     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
7819     Fixes RTbug #1835.
7820     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
7821     Needed now that the class doesn't inherit from Color.
7822    
7823     2003-06-12 Jonathan Coles <[email protected]>
7824    
7825 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
7826     check unicode strings.
7827    
7828     * test/test_layer.py: Check for existence of gdal.
7829    
7830     2003-06-12 Jonathan Coles <[email protected]>
7831 jonathan 1172
7832     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
7833     that was in load.py
7834 jonathan 1169
7835 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
7836     that was in save.py
7837    
7838     2003-06-12 Jonathan Coles <[email protected]>
7839    
7840 jonathan 1169 This is largely a collection of bug fixes. We also handle the
7841     case where gdal is not on the system. The XMLReader and XMLWriter
7842     classes were moved into there own files to resolve some circular
7843     import references and because they shouldn't really be in the
7844     file that is dediciated to reading/writing session files since
7845     they are also used elsewhere.
7846    
7847     * Thuban/Model/classgen.py: Renamed functions to follow the
7848     function_names_with_underscores style. Fixes RTbug #1903.
7849     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7850    
7851     * Thuban/Model/layer.py: Import gdal only if it available.
7852     (RasterLayer): Handle the case where the gdal library is unavailable.
7853     Addresses RTbug #1877.
7854    
7855     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7856     xmlreader.py.
7857    
7858 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
7859    
7860     This is largely a collection of bug fixes. We also handle the
7861     case where gdal is not on the system. The XMLReader and XMLWriter
7862     classes were moved into there own files to resolve some circular
7863     import references and because they shouldn't really be in the
7864     file that is dediciated to reading/writing session files since
7865     they are also used elsewhere.
7866    
7867     * Thuban/Model/classgen.py: Renamed functions to follow the
7868     function_names_with_underscores style. Fixes RTbug #1903.
7869     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7870    
7871     * Thuban/Model/layer.py: Import gdal only if it available.
7872     (RasterLayer): Handle the case where the gdal library is unavailable.
7873     Addresses RTbug #1877.
7874    
7875     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7876     xmlreader.py.
7877    
7878 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
7879     file xmlwriter.py.
7880    
7881     * Thuban/Model/resource.py: Renamed functions to following the
7882     function_names_with_underscores style.
7883     (has_gdal_support): New function that returns true if the gdal
7884     library is available. Addresses RTbug #1877.
7885    
7886     * Thuban/UI/application.py (ThubanApplication.OpenSession):
7887     Display a message box if the gdal library is not available, but
7888     only if there are any layers that would use it. Addresses RTbug #1877.
7889    
7890     * Thuban/UI/classgen.py: Use renamed projection resource functions.
7891     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
7892     when using integers versus floats.
7893    
7894     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
7895     determine if the "Add Image Layer" menu option should be
7896     greyed out or not. Addresses RTbug #1877.
7897    
7898     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
7899    
7900     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
7901     optimize if a raster layer is visible. Fixes RTbug #1931.
7902     Only draw the raster layer if the gdal library is available.
7903     Addresses RTbug #1877.
7904    
7905     * test/test_classgen.py: Add tests for generate_singletons,
7906     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
7907     (test_calculate_quantiles): Fix some tests to catch the new
7908     ValueError that is raised.
7909    
7910     * test/test_proj.py: Use renamed projection resource functions.
7911    
7912     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
7913     test for saving classified layers. Fixes RTbug #1902.
7914     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
7915    
7916 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
7917    
7918     Fix for http://intevation.de/rt/webrt?serial_num=1900.
7919    
7920     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
7921    
7922     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
7923     multiplechoicedialog.py rather than from the wxPython library.
7924    
7925 frank 1151 2003-06-11 Frank Koormann <[email protected]>
7926    
7927 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
7928     update.
7929    
7930     2003-06-11 Frank Koormann <[email protected]>
7931    
7932 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
7933     determine the absolute .thuban/thuban directory under
7934     "posix" (os.expanduser) and "nt" (read AppData registry key).
7935    
7936     * Thuban/Model/resource.py: Use get_application_dir
7937    
7938     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7939     Use get_application_dir.
7940    
7941 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
7942    
7943 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
7944     the messages MAP_LAYERS_REMOVED messages
7945     (LayerTableFrame.OnClose): Unsubscribe from it.
7946     (LayerTableFrame.map_layers_removed): New. Receiver for
7947     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
7948     dialog is showing is removed.
7949    
7950     2003-06-10 Bernhard Herzog <[email protected]>
7951    
7952 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
7953     of the receivers list so that unsubscribing in a receiver doesn't
7954     modify it while iterating over it.
7955    
7956     * test/test_connector.py
7957     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
7958     unsubscribing in a receiver works correctly. See docstring for
7959     details
7960    
7961     2003-06-10 Bernhard Herzog <[email protected]>
7962    
7963 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
7964     message.
7965    
7966     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
7967     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
7968     LAYER_CHANGED will still be sent if the classification changes.
7969    
7970     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
7971     parameter so we can subscribe to some of its messages
7972     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
7973     and the layer's LAYER_SHAPESTORE_REPLACED
7974     (Classifier.unsubscribe_messages): New. Unsubscribe from message
7975     subscribed to in __init__
7976     (Classifier.map_layers_removed)
7977     (Classifier.layer_shapestore_replaced): receivers for the messages
7978     subscribed to in __init__. Unsubscribe and close the dialog
7979    
7980     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
7981     the map to the Classifier dialog
7982    
7983     * test/test_layer.py (SetShapeStoreTests): Derive from
7984     SubscriberMixin as well so we can test messages
7985     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
7986     messages
7987     (SetShapeStoreTests.tearDown): Clear the messages again
7988     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
7989     for the modified flag too
7990     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
7991     to check whether SetShapeStore sets the modified flag
7992     (SetShapeStoreTests.test_set_shape_store_different_field_name)
7993     (SetShapeStoreTests.test_set_shape_store_same_field)
7994     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
7995     Add tests for the messages. This checks both the new
7996     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
7997    
7998 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
7999    
8000     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
8001     the menu items.
8002    
8003 frank 1134 2003-06-05 Frank Koormann <[email protected]>
8004    
8005 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
8006     Layout reimplemented without panel. Make life easier to fit the list
8007     in the dialog.
8008    
8009     2003-06-05 Frank Koormann <[email protected]>
8010    
8011 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
8012     once on initialisation (Former implementation resulted in multiple
8013     entries for each projection).
8014     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
8015     if set, select the projection found under the specified name. This
8016     overwrites any other selection estimate.
8017     Removed projchoice filling from this method.
8018     (ProjFrame._OnSave, ProjFrame._OnAddToList):
8019     Updated call of ProjFrame.__FillAvailList
8020     (LCCPanel._DoLayout): Moved parameter controls in more common order.
8021    
8022     * Resources/Projections/defaults.proj: Extended defaults representing
8023     various common European projections.
8024    
8025     2003-06-05 Frank Koormann <[email protected]>
8026    
8027 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
8028     Use ListCtrl instead of GridCtrl
8029    
8030     * Thuban/Model/resource.py:
8031     Guess location of .thuban directory from tempdir parent directory.
8032    
8033     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
8034     Guess location of .thuban directory from tempdir parent directory.
8035    
8036 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
8037    
8038     Do not cache the values returned by the tree widget's
8039     GetFirstChild and GetNextChild methods because it led to lots of
8040     segfaults. The new way requires more brute force but is more
8041     reliable.
8042    
8043     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
8044     variable layer2id
8045     (LegendTree.find_layer): New method to do with brute force what
8046     layer2id tried to accomplish
8047     (LegendTree._OnMsgLayerChanged)
8048     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
8049     Use find_layer instead of layer2id
8050     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
8051     update layer2id anymore
8052     (LegendTree._OnMsgMapLayersRemoved)
8053     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
8054    
8055 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
8056    
8057     * Thuban/Model/classgen.py (GenQuantiles0): New function.
8058    
8059 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
8060    
8061 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
8062     New commands.
8063     (main_menu): Add the new commands.
8064     (MainWindow.TableRename): New. Implementation of the table_rename
8065     command.
8066     (MainWindow.RenameLayer): New. Implementation of the layer_rename
8067     command.
8068    
8069     * Thuban/Model/session.py (Session.AddTable): call self.changed to
8070     set the modified flag
8071    
8072     * test/test_session.py (TestSessionSimple.test_add_table): Test
8073     whether the modified flag is set properly
8074    
8075     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
8076     instead of issue so that the modified flags get updated.
8077    
8078     * test/test_base.py (SomeTitledObject): Derive from Modifiable
8079     instead of Publisher to reflect reality better and to accomodate
8080     the fact that SetTitle now calls changed instead of issue
8081    
8082     2003-06-02 Bernhard Herzog <[email protected]>
8083    
8084     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
8085     acquisition has to happen before the try in a try-finally.
8086    
8087     2003-06-02 Bernhard Herzog <[email protected]>
8088    
8089 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
8090     possible that a layer is removed that is not currently selected in
8091     the legend so don't check for this.
8092    
8093 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
8094    
8095 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
8096     variables to None that have direct or indirect references to
8097     shapefiles or dbf files to make sure that they do go away and the
8098     files are closed.
8099    
8100     2003-05-30 Bernhard Herzog <[email protected]>
8101    
8102 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
8103     availImgListIndices when a new image list is created
8104    
8105     2003-05-30 Bernhard Herzog <[email protected]>
8106    
8107 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
8108     changing_selection to indicate whether the LegendTree code itself
8109     is currently changing the selection
8110     (LegendTree.normalize_selection): New method to normalize the
8111     selection by selecting the layer item even if the user clicked on
8112     the classification.
8113     (LegendTree._OnSelChanged): normalize the selection. This works
8114     around a bug in wx which doesn't keep track of the selection
8115     properly when subtrees are deleted.
8116    
8117     2003-05-30 Bernhard Herzog <[email protected]>
8118    
8119 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
8120     maximum and minimum scale factors.
8121    
8122     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
8123     changes in classgen.py
8124    
8125 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
8126    
8127     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
8128     all the methods functions. Fixes RTBug #1903.
8129    
8130     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
8131     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
8132     RTBug #1907.
8133    
8134     * Thuban/UI/classgen.py: Use classgen functions that were part
8135     of the ClassGenerator class. Put try/finally blocks around
8136     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
8137     RTBug #1904.
8138    
8139     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
8140    
8141     * Thuban/UI/legend.py: The legend was cleared and repopulated any
8142     time something changed which caused some state to be lost such
8143     as which children were expanded or collapsed. Fixes RTBug #1901.
8144     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
8145     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
8146     the legend but not in the map.
8147     (LegendTree.__FillTree): Move main functionality out into smaller
8148     methods that can be used by other methods.
8149     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
8150     if they are available.
8151     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
8152     that we override the wxTreeCtrl method. Iterate over children
8153     and call __RemoveLayer.
8154     (LegendTree.__AddLayer): New. Add a new layer to the legend.
8155     (LegendTree.__RemoveLayer): Remove a layer from the legend.
8156     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
8157     Should only be called with the id of a layer branch.
8158     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
8159     Returns the root item or creates one if necessary.
8160    
8161     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
8162     ProjectRasterFile with tuple arguments instead of strings.
8163    
8164     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
8165     with try/finally. Fixes RTBug #1904.
8166    
8167     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
8168     with try/finally. Fixes RTBug #1904.
8169     (MapCanvas.FitSelectedToWindow): If a single point is selected
8170     simply center it on the display. Fixes RTBug #1849.
8171    
8172     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
8173     to be compiled as a standalone app. Now the code can only be
8174     called from Python which simplifies the parameter passing.
8175     (ProjectRasterFile): Handle Python arguments. Remove code that
8176     checks for a destination dataset. Add more clean up code.
8177    
8178     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
8179     TestMapWithContents.test_lower_layer_bottom):
8180     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
8181     Fixes RTBug #1907.
8182    
8183     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
8184     extent to the map when the legend is toggled. Fixes RTBug #1881.
8185    
8186 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
8187    
8188     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
8189     unsubscribes all that is subcribed in __init__.
8190    
8191 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
8192    
8193 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
8194     (MainWindow.CanDuplicateLayer): New methods to implement the
8195     Layer/Duplicate command.
8196     (layer_duplicate command): New.
8197     (main_menu): Add layer_duplicate to the Layer menu.
8198    
8199     2003-05-28 Bernhard Herzog <[email protected]>
8200    
8201 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
8202     renderer so that NULL/None values get displayed differently (by a
8203     gray rectangle).
8204     (TableGrid.__init__): Override the default renderers
8205    
8206     2003-05-28 Bernhard Herzog <[email protected]>
8207    
8208 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
8209     classification to "None" if the type of the field has changed.
8210    
8211     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
8212     test for the Layer.SetShapeStore method
8213    
8214 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
8215 jan 1085
8216 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
8217     does not necessarily have a filename).
8218    
8219     2003-05-28 Jan-Oliver Wagner <[email protected]>
8220    
8221 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
8222     sort the selection list for the dialog.
8223    
8224 frank 1083 2003-05-28 Frank Koormann <[email protected]>
8225    
8226     * extensions/thuban/wxproj.cpp
8227     (project_point): Removed cast to int for projected point coordinates.
8228     (shape_centroid): Return last point if all polygon vertices fall
8229     to one point.
8230    
8231 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
8232    
8233 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
8234     with layers that don't have shapestores, i.e. raster layers.
8235    
8236     2003-05-28 Bernhard Herzog <[email protected]>
8237    
8238 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
8239     when determining the title from the filename.
8240    
8241     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
8242     reflect changes in the way the title is derived from the filename
8243    
8244 frank 1077 2003-05-28 Frank Koormann <[email protected]>
8245    
8246     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
8247     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
8248    
8249 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
8250    
8251 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
8252     delegate SelectedLayer.
8253     (MainWindow.LayerUnjoinTable): Implement.
8254     (_can_unjoin): New. Helper function for the sensitivity of the
8255     layer/unjoin command.
8256    
8257     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
8258     (DerivedShapeStore.OrigShapeStore): New. Return the original
8259     shapestore. Used to figure out how to unjoin.
8260     (DerivedShapeStore.Shapefile): Fix a typo.
8261    
8262     2003-05-27 Bernhard Herzog <[email protected]>
8263    
8264 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
8265     well
8266     (JoinDialog.__init__): Use the layer parameter and only build the
8267     left choice when a layer is given
8268     (JoinDialog.OnJoin): Handle layer joins as well
8269     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
8270     that the user selects the "Select..." item. The sensitivitly
8271     updating is now in update_sensitivity
8272     (JoinDialog.y): New method to refactor the sensitivity update of
8273     the join button into its own method.
8274    
8275     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
8276    
8277     2003-05-27 Bernhard Herzog <[email protected]>
8278    
8279 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
8280     iff there are unreferenced tables in the session
8281    
8282     2003-05-27 Bernhard Herzog <[email protected]>
8283    
8284 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
8285    
8286     * Thuban/Model/session.py (Session.UnreferencedTables): New method
8287     to return tables that are not referenced by other tables or shape
8288     stores and can be removed.
8289     (Session.RemoveTable): Issue a TABLE_REMOVED message after
8290     removing the table
8291    
8292     * Thuban/UI/mainwindow.py: Remove unused imports
8293     (MainWindow.TableClose): Implement.
8294    
8295     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
8296     messages so that the frame will be automatically closed when a new
8297     session is opened or the table is removed.
8298     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
8299     __init__
8300     (TableFrame.close_on_session_replaced)
8301     (TableFrame.close_on_table_removed): New. Subscribers that close
8302     the window
8303    
8304     * test/test_session.py (TestSessionMessages.test_remove_table)
8305     (TestSessionSimple.test_remove_table): Move the test to
8306     TestSessionSimple and add test for the TABLE_REMOVED message
8307     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
8308     (TestSessionSimple.test_unreferenced_tables) New. Test for the
8309     UnreferencedTables method.
8310     (UnreferencedTablesTests): New. Class with some more sophisticated
8311     tests for UnreferencedTables.
8312    
8313 frank 1065 2003-05-27 Frank Koormann <[email protected]>
8314    
8315 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
8316     display has some unwanted side effects. Removed again.
8317    
8318     2003-05-27 Frank Koormann <[email protected]>
8319    
8320 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
8321    
8322     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
8323    
8324 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
8325    
8326 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
8327     Menu.RemoveItem().
8328 jan 1062
8329 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
8330     the menu.
8331 jan 1062
8332 frank 1059 2003-05-27 Frank Koormann <[email protected]>
8333    
8334     Nonmodal dialogs without parent (i.e. they can fall behind the main
8335     window)
8336    
8337     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
8338     all dialogs in the dialogs dictionary and the canvas.
8339    
8340     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
8341     parent, i.e. can fall behind other windows.
8342     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
8343     dictionary before removing it.
8344    
8345     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
8346    
8347     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
8348     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
8349     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
8350    
8351 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
8352    
8353 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
8354     tableview dialog
8355     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
8356     Also, don't use the table's titles as the dialog names. The titles
8357     aren't guaranteed to be unique.
8358     (MainWindow.TableOpen): Open a table view dialog after opening the
8359     table
8360    
8361     2003-05-27 Bernhard Herzog <[email protected]>
8362    
8363 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
8364     effect can be achieved by simply closing the window showing the
8365     table.
8366     (MainWindow.TableHide): Removed.
8367     (main_menu): Removed "table_hide"
8368    
8369 frank 1051 2003-05-27 Frank Koormann <[email protected]>
8370    
8371     Fix legend tree display problems under Win32
8372    
8373     * Thuban/UI/legend.py: BMP_SIZE_W = 15
8374     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
8375     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
8376    
8377     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
8378    
8379 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
8380    
8381     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
8382     'after' now allows to insert separators almost anywhere in the menu.
8383    
8384 frank 1046 2003-05-27 Frank Koormann <[email protected]>
8385    
8386     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
8387     "S" of selection box label to hint on hot key (Alt-S). Works under
8388     Win32 but is ignored under GTK.
8389    
8390     2003-05-26 Frank Koormann <[email protected]>
8391    
8392     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
8393     Center Choices.
8394    
8395 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
8396    
8397 bh 1044 Remove the Precision methods again. They're too DBF specific to be
8398     part of the table interface and they're only used in table_to_dbf
8399     anyway.
8400    
8401     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
8402     fixed precision of 12 for doubles.
8403     (TransientTableBase.Precision): Removed
8404     (AutoTransientTable.Width): Delegate to self.table.
8405    
8406     * Thuban/Model/table.py (DBFTable.Precision)
8407     (MemoryTable.Precision): Removed.
8408     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
8409     (table_to_dbf): Use a fixed precision of 12 for floats unless the
8410     column object specifies something else.
8411    
8412     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
8413     test for table_to_dbf
8414    
8415     2003-05-26 Bernhard Herzog <[email protected]>
8416    
8417     * test/test_transientdb.py
8418     (TestTransientTable.run_iceland_political_tests): Fix a comment.
8419    
8420     2003-05-26 Bernhard Herzog <[email protected]>
8421    
8422 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
8423     implementation. Mark parts of the file format strings for
8424     localization.
8425    
8426     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
8427     file and add the table to the tables managed by the session
8428    
8429 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
8430     New. test case for OpenTableFile
8431    
8432 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
8433    
8434 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
8435     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
8436     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
8437     Replace the true/false of wxWindows by True/False of Python 2.2.1.
8438    
8439     2003-05-26 Jan-Oliver Wagner <[email protected]>
8440    
8441 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
8442     already a selection present, update the grid accordingly.
8443 jan 1033
8444     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
8445     resizeable and increase its initial size.
8446    
8447 frank 1030 2003-05-26 Frank Koormann <[email protected]>
8448    
8449     Table export functionality
8450    
8451     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
8452     Return width (in characters) for a column.
8453     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
8454     (table_to_dbf): Write table to dbf file.
8455     (table_to_csv): Write table to csv file.
8456    
8457     * Thuban/Model/transientdb.py (TransientTableBase.Width,
8458     TransientTableBase.Precision): Return column width and precision.
8459    
8460     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
8461     or table_to_csv depending on file selection.
8462    
8463     * test/test_dbf_table.py:
8464     Test table_to_dbf (extension of former part of test).
8465    
8466     * test/test_csv_table.py:
8467     Test table_to_csv.
8468    
8469 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
8470    
8471 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
8472     Use QueryTableFrame instead of TableFrame.
8473 jan 1021
8474 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
8475     table window with 'Layer Table:' instead of 'Table:'.
8476    
8477     2003-05-23 Jan-Oliver Wagner <[email protected]>
8478    
8479     Give all tables a title via mix-in TitledObject.LayerShowTable
8480    
8481 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
8482     only if it exists.
8483    
8484     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
8485     and call its init-method with a default title. Remove Title() method.
8486    
8487     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
8488     AutoTransientTable): mix-in TitledObject and call its init-method with
8489     a default title. Remove Title() method.
8490    
8491 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
8492    
8493     * Thuban/Model/session.py (Session.AddShapeStore): Define
8494     AddShapeStore analogously to AddTable.
8495    
8496     * test/test_session.py (TestSessionSimple.test_add_shapestore):
8497     New. Test for AddShapeStore
8498    
8499 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
8500    
8501     Introducing QueryTableFrame and a very coarse ShowTable implementation.
8502    
8503     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
8504     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
8505     The latter implements the selection GUI without dependency on a layer.
8506     LayerTableFrame now is derived from QueryTableFrame and connects
8507     to a layer.
8508    
8509     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
8510     implementation that still needs work.
8511    
8512     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
8513    
8514 frank 1011 2003-05-22 Frank Koormann <[email protected]>
8515    
8516     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
8517     Added "outer_join = False" as optional parameter.
8518     (TransientJoinedTable.create): If outer join is true, perform a
8519     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
8520     the left table. Records not matching are filled with 0 / None.
8521    
8522     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
8523     (JoinDialog.OnJoin): Consider outer join check box.
8524    
8525 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
8526    
8527 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
8528     somewhat safer way. Storing the traceback in a local variable can
8529     lead to memory leaks
8530    
8531     2003-05-22 Bernhard Herzog <[email protected]>
8532    
8533 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
8534     the wxMessageDialog's Destroy() method.
8535    
8536 frank 1004 2003-05-22 Frank Koormann <[email protected]>
8537    
8538     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
8539     TransientTable.Title()
8540    
8541     2003-05-22 Frank Koormann <[email protected]>
8542    
8543     Join Dialog, initial version.
8544    
8545     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
8546    
8547     * Thuban/UI/join.py (JoinDialog): Functional implementation of
8548     former framework. Renamed Table1/Table2 to LeftTable/RightTable
8549     in all occurences.
8550    
8551     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
8552     Typo fixed.
8553    
8554 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
8555    
8556 bh 999 Give the tables titles so that the GUI can display more meaningful
8557     names. For now the titles are fixed but depend on e.g. filenames
8558     or the titles of the joined tables.
8559    
8560     * Thuban/Model/transientdb.py (TransientTable.Title)
8561     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
8562    
8563     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
8564    
8565     * test/test_transientdb.py
8566     (TestTransientTable.test_auto_transient_table_title): New. Test
8567     for the Title method
8568     (TestTransientTable.test_transient_joined_table)
8569     (TestTransientTable.test_transient_table): Add test for the Title
8570     methods
8571    
8572     * test/test_memory_table.py (TestMemoryTable.test_title): New.
8573     Test for the Title method
8574    
8575     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
8576     the Title method
8577    
8578     2003-05-22 Bernhard Herzog <[email protected]>
8579    
8580 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8581     Provide a better way to destroy the layers
8582     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
8583     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8584     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
8585     the new way to destroy the layers.
8586     (TestLayer.test_derived_store): New. Test for using a layer with a
8587     DerivedShapeStore
8588    
8589     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
8590     filename if the shape store actually has one.
8591    
8592     2003-05-22 Bernhard Herzog <[email protected]>
8593    
8594 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
8595     for the filename
8596    
8597     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
8598     for the FileName method
8599     (TestDBFTableWriting.test_write): Fix spelling of filename
8600    
8601 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
8602    
8603     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
8604     from SciParam that now really is immutable.
8605    
8606 frank 992 2003-05-22 Frank Koormann <[email protected]>
8607    
8608     Layer Top/Bottom placement added to legend.
8609    
8610     * Thuban/UI/legend.py
8611     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
8612     bound to tool events.
8613     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
8614     New, methods binding the event methods with the map methods.
8615    
8616     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
8617     layer at top/bottom of layer stack.
8618    
8619     * Resources/Bitmaps/top_layer.xpm: New button icon.
8620    
8621     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
8622    
8623 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
8624    
8625     * Thuban/Model/session.py (Session.RemoveTable): New method to
8626     remove tables
8627    
8628     * test/test_session.py (TestSessionSimple.test_remove_table): New.
8629     Test for RemoveTable
8630    
8631 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
8632    
8633     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
8634     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
8635    
8636 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
8637    
8638 bh 985 Implement a way to discover dependencies between tables and
8639     shapestores.
8640    
8641     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
8642     (TransientJoinedTable.Dependencies)
8643     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
8644     interface
8645     (TransientJoinedTable.__init__): Keep tack of the original table
8646     objects in addition to the corresponding transient tables.
8647    
8648     * Thuban/Model/table.py (DBFTable.Dependencies)
8649     (MemoryTable.Dependencies): New. Implement the dependencies
8650     interface
8651    
8652     * Thuban/Model/data.py (ShapeTable): New. Helper class for
8653     ShapefileStore
8654     (ShapefileStore.__init__): Use ShapeTable instead of
8655     AutoTransientTable
8656     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
8657     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
8658     methods for filename and type
8659     (ShapefileStore.Dependencies): New. Implement the dependencies
8660     interface
8661     (DerivedShapeStore): New class to replace SimpleStore. The main
8662     difference to SimpleStore is that it depends not on a shapefile
8663     but another shapestore which expresses the dependencies a bit
8664     better
8665     (SimpleStore.__init__): Add deprecation warning.
8666    
8667     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
8668     Test for the Dependencies method.
8669    
8670     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
8671     New. Test for the Dependencies method.
8672    
8673     * test/test_transientdb.py
8674     (TestTransientTable.test_auto_transient_table_dependencies): New.
8675     Test for the Dependencies method.
8676     (TestTransientTable.test_transient_joined_table): Add test for the
8677     Dependencies method.
8678    
8679     * test/test_session.py (TestSessionSimple.setUp)
8680     (TestSessionSimple.tearDown): New. Implement a better way to
8681     destroy the sessions.
8682     (TestSessionSimple.test_initial_state)
8683     (TestSessionSimple.test_add_table): Bind session to self.session
8684     so that it's destroyed by tearDown
8685     (TestSessionSimple.test_open_shapefile): New. Test for
8686     OpenShapefile and the object it returns
8687    
8688     2003-05-22 Bernhard Herzog <[email protected]>
8689    
8690 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
8691     register tables with the session.
8692     (Session.Tables): Return the tables registered with AddTable too.
8693    
8694     * test/test_session.py (TestSessionSimple.test_add_table): New.
8695     Test case for the AddTable method
8696    
8697 frank 981 2003-05-22 Frank Koormann <[email protected]>
8698    
8699     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
8700     lower right corner, center labels for selections, initialize controls
8701     in reasonable order for keyboard navigation.
8702    
8703     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
8704     (ProjFrame.__DoOnProjAvail): Determine position of current projection
8705     using the wxListBox.FindString() method. Still a problem (#1886)
8706    
8707     * Thuban/UI/classifier.py
8708     (Classifier.__init__, SelectPropertiesDialog.__init__)
8709    
8710     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
8711     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
8712     different classification types from here to __init__.
8713     (GenUniquePanel.__init__): Set the column width of the first field
8714     in the Field ListCtrl to the full width.
8715    
8716     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
8717     Button to 'Export'. Center Buttons in Selection Box, set Focus to
8718     Grid.
8719     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
8720     changes focus to the Selection when pressing "Alt-S".
8721    
8722     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
8723     the text if not visible. The italic font sometimes exceeds the
8724     rendering area.
8725    
8726 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
8727 jonathan 971
8728 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
8729     to OnClose so that Thuban closes correctly.
8730    
8731     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
8732     DockFrame.OnClose, not DockFrame._OnClose.
8733    
8734     2003-05-21 Jonathan Coles <[email protected]>
8735    
8736 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
8737     references to 'inf' and use new Range __init__ to pass floats
8738     directly rather than converting them to strings first.
8739     Fixes RTBug #1876.
8740    
8741     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
8742     Use new Range ___init__ to pass floats.
8743    
8744     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
8745     filename is a valid image file. Throw IOError otherwise.
8746    
8747     * Thuban/Model/range.py: Brought over new Range from SciParam that
8748     is immutable and has an __init__ which can accept floats.
8749    
8750     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
8751     into try block. AddLayer doesn't throw any exceptions anymore.
8752     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
8753     try block.
8754    
8755     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
8756     the first item in choices. Fixes RTBug #1882.
8757    
8758     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
8759     has gone to 0 which is a serious problem. abort.
8760     (MapRenderer.draw_raster_layer): Catch IOError seperately and
8761     print the error from GDAL.
8762    
8763     * Thuban/UI/tableview.py (TableGrid.__init__): Call
8764     ToggleEventListeners to turn on listening.
8765     (TableGrid.ToggleEventListeners): New. Turns event listening on
8766     and off so as to prevent excessive messages.
8767     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
8768     to suppress excessive messages when selecting many rows.
8769     Fixes RTBug #1880.
8770    
8771     * Thuban/UI/view.py: Added checks against if scale == 0. This
8772     is a serious problem that can occur when an image without
8773     geo data is loading and causes the map projection bounds to
8774     go to infinity. Right now, the solution is to simply try
8775     to recover.
8776    
8777     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
8778     to set the MFILEReceiver attributes even if the data is NULL.
8779    
8780     * extensions/thuban/gdalwarp.cpp: Improved the error handling
8781     and passed GDAL messages back up to the Python layer. Also
8782     tried to fix some memory leaks that were present in the original
8783     utility but didn't matter because the program aborted.
8784    
8785     * test/test_range.py: Copied over tests from SciParam. Removed
8786     tests against importing. Fixes RTBug #1867.
8787    
8788 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
8789    
8790     * test/test_load.py: Remove unused imports and restructure the
8791     test code
8792     (LoadSessionTest): Split into one class for each test and turn
8793     LoadSessionTest itself into the base class for all such session
8794     tests.
8795     (ClassificationTest): New base class for load tests that test
8796     classifications
8797     (TestSingleLayer, TestLayerVisibility, TestClassification)
8798     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
8799     for the individual tests
8800    
8801     * test/support.py (FileLoadTestCase.filename): New base class for
8802     file loading tests
8803    
8804 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
8805    
8806     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
8807     Mercator' to 'UTM Zone 32' as a more convenient example.
8808     Added 'Gauss Krueger Zone 6'.
8809    
8810     * Data/iceland_sample_raster.thuban: political polygon now
8811     filled transparent to have the raster image visible at once.
8812    
8813 frank 952 2003-05-21 Frank Koormann <[email protected]>
8814    
8815     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
8816     OnClose() to keep in sync with extensions. Internally Thuban
8817     still uses "underscored" names.
8818    
8819 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
8820    
8821     This puts back Raster layer support. These layers support projections
8822     through the GDAL library. Currently, the CVS version is being used.
8823     There are no Debian packages available although this may change soon.
8824     A GDAL driver was extended to support writing to memory rather to
8825     files.
8826    
8827     There is still some work that needs to be done, such as some error
8828     handling when loading invalid images or when there is a problem
8829     projecting the image. This putback simply checks in the majority
8830     of the work.
8831    
8832     * setup.py: Add gdalwarp library extension.
8833    
8834     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
8835     Defaults to False, but can be overridden by subclasses if they
8836     support classification.
8837     (RasterLayer): New. Defines a new layer that represents an
8838     image.
8839    
8840     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
8841     tag handler.
8842     (SessionLoader.start_layer): Encode the filename.
8843     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
8844     New. Supports reading a rasterlayer tag.
8845    
8846     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
8847    
8848     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
8849     get a string in Latin1. If we get such as string convert it to
8850     unicode first, otherwise leave if alone before encoding.
8851     (SessionSaver.write_layer): Add support for writing both Layers
8852     and RasterLayers.
8853    
8854     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8855     The right argument may not be a string, it could also be a Column.
8856    
8857     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
8858     Make initial window size 600x400. Fixes RTBug #1872.
8859    
8860     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
8861     the dialog is constructed so that we can support layers that
8862     do not have classifications.
8863     (Classifier._OnTry): Only build a classification if the layer
8864     supports one.
8865    
8866     * Thuban/UI/legend.py: Change all checks that a layer is an
8867     instance of Layer into checks against BaseLayer.
8868     (LegendTree.__FillTreeLayer): Only add children to a branch if
8869     the layer supports classification.
8870    
8871     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
8872     MainWindow.OpenSession): Don't proceed with an action if the
8873     user chooses Cancel when they are asked to save changes.
8874     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
8875     user to select an image file. Create a new RasterLayer and add
8876     it to the map.
8877    
8878     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
8879     for rendering RasterLayer layers.
8880     (MapRenderer.draw_raster_layer): Actually method that calls
8881     the GDALWarp python wrapper and constructs an image from the
8882     data returned.
8883    
8884     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
8885     Choices symbols to match those used in the table query method.
8886     Replace deprecated method calls on table with new method names.
8887    
8888     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
8889     how small the scale can get. This still needs more testing.
8890    
8891     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
8892     Provides a driver to output in .bmp format.
8893    
8894     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
8895     New. Provides IO routines which write to memory, rather than a file.
8896    
8897     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
8898     of the gdalwarp utility provided in GDAL. Added function calls
8899     that can be accessed from python.
8900    
8901     * Data/iceland_sample_raster.thuban: New. Sample file that uses
8902     a raster layer.
8903    
8904     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
8905     layer image data.
8906    
8907     * Doc/thuban.dtd: Added rasterlayer attribute definition.
8908    
8909     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
8910     tests associated with the raster layer code.
8911    
8912     * test/test_transientdb.py
8913     (TestTransientTable.test_auto_transient_table_query): Added a test
8914     for using a Column object as the "right" parameter to a query.
8915    
8916 frank 924 2003-05-19 Frank Koormann <[email protected]>
8917    
8918 frank 927 * Thuban/version.py (get_changelog_date):
8919     Catch exceptions if ChangeLog does not exist.
8920    
8921     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
8922    
8923     2003-05-19 Frank Koormann <[email protected]>
8924    
8925 frank 924 Extended version information for Thuban
8926    
8927     * Thuban/version.py: New, version information for Thuban: Last
8928     modification date and last ChangeLog entry date.
8929    
8930     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
8931     information: Display Thuban, wxPython and Python version.
8932    
8933 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
8934    
8935 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
8936     __future__ import for nested_scopes as Thuban relies on Python 2.2
8937     now.
8938     (XMLWriter.encode): Remove the special case for a None argument.
8939     In the saver encode is always called with a string argument.
8940    
8941     2003-05-16 Bernhard Herzog <[email protected]>
8942    
8943 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
8944     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
8945     of the bug was that e.g. float("1.2") would fail. Thuban now
8946     requires 2.4.x.
8947    
8948 frank 917 2003-05-16 Frank Koormann <[email protected]>
8949    
8950     Printing enhancement and WMF export (under Win32)
8951    
8952     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
8953     ScreenRenderer. Renders Map, Legend and Scalebar for export.
8954     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
8955     PrintRender.
8956    
8957     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
8958     to fullfil information needed for PrinterRenderer.
8959     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
8960     (MapCanvas.Print): Adapted to new MapPrintout.
8961     (OutputTransform): General calculations to transform from canvas
8962     coordinates to export/printing devices.
8963    
8964     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
8965     new method_command to call ExportMap, with platform dependency (only
8966     __WXMSW__)
8967    
8968     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
8969     of scalebar drawing area as new parameters.
8970    
8971     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
8972    
8973     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
8974     Update to extended scalebar.DrawScalebar header.
8975    
8976     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
8977    
8978     * test/test_scalebar.py: Made test executable as standalone.
8979    
8980 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
8981    
8982     * Thuban/Model/table.py (Table): Remove this compatibility alias
8983     for DBFTable.
8984    
8985     * test/test_table.py: Import DBFTable as Table because that alias
8986     doesn't exist anymore.
8987    
8988     * Thuban/UI/classgen.py: Remove some unused imports
8989    
8990 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
8991    
8992     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
8993     Fix docstring.
8994     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
8995     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
8996     values of the supplied range to determine the beginning and end
8997     bounds of the generated classes.
8998    
8999     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
9000     do not have a leading 0 (.5 is now accepted as well as 0.5).
9001    
9002     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
9003     call to ClassGenerator.GenUniformDistribution.
9004    
9005     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
9006     layout bug with the 'Projection' label.
9007    
9008     * test/support.py (FloatTestCase): New. Needed for the Range tests.
9009    
9010     * test/test_range.py: New. Imported from SciParam.
9011    
9012 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
9013    
9014 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
9015     to table.UniqueValues() with calls that retrieve all the values
9016     from the table. This will need to be replaced by a method on table
9017     which can simply return the list (perhaps more efficiently).
9018    
9019     2003-05-12 Jonathan Coles <[email protected]>
9020    
9021 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
9022     Refer to the documentation for details.
9023    
9024     * test/test_classgen.py: Modified Quantile tests to use the
9025     new return values.
9026    
9027     * Thuban/Model/classgen.py
9028     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
9029     use new return values from CalculateQuantiles to produce the correct
9030     range bounds in the Classification.
9031     (ClassGenerator.CalculateQuantiles): Add more comments describing
9032     the return values and parameters. Make minor adjustments to improve
9033     the legibility of the code. Fix problem with adjusted not being set
9034     in most cases.
9035    
9036 frank 893 2003-05-12 Frank Koormann <[email protected]>
9037    
9038     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
9039     and latin1. Fixes #1851 finally.
9040    
9041 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
9042    
9043 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
9044    
9045     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
9046     Clean up debugging statement, add comments, fix a small bug in the
9047     returned adjusted percentiles.
9048    
9049     2003-05-09 Jonathan Coles <[email protected]>
9050    
9051 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
9052     and such ranges can now be saved and loaded from disk.
9053    
9054     Quantiles are now available in the Classification Generator.
9055    
9056     Initial support for building Queries on a table. Doesn't do anything
9057     but run some tests.
9058    
9059     * Thuban/Model/classification.py: Explicit imports.
9060     (ClassGroupRange): Use the Range class to store the underlying
9061     range information. The interface remains the same, except for
9062     GetRange(), and you can also supply a Range object as the min
9063     parameter to SetRange or __init__.
9064    
9065     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
9066     string appropriately for use in Thuban. Fixes RTbug #1851.
9067     (SessionLoader.end_projection): Handle the context of the
9068     projection tag a bit better by looking at what objects are not
9069     None. There was an assumption that a projection tag for a map
9070     could occur before any layers.
9071     (SessionLoader.start_clrange): Provide backward compatibility for
9072     reading min/max values as well as the new range parameter.
9073    
9074     * Thuban/Model/map.py: Explicit imports.
9075    
9076     * Thuban/Model/resource.py: Import _.
9077     (ProjFileSaver.write): write header using projfile.dtd.
9078    
9079     * Thuban/Model/save.py: Explicit imports.
9080     (XMLWriter.encode): New. Encode the given string from a format
9081     used by Thuban into UTF-8. Fixes RTbug #1851.
9082    
9083     * Thuban/UI/classgen.py: Explicit imports.
9084     (ClassGenDialog.__init__): Clean up the code and add support
9085     for Quantiles.
9086     (ClassGenDialog.OnOK): Add support for Quantiles.
9087     (GenQuantilesPanel): New. Input panel for Quantiles.
9088     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
9089     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
9090    
9091     * Thuban/Model/classgen.py: New. Contains all the classes named above.
9092    
9093     * Thuban/UI/classifier.py: Explicit imports.
9094     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
9095     ClassTable.SetValueAsCustom): Reworked to use new Range class.
9096    
9097     * Thuban/UI/legend.py: Explicit imports.
9098    
9099     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
9100     a Table menu and associated method calls.
9101     (MainWindow.choose_color): Removed. No longer needed.
9102    
9103     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
9104     should be disabled if no projection is selected in the available
9105     list.
9106    
9107     * Thuban/UI/renderer.py: Explicit imports.
9108    
9109     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
9110     with correctly selecting the rows and issuing the right events.
9111     Be sure to call Skip() to allow the grid to do some of its own
9112     handling which allows the rows to actually be selected.
9113     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
9114     selecting multiple shapes.
9115     (LayerTableFrame): Support for building Queries.
9116     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
9117    
9118     * Thuban/UI/tree.py: Explicit imports.
9119    
9120     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
9121     table view can call it.
9122    
9123     * test/test_classification.py: Explicit imports.
9124     (TestClassification.test_ClassGroupRange): Fix test for new
9125     Range class.
9126    
9127     * Doc/thuban.dtd: Add range parameter for clrange.
9128    
9129     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
9130     object in ClassGroupRange, and also uesd for inputting ranges in
9131     the classifer table and elsewhere.
9132    
9133     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
9134     yet.
9135    
9136 frank 872 2003-05-09 Frank Koormann <[email protected]>
9137    
9138     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
9139    
9140 frank 860 2003-05-08 Frank Koormann <[email protected]>
9141    
9142 frank 870 Coding style updates
9143    
9144     * test/test_scalebar.py: Replaced tab indentation by spaces.
9145    
9146     * Thuban/UI/scalebar.py: Explicit imports.
9147    
9148     2003-05-08 Frank Koormann <[email protected]>
9149    
9150 frank 867 * Thuban/UI/scalebar.py
9151     (ScaleBar.DrawScalebar): Format string bug fixed.
9152    
9153     2003-05-08 Frank Koormann <[email protected]>
9154    
9155 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
9156    
9157     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
9158     (deriveInterval):
9159     Calculate scalebar interval and unit which fits in width for scale.
9160     (roundInterval): Round float.
9161    
9162     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
9163    
9164     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
9165    
9166     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
9167    
9168     2003-05-08 Frank Koormann <[email protected]>
9169    
9170 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
9171     Initialize ScaleBar with canvas.map
9172    
9173     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
9174     round intervals to display smarter lengths
9175     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
9176     layer. If the maps has no projection applied grey the scalebar.
9177    
9178 frank 857 2003-05-07 Frank Koormann <[email protected]>
9179    
9180     Basic Scalebar features added.
9181    
9182     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
9183    
9184     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
9185     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
9186     and the renderer.
9187    
9188     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
9189    
9190     * Thuban/UI/messages.py: SCALE_CHANGED added.
9191    
9192 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
9193    
9194 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
9195     variable shapestores to hold a list of all open shapestore objects
9196     (Session.ShapeStores): New. Accessor method for the shapestores
9197     list.
9198     (Session._add_shapestore, Session._clean_weak_store_refs): New.
9199     Internal methods to maintain the shapestores list.
9200     (Session.Tables): New. Return all tables open in the session.
9201     (Session.OpenShapefile): Insert the new ShapeStore into the
9202     shapestores list.
9203    
9204     * test/test_session.py (TestSessionSimple.test_initial_state): Add
9205     tests for ShapeStores and Tables
9206     (TestSessionWithContent.test_shape_stores)
9207     (TestSessionWithContent.test_tables): New. Test cases for
9208     ShapeStores and Tables
9209    
9210     2003-05-07 Bernhard Herzog <[email protected]>
9211    
9212 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
9213     Add comments about the optimizations used.
9214     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
9215     Implement the ReadValue table interface method.
9216    
9217     * test/test_transientdb.py
9218     (TestTransientTable.run_iceland_political_tests)
9219     (TestTransientTable.test_transient_joined_table): Add tests for
9220     ReadValue
9221    
9222 frank 848 2003-05-07 Frank Koormann <[email protected]>
9223    
9224     * Resources/Bitmaps/fulllayerextent.xpm,
9225     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
9226     new icons.
9227    
9228 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
9229    
9230 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
9231     New. Simply delegate to the transient table's version.
9232    
9233     * test/test_transientdb.py
9234     (TestTransientTable.test_auto_transient_table_query): New. Test
9235     case for AutoTransientTable's SimpleQuery
9236    
9237     2003-05-06 Bernhard Herzog <[email protected]>
9238    
9239 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
9240     Implement a simple query method for the query dialog
9241     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
9242     the row index or shapeid.
9243     (TransientTable.create): Insert the right value of the row index
9244     (TransientJoinedTable.create): Copy the row index of the left
9245     table to the joined result table
9246    
9247     * test/test_transientdb.py
9248     (TestTransientTable.test_transient_table_read_twice): Fix
9249     doc-string
9250     (TestTransientTable.test_transient_table_query): New. Test for the
9251     SimpleQuery method
9252    
9253     2003-05-06 Bernhard Herzog <[email protected]>
9254    
9255 bh 840 Convert all table users to use the new table interface. This only
9256     covers Thuban itself, not GREAT-ER or other applications built on
9257     Thuban yet, so the compatibility interface stays in place for the
9258     time being but it now issues DeprecationWarnings.
9259    
9260     Finally, the new Table interface has a new method, HasColumn.
9261    
9262     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
9263     issue deprecation warnings when they're. The warnings refer to the
9264     caller of the method.
9265     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
9266     for the deprecation warnings
9267    
9268     * test/test_table.py: Ignore the deprecation warnings for the old
9269     table in the tests in this module. The purpose of the tests is to
9270     test the old interface, after all.
9271    
9272     * test/test_transientdb.py
9273     (TestTransientTable.run_iceland_political_tests): Use the
9274     constants for the types. Add a test for HasColumn
9275     (TestTransientTable.test_transient_joined_table): Adapt to new
9276     table interface. Add a test for HasColumn
9277     (TestTransientTable.test_transient_table_read_twice): Adapt to new
9278     table interface
9279    
9280     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
9281     Adapt to new table interface
9282    
9283     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
9284     new table interface
9285    
9286     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
9287     (RecordTable.SetTable): Adapt to new table interface
9288    
9289     * Thuban/UI/classifier.py (Classifier.__init__)
9290     (Classifier.__init__): Adapt to new table interface
9291    
9292     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
9293     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
9294     to new table interface
9295    
9296     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
9297     (AutoTransientTable.HasColumn): Implement the new table interface
9298     method
9299     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
9300     (AutoTransientTable.UniqueValues): Adapt to new table interface
9301    
9302     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
9303     Adapt to new table interface
9304    
9305     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
9306     simplify opening shapefiles a bit easier.
9307     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9308     (TestLayer.test_point_layer): Use the new helper method
9309     (TestLayer.test_get_field_type): New. Test for the GetFieldType
9310     method
9311    
9312     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
9313     the new table method
9314    
9315     * test/test_memory_table.py (TestMemoryTable.test_has_column):
9316     Test for the new table method HasColumn
9317    
9318 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
9319    
9320     Addresses the "Selection Extent" wish of RTbug #1787.
9321    
9322     * Resources/Bitmaps/fulllayerextent.xpm,
9323     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
9324     extent. These are just place holders for the real bitmaps.
9325    
9326     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
9327     calculate the bounding box once (the first time compute_bbox() is
9328     called).
9329     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
9330     the bounding box for the shapes in lat/long coordinates.
9331    
9332     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
9333     option.
9334     (MainWindow.has_selected_shapes): New. Returns true if there are
9335     any selected shapes.
9336     (MainWindow.FullSelectionExtent): New. Calls
9337     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
9338     (_has_selected_shapes): New. Returns true if there are any
9339     selected shapes.
9340    
9341     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
9342     true if there are any selected shapes.
9343    
9344     * Thuban/UI/view.py (MapCanvas): Added delegated method
9345     HasSelectedShapes.
9346     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
9347     shapes on the canvas using the map projection (if any).
9348    
9349     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
9350     for Layer.ShapesBoundingBox().
9351    
9352 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
9353    
9354     * Resources/Projections/defaults.proj: Fix spelling of Mercator
9355    
9356 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
9357    
9358     Addresses the "Full Layer Extent" wish of RTbug #1787.
9359    
9360     * Resources/Projections/defaults.proj: Added UK National Grid.
9361    
9362     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
9363     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
9364     when the user selects the menu option.
9365    
9366     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
9367     scales the given layer on the canvas using the map projection.
9368    
9369 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
9370    
9371     Convert the table implementations to a new table interface. All
9372     tables use a common mixin class to provide backwards compatibility
9373     until all table users have been updated.
9374    
9375     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
9376     provide backwards compatibility for table classes implementing the
9377     new interface
9378     (DBFTable, MemoryTable): Implement the new table interface. Use
9379     OldTableInterfaceMixin as base for compatibility
9380     (DBFColumn, MemoryColumn): New. Column description for DBFTable
9381     and MemoryTable resp.
9382    
9383     * test/test_dbf_table.py: New. Test cases for the DBFTable with
9384     the new table interface.
9385    
9386     * test/test_memory_table.py: New. Test cases for the MemoryTable
9387     with the new table interface.
9388    
9389     * test/test_table.py: Document the all tests in this file as only
9390     for backwards compatibility. The equivalent tests for the new
9391     interface are in test_memory_table.py and test_dbf_table.py
9392     (MemoryTableTest.test_read): field_info should be returning tuples
9393     with four items
9394     (MemoryTableTest.test_write): Make doc-string a more precise.
9395    
9396     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
9397     table interface. Derive from from OldTableInterfaceMixin for
9398     compatibility.
9399     (TransientTableBase.create): New intance variable column_map to
9400     map from names and indices to column objects
9401     (TransientTable.create): Use the new table interface of the input
9402     table
9403     (AutoTransientTable): Convert to new table interface. Derive from
9404     from OldTableInterfaceMixin for compatibility.
9405     (AutoTransientTable.write_record): Removed. It's not implemented
9406     yet and we still have to decide how to handle writing with the new
9407     table and data framework.
9408    
9409     * test/test_transientdb.py
9410     (TestTransientTable.run_iceland_political_tests)
9411     (TestTransientTable.test_transient_joined_table): Use the new
9412     table interface
9413    
9414 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
9415    
9416     This is namely a collection of UI updates to improve user interactivity.
9417     Tabbing between controls now exists and you can use ESC to close dialog
9418     boxes; ENTER will active the default button.
9419    
9420     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
9421     order that the controls are created so that tabbing works correctly.
9422     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
9423     wxDialog can handle the default button correctly.
9424     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
9425     same reasons as for OnOK.
9426     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
9427     when we ask the table for the maximum/minimum values of a field
9428     which could take a very long time.
9429    
9430     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
9431     order that the controls are created so that tabbing works correctly.
9432     (SelectPropertiesDialog.__init__): Rearrange the order that the
9433     controls are created so that tabbing works correctly.
9434    
9435     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
9436     to derive from a wxDialog but behave like the original implementation
9437     which was derived from a wxFrame. wxDialog provides useful key
9438     handling functionality like ESC calling OnCancel and ENTER calling
9439     OnOK which is lost with wxFrame.
9440    
9441     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
9442     new dialogs.
9443    
9444     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
9445     order that the controls are created so that tabbing works correctly.
9446     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
9447     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
9448     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
9449     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
9450     can provide the "UK National Grid" as a default projection.
9451     (UTMPanel.__init__): Rearrange the order that the controls are
9452     created so that tabbing works correctly.
9453    
9454 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
9455    
9456 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
9457     (project_point): If a map projection but no layer projection is
9458     given, convert degrees to radians before applying the map
9459     projection.
9460    
9461 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
9462     (TableGrid.allow_messages): New methods to make it possible to
9463     inhibit message sending.
9464     (TableGrid.issue): Only send the message if not inhibited.
9465     (LayerTableGrid.select_shape): Use the new methods to make sure
9466     that no ROW_SELECTED message is sent while we're updating the
9467     selected rows to match the selected shapes.
9468    
9469 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
9470    
9471     Implementation of MemoryTable.
9472    
9473     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
9474     implementation that operates on a list of tuples. All of the data
9475     are kept in the memory.
9476    
9477     * test/test_table.py (MemoryTableTest): New.
9478    
9479     * test/test_transientdb.py (SimpleTable): Removed.
9480     (TestTransientTable.test_transient_joined_table,
9481     (TestTransientTable.test_transient_table_read_twice): Replaced
9482     SimpleTable by MemoryTable.
9483    
9484 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
9485    
9486 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
9487     for each of the layers.
9488    
9489     * Resources/Projections/defaults.proj: Geographic projection
9490     contains unit conversion parameter.
9491    
9492     2003-04-30 Jonathan Coles <[email protected]>
9493    
9494 jonathan 793 The most important part of this putback is the projection changes.
9495     It should now be possible to specify the projection that a layer
9496     is in and then specify a different projection for the map. The
9497     projection dialog has an extra parameter for a geographic projection
9498     which lets the user select if the input is in degrees or radians.
9499    
9500     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
9501     to say that the parameter is a tuple of unprojected
9502     points (which is what the callers to this method were assuming).
9503     Also, since the points are unprojected we need to projected them.
9504    
9505     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
9506     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
9507     groups are selected, move the layer up/down. Fixes RTbug #1833.
9508    
9509     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
9510    
9511     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
9512     parameter in call to SetClientData.
9513     (GeoPanel): Add support for selecting the units that the
9514     source data is in (Radians or Degrees).
9515    
9516     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
9517     the rendering loop by reducing the number of if's, removing the
9518     unnecessary try/except block, and checking if the old group
9519     is the same as the new one (which happens a lot if there is
9520     no classification, or lots of shapes are in the same group).
9521    
9522     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
9523     around the redraw routine to try to catch problems that the user
9524     may create by selecting invalid projections for the data set and
9525     map. Clears the display if there are any problems and prints the
9526     error.
9527     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
9528     rectangle.
9529    
9530     * extensions/thuban/wxproj.cpp (project_point): First invert the
9531     supplied point (which should be in projected coordinates) using
9532     the layer's projection and then project the point using the
9533     map's projection.
9534     (project_points): Use project_point() to project each point.
9535    
9536 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
9537    
9538     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
9539     don't set the Classification to None if the classfication field
9540     is None (ie only a DEFAULT).
9541    
9542 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
9543    
9544 bh 790 * Thuban/UI/view.py: Fix some typos.
9545    
9546 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
9547     not pop up the dialog if the selection becomes empty (this could
9548     happen if e.g. a new selection is opened while the identify tool
9549     is active and dialog had been closed)
9550    
9551     2003-04-30 Bernhard Herzog <[email protected]>
9552    
9553 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
9554     instance variable read_record_last_result
9555     (TransientTableBase.read_record): Make sure reading the same
9556     record twice works. The implementation uses the new instance
9557     variable read_record_last_result
9558    
9559     * test/test_transientdb.py
9560     (TestTransientTable.test_transient_table_read_twice): New test
9561     case for the above bug-fix.
9562    
9563 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
9564    
9565     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
9566    
9567     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
9568    
9569     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
9570     (ClassTable.SetValueAsCustom): Rename keyword argument in
9571     ClassGroup* constructors to match argument name.
9572    
9573 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
9574    
9575     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
9576     transient DB if it exists to make sure it doesn't leave a journal
9577     file in the temp directory.
9578    
9579     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
9580     self.conn to None after closing the connection to make sure it's
9581     not closed twice
9582    
9583 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9584    
9585 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
9586     "true". If anything other than "false" is specified we also assume
9587 jonathan 776 "true". Addresses RTbug #1025.
9588 jonathan 769
9589     * Doc/thuban.dtd: Add visible parameter to a layer.
9590    
9591     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
9592     of visible from 1 to True.
9593     (Layer.__init__): Change default value of visible from 1 to True.
9594    
9595     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
9596     parameter.
9597    
9598     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
9599     parameter.
9600    
9601     * test/test_load.py: Add new test data contents_test_visible.
9602     (LoadSessionTest.setUp): save test data.
9603     (LoadSessionTest.testLayerVisibility): Test if the visible flag
9604     is loaded correctly.
9605    
9606     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
9607     for saving an invisible layer.
9608    
9609     2003-04-29 Jonathan Coles <[email protected]>
9610    
9611 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
9612     legend dialog box and tell it to change its map to the one
9613     supplied to SetMap(). Fixes RTbug #1770.
9614    
9615 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
9616    
9617 bh 766 Next step of table implementation. Introduce a transient database
9618     using SQLite that some of the data is copied to on demand. This
9619     allows us to do joins and other operations that require an index
9620     for good performance with reasonable efficiency. Thuban now needs
9621     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
9622     haven't tested that.
9623    
9624     * Thuban/Model/transientdb.py: New. Transient database
9625     implementation.
9626    
9627     * test/test_transientdb.py: New. Tests for the transient DB
9628     classes.
9629    
9630     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
9631     classes to help automatically remove temporary files and
9632     directories.
9633     (Session.__init__): New instance variables temp_dir for the
9634     temporary directory and transient_db for the SQLite database
9635     (Session.temp_directory): New. Create a temporary directory if not
9636     yet done and return its name. Use AutoRemoveDir to have it
9637     automatically deleted
9638     (Session.TransientDB): Instantiate the transient database if not
9639     done yet and return it.
9640    
9641     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
9642     AutoTransientTable so that data is copied to the transient DB on
9643     demand.
9644     (SimpleStore): New class that simply combines a table and a
9645     shapefile
9646    
9647     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
9648     DBFTable and update its doc-string to reflect the fact that this
9649     is only the table interface to a DBF file. Table is now an alias
9650     for DBFTable for temporary backwards compatibility.
9651    
9652     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
9653     the last reference to the session goes away so that the temporary
9654     files are removed properly.
9655    
9656     * test/test_load.py (LoadSessionTest.tearDown): Remove the
9657     reference to the session to make sure the temporary files are
9658     removed.
9659    
9660     2003-04-29 Bernhard Herzog <[email protected]>
9661    
9662 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
9663     the __parser instance variable into a normal local variable in
9664     read. It's only used there and read will never be called more than
9665     once. Plus it introduces a reference cycle that keeps can keep the
9666     session object alive for a long time.
9667    
9668 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9669 jonathan 735
9670 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
9671     Projection an immutable item. Fixes RTbug #1825.
9672     (Projection.__init__): Initialize instance variables here.
9673     (ProjFile.Replace): New. Replace the given projection object with
9674     the new projection object. This solves the problem of needing the
9675     mutator Projection.SetProjection() in the ProjFrame class and
9676     allows a projection to change parameters without changing its
9677     location in the file.
9678    
9679     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
9680     be of type wxSAVE and should verify overwriting a file.
9681    
9682     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
9683     ProjFile.Replace() method instead of the mutator
9684     Projection.SetProjection(). Also requires that we reassign the
9685     client data to the new projection.
9686    
9687     * test/test_proj.py (TestProjection.test): Test GetName() and
9688     GetAllParameters()
9689     (TestProjFile.test): Remove tests for Set*() methods. Add tests
9690     for Replace().
9691    
9692     2003-04-25 Jonathan Coles <[email protected]>
9693    
9694 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
9695     to save the name of the projection.
9696    
9697     * test/test_save.py (SaveSessionTest.testLayerProjection): New
9698     test to verify layer projections are saved correctly.
9699    
9700     2003-04-25 Jonathan Coles <[email protected]>
9701    
9702 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
9703     to "Unknown" if name is None.
9704     (Projection.SetAllParameters): New. Set the projection's
9705     parameter list to the one supplied.
9706     (Projection.SetProjection): New. Set the projection's
9707     properties to those of the supplied Projection.
9708    
9709     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
9710     the dialog title to include the map's title.
9711     (MainWindow.LayerProjection): Set the dialog title to include
9712     the layer's title.
9713    
9714     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
9715     error dialogs into a single method call.
9716     (ProjFrame.__VerifyButtons): Add more states to check.
9717     (ProjFrame.__GetProjection): Return the current state of an
9718     edited projection or None.
9719     (ProjFrame.__FillAvailList): Remove checks for states that
9720     shouldn't exist.
9721     (ProjFrame._OnNew): Clear all selected items and supply
9722     a projection panel if necessary.
9723    
9724     * test/test_proj.py (TestProjFile.test): Add tests for
9725     ProjFile.SetAllParameters, ProjFile.SetProjection,
9726     ProjFile.SetName.
9727    
9728     2003-04-25 Jonathan Coles <[email protected]>
9729    
9730 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
9731     takes an optional argument to select the current projection.
9732     This does not guarantee that the item is visible due to
9733     limited wxWindows functionality. Fixes RTBug #1821.
9734    
9735     2003-04-25 Jonathan Coles <[email protected]>
9736    
9737 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
9738     the projection name and use it when constructing the Projection
9739     object.
9740    
9741     * Thuban/Model/proj.py (Projection.__init__): Change the default
9742     value for 'name' to None and then test if name is equal to None
9743     in the body of the constructor. This way the caller doesn't have to
9744     know what the default value should be. Namely, useful in load.py
9745     where we have to pick a default value if the 'name' parameter
9746     doesn't exist in the XML file.
9747    
9748     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
9749     Tests a file where a layer has a projection.
9750    
9751     2003-04-25 Jonathan Coles <[email protected]>
9752    
9753 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
9754     tree for projection information.
9755    
9756     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
9757     XMLReader.GetFileName.
9758     (SessionLoader): Added support for loading projection tags that
9759     appear inside a layer.
9760    
9761     * Thuban/Model/proj.py (ProjFile): Document the class. Move
9762     back to using a list because the order of the projections in
9763     the file is important to maintain. Fixes RTbug #1817.
9764    
9765     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
9766     to ProjFile.GetFilename.
9767    
9768     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
9769     information.
9770    
9771     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
9772     ProjFrame._OnSaveAs. Removed old dead code from previous
9773     implementation.
9774     (ProjFrame._OnExport): Add support for exporting more than one
9775     projection to a single file.
9776     (ProjFrame.__FillAvailList): use string formatting (% operator)
9777     to build strings that are (partly) translated. Fixes RTbug #1818.
9778    
9779     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
9780     class.
9781    
9782 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
9783    
9784     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
9785    
9786     * po/fr.po: New. French translation by Daniel Calvelo Aros
9787    
9788     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
9789     empty strings.
9790    
9791 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
9792 jonathan 724
9793     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
9794     implement the interface that the ProjFrame dialog expects.
9795    
9796     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
9797     name of the projection to be changed.
9798     (ProjFile): Use a dictionary instead of a list so that removing
9799     projections is easier and we are sure about uniqueness.
9800     (ProjFile.Remove): Remove the given projection object.
9801    
9802     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
9803     Return a list with only one projection file instead of searching for
9804     any projection file. This simplifies many things if the user can
9805     only have one system file and one user file.
9806    
9807     * Thuban/UI/classgen.py: Change all references to
9808     genCombo to genChoice.
9809    
9810     * Thuban/UI/mainwindow.py: Add a Projection option under the
9811     layer menu.
9812     (MainWindow.LayerProjection): New. Open up a projection window
9813     for a layer.
9814    
9815     * Thuban/UI/projdialog.py: Large changes to how the dialog is
9816     laid out. Use three panels instead of one. One for the list of
9817     projections, one for the edit controls, and one for the buttons.
9818     Fixed resizing problems so that the dialog resizes correctly
9819     when the projection panel changes. Added import/export, save, and
9820     new buttons/functionality.
9821    
9822 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
9823    
9824     First step towards table management. Introduce a simple data
9825     abstraction so that we replace the data a layer uses more easily
9826     in the next step.
9827    
9828     * Thuban/Model/data.py: New file with a simple data abstraction
9829     that bundles shapefile and dbffile into one object.
9830    
9831     * Thuban/Model/session.py (Session.OpenShapefile): New method to
9832     open shapefiles and return a shape store object
9833    
9834     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
9835     object instead of a shapefile filename. This introduces a new
9836     instance variable store holding the datastore. For intermediate
9837     backwards compatibility keep the old instance variables.
9838     (open_shapefile): Removed. No longer needed with the shape store.
9839     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
9840     get the shape store used by a layer.
9841     (Layer.Destroy): No need to explicitly destroy the shapefile or
9842     table anymore.
9843    
9844     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
9845     (MainWindow.AddLayer): Use the session's OpenShapefile method to
9846     open shapefiles
9847    
9848     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
9849     session's OpenShapefile method to open shapefiles
9850    
9851     * test/test_classification.py
9852     (TestClassification.test_classification): Use the session's
9853     OpenShapefile method to open shapefiles and build the filename in
9854     a more platform independed way
9855    
9856     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
9857     Implement to have a session to use in the tests
9858     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9859     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
9860     session's OpenShapefile method to open shapefiles
9861     (TestLayerLegend.setUp): Instantiate a session so that we can use
9862     it to open shapefiles.
9863     (TestLayerLegend.tearDown): Make sure that all references to
9864     layers and session are removed otherwise we may get a resource
9865     leak
9866    
9867     * test/test_map.py (TestMapAddLayer.test_add_layer)
9868     (TestMapWithContents.setUp): Instantiate a session so that we can
9869     use it to open shapefiles.
9870     (TestMapWithContents.tearDown): Make sure that all references to
9871     layers, maps and sessions are removed otherwise we may get a
9872     resource leak
9873     ("__main__"): use support.run_tests() so that more info about
9874     uncollected garbage is printed
9875    
9876     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
9877     session's OpenShapefile method to open shapefiles
9878     ("__main__"): use support.run_tests() so that more info about
9879     uncollected garbage is printed
9880    
9881     * test/test_selection.py (TestSelection.tearDown): Make sure that
9882     all references to the session and the selection are removed
9883     otherwise we may get a resource leak
9884     (TestSelection.get_layer): Instantiate a session so that we can
9885     use it to open shapefiles.
9886     ("__main__"): use support.run_tests() so that more info about
9887     uncollected garbage is printed
9888    
9889     * test/test_session.py (TestSessionBase.tearDown)
9890     (TestSessionWithContent.tearDown): Make sure that all references
9891     to the session and layers are removed otherwise we may get a
9892     resource leak
9893     (TestSessionWithContent.setUp): Use the session's OpenShapefile
9894     method to open shapefiles
9895    
9896 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
9897    
9898     * Thuban/Model/load.py (XMLReader.read): Should have been checking
9899     if the file_or_filename object had the 'read' attribute.
9900    
9901 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
9902    
9903 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
9904     (ReadProjFile): Add documentation about which exceptions are raised.
9905     Always pass the exceptions up to the caller.
9906     (GetProjFiles): If the directory can't be read return an empty list.
9907     If any of the proj files can't be read skip that file and go
9908     on to the next one.
9909    
9910     * test/test_proj.py: Added test cases to handle nonexistent files,
9911     unreadable files, and files that don't parse correctly.
9912    
9913     2003-04-23 Jonathan Coles <[email protected]>
9914    
9915 jonathan 716 Projection dialog. Allows the user to select from a list
9916     of projection templates and optionally edit them and save new ones.
9917    
9918     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
9919     (ProjPanel): Base class for projection specific panels.
9920     (TMPanel): Projection panel for Transverse Mercartor.
9921     (UTMPanel): Projection panel for Universal Transverse Mercartor.
9922     (LCCPanel): Projection panel for Lambert Conic Conformal.
9923     (GeoPanel): Projetion panel for Geographic Projection.
9924    
9925     2003-04-23 Jonathan Coles <[email protected]>
9926    
9927 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
9928     promote symmetry. There now exists XMLReader and XMLWriter.
9929     (XMLReader.read): New. Call to read the given file descriptor or
9930     filename.
9931     (XMLReader.close): New. Make sure the file is closed.
9932     (XMLReader.GetFileName): New. Return just the file name that is being
9933     read from.
9934     (XMLReader.GetDirectory): New. Return just the directory of the file
9935     that is being read.
9936     (XMLReader.AddDispatchers): New. Take a dictionary which contains
9937     the names of functions to call as the XML tree is parsed.
9938     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
9939     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
9940     (SessionLoader): Removed class variables start_dispatcher and
9941     end_dispatcher since this functionality is now part of a class
9942     instance. Fixes RTbug #1808.
9943     (SessionLoader.__init__): Add dispatcher functions.
9944     (load_xmlfile): Code was moved into the XMLReader.read().
9945     (load_session): Use modified SessionLoader.
9946    
9947     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
9948     map's projection.
9949    
9950     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
9951     GetAllParameters.
9952     (Projection.GetParameter): Returns the value for the given parameter.
9953    
9954     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
9955     (GetProjFiles): Renamed from GetProjections. Now returns a list
9956     of ProjFile objects.
9957     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
9958     a list of ProjFile objects whose files are not user defined.
9959     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
9960     list of ProjFile objects whose files are user defined.
9961     (ProjFileReader): Extend new XMLReader.
9962    
9963     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
9964     promote symmetry.
9965    
9966     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
9967     control instead of a wxComboBox. wxChoice controls do not generate
9968     events as the uses highlights possible choices which fixes problems
9969     with resizing the dialog when the use selects an option.
9970    
9971     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
9972     control instead of a wxComboBox.
9973    
9974     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
9975     dialog.
9976    
9977     * test/test_proj.py (TestProjection.test): New tests for GetParameter
9978     method.
9979    
9980 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
9981    
9982 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
9983     constants
9984    
9985 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
9986     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
9987    
9988 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
9989    
9990 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
9991     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
9992     anymore.
9993     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
9994     (Layer.ShapeType, Layer.Shape): No need to call
9995     self.open_shapefile since it's always called in __init__
9996    
9997 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
9998     In wxPython 2.4 there's no need to extend MainLoop anymore since
9999     wxPython itself makes sure OnExit is called.
10000    
10001 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
10002    
10003 jonathan 693 Initial putback of projection management code. Includes new
10004     classes to read and write projection files. The current load
10005     and save classes were abstracted a bit so they could be reused.
10006     The Projection class was extended to provide new methods and
10007     have a name.
10008    
10009     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
10010     general XML reading methods that were part of ProcessSession.
10011    
10012     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
10013     name.
10014     (ProjFile): New. Represents a file that contains projection
10015     information.
10016    
10017     * Thuban/Model/resource.py: New. Contains general utilities
10018     for read and writing projection files.
10019    
10020     * Thuban/Model/save.py (XMLSaver): New. Contains all the
10021     general XML writing methods that were part of SessionSaver.
10022     (SessionSaver): Renamed from Saver.
10023    
10024     * test/test_proj.py: New test cases for the projection
10025     file read and write functions.
10026    
10027     2003-04-16 Jonathan Coles <[email protected]>
10028    
10029 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
10030     in the ClassGroup*.__repr__() methods so it is clearer when
10031     a value is a string and when it is a number.
10032    
10033     * test/test_load.py: Rework the classification test to test
10034     that we can load old files.
10035     (testLabels): Test a file where the groups have labels.
10036    
10037 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
10038    
10039     Safer implementation of the performance enhancements of the
10040     low-level renderer:
10041    
10042     * extensions/thuban/wxproj.cpp (extract_projection)
10043     (extract_pointer): Rename extract_projection to extract_pointer
10044     and redefine its purpose to return the pointer stored in a CObject
10045     returned by the object's cobject method. Update all callers.
10046     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
10047     handling of these low-level parameters so that each s_draw_info
10048     instance is handled as a CObject at python level that also
10049     contains real references to the actual python objects which
10050     contain the values in the struct. Add free_draw_info as the
10051     destructor.
10052     (draw_polygon_shape): Add the py_draw_info parameter which must a
10053     cobject containing an s_draw_info pointer.
10054    
10055     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
10056     method to instantiat the low-level render parameter
10057     (MapRenderer.draw_shape_layer): Use the new method. Remove some
10058     commented out code.
10059     (MapRenderer.draw_polygon_shape): Make the first parameter not the
10060     layer but the low-level render parameter
10061     (ScreenRenderer.draw_shape_layer): Use the low-level render
10062     parameter.
10063    
10064 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
10065    
10066 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
10067     the ClassGroup* classes to make debugging a bit easier.
10068     (ClassGroup.SetLabel): Check that the string is an instance
10069     of StringTypes not StringType. Accounts for Unicode strings.
10070    
10071     * Thuban/Model/color.py: Implemented __repr__ to make
10072     debugging a bit easier.
10073    
10074     * Thuban/Model/save.py (Saver.write_classification): Need to
10075     save the group label.
10076    
10077     * test/test_load.py (testClassification): New. Loads the
10078     iceland_sample_test.thuban file and checks if it was loaded
10079     correctly.
10080    
10081     2003-04-15 Jonathan Coles <[email protected]>
10082    
10083 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
10084     to improve rendering performance by initializing the variables
10085     that are not change each time draw_polygon_shape() is called.
10086     The values are stored in a global struct draw_info.
10087     (draw_polygon_shape): Removed initialization code that is
10088     now in draw_polygon_init().
10089    
10090     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
10091 jonathan 674 drawing initialization call to draw_polygon_init()
10092     (MapRenderer.draw_polygon_shape): Use new signature of
10093     draw_polygon_shape.
10094 jonathan 673
10095 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
10096     weirdness by setting the range to (1, maxint).
10097 jonathan 673
10098 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
10099     instance variables private and optimize comparison operator
10100     by first checking if the color references are the same.
10101     (ClassGroupSingleton): Make instance variables private.
10102     (ClassGroupRange): Make instance variables private.
10103 jonathan 673
10104 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
10105    
10106 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
10107    
10108     First stab at internationalized messages:
10109    
10110     * Thuban/__init__.py (_): Implement the translation function for
10111     real using the python gettext module.
10112    
10113     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
10114     translate empty strings.
10115    
10116     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
10117     Add a missing space to a warning message
10118    
10119     * po/README: New. Notes about the management of the translation
10120     files.
10121    
10122     * po/Makefile: New. Makefile to help manage the translation files.
10123    
10124     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
10125    
10126     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
10127     translations and support files in po/
10128    
10129     * setup.py (data_files): Add the *.mo files to the data_files too
10130    
10131     * README: Add note about the translations when building from CVS
10132    
10133 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
10134    
10135     * Thuban/UI/dock.py: Fixes some window resizing problems most
10136     noticable under windows. Always assume the button bitmaps will
10137     be there. Code clean up.
10138     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
10139     images for the dock/undock button to the same images.
10140     Work around for RTbug #1801.
10141    
10142     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
10143     be allowed to grow within the sizer. Fixes a bug under Windows
10144     where the toolbar wasn't being drawn.
10145    
10146 frank 664 2003-04-14 Frank Koormann <[email protected]>
10147    
10148     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
10149     Updated design to try to make the button functionality more
10150     transparent.
10151    
10152 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
10153    
10154     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
10155     finalize the intialization of the panel.
10156    
10157     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
10158     creation of the panel. Should be the last thing called in the
10159     initializer of a subclass.
10160    
10161     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
10162     set the current selections in the combo boxes. This is needed
10163     under Windows.
10164    
10165     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
10166     level panel to the dialog so that the background colors are
10167     consistent under Windows.
10168    
10169 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
10170    
10171 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
10172     not black.
10173    
10174     * Thuban/UI/legend.py: Enable/disable the legend buttons when
10175     the legend changes. Fixes RTbug #1793.
10176    
10177     * test/test_classification.py: Added test for copying of
10178     classifications.
10179    
10180     2003-04-11 Jonathan Coles <[email protected]>
10181    
10182 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
10183     such as bitmaps.
10184    
10185     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
10186     added images to the move buttons, added 'reverse' button.
10187     (CustomRampPanel.__init__): Added images to the move buttons.
10188     (GreyRamp): New. Generates a ramp from white to black.
10189     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
10190    
10191     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
10192     ID_PROPERTY_*.
10193     (Classifier.__init__): Minor changes to the layout.
10194     (Classifier._OnTitleChanged): Listen for when the user edits the
10195     title and update the dialog's title and the layer's title.
10196    
10197     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
10198    
10199     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
10200     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
10201     if the layer's title changes.
10202    
10203     * Thuban/UI/mainwindow.py: Added new menu item and associated code
10204     to open a dialog to rename the map.
10205     (MainWindow): Use new resource class to import bitmaps.
10206    
10207     2003-04-11 Jonathan Coles <[email protected]>
10208    
10209 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
10210 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
10211     Resources/Bitmaps/group_use_none.xpm,
10212     Resources/Bitmaps/group_use_not.xpm,
10213     Resources/Bitmaps/hide_layer.xpm,
10214     Resources/Bitmaps/layer_properties.xpm,
10215     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
10216     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
10217     New.
10218 jonathan 646
10219 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
10220    
10221 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
10222     Should pass group to ClassGroup constructor.
10223    
10224     2003-04-10 Jonathan Coles <[email protected]>
10225    
10226 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
10227     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
10228     here. Implement SetVisible(), IsVisible().
10229     (ClassGroup.__init__): Add group parameter which acts as a copy
10230     constructor.
10231    
10232     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
10233     "Visible" check boxes.
10234     (Classifier): Rename the buttons and refactor the code to match
10235     the new labels.
10236    
10237     * Thuban/UI/legend.py: Classify button is now called "Properties".
10238     Refactored the code to change variable names.
10239     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
10240    
10241     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
10242     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
10243     renamed to MainWindow.LayerEditProperties.
10244     (MainWindow.ToggleLegend): Don't include map name in legend title.
10245     (MainWindow.SetMap): Added the map name to the window title.
10246     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
10247     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
10248     Functionality is found in the layer properties dialog.
10249    
10250     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10251     draw visible groups.
10252    
10253 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
10254    
10255 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
10256     addition and selection of new color schemes.
10257     (MonochromaticRamp): New. Generates a ramp between two colors.
10258     (RedRamp): New. Generates a ramp of all red.
10259     (GreenRamp): New. Generates a ramp of all green.
10260     (BlueRamp): New. Generates a ramp of all blue.
10261    
10262     2003-04-09 Jonathan Coles <[email protected]>
10263    
10264 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
10265     Need to copy over field and fieldType attributes.
10266    
10267     * Thuban/Model/table.py (Table.field_range): New. Retrive the
10268     maximum and minimum values over the entire table for a given
10269     field.
10270     (Table.GetUniqueValues): New. Retrieve all the unique values
10271     in the table for a given field.
10272    
10273     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
10274     (GenUniquePanel): New. Controls to allow the user to select
10275     which unique field values they would like in the classification.
10276     (CustomRampPanel): Code that was in ClassGenDialog that allows
10277     the user to select the properties for a custom ramp.
10278     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
10279    
10280     * Thuban/UI/classifier.py: Removed a lot of debugging code.
10281     (Classifier._SetClassification): Callback method so that the
10282     class generator can set the classification in the grid.
10283     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
10284     editing of a group properties class into a wxWindows control.
10285    
10286     * Thuban/UI/dock.py: It was decided that if the user closes
10287     a dockable window the window should simply hide itself. That
10288     way if the user wants to show the dock again it appears in the
10289     same place as it was when it was closed.
10290     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
10291     (DockableWindow._OnButtonClose): Hide the window instead of
10292     destroying it.
10293     (DockableWindow._OnClose): Hide the window instead of
10294     destroying it.
10295    
10296     * Thuban/UI/legend.py (LegendTree): Use a private method to
10297     consistently set the font and style of the text. Fixes RTbug #1786.
10298    
10299     * Thuban/UI/mainwindow.py: Import just the Classifier class.
10300    
10301 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
10302    
10303 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
10304     to the map module
10305    
10306     2003-04-07 Bernhard Herzog <[email protected]>
10307    
10308 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
10309     favor of ToggleSessionTree
10310     (MainWindow.ToggleSessionTree): New method to toggle visibility of
10311     the session tree.
10312     (MainWindow.SessionTreeShown): New method to return whether the
10313     session tree is currently shown.
10314     (MainWindow.ToggleLegend): New method to toggle visibility of the
10315     legend
10316     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
10317     LegendShown
10318     (MainWindow.LegendShown): New method to return whether the legend
10319     is currently shown.
10320     (_method_command): Add checked parameter so we can define check
10321     menu items
10322     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
10323     mainwindow methods.
10324     (show_session_tree, show_legend commands): Removed.
10325     (toggle_session_tree, toggle_legend commands): New commands to
10326     toggle the visibility of the dialogs
10327    
10328 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
10329    
10330 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
10331    
10332     * Thuban/UI/dock.py: Fix Windows problem.
10333    
10334     * Thuban/UI/mainwindow.py: Use False instead of false.
10335     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
10336    
10337     2003-04-07 Jonathan Coles <[email protected]>
10338    
10339 jonathan 612 Since we now say that the order of the groups in a classification
10340     matters, it makes sense to be able to manipulate that order. Most
10341     of the changes to Thuban/Model/classification.py are to that end.
10342    
10343     * Thuban/Model/classification.py (Classification.AppendGroup,
10344     Classification.InsertGroup, Classification.ReplaceGroup,
10345     Classification.RemoveGroup, Classification.GetGroup): Do as the
10346     names imply.
10347     (Classification.FindGroup): This was called GetGroup, but GetGroup
10348     takes an index, while FindGroup takes a value.
10349     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
10350     REFERENCE. Currently there is a cyclic reference between the layer
10351     and its classification. If the classification doesn't need to know
10352     its owning layer we can change this, since it may make sense to be
10353     able to use the same classification with different layers.
10354    
10355     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
10356    
10357     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
10358     not AddGroup()
10359    
10360     * Thuban/UI/classifier.py: Now that we can depend on the order in
10361     a Classification and have methods to manipulate that order we don't
10362     need to use our own data structures in the grid. We can simply make
10363     the grid/table access the information they need from a copy of
10364     the classification object.
10365     (Classifier._OnCloseBtn): Event handler for when the user clicks
10366     'Close'. This is needed so if the user applies changes and then
10367     continues to change the table the user has the option of discarding
10368     the most recent changes and keeping what they applied.
10369    
10370     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
10371     into the same group.
10372    
10373     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
10374     with a really old version of proj, PJ_VERSION won't even be defined.
10375     If it isn't defined then just compile so that the function always
10376     returns Py_False.
10377    
10378     * test/test_classification.py: Fix tests to use the renamed methods.
10379     Still need to write tests for the new methods.
10380    
10381 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
10382 jonathan 608
10383 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
10384     call to SetSelection out of the method and before the call
10385     to __SelectField in __init__. This prevents a recursion of events
10386     when _OnFieldSelect is triggered by the user.
10387    
10388     2003-04-04 Jonathan Coles <[email protected]>
10389    
10390 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
10391     Color.Transparent.
10392     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
10393     Don't bother copying the color, since Colors are immutable.
10394    
10395     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
10396     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
10397     Thuban/UI/renderer.py, Thuban/UI/view.py:
10398     Rename Color.None to Color.Transparent.
10399    
10400     * test/test_classification.py, test/test_load.py: Rename Color.None
10401     to Color.Transparent.
10402    
10403     2003-04-04 Jonathan Coles <[email protected]>
10404 jonathan 603
10405     * Thuban/Model/classification.py: Fix assert calls.
10406     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
10407     Copy the color parameter rather than hold onto a reference.
10408 jonathan 601
10409 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
10410     the color object.
10411     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
10412     are sure there exists only one refernce to Color.None in the system.
10413     This allows us to use 'is' rather than the comparision functions.
10414    
10415     * Thuban/Model/save.py: Fix assert calls.
10416    
10417     * Thuban/UI/classifier.py: Fix assert calls.
10418     (ClassGrid._OnCellDClick): Call up to the classifier to open the
10419     dialog to edit the groups properties.
10420     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
10421     correctly if a cell is resized.
10422     (ClassTable.SetClassification): New. Changes the classification
10423     that is in the table.
10424     (ClassTable.__SetRow): Allow groups to be prepended.
10425     (Classifier): New code for opening the EditProperties and
10426     GenerateRanges dialogs.
10427     (SelectPropertiesDialog.__GetColor): Only set the color in the
10428     color dialog if the current color is not None.
10429    
10430     * Thuban/UI/dock.py: Fix assert calls.
10431    
10432     * Thuban/UI/legend.py: Fix assert calls.
10433    
10434     * Thuban/UI/renderer.py: Fix assert calls.
10435    
10436     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
10437     classifications.
10438     (GenRangePanel): Panel specific to range generation.
10439     (GenSingletonPanel): Panel specific to singleton generation.
10440     (ClassGenerator): Class responsible for actually generating
10441     the classification from the data gathered in the dialog box.
10442     (PropertyRamp): Generates properties whose values range from
10443     a starting property to an ending property.
10444 jonathan 601
10445 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
10446    
10447     * test/support.py (print_garbage_information): New function that
10448     prints information about still connected messages and memory
10449     leaks.
10450     (run_suite): Removed.
10451     (run_tests): New function for use as a replacement of
10452     unittest.main in the test_* files. This one calls
10453     print_garbage_information at the end.
10454    
10455     * test/runtests.py (main): Use support.print_garbage_information
10456    
10457     * test/test_layer.py: Use support.run_tests instead of
10458     unittest.main so we get memory leak information
10459     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
10460     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
10461     (TestLayerLegend.test_visibility): Call the layer's Destroy method
10462     to fix a memory leak.
10463    
10464     * test/test_classification.py: Use support.run_tests instead of
10465     unittest.main so we get memory leak information
10466     (TestClassification.test_classification): Call the layer's Destroy
10467     method to fix a memory leak.
10468    
10469 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
10470    
10471 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
10472     Handle the reference counts of the return value and errors in
10473     PyArg_ParseTuple correctly.
10474    
10475 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
10476     sure the filename is absolute to avoid problems when saving the
10477     session again
10478    
10479 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
10480    
10481 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
10482    
10483 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
10484 jonathan 587 that there actually are points in the returned list of points
10485     before trying to index into the list. The list may be empty if
10486     the shape is a Null Shape.
10487    
10488 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
10489    
10490     * test/test_map.py: Don't use from <module> import *
10491    
10492 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
10493    
10494     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
10495     LAYER_LEGEND_CHANGED
10496    
10497     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
10498     self.Destroy() to close the window after yesterday's changes.
10499    
10500     * test/test_map.py, test/test_session.py: Fix messages that
10501     are sent from maps and layers.
10502    
10503 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
10504    
10505     * Thuban/UI/classifier.py: Commented out some debugging statements.
10506     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
10507     RTbug #1769.
10508    
10509     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
10510     position (although position doesn't work yet under GTK).
10511     (DockableWindow.Destroy): New. Called when the window must be
10512     closed. Namely needed when the DockFrame closes and must close
10513     its children.
10514     (DockFrame): Listen for EVT_CLOSE and destroy all children.
10515    
10516     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
10517     when then window is told to close.
10518     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
10519     comment in source for more info.
10520    
10521     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
10522    
10523     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
10524     symmetry with other such methods.
10525     (MainWindow.ShowLegend): Show the legend docked by default.
10526    
10527 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
10528    
10529     * Thuban/UI/classifier.py: Support for highlighting a specific
10530     group within the grid when the classification dialog is opened.
10531     Also contains a lot of debugging printouts which will later
10532     be removed.
10533    
10534     * Thuban/UI/dock.py: Complete rework on the dock code so that
10535     that it is fairly removed from the rest of the Thuban application.
10536     It is easy to add new docks which the rest of the program having
10537     to be aware of them.
10538    
10539     * Thuban/UI/legend.py: Modifications to support selecting a
10540     specific group in the classification dialog. Changed how layers
10541     are drawn when the layer is visible/invisible.
10542    
10543     * Thuban/UI/mainwindow.py: Removed legend specific code and
10544     replaced it with calls to the new dock code.
10545    
10546     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
10547     to check if scale > 0. Trying to track down a divide by zero.
10548    
10549 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
10550    
10551 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
10552     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
10553     now part of DockableWindow.
10554     (LegendPanel.DoOnSelChanged): Select the current layer in the
10555     map.
10556     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
10557     with the selected layer and/or group.
10558    
10559     2003-03-26 Jonathan Coles <[email protected]>
10560    
10561 jonathan 557 This putback contains the code for dockable windows. There is
10562     no support in wxWindows as of this date for windows that can
10563     attach themselves to other windows.
10564    
10565     The current model contains a DockableWindow which has a parent
10566     window for when it is detached and a dock window that it puts
10567     its contents in when it is docked. The contents of a DockableWindow
10568     must be a DockPanel. DockPanel itself derives from wxPanel.
10569    
10570     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
10571     message, not a LAYER_LEGEND_CHANGED message.
10572    
10573     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
10574    
10575     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
10576     as one of the style properties for the fieldTypeText item to
10577     be sure that its size is correct when the text changes.
10578    
10579     * Thuban/UI/dock.py: New. Classes for the DockPanel and
10580     DockableWindow.
10581    
10582     * Thuban/UI/legend.py: Added some more buttons and made the
10583     LegendPanel a DockPanel.
10584    
10585     * Thuban/UI/mainwindow.py: Added sash windows to the main window
10586     and supporting functions for manipulating the sashes.
10587     (MainWindow.ShowLegend): Create a DockableWindow with the
10588     LegendPanel as the contents.
10589    
10590     * Thuban/UI/messages.py: Added DOCKABLE_* messages
10591    
10592     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
10593     not LAYER_LEGEND_CHANGED, messages.
10594    
10595 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
10596    
10597     * setup.py: Added custom script bdist_rpm_build_script so that
10598     when the rpm is built the path to wx-config is correct.
10599    
10600     * setup.cfg: Added line saying to use the custom build script
10601    
10602 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
10603    
10604     Initial implementation of the Legend.
10605    
10606     * Thuban/UI/legend.py: New. Creates a window that shows the map's
10607     Legend information and allows the user to add/modify classifications
10608     and how the layers are drawn on the map.
10609    
10610     * setup.py: New command 'build_docs' which currently uses
10611     happydoc to generate html documentation for Thuban.
10612    
10613     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
10614     Returns a string which is appropriately describes the group.
10615    
10616     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
10617     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
10618    
10619     * Thuban/Model/map.py (Map): Rename messages and use new, more
10620     specific, messages.
10621    
10622     * Thuban/Model/messages.py: New message to indicate that a layer's
10623     data has changed (LAYER_CHANGED). New map messages to indicate
10624     when layers have been added/removed/changed or if the stacking order
10625     of the layers has changed.
10626    
10627     * Thuban/Model/session.py: Rename and use new messages.
10628    
10629     * Thuban/UI/classifier.py: Remember if any changes have actually
10630     been applied so that if the dialog is cancelled without an application
10631     of changes we don't have to set a new classification.
10632     (ClassDataPreviewer): Pulled out the window specific code and put it
10633     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
10634     symbols on any DC.
10635    
10636     * Thuban/UI/mainwindow.py: New code to open the legend.
10637    
10638     * Thuban/UI/view.py: Use new message names.
10639    
10640 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
10641    
10642     * Thuban/UI/main.py (verify_versions): New. Checks the versions
10643     of Python, wxPython, and some other libraries.
10644    
10645     * extensions/thuban/wxproj.cpp (check_version): Checks the given
10646     version against what wxproj was compiled with.
10647     (check_version_gtk): If wxproj was compiled with gtk then check
10648     the given version against the version of the gtk library
10649     currently being used.
10650    
10651 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
10652    
10653     * test/test_command.py: Run the tests when the module is run as a
10654     script
10655    
10656     2003-03-14 Bernhard Herzog <[email protected]>
10657    
10658     Implement selection of multiple selected shapes in the same layer:
10659    
10660     - Introduce a new class to hold the selection. This basically
10661     replaces the interactor which was nothing more than the
10662     selection anyway. A major difference is of course that the new
10663     selection class supports multiple selected shapes in one layer
10664    
10665     - Move the object that represents the selection from the
10666     application to the canvas. The canvas is a better place than the
10667     application because the selection represents which shapes and
10668     layer of the map displayed by the canvas are selected and
10669     affects how the map is drawn.
10670    
10671     - Make the selection and its messages publicly available through
10672     the mainwindow.
10673    
10674     - The non-modal dialogs do not get a reference to the interactor
10675     anymore as they can simply refer to their parent, the
10676     mainwindow, for the what the interactor had to offer.
10677    
10678     * Thuban/UI/selection.py: New module with a class to represent the
10679     selection.
10680    
10681     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
10682     these unused messages
10683    
10684     * Thuban/UI/application.py (ThubanApplication.OnInit)
10685     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
10686     interactor is gone now.
10687     (ThubanApplication.CreateMainWindow): There is no interactor
10688     anymore so we pass None as the interactor argument for now for
10689     compatibility.
10690    
10691     * Thuban/UI/view.py (MapCanvas.delegated_messages)
10692     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
10693     Unsubscribe, delegate messages according to the delegated_messages
10694     class variable.
10695     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
10696     attributes from instance variables as described with the
10697     delegated_methods class variable.
10698     (MapCanvas.__init__): New instance variable selection holding the
10699     current selection
10700     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
10701     pass them on to the renderer
10702     (MapCanvas.SetMap): Clear the selection when a different map is
10703     selected.
10704     (MapCanvas.shape_selected): Simple force a complete redraw. The
10705     selection class now takes care of only issueing SHAPES_SELECTED
10706     messages when the set of selected shapes actually does change.
10707     (MapCanvas.SelectShapeAt): The selection is now managed in
10708     self.selection
10709    
10710     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
10711     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
10712     Unsubscribe, delegate messages according to the delegated_messages
10713     class variable.
10714     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
10715     attributes from instance variables as described with the
10716     delegated_methods class variable.
10717     (MainWindow.__init__): The interactor as ivar is gone. The
10718     parameter is still there for compatibility. The selection messages
10719     now come from the canvas.
10720     (MainWindow.current_layer, MainWindow.has_selected_layer):
10721     Delegate to the the canvas.
10722     (MainWindow.LayerShowTable, MainWindow.Classify)
10723     (MainWindow.identify_view_on_demand): The dialogs don't need the
10724     interactor parameter anymore.
10725    
10726     * Thuban/UI/tableview.py (TableFrame.__init__)
10727     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
10728     (LayerTableFrame.row_selected): The interactor is gone. It's job
10729     from the dialog's point of view is now done by the mainwindow,
10730     i.e. the parent. Subscribe to SHAPES_SELECTED instead
10731     of SELECTED_SHAPE
10732    
10733     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
10734     is gone. It's job from the dialog's point of view is now done by
10735     the mainwindow, i.e. the parent.
10736    
10737     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
10738     gone. It's job from the dialog's point of view is now done by the
10739     mainwindow, i.e. the parent.
10740    
10741     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
10742     gone. It's job from the dialog's point of view is now done by the
10743     mainwindow, i.e. the parent.
10744     (SessionTreeCtrl.__init__): New parameter mainwindow which is
10745     stored as self.mainwindow. The mainwindow is need so that the tree
10746     can still subscribe to the selection messages.
10747     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
10748     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
10749     selection is now accessible through the mainwindow. Subscribe to
10750     SHAPES_SELECTED instead of SELECTED_SHAPE
10751    
10752     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
10753     SHAPES_SELECTED message now.
10754     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
10755     so deal with multiple shapes
10756     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
10757     gone. It's job from the dialog's point of view is now done by the
10758     mainwindow, i.e. the parent.
10759    
10760     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
10761     parameter is now a list of shape ids.
10762     (RecordTable.SetTable): The second parameter is now a list of
10763     indices.
10764    
10765     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
10766     selected_shape parameter and ivar to selected_shapes. It's now a
10767     list of shape ids.
10768     (MapRenderer.draw_label_layer): Deal with multiple selected
10769     shapes. Rearrange the code a bit so that the setup and shape type
10770     distinctions are only executed once.
10771    
10772     * test/test_selection.py: Test cases for the selection class
10773    
10774 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
10775    
10776     * Thuban/Model/load.py: Temporary fix so that the xml reader
10777     doesn't cause Thuban to crash.
10778    
10779     * Thuban/Model/layer.py: Handle the cyclic references between
10780     a layer and its classification better, and be sure to disconnect
10781     the classification from the layer when the layer is destroyed
10782     so that we don't maintain a cyclic reference that may not be
10783     garbage collected.
10784    
10785     * Thuban/Model/classification.py: See comment for layer.py.
10786    
10787 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
10788    
10789     * HOWTO-Release: New. Information on the steps for releasing
10790     a new version of Thuban.
10791    
10792 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
10793    
10794     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
10795     Use True instead of true.
10796     (Classifier): Should have a single panel in which all the controls lie.
10797    
10798     * Thuban/UI/proj4dialog.py: Add normal border.
10799    
10800     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
10801    
10802     * Thuban/UI/mainwindow.py: Use True instead of true.
10803    
10804     * setup.py: Update some definitions to use wxWindows2.4 files
10805    
10806     * Data/iceland_sample_class.thuban: Fixed file so that the
10807     field_type information is present.
10808    
10809 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
10810    
10811 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
10812     field type label grow so that when the text changes the
10813     size is updated correctly. This may be a wxWindows bug.
10814    
10815     2003-03-10 Jonathan Coles <[email protected]>
10816    
10817 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
10818     SESSION_REPLACED.
10819    
10820     * Thuban/UI/classifier.py: Wrap text with _().
10821     (ClassGrid.CreateTable): Set dimensions and size hints here,
10822     instead of in Reset, so we only set the size once.
10823    
10824     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
10825    
10826     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10827     Call Close() instead of Shutdown().
10828    
10829     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10830    
10831     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10832     Go back to using OnClose() instead of Shutdown().
10833    
10834     2003-03-10 Jonathan Coles <[email protected]>
10835    
10836 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
10837     to know the old field index as well as the new one.
10838    
10839     2003-03-10 Jonathan Coles <[email protected]>
10840    
10841 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
10842     to correctly set the table information and call this from
10843     __init__ and from _OnFieldSelect so that all the information
10844     is up to date when the dialog opens and when a field is changed.
10845    
10846     2003-03-10 Jonathan Coles <[email protected]>
10847    
10848 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
10849     layer's message function directly, use the ClassChanged() method
10850     when then classification changes. SetField/SetFieldType/SetLayer
10851     must keep the information about field name and field type in
10852     sync when an owning layer is set or removed.
10853    
10854     * Thuban/Model/layer.py: Added ClassChanged() so that the
10855     classification can tell the layer when its data has changed.
10856     (Layer.SetClassification): Accepts None as an arguement to
10857     remove the current classification and correctly handles
10858     adding a new classification.
10859    
10860     * Thuban/Model/load.py: Comment out print statement
10861    
10862     * test/test_classification.py, test/test_save.py: New and
10863     improved tests.
10864    
10865 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
10866    
10867     * Thuban/Model/classification.py: Implemented __copy__ and
10868     __deepcopy__ for ClassGroup* and ClassGroupProperites so
10869     they can easily be copied by the classifier dialog.
10870     (ClassGroupProperites.__init__): The default line color should
10871     have been Color.Black.
10872    
10873     * Thuban/UI/classifier.py: Setting and Getting table values now
10874     uses a consistent set of functions.
10875     (Classifier): Now non-modal. Has field type label which changes
10876     as the field changes. Keep track of buttons in a list so that
10877     we can enable/disable the buttons when the None field is selected.
10878     (SelectPropertiesDialog): Add buttons to make the colors transparent.
10879    
10880     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
10881     does what OnClose did, but can be called by the application to
10882     close a window. Needed when a session changes, and we have to
10883     close the classifier windows.
10884    
10885     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10886     Shuts down open dialogs. Used when a new session is created
10887     or a session is opened.
10888     (MainWindow.SaveSession): Should only call application.SaveSession()
10889     if we don't call SaveSessionAs first.
10890     (MainWindow.Classify): Allow different classifier dialogs for
10891     different layers.
10892    
10893     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
10894     the parent class handle it. Add Shutdown() to unsubscibe from
10895     event notification and call the parent Shutdown(). This was
10896     necessary so the application can close the tree window.
10897    
10898 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
10899    
10900     * Thuban/Model/classification.py: Minor documentation changes,
10901     Addition of __eq__ and __ne__ methods.
10902     (Classification.SetLayer): prevent recursion between this method
10903     and Layer.SetClassification().
10904    
10905     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
10906    
10907     * Thuban/Model/layer.py (SetClassification): prevent recursion
10908     between this method and Classification.SetLayer().
10909    
10910     * test/test_classification.py, test/test_load.py,
10911     test/test_session.py: Fixed and added tests for the classification
10912     classes.
10913    
10914 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
10915    
10916     * Thuban/UI/classifier.py (ClassGrid.__init__)
10917     (ClassGrid.CreateTable): Move the SetSelectionMode call to
10918     CreateTable because otherwise it triggers an assertion in
10919     wxPython/wxGTK 2.4.
10920    
10921 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
10922    
10923 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
10924 jonathan 471
10925 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
10926 jonathan 471
10927 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
10928 jonathan 471
10929 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
10930 jonathan 471
10931     2003-03-05 Jonathan Coles <[email protected]>
10932    
10933 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
10934     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
10935     Store just the groups in the table and generate the other
10936     column information when it is requested. Add "None" field
10937     to pull-down to select no classification.
10938    
10939     * Thuban/common.py: Moved FIELDTYPE constants from table.py
10940     (Str2Num): Only catch ValueError exceptions.
10941    
10942     * Thuban/Model/classification.py: Class documentation. Renaming
10943     of methods with Stroke to Line. Groups are stored in a single
10944     list with the default as the first element. Groups are searched
10945     in the order they appear in the list.
10946    
10947     * Thuban/Model/color.py: Documentation.
10948    
10949     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
10950     the kind of data represented by a field.
10951    
10952     * Thuban/Model/load.py (ProcessSession): Use proper string
10953     conversion function; fixes RTbug #1713.
10954    
10955     * Thuban/Model/save.py (Saver): Store field type information.
10956    
10957     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
10958     (Table): Add field_info_by_name() to retrieve field information
10959     by specifying the field name, not the number.
10960    
10961     * Thuban/UI/mainwindow.py: Function name changes.
10962    
10963     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10964     get the layer classification once. Don't try to classify
10965     values when the field is None: just use the default properties.
10966    
10967     * Thuban/UI/view.py: Function name changes.
10968    
10969     * Doc/thuban.dtd: Add field_type attribute to a classification.
10970    
10971 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
10972    
10973 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
10974     the fill and stroke layer attributes optional with suitable
10975     default values. Add the stroke_width layer attribute. Use correct
10976     syntax for empty elements. Make the attribute list for labels
10977     refer to the label element.
10978    
10979     2003-03-04 Bernhard Herzog <[email protected]>
10980    
10981 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
10982     Python 2.3 containing some of the functionality we implement in
10983     setup.py ourselves.
10984    
10985     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
10986     before the selection mode. Doing it the other way round triggers
10987     an assertion in wxWindows.
10988    
10989     * Thuban/Model/save.py (escape): Fix typo in doc-string
10990    
10991     * Thuban/Model/classification.py: Remove unnecessary wxPython
10992     import
10993    
10994 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
10995    
10996     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
10997     Parameter 'value' should default to None.
10998    
10999     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
11000     the class attribute __classification is now private.
11001    
11002     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
11003     Classifier to ClassGrid. Added support for removing selected rows,
11004     which including code for keeping track of when cells are selected,
11005     and deselected.
11006     (ClassTable): Support for added/removing rows. Fixed a problem
11007     with __ParseInput whereby it would not allow strings (only numbers)
11008     to be entered.
11009     (Classifier): Added button and supporting code for removing
11010     selected rows.
11011    
11012 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
11013 jonathan 434
11014     * Thuban/common.py: Moved color conversion functions into
11015     Thuban/UI/common.py.
11016     (Str2Num): Now converts the float (not the string) to a long/int
11017     so that an exception isn't thrown.
11018    
11019     * Thuban/UI/common.py: Common functions used in several UI modules
11020    
11021     * Thuban/Model/classification.py: Changed the class hierarchy
11022     so that a Classification consists of Groups which return
11023     Properties when a value matches a Group.
11024    
11025     * Thuban/Model/layer.py: Fixed name resolution problem.
11026    
11027     * Thuban/Model/load.py: Use new Classification and Group functions.
11028    
11029     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
11030     failure.
11031     (Saver.write_classification): Use new Classification and Group
11032     functions.
11033    
11034     * Thuban/UI/classifier.py: Changes to use new Classification and Group
11035 jonathan 445 functions. Fix to create a tuple with a single value instead of
11036     simply returning the value.
11037 jonathan 434
11038     * Thuban/UI/renderer.py: Use new Classification and Group functions.
11039     Use common.py functions.
11040    
11041 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
11042 jonathan 447
11043     * test/test_classification.py: Use new Classification and Group
11044     classes.
11045 jonathan 434
11046 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
11047    
11048     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
11049     functions from Thuban color objects to wxWindow colour objects.
11050    
11051     * Thuban/Model/classification.py (Classification): Renamed
11052     GetProperties() to GetClassData(). Used the new iterator
11053     in TreeInfo().
11054     (ClassIterator): Iterator implementation to iterate over the
11055     ClassData objects in a classification object.
11056    
11057     * Thuban/Model/save.py (Saver.write_classificaton): Uses
11058     the new iterator to save the classification information.
11059    
11060     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
11061     for changing the stroke and fill colors and previewing the
11062     changes.
11063    
11064     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
11065     MainWindow.SaveSessionAs): Text string changes so the dialogs
11066     have more meaningful titles.
11067    
11068     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
11069     Classification method name from GetProperties to GetClassData.
11070    
11071     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
11072     instead of accessing now non-existent class variables.
11073    
11074 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
11075    
11076     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
11077     unneeded Shape() call. Rendering is substantially faster without
11078     it and it avoids some problems with broken shape files.
11079    
11080 frank 423 2003-02-20 Frank Koormann <[email protected]>
11081    
11082     Force minimal size of identify and label dialogs. The autosizing
11083     looked too ugly.
11084    
11085     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
11086     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
11087     Set size of listctrl.
11088     * Thuban/UI/identifyview.py (IdentifyView.__init__):
11089     Set size of dialog.
11090    
11091 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
11092    
11093     * test/test_classification.py, test/test_layer.py,
11094     test/test_load.py, test/test_map.py, test/test_session.py:
11095     Updated the tests to use the new functions that are in the
11096     respective classes.
11097    
11098     * Thuban/Model/classification.py (Classification):
11099     Uses the new ClassData* classes. Modification messages are
11100     passed up to the parent layer (if it exists).
11101     (ClassData): New class to encapsulate the common data in each
11102     classification property.
11103     (ClassDataDefault): Represents the Default class. data.
11104     (ClassDataPoint): Represents a single class. data point
11105     (ClassDataRange): Represents a class. range
11106     (ClassDataMap): Represents a class. map (unused).
11107    
11108     * Thuban/Model/color.py: Added Color.None to represent something
11109     with no color. Color.Black represents the color black.
11110     (NoColor): Helper class derived from Color to represent something
11111     with no color.
11112    
11113     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
11114     stroke_width attributes. Made the 'classification' attribute private.
11115     New methods for setting/getting the classification.
11116    
11117     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
11118     to get the classifcation and use the new ClassData* classes to
11119     hold the classification data. Use Str2Num to convert numbers
11120     properly.
11121    
11122     * Thuban/Model/save.py (Saver): Use new Color and Classification
11123     methods
11124    
11125     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
11126     custom grid.
11127     (ClassTable): Support for editing Values and Labels and for
11128     changing what type (point or range) of data is stored in each
11129     property based on how the user enters the data.
11130     (Classifier): Support for saving the new classifications and
11131     launching the dialog to edit a property.
11132     (SelectPropertiesDialog): New class for editing the visual
11133     properties of a classification (stroke color, width, and fill color)
11134     (ClassPreviewer): Took the Draw method from ClassRenderer and
11135     made most of it into this new class. Intend to use this class in
11136     the SelectPropertiesDialog for previewing changes.
11137    
11138     * Thuban/UI/renderer.py: Use new Color and Classification methods.
11139    
11140     * Thuban/UI/tree.py: Formatting changes.
11141    
11142     * Doc/thuban.dtd: Add 'label' element
11143    
11144     * Thuban/common.py: New. Contains common routines used throughout
11145     the code.
11146     (Str2Num): Takes a string and converts it to the "best" type of
11147     number.
11148    
11149 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
11150    
11151     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
11152     dragging flag is always set to 0 even when the tool implementation
11153     raises an exception
11154    
11155 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
11156    
11157     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
11158     method to create a splash screen.
11159     (ThubanApplication.ShowMainWindow): New. Show the main window.
11160     Needed so the splash screen can display the mainwindow
11161     (ThubanApplication.OnInit): Call the
11162     new splash_screen method to determine whether the application
11163     should display a splash screen. If it displays a splash screen do
11164     not immediately show the main window.
11165    
11166 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
11167    
11168     * Thuban/Model/classification.py: Added import line to fix
11169     feature conflicts between running on python2.2 and python2.1.
11170    
11171     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
11172     onto the clinfo parameter, so removed the deepcopy().
11173    
11174 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
11175    
11176 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
11177 jonathan 396 Added element_open variable to track opening and closing of tags
11178     so that tags that don't span more than one line are closed with
11179     /> instead of </tag_name>. Use the GetDefault*() methods of
11180     the Classification class.
11181    
11182     * Thuban/Model/classification.py (Classificaton): Added set and
11183     get methods for the default data. The class also takes a layer
11184     reference so that modification messages can be sent. Fixed the
11185     methods to use the new ClassData class.
11186     (ClassData): New class to encapsulate the classification data
11187    
11188     * Thuban/Model/layer.py (Layer): Remove the
11189 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
11190 jonathan 396 SetDefault*() methods on the layer's classification object.
11191 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
11192 jonathan 396 Classification class.
11193    
11194     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
11195     object instead of a dictionary.
11196    
11197 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
11198 jonathan 396 draw the classifications in the dialog box's table.
11199     (Classifier): Modified to use the ClassRenderer class.
11200    
11201 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
11202     methods of the Classification class.
11203 jonathan 396
11204     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
11205     of the ClassData class.
11206    
11207     * test/test_classification.py, test/test_layer.py,
11208     test/test_map.py, test/test_session.py: Fix the tests to work
11209     with the above code changes.
11210    
11211 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
11212    
11213     * Thuban/Model/classification.py (Classification): Added getNull()
11214     to return the NullData reference
11215    
11216     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
11217     Layer.SetStrokeWidth): Modified these functions to change the
11218     null data in the classification rather than keep these values
11219     directly in the Layer class. Menu options to change these values
11220     work again.
11221    
11222 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
11223    
11224 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
11225 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
11226 jonathan 380 classification data.
11227    
11228 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
11229     Colors in the tree view.
11230    
11231     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
11232     the tree info for classifications. Commented out unnecessary lines.
11233    
11234     * Thuban/Model/classification.py (Classification.TreeInfo): New
11235     function to add information about the classification into the
11236     tree view.
11237    
11238 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
11239 jan 375
11240 tkoester 403 * Thuban/__init__.py (_): New.
11241 jan 375
11242     * Thuban/Model/classification.py, Thuban/Model/extension.py,
11243     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
11244 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
11245     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
11246     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
11247     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
11248     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
11249     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
11250 jan 375
11251 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
11252    
11253 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
11254 jonathan 370
11255 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
11256     a layer classification. Supports specific data points and
11257     ranges.
11258 jonathan 370
11259 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
11260     information.
11261 jonathan 370
11262 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
11263     information.
11264 jonathan 370
11265 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
11266     specifying classification information.
11267 jonathan 370
11268 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
11269     dialog.
11270 jonathan 370
11271 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
11272     classification information.
11273 jonathan 370
11274 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
11275     classification data.
11276 jonathan 370
11277 tkoester 403 * test/test_classification: Tests for the Classification class.
11278 jonathan 370
11279 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
11280    
11281 bh 361 * test/test_command.py: New. Tests for the command classes.
11282    
11283 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
11284     (Command.IsTool): New method to distinguish between command
11285     switching tools and other commands.
11286    
11287     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
11288     the tool to avoid direct assignments to instance variables
11289     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
11290     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
11291     change the tool
11292    
11293     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
11294     active tool's command turns insensitive, disable the tool.
11295     (_tool_command): Use the new ToolCommand class
11296    
11297     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
11298     SelectTool method to change the tool
11299     (iconfile): Use the ToolCommand class
11300    
11301 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
11302    
11303     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
11304     the case of selected items that are not children of Layers or Maps
11305     properly. Previously this bug would trigger an assertion in
11306     wxWindows.
11307    
11308 frank 352 2002-11-06 Frank Koormann <[email protected]>
11309    
11310 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
11311     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
11312     Full Extent).
11313 tkoester 403
11314 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
11315    
11316     * setup.py (setup call): version now 0.1.3
11317    
11318     * MANIFEST.in: Add the files in test/
11319    
11320     * test/README: Add note about tests requiring the iceland data
11321    
11322     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
11323     copyright notice.
11324    
11325 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
11326    
11327     * test/test_map.py
11328     (TestMapWithContents.test_projected_bounding_box): Use an explicit
11329     epsilon.
11330    
11331     * test/support.py (FloatComparisonMixin.assertFloatEqual)
11332     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
11333     message if the assertion fails and don't return the return value
11334     of self.assert_. In assertFloatSeqEqual the return meant that not
11335     all items of the sequence were compared.
11336    
11337 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
11338    
11339 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
11340    
11341     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
11342    
11343 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
11344     the string with the bounding box on the fly because of platform
11345     differences in the way %g is handled.
11346    
11347     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
11348     DBFfile too because Thuban layers can't yet cope missing DBF
11349     files.
11350    
11351     2002-09-20 Bernhard Herzog <[email protected]>
11352    
11353 bh 326 * test/test_menu.py: Use initthuban instead of
11354     add_thuban_dir_to_path to initialize Thuban.
11355    
11356     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
11357     Mixin class for float comparisons
11358     (SubscriberMixin): New. Mixin class to test messages sent through
11359     the Connector class
11360    
11361     * test/README: Fix a typo and add the -v flag to the command for
11362     individual tests
11363    
11364 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
11365    
11366     * test/test_proj.py: New. Test cases for Thuban.Model.proj
11367    
11368     * test/test_map.py: New. Test cases for Thuban.Model.map
11369    
11370     * test/test_layer.py: New. Test cases for Thuban.Model.layer
11371    
11372     * test/test_label.py: New. Test cases for Thuban.Model.label
11373    
11374     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
11375    
11376     * test/test_color.py: New. Test cases for Thuban.Model.color
11377    
11378     * test/test_base.py: New. Test cases for Thuban.Model.base
11379    
11380 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
11381    
11382     * Thuban/Model/session.py (Session.forwarded_channels): Forward
11383     the CHANGED channel too.
11384    
11385     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
11386     CHANGED channel too.
11387     (Map.__init__): Call the Modifiable constructor as well.
11388    
11389     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
11390     event if the modified flag changes.
11391     (Modifiable.changed): Tweak the doc-string.
11392    
11393     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
11394     (MainWindow.set_position_text): Put the code that puts the text
11395     with the mouse position into the status bar into the new method
11396     set_position_text so that it can overwritten in derived classes.
11397    
11398 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
11399    
11400     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
11401     message box on the main window.
11402    
11403 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
11404    
11405     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
11406     the 'E' because it's less likely to interfere with other menu
11407     entries.
11408 bh 315 (MainWindow.build_menu): remove an incorrect comment.
11409 bh 313
11410 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
11411    
11412     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
11413     (_tool_command): Add sensitive parameter
11414     (_has_visible_map): Sensitivity callback to tools and other
11415     commands that require a visible map. Use it in map_zoom_in_tool,
11416     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
11417     and map_full_extent
11418    
11419 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
11420    
11421     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
11422     VIEW_POSITION
11423    
11424 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
11425 frank 306
11426     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
11427    
11428 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
11429    
11430 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
11431     wxWindows already and our implementation doesn't work correctly
11432     with wxGTK 2.3:
11433     (MapCanvas.__init__): Remove the instance variable
11434     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
11435     be drawin
11436     (MapCanvas.OnIdle): Removed.
11437    
11438 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
11439     a parameter to determine the size of the rectangle.
11440     (MapCanvas.find_shape_at): Create the box around the point on a
11441     layer by layer basis and make the size depend on the shape type.
11442     This solves a problem with the selection of point shapes at the
11443     border of the layer's bounding box
11444    
11445 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
11446    
11447 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
11448     for the sensitivity of remove layer.
11449     (_can_remove_layer): New. Sensitivity callback for remove layer
11450     (Command layer_remove): Use _can_remove_layer
11451    
11452     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
11453     determine whether a given layer can be deleted.
11454    
11455 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
11456     (MapCanvas.do_redraw): Get rid of the unused update_region
11457     instance variable
11458    
11459 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
11460    
11461 bh 292 * test/: new subdirectory with a bunch of unit tests.
11462    
11463     * test/README, test/test_table.py, test/test_save.py,
11464     test/test_menu.py, test/test_load.py: Initial set of tests and
11465     brief instructions on how to run them
11466    
11467 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
11468    
11469 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
11470     arcs with multiple parts.
11471    
11472 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
11473     Handle degenrate rectangles.
11474    
11475 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
11476     (Table.__init__): Keep track of whether the DBF is open for
11477     writing
11478     (Table.write_record): Open the DBF file for writing when necessary
11479    
11480 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
11481    
11482     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
11483     dbf files only for reading by default. Use a new writable dbf
11484     object for writing.
11485    
11486 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
11487    
11488 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
11489     (MainWindow.Context): New method to return a context
11490     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
11491     new method
11492    
11493 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
11494     layer table specific code from TableGrid into LayerTableGrid
11495     (TableFrame, LayerTableFrame): Split the layer table specific code
11496     from TableFrame into LayerTableFrame
11497 bh 280 (LayerTableGrid.select_shape): Remove a debug print
11498 bh 278
11499     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
11500     LayerTableFrame
11501    
11502 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
11503    
11504     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
11505     absolute filename.
11506    
11507 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
11508    
11509 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
11510     records.
11511 tkoester 403 (Table.__init__): Open the DBF file for writing too.
11512 bh 275
11513     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
11514     into the underlying table.
11515    
11516     * extensions/shapelib/shapefil.h (DBFCommit),
11517     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
11518     commit any changes made to the DBF file.
11519    
11520 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
11521     (_tool_command): Put the code that generates the "checked"
11522     callback into a separate function so that we can reuse it
11523     elsewhere
11524    
11525 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
11526     session into an XML file. The main reason to introduce a class is
11527     that applications built on Thuban can derive from it so that they
11528     can save additional information in a session file.
11529     (save_session): Delegate almost all the work to the Saver class.
11530     Rename the filename argument to file because it may be a file like
11531     object now.
11532    
11533     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
11534     code. Remove the little test code which would be executed when the
11535     module is run as a script which didn't work anymore since it can't
11536     import the other Thuban modules.
11537     (ProcessSession, load_session): Refactor the ProcessSession to
11538     have one method for each element start and end tag so that derived
11539     classes can easily override the processing of individual tags.
11540     Also, always parse with namespaces enabled because applications
11541     built on top of Thuban will likely use namespaces if they extend
11542     the session file format.
11543    
11544 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
11545    
11546     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
11547     because thubaninit_contents will do it for us.
11548    
11549 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
11550 jan 265
11551     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
11552     tree window already open
11553    
11554 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
11555    
11556 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
11557     with self.
11558    
11559     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
11560     when we have actually captured it.
11561    
11562 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
11563     shapefile and destroy the table.
11564    
11565     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
11566    
11567 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
11568    
11569 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
11570     instance variable columns
11571     (RecordTable.GetTypeName): row and col may be negative in some
11572     cases.
11573    
11574 bh 254 * setup.py (InstallLocal.initialize_options)
11575     (InstallLocal.finalize_options, InstallLocal.user_options): New
11576     option create-init-file to build a thubaninit.py when running
11577     install_local
11578     (InstallLocal.run): Create the thubaninit.py module when requested
11579     (thubaninit_contents): Split the template into several parts and
11580     create a new function thubaninit_contents that creates the
11581     contents of a thubaninit module.
11582     (ThubanInstall.run): Use the new function to create the thubaninit
11583     module.
11584    
11585 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
11586    
11587     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
11588     cleanup.
11589     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
11590    
11591     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
11592     direct base class' Destroy method.
11593    
11594     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
11595     layers.
11596     (Map.Destroy): Destroy the label_layer as well and call the
11597     inherited Desatroymethod first so that no more messages are
11598     issued.
11599     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
11600     message if the stacking order actually has changed. Add
11601     doc-strings.
11602     (Map.BoundingBox): Correct the doc-string.
11603     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
11604     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
11605    
11606     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
11607     all labels.
11608    
11609 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
11610    
11611     * Thuban/Model/map.py (Map.subscribe_layer_channels)
11612     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
11613     to a layer's channels into separate methods.
11614     (Map.RemoveLayer, Map.AddLayer): Call the new methods
11615     (Map.Destroy): Unsubscribe from a layer's channels before
11616     destroying it.
11617    
11618     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
11619     selected_layer parameter to searched_layer which is the layer to
11620     search in.
11621     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
11622     search to that layer. Return the selected layer and shape.
11623    
11624     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
11625     typo
11626    
11627 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
11628    
11629 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
11630     Extend the doc string.
11631     (ThubanApplication.subscribe_session)
11632     (ThubanApplication.unsubscribe_session): New methods to
11633     subscribe/unsubscribe to/from session channels.
11634     (ThubanApplication.SetSession): Call the new methods here.
11635     (ThubanApplication.maps_changed, ThubanApplication.set_map):
11636     Renamed set_map to maps_changed. Its now a subscriber for
11637     MAPS_CHANGED.
11638    
11639     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
11640     x-coordinate in case of simple clicks
11641    
11642     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
11643     don't pass it as a parameter
11644    
11645     * Thuban/Model/session.py (Session.RemoveMap): New
11646    
11647 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
11648     window size into a parameter.
11649    
11650 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
11651    
11652 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
11653     just commands.
11654    
11655 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
11656     parameter list a bit to allow setting the window title and the
11657     initial message in the status bar. Update the callers.
11658    
11659     * Thuban/UI/application.py (ThubanApplication.OnInit)
11660     (ThubanApplication.CreateMainWindow): Put the mainwindow
11661     instantiation into a separate method so that it can be overridden
11662     by a subclass.
11663    
11664 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
11665    
11666 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
11667     another changed message is issued to make it easier to get
11668     notified of changes.
11669     (Session): Update the doc string
11670     (Session.forward): Issue changed-events as CHANGED as well.
11671     (Session.changed): Overwrite the inherited version to issue
11672     CHANGED events as well.
11673    
11674     * Thuban/UI/tree.py: We can now simply subscribe to the session's
11675     CHANGED channel to be informed of changes.
11676     (SessionTreeCtrl.session_channels): Not needed any longer.
11677 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
11678 bh 234 Only have to (un)subscribe CHANGED
11679    
11680     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
11681    
11682 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
11683     for the wxPython locale bug to __init__.py so that it's
11684     automatically executed by anybody using UI code from Thuban.
11685    
11686 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
11687    
11688 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
11689    
11690     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
11691     as parameter and store it in an instance variable
11692     (MainWindow.invoke_command, MainWindow.update_command_ui)
11693     (MainWindow.save_modified_session, MainWindow.NewSession)
11694     (MainWindow.OpenSession, MainWindow.SaveSession)
11695     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
11696     application object.
11697    
11698     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
11699     the main window with self.
11700    
11701 bh 225 * Thuban/UI/context.py: New module with the context class
11702    
11703     * Thuban/UI/command.py (Command): Update doc string.
11704    
11705     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
11706     MainWindow.update_command_ui): Pass an instance of the context
11707     class to the command's methods
11708     (check_current_tool, call_method): Handle the new context
11709     implementation
11710    
11711     * Examples/simple_extensions/simple_tool.py (simple_tool,
11712     check_simple_tool): Handle the new context implementation
11713    
11714     * Examples/simple_extensions/simple_command.py (simple_command):
11715     Handle the new context implementation. Update the comments about
11716     the context.
11717    
11718     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
11719     doc-string
11720     (ThubanApplication.Session): New method to return the session
11721     object
11722    
11723     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
11724     interactor's selected_layer may not be a layer of the current
11725     session when the tree is updated while a new session is being set.
11726    
11727 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
11728    
11729     * Thuban/UI/tree.py (color_string): Removed. No longer used.
11730     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
11731     update_tree into update_tree and add_items. The tree now uses a
11732     more generic way to display the contents of the tree.
11733     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
11734    
11735     * Thuban/Model/layer.py (Layer.TreeInfo),
11736     Thuban/Model/extension.py (Extension.TreeInfo),
11737     Thuban/Model/map.py (Map.TreeInfo),
11738 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
11739 bh 217 Add TreeInfo methods to implement the new tree view update scheme
11740    
11741 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
11742    
11743     * Thuban/UI/application.py: Don't use "import from" for the
11744     MainWindow. It can't always be resolved.
11745     (ThubanApplication.OnInit): change reference to MainWindow
11746     accordingly.
11747    
11748     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
11749     completely
11750    
11751 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
11752    
11753     * setup.py (create_init_module): New configurable variable whose
11754     default depends on the platform we're running on.
11755     (ThubanInstall.initialize_options): Initialize
11756     self.create_init_module from the global create_init_module
11757     (ThubanInstall.user_options): indictate that the options
11758     create-init-module and init-module-dir have arguments.
11759    
11760     * setup.py: In the setup call change the version number to include
11761     cvs.
11762    
11763     * MANIFEST.in: Add the files in Examples
11764    
11765 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
11766    
11767 bh 210 * setup.py: In the setup call, use the thuban homepage as the
11768     value of the url parameter.
11769    
11770 bh 208 * Examples: New subdirectory for examples.
11771    
11772     * Examples/simple_extensions/simple_tool.xpm,
11773     Examples/simple_extensions/simple_tool.py,
11774     Examples/simple_extensions/simple_command.py,
11775     Examples/simple_extensions/README: Simple examples showing how to
11776     add new commands and tools.
11777    
11778 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
11779     bdist_rpm that we also have an install script.
11780     (bdist_inno): Add 2002 to the copyright notice.
11781    
11782 bh 205 * setup.py: Create a file in python's site-packages directory to
11783     make installation of Thuban as a library easier.
11784     (ThubanInstall.user_options): Add two new options,
11785     create-init-module and init-module-dir
11786     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
11787     filenames for installation in the default directories.
11788     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
11789     the inherited methods to capture some filenames before they're
11790     transformed too much by distutils.
11791     (ThubanInstall.run): Create the init module if requested.
11792     (ThubanInstall.thuban_init_filename): New method to return the
11793     full name of the init module.
11794     (ThubanInstall.get_outputs): Append the filename of the init
11795     module.
11796    
11797 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
11798    
11799 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
11800     handle the prefix properly which means that the default for the
11801     installation prefix should be /usr for RPMs and /usr/local when
11802     doing a normal source install.
11803     (bdist_rpm_install_script): Script to override the default install
11804     commands in the specfile generated by the bdist_rpm command.
11805     (thuban_bdist_rpm.user_options): Add a prefix option
11806     (thuban_bdist_rpm.initialize_options): Init the prefix option.
11807     Create the script files for the spec files as empty files here
11808     (thuban_bdist_rpm._make_spec_file): Override the inherited method
11809     to fill the script files with content.
11810    
11811 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
11812     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
11813     argument. save_session now automatically uses this version,
11814     solving a problem when saving to a relative filename.
11815    
11816     * setup.py: In the setup call, make sure that the library
11817     directories are under $prefix/lib not directly under $prefix.
11818    
11819 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
11820 jan 199
11821     * Thuban/Model/extension.py: new module to handle extension objects.
11822     * Thuban/Model/messages.py: new messages for extensions.
11823     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
11824     Session.AddExtension): new for handling extensions.
11825     Also some other minor changes to round up extension handling.
11826     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
11827     of Extension titles and title and names of its objects.
11828    
11829 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
11830    
11831     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
11832 bh 202 the events for a command.
11833 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
11834     Call bind_command_events to bind the events. add_toolbar_command
11835     can now bind events too so that it's possible to have commands
11836     that are only available through the toolbar.
11837     (MainWindow.init_ids): New instance variable events_bound to keep
11838     track of for which commands events have been bound.
11839    
11840 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
11841    
11842     * Thuban/UI/menu.py: New module to build and manage menus.
11843    
11844     * Thuban/UI/mainwindow.py: Remove some unused imports.
11845     (MainWindow.__init__, main_menu): move the definition of the main
11846     menu from __init__ to the Menu instance main_menu.
11847     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
11848     build the menu bar and sub-menus from a menu description.
11849    
11850     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
11851     startup file
11852     (ThubanApplication.read_startup_files): New method to run
11853     ~/.thuban/thubanstart.py
11854    
11855 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
11856     Move the toolbar definition to the Menu instance main_toolbar.
11857     (MainWindow.build_toolbar): New method to build the toolbar
11858     similar to the build_menu methods
11859    
11860 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
11861    
11862 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
11863     layer_outline_color. Fix it in the definition of the command too.
11864    
11865 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
11866    
11867 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
11868    
11869     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
11870     in the docstring
11871    
11872 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
11873    
11874 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
11875     when the shapefile is empty.
11876     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
11877     now return None for empty shapefiles. Update doc-strings.
11878    
11879     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
11880     the layer's bbox being None.
11881    
11882     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
11883     layer's bbox being None.
11884    
11885 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
11886     necessary.
11887     (MapCanvas.__init__): New instance variables, last_selected_layer
11888     and last_selected_shape to determine how the selection has
11889     changed.
11890    
11891     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
11892     AutoSizeColumns because it will cause a traversal of the entire
11893     table which for large .dbf files will take a very long time.
11894    
11895 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
11896    
11897     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
11898     maximum depth for the tree than shapelib does by default.
11899    
11900 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
11901    
11902     * setup.py (py_modules): The shptree modules doesn't have a
11903     wrapper, so don't include it in the py_modules
11904    
11905 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
11906    
11907     * extensions/shapelib/shptree.c (compare_ints): Make arguments
11908     const void * as in the qsort prototype
11909     (SHPTreeFindLikelyShapes): Remove some unused variables.
11910    
11911     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
11912     maintains to redraw the window during a drag.
11913     (MapCanvas.unprojected_rect_around_point): New method to determine
11914     a small region around a point for hit-testing.
11915     (MapCanvas.find_shape_at): Only test the shapes in a small region
11916     around the point.
11917    
11918     * setup.py: Increment the version to 0.1.2
11919    
11920     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
11921     debug print and set session to None after unsubscribing
11922    
11923 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
11924    
11925 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
11926     the file to have a .thuban extension.
11927    
11928 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
11929     all the session channels to subscribe to to update the tree
11930     (SessionTreeCtrl.session_changed): Remember the session so that we
11931     can unsubscribe properly. Use the new class constant to
11932     unsubscribe from the old session and subscribe to the new one.
11933     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
11934     subscriptions of the SessionTreeCtrl.
11935     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
11936    
11937     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
11938     Session Tree" command to the file menu.
11939    
11940     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
11941     as update_region to the renderer.
11942    
11943     * Thuban/UI/renderer.py
11944     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
11945     update box is now directly a tuple, not a wxRect anymore.
11946    
11947     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
11948     prints.
11949    
11950     2002-05-07 Bernhard Herzog <[email protected]>
11951    
11952 bh 146 * setup.py: Add the shptree extension module. See
11953     extensions/pyshapelib/ChangeLog for more details.
11954    
11955     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
11956     extensions/shapelib/dbfopen.c: Really update to the versions of
11957     shapelib 1.2.9. For some reason it wasn't really done on
11958     2002-04-11.
11959    
11960     * extensions/shapelib/shptree.c: Modified version of shptree.c of
11961     shapelib 1.2.9. The only real difference is the use of qsort
11962     instead of a bubble sort implementation
11963    
11964     * Thuban/Model/layer.py (Layer.__init__): New instance variable
11965     shapetree to hold the shapelib quadtree for the shapefile
11966     (Layer.open_shapefile): Create the quad tree.
11967     (Layer.ShapesInRegion): New method to return the ids of shapes in
11968     a given region using the quad tree.
11969    
11970     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
11971     comment
11972     (draw_polygon_shape): Accept both arcs and polygons.
11973     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
11974     the api.
11975    
11976     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
11977     return the shape ids to be rendered in a given layer.
11978     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
11979     ids. Use draw_polygon_shape to draw arc shapes as well.
11980     (ScreenRenderer.RenderMap): New parameter for the rectangle that
11981     has to be updated
11982     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
11983     calling it's ShapesInRegion method.
11984    
11985     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
11986     update_region for the update region.
11987     (MapCanvas.OnPaint): Maintain the update region
11988     (MapCanvas.do_redraw): Pass the bounding box of the update_region
11989     to the renderer when drawing the bitmap. Reset the update_region.
11990    
11991 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
11992    
11993 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
11994     MainWindow.OpenSession): Change the file extension of the session
11995     files to .thuban
11996    
11997 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
11998     Move the map channels to be forwarded by the session into the
11999 bh 146 class constant with forwarded_channels. Also add
12000     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
12001     forwarded_channels
12002 bh 129
12003     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
12004     typo and some rewording).
12005    
12006 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
12007    
12008     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
12009     around to speed up most redraws:
12010     (MapCanvas.__init__): New instance variable bitmap which holds the
12011     bitmap
12012     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
12013     self.bitmap to draw.
12014     (MapCanvas.full_redraw): New method to force a full redraw
12015     including the bitmap
12016     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
12017     make sure the bitmap is redrawn.
12018     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
12019     MapCanvas.shape_selected): Call full_redraw instead of readraw to
12020     make sure the bitmap is redrawn.
12021     (MapCanvas.OnSize): New method to handle size events so that the
12022     bitmap can be redrawn.
12023    
12024 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
12025    
12026     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
12027     canvas' VIEW_POSITION event
12028     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
12029     Update the text in the status-bar accordingly.
12030    
12031     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
12032     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
12033     called.
12034     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
12035     current_position
12036     (MapCanvas.set_current_position): New method to set
12037     current_position. Issue a VIEW_POSITION event
12038     (MapCanvas.CurrentPosition): New public method to return the value
12039     of current_position. Should be called when the VIEW_POSITION event
12040     is processed.
12041     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
12042     Update the position.
12043     (MapCanvas.OnLeaveWindow): Set the position to None.
12044    
12045     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
12046     position in the statusbar
12047    
12048 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
12049 frank 120
12050     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
12051    
12052 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
12053    
12054 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
12055    
12056     * Resources/Bitmaps/fullextent.xpm: new
12057 jan 116
12058 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
12059 jan 116
12060 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
12061     box
12062 jan 114
12063 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
12064    
12065 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
12066    
12067     * Thuban/UI/tree.py (update_tree): added added map extent
12068    
12069     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
12070 tkoester 403 icon; added map_full_extend as tool
12071 jan 114
12072 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
12073 jan 107
12074     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
12075     saving _new_ sessions
12076    
12077     * Thuban/Model/session.py (create_empty_session): new session
12078     don't have a filename (set to None)
12079    
12080     * Thuban/UI/tree.py (update_tree): added filename and modified flag
12081    
12082     * Thuban/Model/load.py (ProcessSession): convert projection
12083     parameters from unicode to regular string
12084    
12085     * Data/iceland_sample.session: Added UTM Zone 26 projection.
12086    
12087 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
12088    
12089     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
12090     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
12091     1.2.9
12092    
12093     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
12094     the pyshapelib directoy into the list of include dirs, so that
12095     pyshapelib_api.h can be found.
12096    
12097     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
12098     holds the pyshapelib C-API
12099     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
12100     pyshapelib_api to access the shapelib functions.
12101     (initwxproj): Import the c_api from the shapelib module and
12102     initialize pyshapelib_api.
12103    
12104 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
12105    
12106 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
12107     initialize_options to create the scripts for the rpm.
12108    
12109 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
12110    
12111 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
12112    
12113 bh 87 * setup.py: Increment version to 0.1.1
12114    
12115 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
12116     Layer" and "Remove Layer" commands from the layer menu to the map
12117     menu
12118    
12119 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
12120    
12121     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
12122     argument (python <= 1.5.2 erroneously accepted multiuple
12123     arguments)
12124    
12125 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
12126    
12127     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
12128     RecordGrid in the identifyview.
12129     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
12130     IdentifyListCtrl. The grid allows editing of the values.
12131    
12132     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
12133     implementing a grid for a single row of a thuban table.
12134    
12135     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
12136     layers by default. Easier to use than the previous default of only
12137     searching through the select layer which meant that if no layer
12138     was selected, you couldn't select a shape.
12139    
12140     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
12141    
12142     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
12143     stroke_width attribute
12144    
12145     * Thuban/Model/save.py (save_session): Write the new stroke_width
12146     attribute
12147    
12148     * Thuban/Model/load.py (ProcessSession.startElement): Read the
12149     stroke_width attribute
12150    
12151     * Thuban/Model/layer.py (Layer.__init__): New parameter and
12152     instance variable stroke_width
12153     (Layer.SetStrokeWidth): Set the stroke_width.
12154    
12155 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
12156    
12157     * extensions/thuban/wxproj.cpp (project_points): Fix two
12158     off-by-one errors in the last loop that joins the various parts
12159     together.
12160    
12161 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
12162    
12163     * setup.py (data_dist.make_distribution): Fix some typos
12164    
12165 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
12166    
12167     * README: Slight tweaking in preparation for the 0.1 release
12168    
12169     * setup.cfg: Add section for sdist to create both tgz and zip
12170     archives
12171    
12172     * setup.py: increase version number to 0.1
12173     (data_dist): New command class for data distribution
12174    
12175 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
12176    
12177 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
12178     Handle the case of no layer (i.e. layer is None) properly.
12179    
12180 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
12181 bh 70 Set the initial selection of the combo boxes to reflect the
12182     projection we're starting with in a way that works on windows,
12183     too.
12184    
12185 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
12186     puiblisher's ids in hex to make it easier to compare them to the
12187     standard repr of python methods
12188    
12189     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
12190     messages
12191    
12192 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
12193    
12194 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
12195     deselect the layer if no layer is selected
12196    
12197 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
12198     idle time when there actually is something to draw. If there's
12199     nothing to draw simply clear the window
12200     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
12201     (MapCanvas.SetMap): force a redraw in all cases because
12202     FitMapToWindow doesn't always do it.
12203     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
12204     specify the point to move into the center of the window
12205     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
12206     dragged, zoon in/out by a factor of 2
12207 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
12208     index, i.e. reversed drawing order) so that objects appearing to
12209     be in from of others are selected first. This is probably mostly
12210     relevant for point shapes where the symbols used may overlap
12211 bh 59
12212     * Thuban/Model/session.py (create_empty_session): Unset the
12213     modified bit before returning it
12214    
12215     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
12216     create_empty_session session to create the new, empty session.
12217    
12218     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
12219     the tool bitmaps.
12220     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
12221     the code that asks whether the session should be saved into the
12222     new method save_modified_session.
12223     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
12224     method to save modified session here too.
12225    
12226 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
12227    
12228     * setup.py (InnoIconItem): fix typo
12229    
12230     (thuban_bdist_inno.run):
12231     (bdist_inno.run): Move the decision not to create symlinks on
12232     non-nt platforms to thuban_bdist_inno and do it unconditinally
12233     since we never want to create the symlinks here
12234    
12235 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
12236    
12237 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
12238     identify view immediately
12239    
12240     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
12241     and SelectableRecordListCtrl that implement the code shared by the
12242     identify view and the label dialog
12243    
12244     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
12245     new class RecordListCtrl
12246    
12247     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
12248     return value of GetValue is None instead of using it as a boolean
12249     directly so that Zero numbers are handled properly.
12250     (LabelListCtrl): Derive from the new class
12251     SelectableRecordListCtrl
12252    
12253 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
12254     (Proj4Dialog.dialogLayout): Make the window resizable and set the
12255     size of the text control explicitly to make the sizers work on
12256     both Windows and X.
12257    
12258 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
12259    
12260     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
12261     that can limit the search to the currently selected layer.
12262     (MapCanvas.SelectShapeAt): Make sure that the currently selected
12263     layer stays selected even when no shape is found
12264 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
12265     height do nothing (avoids zero division errors)
12266 bh 44
12267 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
12268    
12269 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
12270     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
12271     convenient :-)
12272     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
12273     a new instvar layer_to_item to map layers to tree items
12274     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
12275     to match the current selection in the interactor
12276    
12277 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
12278     (Interactor.HasSelectedLayer): New methods to query the current
12279     selection
12280    
12281     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
12282     (MainWindow.has_selected_layer): Simply call the appropriate
12283     interactor method
12284    
12285     * Thuban/UI/mainwindow.py (MainWindow.__init__):
12286     (MainWindow.LayerShowTable):
12287     (MainWindow.identify_view_on_demand): Store the interactor in an
12288     instvar and use that reference instead of going through main.app
12289    
12290 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
12291     * Thuban/UI/application.py (ThubanApplication.OnInit):
12292 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
12293     with the new mainwindow method ShowSessionTree and not directly
12294     the application's OnInit method
12295    
12296     * Thuban/UI/tree.py (myTreeCtrlPanel):
12297     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
12298     TreeCtrl isntead of a panel. This affects most method since we now
12299     refer to self instead of self.tree
12300     (SessionTreeView): New class implementing a non-modal dialog
12301     showing the session tree.
12302    
12303 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
12304     layer to the tableview dialog.
12305    
12306     * Thuban/UI/tableview.py: Add some doc-strings
12307 tkoester 403 (TableGrid):
12308 bh 35 (TableGrid.OnRangeSelect):
12309     (TableGrid.OnSelectCell):
12310     (TableFrame.__init__):
12311     (TableFrame.row_selected):
12312     Selecting rows in the grid view now updates the selected shapes
12313     through the TableFrame. To achieve this we derive TableGrid from
12314     Publisher and introduce the message type ROW_SELECTED which the
12315     TableFrame subscribes to and which is issued by OnRangeSelect and
12316     OnSelectCell
12317    
12318     (DataTable.SelectRow): Removed because it's no longer needed in
12319     the row/shape selection scheme
12320    
12321 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
12322     dialogs
12323    
12324     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
12325     the SELECTED_SHAPE message anymore. This is now handled by the
12326     parent.
12327     (TableGrid.select_shape): Only update the selection if the shape
12328     is not None.
12329     (TableFrame): Inherit from the new NonModalDialog class.
12330     (TableFrame.__init__, TableFrame.select_shape): Handle the
12331     SELECT_SHAPE message.
12332     (TableFrame.OnClose): Extend the inherited method to unsubscribe
12333     SELECT_SHAPE
12334    
12335     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
12336     (MainWindow.add_dialog):
12337     (MainWindow.dialog_open):
12338     (MainWindow.remove_dialog):
12339     (MainWindow.get_open_dialog): New methods to maintain a dictionary
12340     of opened non-modal dialogs.
12341    
12342     (MainWindow.__init__): Initialize the new non-modal dictionary
12343     management code
12344     (MainWindow.LayerShowTable): maintain separate dialogs for each
12345     table using the non-modal dialog management code to only open a
12346     view once for each table.
12347    
12348     (MainWindow.IdentifyTool):
12349     (MainWindow.__init__):
12350     (MainWindow.identify_view_on_demand): Don't open the identify view
12351     in IdentifyTool anymore. This will be done automatically by the
12352     new method identify_view_on_demand which handles the
12353     SELECTED_SHAPE message so that the identify view will be opened on
12354     demand
12355    
12356     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
12357     the interactor argument. The SELECTED_SHAPE message is now handled
12358     by the parent.
12359     (IdentifyView.__init__): Add the interactor argument so that we
12360     can handle the SELECTED_SHAPE message here
12361     (IdentifyView.selected_shape): New method to handle the
12362     SELECTED_SHAPE messages
12363    
12364     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
12365     NonModalDialog class
12366     (IdentifyView.OnClose): Extend the inherited version to
12367     unsubscribe SELECT_SHAPE
12368    
12369     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
12370    
12371 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
12372    
12373     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
12374 tkoester 403
12375 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
12376     interactor to pass through to the MapCanvas
12377 tkoester 403
12378 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
12379     argument to the MainWindow constructor to get rid of the ugly hack
12380     that made main.app available early just so that the mapcanvas
12381     could access the interactor object.
12382    
12383 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
12384    
12385 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
12386     that runs a modal message box
12387     (MainWindow.OnClose): Use the new method
12388     (MainWindow.RemoveLayer): Just do nothing in case no layer is
12389     selected. The command should be grayed out anyway, so there's no
12390     need to pop up a message box.
12391     (MainWindow.AddLayer): Pop up a message box with an error message
12392     if the shape file can't be opened
12393    
12394     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
12395     immediately. This will cause an exception in case the file can't
12396     be opened and we can display an appropriate message.
12397    
12398 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
12399    
12400     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
12401     specific bdist_rpm command.
12402    
12403     * Thuban/UI/main.py: Catch ImportError exceptions when importing
12404     the locale module because it may not be available on some
12405     installations.
12406    
12407     * extensions/pyprojection/LICENSE: Copy of the license text in
12408     Projection.i. Having it in a separate file makes it easier to
12409     refer to license text in e.g. RPMs
12410    
12411 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
12412    
12413 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
12414     more generic
12415    
12416     * setup.py (ThubanInstall.get_outputs): Add the symlink in
12417     <prefix>/bin to the outputs
12418     (ThubanInstall.link_file): New method to link files. We need this
12419     because the standard copy_files refuses to link non-existing
12420     files.
12421     (ThubanInstall.run): Remove the leading install root from the
12422     script filename if an install root was specified and use the new
12423     link_file method
12424 tkoester 403
12425 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
12426     the window when the first layer is added to the map.
12427    
12428     * setup.py (ThubanInstall.run): Honor the build root (self.root)
12429     when linking thuban.py to <prefix>/bin
12430    
12431 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
12432    
12433     * setup.py: In the setup call, the install parameters shouldn't
12434     have trailing slashes because distutils on non-posix platforms
12435     doesn't like that. The same applies to other directories like
12436     "Resources/Bitmaps"
12437    
12438     In the configuration section for nt, move the wxWindows directory
12439     optins into the part clearly marked as editable.
12440    
12441     (InstallLocal.initialize_options):
12442     (InstallLocal.user_options): remove the currently unused debug
12443     flag
12444     (thuban_build_py.find_all_modules): Add this method so that it
12445     works for our case of having packages and modules in one
12446     distribution as well.
12447     (ThubanInstall.initialize_options):
12448     (ThubanInstall.finalize_options):
12449     (ThubanInstall.user_options):
12450     (ThubanInstall.boolean_options): Add new options, do-symlink and
12451     extra files. Since these are the first ThubanInstall specific
12452     options, override user_options and boolean_options
12453     (ThubanInstall.run): Honor the new do-symlink and extra-files
12454     options.
12455     (ThubanInstall.get_outputs): Add to override the base-class's
12456     version and add the extra-files to the outputs
12457     (bdist_inno): New class for windows distributions with Inno Setup
12458     (InnoIconItem): Helper class for bdist_inno
12459     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
12460     this together with the appropriate parameters, to the setup call.
12461 tkoester 403
12462 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
12463     installer
12464    
12465     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
12466     changing_selection to avoid recursive selection events when
12467     modifying the selection in response to a selection event.
12468     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
12469     changing the tree's selection.
12470     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
12471     we're not being called indirectly from normalize_selection.
12472    
12473     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
12474     event.Check only if the command is actuall checkable.
12475     (MainWindow.__init__): Call the toolbar's Realize method to make
12476     sure that the items are actually shown
12477    
12478 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
12479    
12480 bh 9 * setup.py: Fix some doc strings
12481    
12482 bh 7 * ChangeLog: started
12483    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26