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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2708 - (hide annotations)
Sun Sep 24 20:01:23 2006 UTC (18 years, 5 months ago) by bernhard
Original Path: trunk/thuban/ChangeLog
File size: 473769 byte(s)
* Thuban/Model/proj.py(_do_we_have_to_work_around_broken_proj): 
Making the test more robust for observed python 2.3 problems
with setlocale().

1 bernhard 2705 2006-09-24 Bernhard Reiter <[email protected]>
2    
3 bernhard 2708 * Thuban/Model/proj.py(_do_we_have_to_work_around_broken_proj):
4     Making the test more robust for observed python 2.3 problems
5     with setlocale().
6    
7 bernhard 2705 * test/runtests.py: Added new option ---setdecimalcommalocale
8     to run all tests with an LC_NUMERIC that uses comma as decimal_point.
9     Minor: Added (c) year 2006. Fixed typo in a docstring.
10    
11     * test/test_transientdb.py: Minor: Added (c) year 2006. Fixed typo in
12     a docstring.
13    
14 bernhard 2702 2006-09-23 Bernhard Reiter <[email protected]>
15    
16     * Extensions/ogr/test/test_OGRShapestore.py: fixed skip_if_no_ogr()
17     and added it to TestOGRTable.setUp() so that all tests get skipped
18     if ogr cannot be imported. Added (c) year 2006.
19    
20 dpinte 2701 2006-09-18 Didrik Pinte <[email protected]>
21    
22     * wxPython 2.6 update : wx 2.4 syntax has been updated to 2.6
23    
24 bernhard 2696 2006-09-18 Bernhard Reiter <[email protected]>
25    
26 bernhard 2698 Fixed proj behaviour with python >=2.4 when decimal_point != '.'.
27    
28 bernhard 2697 * Thuban/UI/application.py: Fixed warning dialog when gdal is missing.
29    
30     * test/test_proj.py: new test_lc_numeric_robustness(). Added author
31     Bernhard Reiter and new copyright year 2006.
32    
33 bernhard 2698 * Thuban/Model/proj.py: New _do_we_have_to_work_around_broken_proj()
34     and Projection.assuregoodlocale(), Projection.assureinitlocale().
35     Added author Bernhard Reiter and (c) 2006.
36    
37 bernhard 2694 2006-09-15 Bernhard Reiter <[email protected]>
38 bernhard 2692
39     * README: added RXP and pyRXP as optional for tests.
40 bernhard 2697
41 bernhard 2694 * test/localessupport.py: New. Contains a helper function
42     to find a locale with comma used as decimal_point.
43 bernhard 2692
44 bernhard 2690 2006-08-31 Bernhard Reiter <[email protected]>
45 bernhard 2691
46 bernhard 2690 * README: fixed URLs to sqlite and pysqlite.
47 bernhard 2697
48 bernhard 2691 * Thuban/UI/about.py: Added Didrik Pinte as contributor. Extended
49     copyright range to include 2006.
50 bernhard 2690
51 dpinte 2689 2006-06-29 Didrik Pinte <[email protected]>
52    
53     * Thuban/UI/main.py: circular import fix.
54    
55 frank 2688 2006-06-27 Frank Koormann <[email protected]>
56    
57     New Classification "Pattern": Classify text attributes by regexp.
58    
59     * Thuban/Model/classification.py (class ClassGroupPattern):
60     New, group is associated with a regular expression.
61     (Classification._compile_classification): Store compiled regexp and
62     original group for pattern.
63     (Classification.FindGroup): Added pattern.
64    
65     * Thuban/UI/classifier.py
66     (ClassGrid._OnLabelRightClicked, ClassGrid.labelPopup):
67     New, add popup to select singleton/pattern.
68     (ClassTable.GetRowLabelValue, ClassTable.GetValueAsCustom,
69     ClassTable.SetValueAsCustom): Added pattern.
70     (ClassTable.__ParseInput): Autodetect singleton/pattern.
71    
72     * Thuban/Model/save.py (SessionSaver.write_classification):
73     Added pattern.
74    
75     * Thuban/Model/load.py (SessionLoader.start_clpattern,
76     SessionLoader.end_clpattern): New, process pattern elements.
77    
78     * test/test_classification.py (class TestClassGroupPattern): New.
79     (TestClassification.test_add_pattern,
80     TestClassification.test_multiple_groups_textual,
81     TestClassification.test_deepcopy_textual): New.
82     (TestClassification.test_multiple_groups_numerical):
83     Renamed test_multiple_groups.
84     (TestClassification.test_deepcopy_numerical): Renamed test_deepcopy.
85    
86     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
87     Added pattern.
88    
89     * test/test_load.py (ClassificationTest.TestLayers, TestClassification):
90     Added pattern.
91    
92     * test/test_layer.py
93     (TestLayerModification.test_set_classification_textual): New
94     (TestLayerModification.test_set_classification_numerical):
95     Renamed test_set_classification.
96    
97     * Doc/manual/thuban-manual.xml: Added pattern to layer classification
98     description.
99    
100     * Resources/XML/thuban-1.1.dtd: Added clpattern element and attribs.
101    
102 dpinte 2687 2006-06-29 Didrik Pinte <[email protected]>
103    
104     * Thuban/version.py: Bugfix determination of SQLite, the wright one !
105    
106 dpinte 2685 2006-06-28 Didrik Pinte <[email protected]>
107    
108 dpinte 2686 * packaging/windows/thubanstart.py: sample file loading all the stable
109     extensions
110    
111     2006-06-28 Didrik Pinte <[email protected]>
112    
113 dpinte 2685 * Thuban/version.py: Bugfix determination of SQLite on old and recent
114     systems (support pysqlite1 and pysqlite2)
115    
116 frank 2684 2006-06-27 Frank Koormann <[email protected]>
117    
118     * Thuban/version.py: Bugfix determination of SQLite on old systems.
119    
120 dpinte 2683 2006-05-17 Didrik Pinte <[email protected]>
121     * Extensions/ogr/__init__.py : updated test for win32 and correct
122     imports
123    
124 dpinte 2680 2006-05-15 Didrik Pinte <[email protected]>
125 dpinte 2682 Ashamed ... still some tabs in the files
126    
127     * Thuban/version.py : tabs removed
128     * Thuban/Model/transientdb.py : tabs removed
129    
130     2006-05-15 Didrik Pinte <[email protected]>
131    
132 dpinte 2681 * Thuban/version.py : coding style correction
133 dpinte 2682 * Thuban/Model/transientdb.py : coding style correction
134 dpinte 2681
135     2006-05-15 Didrik Pinte <[email protected]>
136 dpinte 2682
137 dpinte 2680 * Thuban/version.py : Updated imports to support pysqlite2
138 dpinte 2682
139     * Thuban/Model/transientdb.py : Updated imports to support pysqlite2
140 dpinte 2680 Patched the querying system to support the param style of pysqlite2
141    
142 dpinte 2679 2006-04-24 Didrik Pinte <[email protected]>
143 bernhard 2690 * Extensions/svgexport/__init__.py: The extension now works on win32
144 dpinte 2679 architecture. Bug #87 corrected.
145    
146 bernhard 2678 2006-04-20 Bernhard Reiter <[email protected]>
147     * Doc/technotes/coding_guidelines.txt: Changed text from CVS to SVN.
148     Removed emacs specific hint and replaced it with a general hint
149     that editors might support writing changelogs.
150    
151 bernhard 2677 2006-04-12 Bernhard Reiter <[email protected]>
152 bernhard 2678
153 bernhard 2677 * Thuban/version.py: Changed thuban_release mechanism to use "svn"
154     instead of "cvs".
155    
156 bernhard 2676 2006-03-31 Bernhard Reiter <[email protected]>
157    
158     * libraries/thuban/wxproj.cpp: including proj_api.h instead of
159     projects.h now. According the Frank Warmerdam and man pj_init
160     this is the public interface to proj. Thus I have changed PJ to projPJ.
161     And I could remove the hack to avoid clashes with typedef PVALUE
162     and #define LP in projects.h clashing with symbols when trying to
163     build on windows. The file is cleaner and nicer now.
164    
165 bernhard 2675 2006-03-29 Bernhard Reiter <[email protected]>
166 bernhard 2678
167 bernhard 2675 * libraries/thuban/wxproj.cpp: undef LP to avoid clash when
168     trying to build with mingw.
169    
170 bernhard 2673 2005-10-18 Bernhard Reiter <[email protected]>
171    
172 bernhard 2674 * Thuban/UI/about.py: remove unused import of getdefaultlocale.
173     Added display of internal encoding to the about dialog text.
174    
175     * Extensions/svgexport/__init__.py: changed version to "1.0.0+cvs".
176    
177     2005-10-18 Bernhard Reiter <[email protected]>
178    
179 bernhard 2673 Startup improved: We fail right away if the internal encoding could
180     not be determined.
181    
182     * Thuban/__init__.py (get_internal_encoding): new.
183    
184     * test/test_stringrepresentation.py (class TestInternalEncoding):
185     Preserve the internal encoding for the tests in this class.
186    
187 bernhard 2671 2005-10-17 Bernhard Reiter <[email protected]>
188    
189 bernhard 2672 * test/test_stringrepresentation.py: New file, for now testing
190     that set_internal_coding() is throwing an exception for bad exceptions.
191    
192     * Thuban/__init__.py (set_internal_encoding): added a forwards
193     and backward translation, so that we fail early if the
194     internal_encoding is bad.
195    
196     2005-10-17 Bernhard Reiter <[email protected]>
197    
198 bernhard 2671 svgexport 1.0.0cvs: Fixed ARC layer writing: No filling is done.
199     You could actually get polylines with filling in between,
200     when the classification for the lines had a fill color.
201     E.g. this happens when you generate a classification from a ramp.
202    
203     * Extensions/svgexport/test/test_svgmapwriter.py:
204     New test_export_arc_no_fill(). Extend copyright notice to 2005.
205    
206     * Extensions/svgexport/svgmapwriter.py
207     (SVGRenderer.draw_shape_layer_incrementally()):
208     Setting TRANSPARENT_BRUSH for shaptype ARC.
209     Extend copyright notice to 2005.
210    
211     * Extensions/svgexport/__init__.py: Extend copyright notice to 2005.
212    
213 frank 2670 2005-09-08 Frank Koormann <[email protected]>
214    
215     * Doc/manual/thuban-manual.xml (Map Management): Fixed typo reported
216     by Erik (sigra.at.home.se)
217    
218 jan 2669 2005-08-18 Jan-Oliver Wagner <[email protected]>
219    
220     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
221     Call the right method for the default size.
222    
223 jan 2667 2005-08-11 Jan-Oliver Wagner <[email protected]>
224    
225     * Extensions/export_shapefile: New.
226    
227     * Extensions/export_shapefile/__init__.py: New. Initialize
228     the export_shapefile extension.
229    
230     * Extensions/export_shapefile/export_shapefile.py: New.
231     Exports a layer as a Shapefile.
232    
233 jan 2664 2005-08-08 Jan-Oliver Wagner <[email protected]>
234    
235     * po/de.po: String fixes. This fixes Debian bug #313843.
236    
237 jan 2660 2005-07-27 Jan-Oliver Wagner <[email protected]>
238    
239     Remove the attributes from the layer element in
240     .thuban files for the save routine.
241     This also solves RT bug #3149,
242     https://intevation.de/rt/webrt?serial_num=3149
243    
244     * test/test_load.py: (TestSingleLayer, TestNonAsciiColumnName,
245     TestLayerVisibility, TestSymbolSize, TestClassification, TestLabels,
246     TestLayerProjection, TestJoinedTable, TestLabelLayer): Removed
247     attributes from layer element to classification clnull element.
248    
249     * test/test_save.py (SaveSessionTest.testSingleLayer,
250     SaveSessionTest.testLayerProjection,
251     SaveSessionTest.testClassifiedLayer,
252     SaveSessionTest.test_joined_table, SaveSessionTest.test_save_postgis):
253     Removed attributes from layer element to classification clnull element.
254     (test_save_postgis.NonConnectionStore._fetch_table_information):
255     added pretending to have a shape_type.
256    
257     * Resources/XML/thuban-1.1.dtd: Make the attributes field
258     and field_type of classification optional.
259    
260     * Thuban/Model/classification.py (Classification.TreeItem.build_info):
261     Added output of size.
262    
263     * Thuban/Model/load.py (SessionLoader.start_classification):
264     Change attribute 'field' and 'field_type' from obligatory to
265     optional to allow empty classes (ie. only with a default=clnull).
266    
267     * Thuban/Model/save.py (SessionSaver.write_layer): Don't write
268     any attributes anymore for the layer element.
269     (SessionSaver.write_classification): Even if there is no
270     classification field, still write the classification because
271     the clnull (default) symbol will not be defined anymore as
272     part of the layer element.
273    
274 bh 2643 2005-07-05 Bernhard Herzog <[email protected]>
275    
276 bh 2652 * setup.py (setup call): Version 1.1.0
277    
278     * NEWS: Update for 1.1.0
279    
280     * MANIFEST.in: Add *.txt to files taken from Doc. Otherwise the
281     technores won't be included
282    
283     * Thuban/UI/about.py (About.__init__): Extend copyright notice to
284     2005
285    
286     * po/de.po: Updated.
287    
288     2005-07-05 Bernhard Herzog <[email protected]>
289    
290 bh 2645 * README: gdal 1.1.8 is too old. 1.2.5 works.
291    
292     2005-07-05 Bernhard Herzog <[email protected]>
293    
294 bh 2650 * Resources/XML/thuban-1.1.dtd (rasterlayer): Add the opacity and
295     masktype attributes.
296    
297     2005-07-05 Bernhard Herzog <[email protected]>
298    
299 bh 2644 * Thuban/Model/layer.py (Layer.__mangle_bounding_box)
300     (Layer.ClipBoundingBox): Rename ClipBoundingBox to
301     __mangle_bounding_box. See the comments in the code and RT #2845
302    
303     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
304     Remove the explicit test of ClipBoundingBox. The method isn't
305     public anymore and the direct call in the test wasn't necessary in
306     the first place. If ClipBoundingBox (now __mangle_bounding_box)
307     isn't called, the return value of ShapesInRegion will be
308     different.
309    
310     2005-07-05 Bernhard Herzog <[email protected]>
311    
312 bh 2643 * Thuban/UI/viewport.py (ViewPort.set_view_transform): Handle
313     ZeroDivisionError exceptions. I don't know when they happen
314     exactly. It probably happens when the projections aren't set
315     properly.
316    
317 bh 2642 2005-07-01 Bernhard Herzog <[email protected]>
318    
319     First step towards unicode. With this roughly we're at step 1
320     string_representation.txt
321    
322     * Doc/technotes/string_representation.txt: New. Document how
323     strings are represented in Thuban and how to get to a Unicode
324     Thuban.
325    
326     * Thuban/__init__.py (set_internal_encoding)
327     (unicode_from_internal, internal_from_unicode): New. The first few
328     functions for the internal string representation
329    
330     * Thuban/UI/about.py (unicodeToLocale): Removed. Use
331     internal_from_unicode instead.
332    
333     * Thuban/UI/__init__.py (install_wx_translation): Determine the
334     encoding to use for the internal string representation. Also,
335     change the translation function to return strings in internal
336     representation even on unicode builds of wxPython
337    
338     * Thuban/Model/load.py (SessionLoader.check_attrs): Decode
339     filenames too.
340     (SessionLoader.start_clrange): Use check_attrs to decode and check
341     the attributes.
342    
343     * Thuban/Model/xmlreader.py (XMLReader.encode): Use
344     internal_from_unicode to convert unicode strings.
345    
346     * Thuban/Model/xmlwriter.py (XMLWriter.encode): Use
347     unicode_from_internal when applicable
348    
349     * test/runtests.py (main): New command line option:
350     internal-encoding to specify the internal string encoding to use
351     in the tests.
352    
353     * test/support.py (initthuban): Set the internal encoding to
354     latin-1
355    
356     * test/test_load.py (TestSingleLayer.test, TestClassification.test)
357     (TestLabelLayer.test): Use the internal string representation when
358     dealing with non-ascii characters
359    
360     * test/test_load_1_0.py (TestSingleLayer.test)
361     (TestClassification.test, TestLabelLayer.test): Use the internal
362     string representation when dealing with non-ascii characters
363    
364     * test/test_load_0_9.py (TestSingleLayer.test)
365     (TestClassification.test): Use the internal string representation
366     when dealing with non-ascii characters
367    
368     * test/test_load_0_8.py (TestUnicodeStrings.test): Use the
369     internal string representation when dealing with non-ascii
370     characters
371    
372     * test/test_save.py (XMLWriterTest.testEncode)
373     (SaveSessionTest.testClassifiedLayer): Use the internal string
374     representation when dealing with non-ascii characters where
375     applicable
376    
377 bh 2638 2005-06-30 Bernhard Herzog <[email protected]>
378    
379 bh 2641 * test/runtests.py: Untabify.
380    
381     2005-06-30 Bernhard Herzog <[email protected]>
382    
383 bh 2639 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
384     untabify.
385    
386     2005-06-30 Bernhard Herzog <[email protected]>
387    
388 bh 2638 * Extensions/ogr/test/__init__.py: Add missing coding directive
389    
390 jan 2631 2005-06-28 Jan-Oliver Wagner <[email protected]>
391    
392 jan 2636 * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
393     Use the default size for rendering selected items of default type.
394     Fixes part 2 of https://intevation.de/rt/webrt?serial_num=3149
395    
396     2005-06-28 Jan-Oliver Wagner <[email protected]>
397    
398 jan 2631 * Extensions/importAPR/apr.py (APR_BShSym): Extend by 'Stripple'.
399     (APR_TClr.GetThubanColor): Fix bug in color interpretation.
400     Thanks to Frank Koormann who identified this problem.
401    
402     * Extensions/importAPR/importAPR.py (APR_VShSym): New. Just
403     another symbol identified.
404    
405 jan 2628 2005-06-27 Jan-Oliver Wagner <[email protected]>
406    
407     * Doc/manual/thuban-manual-de.xml: More translations.
408    
409 jonathan 2626 2005-05-12 Jonathan Coles <[email protected]>
410    
411     * Thuban/UI/projdialog.py: Add missing import, which led to an
412     exception when opening a layer's projection.
413    
414 bh 2623 2005-05-09 Bernhard Herzog <[email protected]>
415    
416 bh 2624 * test/support.py (FileLoadTestCase.filename): Fix doc-string.
417    
418     2005-05-09 Bernhard Herzog <[email protected]>
419    
420 bh 2623 * Thuban/Model/postgisdb.py (PostGISConnection.connect): Set the
421     connection to autoconnect. Fixes RT#3148.
422    
423     * test/test_postgis_db.py
424     (TestPostGISSpecialCases.test_simple_error_handling): New test
425     that attempts to reproduce RT#3148.
426    
427 jonathan 2622 2005-05-06 Jonathan Coles <[email protected]>
428    
429     Add support for saving and loading the opacity and mask type
430     properties of RasterLayers. Also add support for proper use
431     of alpha information while drawing images not in 'RAW' format.
432     If transparency in an image format (e.g, PNG) is supported by
433     wxWidgets then the image would previously have been draw with
434     transparent regions, but the opaque regions would have been
435     unaffected by a change in the layer's opacity. This patch
436     corrects the problem.
437    
438     * Thuban/Model/layer.py (RasterLayer): Added opacity and
439     masktype parameters to the constructor, and set the
440     appropriate variables to those values.
441    
442     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Added
443     code to read the opacity and mask type of the layer and construct
444     a new layer with the additional parameters.
445    
446     * Thuban/Model/save.py (SessionSaver.write_layer): Added code
447     to save the opacity and mask type of a layer.
448    
449     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
450     the opacity of the layer to draw_raster_data rather than the layer.
451     (BaseRenderer.draw_raster_data): Remove the layer parameter because
452     the function doesn't need to know about the layer. Add the optional
453     opacity parameter whose default is 1.0. Add 'PNG' as a supported
454     graphics format.
455    
456     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Fixed
457     signature to match that in BaseRenderer. Use the new opacity argument
458     in place of calling layer.Opacity(). In the case where the
459     format is not 'RAW', alpha_data is None and the loaded image has
460     alpha information, use the file's alpha information. This is
461     still subject to the layer's opacity setting.
462    
463     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
464     Fixed signature to match that in BaseRenderer.
465    
466     * test/test_load.py (TestRasterLayer): Change file_contents to
467     include opacity and masktype variables.
468     (TestRasterLayer.test): Include tests for opacity and masktype
469     changes.
470    
471     * test/test_save.py (SaveSessionTest.testRasterLayer): Restructure
472     test to cover a variety of combinations of masktype and opacity
473     settings.
474    
475 jan 2612 2005-05-02 Jan-Oliver Wagner <[email protected]>
476    
477     * debian/rules: add --use-wx-python-swig-hack
478     to the build command.
479     Thanks to Moritz Lennert for pointing this out.
480    
481 jan 2610 2005-04-28 Jan-Oliver Wagner <[email protected]>
482    
483     Introduce OGRFileShapeStore in ogr extension.
484     This allows at least that loaded shapefile shape stores
485     can be saved correctly in the thuban session file
486     and reloaded again (reload is via core shapefile
487     routine, not OGR). For other types, .thuban files
488     can not be reloaded for the time being.
489    
490     * Extensions/ogr/ogrshapes.py (OGRFileShapeStore): New. This
491     class ist to be used for any file-based shape stores
492     accessed through OGR.
493    
494     * Extensions/ogr/ogrstart.py (open_with_ogr): Added
495     forgotten _ for i18n. Adapted call OpenFileShapestore
496     regarding new parameter.
497     (OpenFileShapestore): Use OGRFileShapeStore instead of
498     OGRShapeStore. Fix return value (None instead of null).
499     Add new parameter "mainwindow" to avoid accessing global
500     context.
501    
502 jan 2607 2005-04-27 Jan-Oliver Wagner <[email protected]>
503    
504     Introduce FileShapeStore as generalization for
505     file-based shape stores. In a first instance
506     this allows additional modules to handle shapefile
507     format as well, namely the OGR extension.
508    
509     * Thuban/Model/data.py: Various small fixes in doc-strings.
510     (FileShapeStore): New class.
511     (ShapefileStore): Derive from FileShapeStore.
512     (ShapefileStore.__init__): Call __init__ of FileShapeStore,
513     rename self.table to self._table, initialize self._bbox
514     (ShapefileStore._open_shapefile): Use self._bbox instead of self.bbox
515     and self.FileName() instead of self.filename.
516     (ShapefileStore.Table): Use self._table instead of self.table.
517     (ShapefileStore.FileName): Removed (moved to FileShapeStore).
518     (ShapefileStore.BoundingBox): Use self._bbox instead of self.bbox.
519    
520     * Thuban/Model/save.py: Replace ShapefileStore by FileShapeStore.
521     (SessionSaver.write_data_containers): Only use methods of the
522     base class FileShapeStore.
523    
524 joey 2604 2005-04-26 Martin Schulze <[email protected]>
525    
526     * Extensions/wms/wms.py (render_wms_layer): Adjusted the render
527     function to the modified render engine
528    
529     2005-04-25 Martin Schulze <[email protected]>
530    
531     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
532     Added a description according to the CVS log message
533    
534     2005-04-23 Martin Schulze <[email protected]>
535    
536     * Thuban/UI/renderer.py: Added a missing import
537    
538 russell 2600 2005-04-23 Russell Nelson <[email protected]>
539    
540 russell 2613 * Thuban/UI/view.py (MapCanvas.OnMiddle{Up,Down}): Changed the
541     way the previous tool is remembered, so that middle-button
542     panning works even if you haven't selected a tool.
543 russell 2600
544 bh 2598 2005-04-11 Bernhard Herzog <[email protected]>
545    
546     * libraries/thuban/wxproj.cpp: Move the compatibility code that
547     deals with the wxPython 2.4 version of wxPython.h into the #ifdef
548     branch that includes wxPython.h because it's only needed when
549     wxPython.h is used. Also, it won't compile when
550     USE_WX_PYTHON_SWIG_HACK is set otherwise.
551    
552 bh 2597 2005-04-07 Bernhard Herzog <[email protected]>
553    
554     * Thuban/UI/classifier.py (ClassGrid.__init__): Use -1 as the ID.
555     (ID_CLASS_TABLE): Removed. It wasn't used anywhere except in
556     ClassGrid.__init__ and it's value is outside of the valid
557     range (must be < 32768). wxPython 2.5 complains about it with an
558     exception.
559    
560 jan 2596 2005-04-05 Jan-Oliver Wagner <[email protected]>
561    
562     * Doc/manual/thuban-manual-de.xml: More translations.
563    
564 bh 2590 2005-04-05 Bernhard Herzog <[email protected]>
565    
566 bh 2591 * libraries/thuban/wxproj.cpp: Make it work with a wxPython.h from
567     wxPython 2.4 as well. Also, remove a now obsolete comment.
568    
569     2005-04-05 Bernhard Herzog <[email protected]>
570    
571 bh 2590 Use wxPython.h by default but provide a workaround when it isn't
572     available.
573    
574     * setup.py (wxproj_extension): New variable. Assign the Extension
575     instance for Lib.wxproj to this variable instead of putting it
576     directly into the listso that it can be accessed by other code
577     later.
578     (thuban_build_ext.user_options): Added boolean option
579     --use-wx-python-swig-hack.
580     (thuban_build_ext.initialize_options): Initialize the new option
581     to False.
582     (thuban_build_ext.finalize_options): If the new option was given,
583     define the preprocesser macro USE_WX_PYTHON_SWIG_HACK.
584     (thuban_build_ext): Update the doc-string
585    
586     * libraries/thuban/wxproj.cpp: Normally we use
587     wx/wxPython/wxPython.h now. Only if USE_WX_PYTHON_SWIG_HACK is
588     defined, use swigPtrConvertHack.h instead.
589    
590     * libraries/thuban/swigPtrConvertHack.h: Remove the code that was
591     copied over from wxPython.h.
592     (decode_pointer_new): New. Equivalent of decode_pointer for
593     wxPython 2.5.
594     (wxPyConvertSwigPtr): Modified to cope with wxPython 2.5 as well.
595    
596     * README: Add section on potential build problems which explains
597     how the work-around for a missing wxPython.h is activated.
598    
599 bh 2588 2005-03-29 Bernhard Herzog <[email protected]>
600    
601 bh 2589 * test/postgissupport.py (find_postgis_sql): Added yet another
602     potential location for (lw)postgis.sql because the file has moved
603     again in postgis 1.0.0 rc4.
604    
605     2005-03-29 Bernhard Herzog <[email protected]>
606    
607 bh 2588 * Thuban/UI/legend.py (BMP_SIZE_W, BMP_SIZE_H): Set both to 16 to
608     match the site of the legend_icon_layer icon. Otherwise wxpython
609     2.5 complains when the legend is created with the error:
610    
611     PyAssertionError: C++ assertion "(bitmap.GetWidth() == m_width &&
612     bitmap.GetHeight() == m_height) || (m_width == 0 && m_height ==
613     0)" failed in ./src/generic/imaglist.cpp(81): invalid bitmap size
614     in wxImageList: this might work on this platform but definitely
615     won't under Windows.
616    
617 jonathan 2587 2005-03-23 Jonathan Coles <[email protected]>
618    
619     These changes add support for adjusting the opacity of a raster layer.
620    
621     * Thuban/Model/layer.py (RasterLayer.Opacity): Replaces AlphaOpacity.
622     (RasterLayer.SetOpacity): Replaces SetAlphaOpacity. Also triggers
623     a LAYER_CHANGED event if the opacity actually changes.
624    
625     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_data): Added
626     layer parameter needed in the implementation of this method in
627     renderer.py.
628    
629     * Thuban/UI/layerproperties.py (LayerProperties.dialog_layout): Fixed
630     typo 00 -> 0.
631    
632     * Thuban/UI/rasterlayerproperties.py (RasterLayerProperties): Added
633     control to adjust opacity.
634    
635     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Scale the
636     alpha data based on the opacity level of the layer.
637    
638     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Now
639     accepts a layer parameter.
640    
641     * test/test_layer.py (TestLayerModification.test_raster_layer):
642     Rename opacity method calls and add test for LAYER_CHANGED.
643    
644 bh 2586 2005-03-16 Bernhard Herzog <[email protected]>
645    
646     * test/test_connector.py (DeletionTestMixin.check_deletions)
647     (DeletionTestMixin.check_deletetions): renamed to check_deletions.
648     update the callers.
649    
650 jan 2585 2005-03-14 Jan-Oliver Wagner <[email protected]>
651    
652     * Doc/manual/thuban-manual-de.xml: More translations.
653    
654 jan 2584 2005-03-10 Jan-Oliver Wagner <[email protected]>
655    
656     Introducing initialization callbacks for extensions.
657    
658     * Thuban/UI/extensionregistry.py (ExtensionDesc.__init__): Added
659     optional parameter init_callback.
660     (ExtensionDesc.init_ext): New. Executes the callback and sets
661     a status.
662    
663     * Thuban/UI/application.py (ThubanApplication.OnInit): Add the
664     initialization of the extensions.
665     (ThubanApplication.init_extensions): Init all extensions.
666    
667     * Thuban/UI/about.py (About.__init__): Added status of the extensions
668     to the about text.
669    
670     * Extensions/gns2shp/__init__.py: Added init method for Extension
671     description.
672     (init): New. Contains the initialization of the module.
673    
674 nhueffme 2577 2005-03-04 Nina Hüffmeyer <[email protected]>
675    
676     * Extensions/ogr/ogrdialog.py: Added a dialog, which asks for
677     OGRConnection to open a datasource. Removed dialog to display all
678     available drivers. Added some doc strings.
679    
680     * Extensions/ogr/ogrstart.py: Added menu entry for opening an
681     OGRDatasource with a string. Added two opening methods which return an
682     OGRDatasource (either data from file or from DB).
683    
684     * Extensions/ogr/ogrshapes.py: Added class OGRGeometry, which
685     represents a geometry reference of an OGRFeature. OGRShape now has a
686     list of referenced geometry objects (important for geometry
687     collections).
688     For OGRShapeStores loaded from a DB an ID column can be specified now.
689    
690 jan 2576 2005-02-22 Jan-Oliver Wagner <[email protected]>
691    
692     * test/test_map.py (TestMapWithContents.test_tree_info):
693     Added label layer for comparison.
694    
695 jonathan 2574 2005-02-18 Jonathan Coles <[email protected]>
696    
697     * libraries/thuban/gdalwarp.cpp (GetImageData): Optimize the loop
698     which builds a mask. Handle the majority of an image in a loop,
699     creating 8 bits at a time. Later, handle the edge case where less
700     than 8 bits are packed.
701    
702 bh 2573 2005-02-18 Bernhard Herzog <[email protected]>
703    
704     * test/test_baserenderer.py (TestBaseRenderer.setUp): Fix
705     doc-string
706    
707 jonathan 2571 2005-02-18 Jonathan Coles <[email protected]>
708    
709 jonathan 2572 * setup.py: Remove wx_cs_params from gdal compile options.
710    
711     2005-02-18 Jonathan Coles <[email protected]>
712    
713 jonathan 2571 Refactored baserenderer.py and renderer.py to remove baserenderer.py's
714     dependencies on wxPython. Added a new method projected_raster_layer()
715     that returns a raster layer image in projected space. This must be
716     implemented in classes derived from BaseRenderer. This also eliminates
717     the dependency on gdal in baserenderer.py.
718    
719     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Call
720     new projected_raster_layer() to get projected raster image instead
721     of directly calling ProjectRasterFile().
722     (BaseRenderer.projected_raster_layer): New. This must be implemented
723     by derived classes. It takes almost the same arguments as ProjectRasterFile
724     did and returns a projected image with mask and alpha data (if requested).
725     (BaseRenderer.render_map_incrementally): Remove the check for gdal since
726     that check will be done in MapRenderer.projected_raster_layer(). This
727     also allows other implementations to use different projection code.
728    
729     * Thuban/UI/renderer.py (MapRenderer.projected_raster_layer):
730     Implementation of BaseRenderer.projected_raster_layer. Checks for
731     gdal support and wxPython version. Also handles exceptions from
732     ProjectRasterFile.
733    
734     * libraries/thuban/gdalwarp.cpp: Removed checks for wxPython versions
735     and added a variable which can be set through the options argument
736     of ProjectRasterFile.
737    
738     * test/test_baserenderer.py (SimpleRenderer.projected_raster_layer): New.
739     Calls ProjectRasterFile and returns the result.
740     (TestBaseRenderer.test_projected_raster_layer): New. Tests the results
741     of calling projected_raster_layer() with different options.
742     (TestBaseRenderer.test_raster_no_projection): Removed tests based on
743     wxPython version and all tests of masks and alpha channels. These are
744     now in test_projected_raster_layer().
745    
746 jan 2565 2005-02-17 Jan-Oliver Wagner <[email protected]>
747    
748 jan 2570 * Thuban/Model/map.py, Thuban/Model/label.py: Fixed
749     doc-strings to comply with coding_guidelines.
750    
751     2005-02-17 Jan-Oliver Wagner <[email protected]>
752    
753 jan 2565 Docstring improvements and minor fixes for labellayer.
754    
755     * Thuban/Model/map.py:
756     (Map, Map.Destroy, Map.RemoveLayer, Map.ClearLayers,
757     Map.Layers, Map.HasLayers, Map.MoveLayerToTop,
758     Map.RaiseLayer, Map.LowerLayer, Map.MoveLayerToBottom,
759     Map.ProjectedBoundingBox, Map.GetProjection): Improved/added
760     doc string.
761     (Map.BoundingBox): Removed superfluous test for label_layer
762     and improved doc string.
763     (Map.TreeInfo): Added label_layer and improved sdo string.
764    
765     * Thuban/Model/label.py: Added import of _.
766     (Label, Label.__init__): Improved/added doc string.
767     (LabelLayer, LabelLayer.__init__, LabelLayer.Labels,
768     LabelLayer.RemoveLabel, LabelLayer.ClearLabels):
769     Improved/added doc string.
770     (LabelLayer.AddLabel): Use already defined names for
771     align strings and improved doc string.
772     (LabelLayer.TreeInfo): New. Return the object data for
773     the tree view.
774    
775 jonathan 2562 2005-02-16 Jonathan Coles <[email protected]>
776    
777     Further wxPython 2.5 changes using patches from Daniel Calvelo Aros
778     so that that wxproj doesn't crash. Added GUI support for selecting
779     alpha channel (opacity can't be selected yet).
780    
781     NOTE: If wxPython.h is including in future distribution packages
782     then it will not be necessary to have the files swigPtrConvertHack.h
783     and wxPython_int.h included with Thuban. This is hopefully
784     a temporary workaround.
785    
786     * setup.py (thuban_build_ext.finalize_options): gdalwarp needs
787     access to the macro wxCHECK_VERSION so that it will properly
788     generate a bit mask. There was a problem between wx2.4 and wx2.5
789     that this works around.
790    
791     * Thuban/Model/layer.py (RasterLayer.UseMask): Removed in favor
792     of RasterLayer.MaskType.
793     (RasterLayer.SetUseMask): Removed in favor of RasterLayer.SetMaskType
794     (RasterLayer.MaskType): New. Returns the type of mask to use. Can
795     specify none, a bitmap, or an alpha channel.
796     (RasterLayer.SetMaskType): New. Set what kind of mask to use.
797    
798     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
799     Set the raster warping options for the mask based on the value
800     of RasterLayer.MaskType.
801    
802     * Thuban/UI/legend.py (LegendTree.__FillTreeLayer): Remove
803     deprecated calls to SetItemSelectedImage in favor of SetItemImage
804     with wxTreeItemIcon_Selected.
805    
806     * Thuban/UI/rasterlayerproperties.py: Support selecting to use
807     an alpha channel for the mask.
808    
809     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Use alpha
810     data if it is available and an alpha channel is supported under
811     the current version of wxPython.
812    
813     * libraries/thuban/gdalwarp.cpp (GetImageData): Added compiler define
814     to select whether 1's or 0's select the desired portion of an image
815     in the bit mask. wx2.4 has a bug where the documentation is the opposite
816     from behavior.
817     (ProjectRasterFile): Only generate an alpha channel if the version
818     of wxPython is >= 2.5.3.
819    
820     * libraries/thuban/wxproj.cpp: Applied patches from Daniel Calvelo Aros.
821     When wxPython >= 2.5.3 use the special swig functions to decode an
822     object's address.
823    
824     * libraries/thuban/swigPtrConvertHack.h: Includes conditional code
825     based on the version of wxPython. If >= 2.5.3 use the special swig
826     functions from wxPython to decode wxPython objects, otherwise use
827     the old method of retrieving the address from the object __repr__ string.
828    
829     * libraries/thuban/wxPython_int.h: Copied from wxPython source.
830     Unnecessary code was removed to make it smaller.
831    
832     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
833     Add tests for returning an alpha channel.
834    
835     * test/test_layer.py (TestLayerModification.test_raster_layer): Fix
836     tests that used removed functions UseMask and SetUseMask
837    
838    
839 bh 2560 2005-02-08 Bernhard Herzog <[email protected]>
840    
841 bh 2561 More wxPython 2.5 changes. This time taken from a patch from
842     Daniel Calvelo Aros.
843    
844     * Thuban/UI/tableview.py (QueryTableFrame.__init__)
845     (QueryTableFrame.__init__): Pass the size of a spacer as a single
846     item.
847    
848     * Thuban/UI/projdialog.py (ProjFrame.build_dialog)
849     (ProjFrame.build_dialog): Pass the size of a spacer as a single
850     item.
851    
852     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Pass the
853     size of a spacer as a single item.
854    
855     * Thuban/UI/classifier.py (Classifier.dialog_layout): Pass the
856     size of a spacer as a single item.
857    
858     2005-02-08 Bernhard Herzog <[email protected]>
859    
860 bh 2560 Compatibility with wxPython 2.5. The changes should make it work
861     better with 2.5 while still keeping compatibility with 2.4. There
862     are still problems with 2.5, though.
863    
864     * Thuban/UI/dock.py (DockableWindow.__CreateBorder): Pass the size
865     of a spacer as a single item.
866    
867     * Thuban/UI/classifier.py (ClassGroupPropertiesCtrl): Derive only
868     from wxControl
869    
870     * Thuban/UI/legend.py (LegendTree): When running with wxPython <
871     2.5, add an implementation of the GetFirstChild method that does
872     not require the second parameter.
873     (LegendTree.find_layer, LegendTree._OnMsgMapLayersAdded)
874     (LegendTree._OnMsgMapLayersRemoved, LegendTree.DeleteAllItems)
875     (LegendTree.DeleteChildren, LegendTree.__ShowHideLayer): Do not
876     pass the second parameter to GetFirstChild
877    
878 nhueffme 2559 2005-02-08 Nina Hüffmeyer <[email protected]>
879    
880     * Extensions/ogr/ogrshapes.py: Removed some print commands.
881    
882     * Extensions/ogr/ogrstart.py: Changed the GUI. OGR is no longer an
883     additional menu but appears as a possibility in the menu Map.
884    
885 jonathan 2558 2005-02-07 Jonathan Coles <[email protected]>
886     * libraries/thuban/gdalwarp.cpp: Removed the macros PYTHON_ERR
887     and PYTHON_ERRF since they were no longer necessary.
888    
889 bernhard 2556 2005-02-07 Bernhard Reiter <[email protected]>
890     * Thuban/UI/classifier.py (ClassGrid.DeleteSelectedRows):
891     Enable translation for message string.
892    
893 joey 2555 2005-02-06 Martin Schulze <[email protected]>
894    
895     * Extensions/wms/infodialog.py (wmsInfoDialog.__init__): Adjusted
896     the arguments of the contstructor to fit the global scheme
897    
898 nhueffme 2554 2005-01-31 Nina Hüffmeyer <[email protected]>
899    
900     * Extensions/ogr/ogrdialog.py: Added class ogrdialog.py, which provides
901     some dialogs needed to start ogr.
902    
903     * Extensions/ogr/__init__.py: Changed comments to avoid encoding
904     warnings.
905    
906     * Extensions/ogr/test/test_OGRShapestore.py: Changed comments to avoid
907     encoding warnings.
908    
909 jonathan 2552 2005-01-28 Jonathan Coles <[email protected]>
910    
911 jonathan 2553 * libraries/thuban/gdalwarp.cpp (GetImageData): Recode how the
912     mask is packed into a bit array. It's now slightly faster.
913    
914     2005-01-28 Jonathan Coles <[email protected]>
915    
916 jonathan 2552 * Thuban/Model/layer.py (RasterLayer.__init__): Make use_mask
917     default to true.
918    
919     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Remove
920     code that loads the state of the layer's use_mask flag. Its
921     usefulness is still being debated.
922    
923     * Thuban/Model/save.py (SessionSaver.write_layer): Remove
924     code that saves the state of the layer's use_mask flag. Its
925     usefulness is still being debated.
926    
927     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer): Pass
928     options to ProjectRasterFile based on the state of layer.UseMask().
929     Catch more exceptions from ProjectRasterFile so that Thuban doesn't
930     quit is there is a problem projecting.
931     (BaseRenderer.draw_raster_data): Change the documentation to
932     describe the new format (XBM) that the mask data will be in.
933    
934     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): The mask
935     data is in XBM format when format='RAW' which means it doesn't
936     need to be converted to a wxImage before being used as a mask
937     for a wxBitmap. Assume that if format != 'RAW' that the image
938     data and mask data are in the same format.
939    
940     * libraries/thuban/gdalwarp.cpp (GetImageData): If alpha is enabled
941     and a mask is requested, convert the alpha band to a bit array in
942     XBM format. if an alpha channel is requested, simply return the
943     data in the alpha band. Provide better error handling by returning
944     python error messages (also fixes RT #2947).
945     (ProjectRasterFile): Support multiple mask options, rather than simply
946     a flag indicating that a mask should or should not be used. Provide
947     better error handling by returning python error messages.
948    
949     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
950     Add mask data to test.
951    
952     * test/test_layer.py (TestLayer.test_raster_layer): Test that a layer
953     should use the mask by default.
954     (TestLayerModificaton.test_raster_layer): Test that a layer should use
955     the mask by default.
956    
957     * test/test_load.py (TestRasterLayer.test): Remove testing for
958     use_mask flag in file.
959    
960     * test/test_save.py (SaveSessionTest.testRasterLayer): Remove testing
961     for use_mask in file.
962    
963     * test/test_load_1_0_1.py: Removed. Shouldn't have been checked in.
964    
965 jonathan 2551 2005-01-26 Jonathan Coles <[email protected]>
966    
967     Add a new dialog box for raster layers. The dialog box allows
968     the user to toggle a mask that is generated by ProjectRasterFile
969     and is used to only draw the real parts of the projected image.
970    
971     * Thuban/UI/baserenderer.py (BaseRenderer.draw_raster_layer):
972     Instruct the warping code to generate a mask if the raster layer
973     requests one.
974     (BaseRenderer.draw_raster_data): Removed obsolete optional mask argument.
975    
976     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Removed
977     obsolete optional mask argument.
978    
979     * Thuban/UI/classifier.py (Classifier): Change the parent class
980     to LayerProperties and rework the code to support layout calls
981     from the parent.
982     (Classifier.dialog_layout): New. Layout the dialog box.
983     (Classifier.map_layers_removed): Removed. Moved to parent class.
984     (Classifier.map_replaced): Removed. Moved to parent class.
985     (Classifier._OnTry): Renamed to OnTry to support parent class.
986     (Classifier.OnClose): Removed. Supplied in parent class.
987     (Classifier._OnCloseBtn): Removed. Supplied in parent class as OnCloseBtn.
988     (Classifier._OnOK): Renamed to OnOK to support parent class.
989     (Classifier._OnRevert): Renamed to OnRevert to support parent class.
990    
991     * Thuban/UI/layerproperties.py: New. Base class for layer properties
992     dialog boxes.
993    
994     * Thuban/UI/rasterlayerproperties.py: New. Class for displaying
995     raster layer properties.
996    
997     * libraries/thuban/gdalwarp.cpp: Replace the old gdalwarp.cpp code
998     with the non-simple version supplied with gdal. This allows added
999     features such as creating an alpha band.
1000     (GetImageData): Generate a mask array from the alpha band that is
1001     generated by gdal if the user has selected it. Try to support images
1002     that have more than three bands, such as images with RGB plus an
1003     alpha band.
1004     (ProjectRasterFile): Convert python argument for mask and tell
1005     gdal to enable or disable an alpha band.
1006    
1007     * Thuban/Model/layer.py (BaseLayer.Type): New. Returns a string
1008     describing what kind of layer the class is. Defaults to "Unknown",
1009     but should be overridden by subclasses.
1010     (Layer.Type): New. Override base class method.
1011     (RasterLayer.__init__): Create a flag for using a mask. Record extra
1012     data from gdal for display in the properties dialog.
1013     (RasterLayer.Type): New. Override base class method.
1014     (RasterLayer.UseMask): New. Returns True if the mask should be used.
1015     (RasterLayer.SetUseMask): New. Set if the mask should be used.
1016     (RasterLayer.ImageInfo): New. Return extra information about the image.
1017    
1018     * Thuban/Model/load.py (SessionLoader.start_rasterlayer): Load
1019     the mask information.
1020    
1021     * Thuban/Model/save.py (SessionSaver.write_layer): Save mask information.
1022    
1023     * Thuban/UI/mainwindow.py: Register the RasterLayerProperties and
1024     Classifier classes as dialogs to use with the proper layer types.
1025    
1026     * test/test_baserenderer.py (TestBaseRenderer.test_raster_no_projection):
1027     Fix test.
1028    
1029     * test/test_layer.py (TestLayer.test_raster_layer): Test new methods.
1030     (TestLayerModification.build_path): New. Support function.
1031     (TestLayerModification.test_raster_layer): New. Test new methods.
1032    
1033     * test/test_save.py (SaveSessionTest.testRasterLayer): Add tests for mask.
1034    
1035     * test/test_load.py (TestRasterLayer): Add tests for mask.
1036    
1037     * test/test_load_1_0_1.py: New. Copied from test_load.py.
1038    
1039     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Removed
1040     obsolete optional mask argument.
1041    
1042 nhueffme 2549 2005-01-26 Nina Hüffmeyer <[email protected]>
1043    
1044     * Extensions/ogr/ogrshapes.py: Added two dictionaries to ShapeStore
1045     which maps the ids and the ordinals. Fixed RowIdToOrdinal(),
1046     RowOrdinalToId() and ReadRowAsDict().
1047    
1048     * Extensions/ogr/ogrstart.py: Added menu item which opens database
1049     layers for existing database connections.
1050    
1051     * Extensions/ogr/test/test_OGRShapestore.py: Fixed a message string.
1052    
1053    
1054 jan 2548 2005-01-26 Jan-Oliver Wagner <[email protected]>
1055    
1056     * Doc/manual/thuban-manual-de.xml: More translations.
1057    
1058 bh 2544 2005-01-24 Bernhard Herzog <[email protected]>
1059    
1060     Rework the status bar updates a bit to make sure the message about
1061     the projections is produced at the right times.
1062    
1063     * Thuban/UI/mainwindow.py (MainWindow.update_status_bar_messages):
1064     New class variable with messages that may require a status bar
1065     update.
1066     (MainWindow.view_position_changed)
1067     (MainWindow.update_status_bar): Rename from view_position_changed
1068     to update_status_bar. It's meaning has changed now that it may
1069     also generate messages about problems with projection settings.
1070     (MainWindow.__init__): Use the new update_status_bar_messages
1071     class variable to subscribe update_status_bar
1072     (MainWindow.set_position_text): Update doc-string. This method
1073     has to be renamed at some point. See doc-string and comments.
1074     (MainWindow.OnClose): Unsubscribe update_status_bar from all
1075     messages in update_status_bar_messages
1076    
1077     * Thuban/UI/viewport.py (ViewPort.forwarded_map_messages): New
1078     class attribute. map messages to be forwarded by the viewport.
1079     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): (un)subscribe
1080     the messages in forwarded_map_messages
1081    
1082 bh 2543 2005-01-21 Bernhard Herzog <[email protected]>
1083    
1084     * test/postgissupport.py (PostGISDatabase.__init__): Tweak
1085     doc-string
1086     (find_postgis_sql): Update for postgis-1.0.0-rc1, which uses a
1087     different name for the initialization SQL file.
1088    
1089 jonathan 2537 2005-01-21 Jonathan Coles <[email protected]>
1090 jan 2542
1091     * Thuban/UI/baserenderer.py (proj_params_to_str): New. Takes
1092     a projection and returns a formatted string representing the
1093     parameters to feed to gdalwarp. This function eliminates
1094     redundancy in draw_raster_layer().
1095     (BaseRenderer.render_map_incrementally): Removed the optimization which
1096     drew the top most raster layer first and then only those vector-
1097     based layers that are above it. With the support for transparency
1098     this optimization breaks correct behaviour.
1099     (BaseRenderer.draw_raster_layer): Reorganize code to support possible
1100     future enhancements to raster layer bounding box. The old behaviour has
1101     not changed. Also, change calling parameters to draw_raster_data()
1102     to specify new RAW data format and mask.
1103     (BaseRenderer.draw_raster_data): Change signature to include an optional
1104     parameter for mask information. Change documentation to mention
1105     support for new parameter and added option for RAW data format.
1106     The data argument is now a list of [width, height, data].
1107    
1108     * Thuban/UI/renderer.py (MapRenderer.draw_raster_data): Add new optional
1109     mask parameter. Add new condition for RAW format, which
1110     significantly reduces rendering time. Add condition for
1111     mask parameter.
1112    
1113     * libraries/thuban/gdalwarp.cpp (GetImageData): New. Creates a
1114 jonathan 2537 data array of RGB values from the projected image returned from
1115     the gdal warping functions. In the case of palette based images, it
1116 jan 2542 converts the NO_DATA index to the mask color.
1117     (ProjectRasterFile): Removed all custom memory driver references
1118     and replaced it with the standard in-memory dataset provided
1119     by gdal. The return data is no longer a BMP file, but an array
1120     of RGB values, one set triple per pixel.
1121 jonathan 2537
1122     * libraries/thuban/bmpdataset.cpp: Removed. Unnecessary.
1123     * libraries/thuban/cpl_mfile.h: Removed. Unnecessary.
1124     * libraries/thuban/cpl_mfile.cpp: Removed. Unnecessary.
1125    
1126 jan 2542 * setup.py (thuban_build_ext.finalize_options): Removed mention
1127     of cpl_mfile.cpp and bmpdataset.cpp files in the list of source
1128     files. These are obsolete with the new version of gdalwarp.cpp
1129    
1130     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data):
1131     Updated signature.
1132     (TestBaseRenderer.test_raster_no_projection): Changed the test
1133     data to be data in the uncompressed RAW format returned from
1134     ProjectRasterFile.
1135    
1136 jan 2535 2005-01-21 Jan-Oliver Wagner <[email protected]>
1137    
1138 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Made
1139     string available for i18n.
1140 jan 2535
1141 russell 2532 2005-01-20 Russell Nelson <[email protected]>
1142    
1143     * Resources/Projections/defaults.proj: Ruin the speling of the
1144 russell 2533 Lambert-93 projection so it doesn't run into the wx UTF-8 bug.
1145     It's the wrong thing to do in the long run, but it's necessary for
1146     those users until that bug is fixed. Otherwise the projection
1147     dialog segfaults. Better to annoy some Lambert-93 users with a
1148     spelling mistake than every Fedora Core 3 user of Thuban-CVS.
1149 russell 2532
1150 bernhard 2531 2005-01-20 Bernhard Reiter <[email protected]>
1151    
1152 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Added
1153     docstring and comment that the warning code here is a hack.
1154 bernhard 2531
1155 russell 2529 2005-01-20 Russell Nelson <[email protected]>
1156    
1157 jan 2542 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed): Warn
1158     user about misprojected layers when their lat/lon bounding
1159 russell 2529 box exceeds rational lat/lon values.
1160    
1161 bernhard 2525 2005-01-20 Bernhard Reiter <[email protected]>
1162    
1163 jan 2542 * Thuban/UI/about.py (unicodeToLocale): Improved:
1164 bernhard 2528 Use 'ascii' and then 'replace' for other characters
1165     when getdefaultlocale returns None. Thanks to Bernhard H. .
1166 jan 2542
1167 bernhard 2528 2005-01-20 Bernhard Reiter <[email protected]>
1168    
1169 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Added a comment
1170 bernhard 2527 that OnRangeText might be called twice and using None as argument.
1171 jan 2542
1172 bernhard 2527 2005-01-20 Bernhard Reiter <[email protected]>
1173    
1174 jan 2542 * Thuban/UI/classgen.py (GenQuantilesPanel.OnRetrieve): Add a
1175     OnRangeText(0) to work around a different in wx Behaviour noticed
1176     on MacOSX, thanks to Lorenzo Moretti and Daniel Calvelo for the fix.
1177    
1178 bernhard 2526 2005-01-20 Bernhard Reiter <[email protected]>
1179    
1180     * Thuban/UI/about.py: take iso-8859-15 when getdefaultlocale returns
1181 bernhard 2525 None. (Fixes rt#2910.)
1182    
1183 frank 2524 2005-01-18 Frank Koormann <[email protected]>
1184    
1185     New Extension: mouseposition
1186     Tool to collect mouse click positions (map coordinates) in a dialog.
1187    
1188     * Extensions/mouseposition/__init__.py: New, extension registration
1189    
1190     * Extensions/mouseposition/mouseposition.py: New, implements the
1191     dialog and adds a tool to Thuban mainwindow.
1192    
1193     * Extensions/mouseposition/position.xpm: New, icon for tool.
1194    
1195 jan 2522 2005-01-14 Jan-Oliver Wagner <[email protected]>
1196    
1197     * Doc/manual/thuban-manual-de.xml: More translations.
1198    
1199 frank 2520 2005-01-11 Frank Koormann <[email protected]>
1200    
1201     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1202     Fix indention bug.
1203    
1204 frank 2517 2005-01-09 Frank Koormann <[email protected]>
1205    
1206     * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer):
1207 frank 2520 BugFix 2901: Explicitly copy layers ClassificationColumn since it
1208 frank 2517 is not part of the layers Classification.
1209    
1210 frank 2515 2005-01-03 Frank Koormann <[email protected]>
1211    
1212 frank 2517 * Thuban/UI/renderer.py (ScreenRendererdraw_selection_incrementally):
1213     BugFix 2883: Former implementation only worked on classified point
1214     layers: KeyError was raised, now use the default size if field is None.
1215 frank 2515
1216 bernhard 2513 2004-12-27 Bernhard Reiter <[email protected]>
1217    
1218     svgexport 1.0.0cvs: Fixed label export.
1219    
1220     * Extensions/svgexport/test/test_svgmapwriter.py:
1221     class TestSVGRenderer(): New class; new test test_label_font().
1222    
1223     * Extensions/svgexport/svgmapwriter.py
1224     (SVGRenderer.label_font()): initialised Font size with self.factor now,
1225     makes test_label_font happy.
1226    
1227     * Extensions/svgexport/TODO: crossed out fixed label export item.
1228     Added item for options.
1229    
1230     * Extensions/svgexport/__init__.py: Bumped version to 1.0.0cvs.
1231    
1232 russell 2511 2004-12-27 Russell Nelson <[email protected]>
1233    
1234 jan 2512 Middle mouse button pans.
1235 russell 2511
1236 jan 2512 * Thuban/UI/view.py (MapCanvas.__init__): Subscribe also
1237     OnMiddleDown and OnMiddleUp events.
1238     (MapCanvas.OnMiddleDown): New. Activate the pan tool and remember the
1239     previously used tool.
1240     (MapCanvas.OnMiddleUp): New. Reactivate the remebered tool used before
1241     pressing the middle mouse button.
1242    
1243 jan 2509 2004-12-27 Jan-Oliver Wagner <[email protected]>
1244    
1245     * Doc/manual/thuban-manual-de.xml: More translations.
1246    
1247 jan 2506 2004-12-23 Jan-Oliver Wagner <[email protected]>
1248    
1249     * Thuban/UI/projdialog.py (ProjFrame.load_user_proj): Added a
1250     \n to stderr after the warnings. Thanks to Russell Nelson.
1251    
1252 nhueffme 2493 2004-12-20 Nina Hueffmeyer <[email protected]>
1253    
1254     * Extensions/ogr/ogrshapes.py: Fixed some issues from
1255     Bernhard (coding guidelines etc.). Additionally it is now possible to
1256     display shapefiles containing feature collections (e.g.polygons
1257     with holes). Works with gdal 1.2.1 now.
1258    
1259     * Extensions/ogr/test/test_OGRShapestore.py: Fixed some issues
1260     from Bernhard (coding guidelines etc.). If ogr can't be imported,
1261     tests are skipped now.
1262    
1263     * Extensions/ogr/ogrstart.py: Fixed some typings.
1264    
1265 bernhard 2490 2004-12-20 Bernhard Reiter <[email protected]>
1266    
1267     * Extensions/svgexport/TODO: updated to add support for
1268     raster layers and labels for 1.0.1.
1269    
1270     * Extensions/svgexport/svgmapwriter.py (draw_raster_layer):
1271     Issue a warning now.
1272    
1273 bernhard 2488 2004-12-19 Bernhard Reiter <[email protected]>
1274    
1275 bernhard 2489 * Extensions/svgexport/TODO: Added idea to support triggering
1276     the application down the pipe.
1277    
1278     2004-12-19 Bernhard Reiter <[email protected]>
1279    
1280 bernhard 2488 svgexport: Improved code quality, mainly by better naming.
1281    
1282     * Extensions/svgexport/svgmapwriter.py:
1283     DrawPath() renamed to DrawPolygonPath(),
1284     added documentation, improved comments and variable names.
1285    
1286     * Extensions/svgexport/svgmapwriter.py,
1287     Extensions/svgexport/test/test_svgmapwriter.py:
1288     All using DrawPolygonPath() now, the default parameter closed=True
1289     omitted.
1290    
1291     * Extensions/svgexport/test/test_svgmapwriter.py:
1292     renamed test_polygon_opened() to test_polyline()
1293     renamed test_transparent_polygon() to test_transparent_polyline()
1294    
1295 jan 2487 2004-12-18 Jan-Oliver Wagner <[email protected]>
1296    
1297     Some fixes of gns2shp extension.
1298    
1299     * Extensions/gns2shp/test/__init__.py: New. Make this directory a
1300     package.
1301    
1302     * Extensions/gns2shp/test/test_gns2shp.py: Add some import paths
1303     dynamically.
1304    
1305     * Extensions/gns2shp/test/README: Simplified description how to test.
1306    
1307     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed doc-string,
1308     fixed some dimensions of fields according to the GNS documentation
1309     which seems to change undocumented.
1310     Now killing trailing \n and/or \r from MODIFY_DATE.
1311     This fixes RT#2453.
1312    
1313 bernhard 2479 2004-12-18 Bernhard Reiter <[email protected]>
1314 bernhard 2480
1315 bernhard 2482 svgexport 1.0.0: Treats holes and islands nicely. Documentation added.
1316    
1317     * Extensions/svgexport/test/test_svgmapwriter.py:
1318     Added new tests: test_export_polygon_with_hole()
1319     and test_polygon_with_hole().
1320    
1321     * Extensions/svgexport/svgmapwriter.py
1322     (draw_polygon_shape()): Uses DrawPath correctly now.
1323    
1324     * Doc/manual/thuban-manual.xml: Added documentation for stable
1325     extention svgexport.
1326     * Doc/manual/thuban-manual-de.xml: Copied English section about
1327     svexport over.
1328    
1329 jan 2509 * Extensions/svgexport/__init__.py: Bumped version number to 1.0.0.
1330 bernhard 2482
1331     * Extensions/svgexport/svgsaver.py,maplegend.py:
1332     Moved from experimental to stable extension menu.
1333    
1334     * Extensions/svgexport/TODO: updated.
1335    
1336    
1337     2004-12-18 Bernhard Reiter <[email protected]>
1338    
1339 bernhard 2481 Added Extensions/svgexport/TODO
1340    
1341     2004-12-18 Bernhard Reiter <[email protected]>
1342    
1343 bernhard 2480 Refactored in svgexport:
1344     DrawPath replaces DrawPolygon; added newline in front of "M" in paths.
1345    
1346     * Extensions/svgexport/svgmapwriter.py
1347     Added verbosity level 3 to print out polygon points.
1348     (class Point): added __repr__
1349     (class Brush, __str__()): Added space after ,.
1350     (DrawPolygon): Renamed to DrawPath()
1351     (DrawPath): Takes list of polygons as input now, adds \n before "M"s.
1352     (DrawLines): Using DrawPath now.
1353    
1354     * Extensions/svgexport/test/test_svgmapwriter.py:
1355     Replaced DrawPolygon() calls with DrawPath() and put the first argument
1356     inside another list. Adapted test data with a newline before "M".
1357    
1358     2004-12-18 Bernhard Reiter <[email protected]>
1359 bernhard 2479
1360     Refactored svgexport tests: 9 double tests runs eliminated;
1361     code size reduced by 8 lines.
1362    
1363     * Extensions/svgexport/test/test_svgmapwriter.py:
1364     (class TestWithDC): Renamed to BaseTestWithDC, moved to top.
1365     (class BaseWithDCtools): New, subclass from BaseTestWithDC.
1366     (class TestDrawSplines): now subclass from BaseTestWithDCtools,
1367     this fixed the double running of the nine tests of TestVirtualDC.
1368     (class TestVirtualDC): Using self.dc and self.file from setUp().
1369    
1370 bh 2478 2004-12-17 Bernhard Herzog <[email protected]>
1371    
1372     Two windows specific fixes ported from thuban-1­0-branch:
1373    
1374     * Thuban/UI/about.py (unicodeToLocale): Use getdefaultlocale
1375     instead of getlocale because getlocale doesn't return a usable
1376     encoding name on a german windows 2000
1377    
1378     * setup.py: windows build: Removed the absolute path names and
1379     made all prfixes relative to the directory containing setup.py.
1380     Makes it a little easier to adapt to a different system.
1381    
1382 bh 2470 2004-12-16 Bernhard Herzog <[email protected]>
1383    
1384 bernhard 2479 Add support for PostGIS tables with LINESTRING geometries.
1385 bh 2472 Fixes RT#2299
1386    
1387     * Thuban/Model/postgisdb.py (shapetype_map): Add LINESTRING
1388    
1389     * test/postgissupport.py
1390     (PostgreSQLServer.get_default_static_data_db): Rename the "roads"
1391     table to "roads-multi" because it now uses MULTILINESTRING
1392     geometries and introduce a new "roads" table that uses LINESTRING
1393     (coords_to_multilinestring): Make the doc string more precise
1394     (coords_to_linestring): New. Create a LINESTRING WKT
1395     representatin
1396     (wkt_converter): Add coords_to_linestring
1397     (upload_shapefile): Rephrase the doc-string a bit.
1398    
1399     * test/test_postgis_db.py (TestPostGISShapestoreArc)
1400     (LineStringTests)
1401     (TestPostGISShapestoreLineString)
1402     (TestPostGISShapestoreMultiLineString): Split
1403     TestPostGISShapestoreArc into a base class LineStringTests and two
1404     derived classes TestPostGISShapestoreLineString for LINESTRING
1405     geometries and TestPostGISShapestoreMultiLineString for
1406     MULTILINESTRING geometries. Most test methods are in the base
1407     class with the exception of tests that explicitly check the raw
1408     format.
1409    
1410     2004-12-16 Bernhard Herzog <[email protected]>
1411    
1412 bh 2471 Make the test suite work with PostGIS 0.8.2 and PostgreSQL 7.4
1413    
1414     * test/postgissupport.py (find_postgis_sql): Different postgis
1415     versions put the postgis.sql file into slightly different places
1416     so we have to look in both. The updated doc string describes this
1417     is more detail.
1418    
1419     * test/test_postgis_db.py
1420     (TestPostGISSpecialCases.test_column_name_quoting): The return
1421     value of UniqueValues is unsorted, so it has to be sorted for
1422     comparison.
1423    
1424     2004-12-16 Bernhard Herzog <[email protected]>
1425    
1426 bh 2470 Fix for RT#2237
1427    
1428     * Thuban/UI/projdialog.py (ProjFrame._show_proj_panel): If the
1429     panel to be shown is the UnknownProjPanel disable the OK and Try
1430     buttons. Otherwise enable them.
1431     (ProjFrame.__GetProjection): The UnknownProjPanel returns None for
1432     the parameters. In that case __GetProjection also returns None
1433     now.
1434    
1435 bh 2459 2004-12-15 Bernhard Herzog <[email protected]>
1436    
1437 bh 2462 * Thuban/UI/classgen.py (GenQuantilesPanel.__init__): Set the
1438     minimum number of classes to 2. The calculate_quantiles needs at
1439     least two and raises an exception otherwise.
1440     Fixes RT#2549
1441    
1442     2004-12-15 Bernhard Herzog <[email protected]>
1443    
1444 bh 2460 * test/postgissupport.py (PostgreSQLServer.execute_sql): Extend to
1445     so that it returns a result for select statements.
1446     (PostgreSQLServer.server_version): New. Return the version of the
1447     server software.
1448     (PostgreSQLServer.require_authentication): The format of
1449     pg_hba.conf has changed between PostgrSQL 7.2 and 7.3. Check the
1450     server version and generate the file in the correct format
1451    
1452     2004-12-15 Bernhard Herzog <[email protected]>
1453    
1454 bh 2459 * test/postgissupport.py (PostgreSQLServer.is_running): Fix typo
1455     in the doc string and rephrase it a little.
1456    
1457 frank 2457 2004-12-15 Frank Koormann <[email protected]>
1458    
1459     * test/test_load.py (TestAltPath.checkSession): New, extended checks if
1460     session has been loaded successfully. The check is called by the relevant
1461     tests after executing load_session().
1462    
1463 bh 2450 2004-12-13 Bernhard Herzog <[email protected]>
1464    
1465 bh 2454 Make sure the region used to determine which shapes are visible
1466     actually matches the region on the printed page. If this isn't
1467     done properly some shapes might not be printed.
1468     Fixes RT #2692
1469    
1470     * Thuban/UI/view.py (MapPrintout.draw_on_dc): The region for the
1471     renderer has to be at the same position as the mapregion
1472    
1473     * Thuban/UI/renderer.py (ExportRenderer.RenderMap): self.region
1474     has to be moved by (self.shiftx, self.shifty) too.
1475    
1476     2004-12-13 Bernhard Herzog <[email protected]>
1477    
1478 bh 2452 * libraries/pyprojection/Projection.i: Work around a bug in the
1479     generated python code which leads to exception in the __del__
1480     method when the constructor fails. See the comments in the code
1481     for more details.
1482    
1483     * libraries/pyprojection/Projection.py: Updated from Projection.i
1484     with SWIG.
1485    
1486     2004-12-13 Bernhard Herzog <[email protected]>
1487    
1488 bh 2451 * test/test_load.py (TestAltPath.test_01_single_path_error_fix)
1489     (TestAltPath.test_02_path_error_fix_from_list)
1490     (TestAltPath.test_05_path_error_fix_from_list_changed)
1491     (TestAltPath.test_06_path_error_fix_from_list_fails): self.session
1492     is destroyed in tearDown, so there's no need to do it in a test
1493     case.
1494    
1495     * Thuban/Model/load.py (SessionLoader.open_shapefile): Remove a
1496     debug print
1497    
1498     2004-12-13 Bernhard Herzog <[email protected]>
1499    
1500 bh 2450 * Extensions/svgexport/test/test_svgmapwriter.py
1501     (TestDrawSplines.setUp): Do not use super with the unittest
1502     classes because in Python 2.2 they're still old-style classes.
1503    
1504 frank 2448 2004-12-13 Frank Koormann <[email protected]>
1505    
1506     Alternative Path feature: When loading a (moved) session where
1507     shapefiles cannot be found, ask the user. Use the specified path
1508     if further shapefiles are missing. However, ask the usr for confirmation
1509     in such cases.
1510    
1511     * test/test_load.py (TestAltPath): New, tests for alternative path feature
1512     in load_session()
1513     (Shapefile_CallBack): Helper, implements controllable callback.
1514    
1515     * Thuban/UI/application.py (ThubanApplication.OnInit):
1516     Added "alt_path" to self.path
1517     (ThubanApplication.OpenSession): Added shapefile_callback as second
1518     callback similar to db_connection_callback.
1519     (ThubanApplication.run_alt_path_dialog): New, implementaion of
1520     shapefile_callback. In addition to raising the dialog the control of
1521     self.path('alt_path') is implemented here.
1522    
1523     * Thuban/Model/load.py (SessionLoader.__init__): Added shapefile_callback.
1524     (SessionLoader.open_shapefile): Open shapefile, eventually with
1525     alternative path. This wrapps the "theSession.OpenShapefile(filename)"
1526     formerly used in start_fileshapesource()/start_layer().
1527     (SessionLoader.start_fileshapesource): Call open_shapefile().
1528     (SessionLoader.start_layer): Call open_shapefile().
1529     (load_session): Added shapefile_callback.
1530    
1531     * Thuban/UI/altpathdialog.py: New, implements dialogs for alternative path
1532     feature (search / check).
1533    
1534     * Doc/manual/thuban-manual.xml: Added documentation of new feature.
1535    
1536 bernhard 2443 2004-12-11 Bernhard Reiter <[email protected]>
1537    
1538 bernhard 2445 svgexport 0.9.2: Point size supports for maps.
1539    
1540     * Extensions/svgexport/svgmapwriter.py: Added import of SHAPETYPE_POINT
1541     (def draw_point_shape): new parameter size defaults to 2 as before.
1542     (draw_shape_layer_incrementally): Moved draw_func log line higher.
1543     Added draw_func call with size when dealing with a point layer.
1544    
1545     * Extensions/svgexport/__init__.py: bumped version to 0.9.2.
1546    
1547     2004-12-11 Bernhard Reiter <[email protected]>
1548    
1549 bernhard 2444 Made sure that newlines are inserted in the svg path d attributes
1550     to raise the chance that the line length will be below 255 characters,
1551     as recommended by REC SVG 1.1 in section 8.3.1.
1552    
1553     * Extensions/svgexport/svgmapwriter.py(DrawPolygon):
1554     Adding \n before L's and changed whitespace handling.
1555    
1556     * Extensions/svgexport/test/test_svgmapwriter.py:
1557     Adapted tests to new whitespace handling of DrawPolygon.
1558    
1559     2004-12-11 Bernhard Reiter <[email protected]>
1560    
1561 bernhard 2443 * Doc/technotes/coding_guidelines.txt: easy typo fixed.
1562    
1563     * Extensions/svgexport/test/test_svgmapwriter.py:
1564     Removed test_drawbezier in favour of new test_drawspline3 and
1565     test_drawspline4 within new class TestDrawSplines(TestVirtualDC).
1566     All only to test DrawSpline.
1567    
1568     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1569     New implementation now really using the strange algorithm of
1570     xfig 3.1's approximated splines and its conversion to postscript
1571     with one twist: SVG can do quadratic beziers, so skipped translation
1572     to cubic beziers.
1573     (TestWithDC): Typo in comment fixed.
1574    
1575 joey 2442 2004-12-09 Martin Schulze <[email protected]>
1576    
1577     * Thuban/Model/classgen.py: Added missing character encoding
1578    
1579     * Extensions/wms/properties.py (OpenWMSProperties): removed
1580    
1581     * Extensions/wms/parser.py (WMSCapabilitiesParser.error): Dropped
1582     support for get_srs_discrepancies() since there are no
1583     discrepancies anymore (was a thinko)
1584    
1585     * Extensions/wms/layer.py (WMSLayer.GetMapImg): Improved graphic
1586     format priority now that more formats are supported globally by
1587     the render engine.
1588    
1589 silke 2437 2004-12-08 Silke Reimer <[email protected]>
1590     * Extensions/ogr/ogrshapes.py: Substituted ogr-method CloseRings
1591     because it is not available in all versions of ogr
1592    
1593 bernhard 2436 2004-12-08 Bernhard Reiter <[email protected]>
1594     * Extensions/ogr/__init__.py: Added empty __init__.py to heal
1595     global tests until a real one is commited.
1596    
1597 nhueffme 2435 2004-12-07 Nina Hüffmeyer <[email protected]>
1598    
1599     * /Extensions/ogr/: Adding a new extension to read shapefiles with
1600     ogr. It is planned to add other vector formats.
1601    
1602     * /test/runtests.py: Adding tests from /Extensions/ogr/test/.
1603    
1604 jan 2434 2004-12-07 Jan-Oliver Wagner <[email protected]>
1605    
1606     * /Extensions/svgexport/test/test_svgmapwriter.py: Reverting
1607     part of a (non-)fix to renable that the tests are always
1608     executed.
1609    
1610 bernhard 2432 2004-12-07 Bernhard Reiter <[email protected]>
1611    
1612     * Extensions/svgexport/test/test_svgmapwriter.py:
1613     Added test_drawbezier() to test DrawSpline().
1614    
1615     * Extensions/svgexport/svgmapwriter.py(DrawSpline):
1616     Really implemented bezier drawing.
1617    
1618     * Extensions/svgexport/__init__.py: Bumped version of svgexport
1619     to 0.9.1 because now the legend examples lines styles
1620     will be drawing with beziers.
1621    
1622 joey 2431 2004-12-05 Martin Schulze <[email protected]>
1623    
1624     * Thuban/UI/renderer.py (raster_format_map): Added PNG, TIFF and
1625     GIF as supported bitmap image formats (helpful for the WMS extension)
1626    
1627 joey 2430 2004-11-30 Martin Schulze <[email protected]>
1628    
1629     * Extensions/wms/test/test_ogclib.py (TestOGCLib.test_compareURLs):
1630     Improved the test for the internal compare method
1631    
1632 jan 2429 2004-11-27 Jan-Oliver Wagner <[email protected]>
1633    
1634     * Thuban/UI/about.py (About.__init__): Added
1635     Norbert Solymosi for hungarian translation and Ole Rahn
1636     as contrbutor. Moved Bernhard Reiter from Contributor
1637     to Developer.
1638    
1639 bernhard 2425 2004-11-27 Bernhard Reiter <[email protected]>
1640    
1641     * Extensions/svgexport/test/test_svgmapwriter.py:
1642     Removed Jan from author list as he did not change enough significant
1643     lines yet.
1644    
1645     * Extensions/svgexport/__init__.py: Added Bernhard as author
1646     of the Extension.
1647    
1648 jan 2422 2004-11-27 Jan-Oliver Wagner <[email protected]>
1649    
1650     * po/hu.po: New. Hungarian translation. Contributed
1651     by Norbert Solymosi.
1652    
1653 bh 2419 2004-11-26 Bernhard Herzog <[email protected]>
1654    
1655     * Extensions/svgexport/test/test_svgmapwriter.py
1656     (Testobjectexport.test_transparent_polygon): Commented out some
1657     debug prints
1658    
1659 jan 2418 2004-11-24 Jan-Oliver Wagner <[email protected]>
1660    
1661     Fix broken tests for svg extension and added svg legend
1662     to Experimental menu.
1663    
1664     * Extensions/svgexport/test/test_svgmapwriter.py: Fix to have
1665     the test run correctly even if the extension is a package.
1666     Also removed the "import Thuban" which makes no sense.
1667    
1668     * Extensions/svgexport/__init__.py: Fix to have the extensions'
1669     test module also be executed from the global test routine.
1670     This is done by looking for the absense of the DISPLAY variable.
1671    
1672     * Extensions/svgexport/maplegend.py: Moved the menu entry from Extensions
1673     to Experimental menu since this module has yet not reached a stable
1674     status (ie. 1.0).
1675    
1676 bernhard 2414 2004-11-22 Bernhard Reiter <[email protected]>
1677    
1678     * Extensions/svgexport/svgmapwriter.py:
1679     Added verbose variable and some logging depending on it.
1680     (class VirtualDC(XMLWriter)): Minor improvement in the polygon loop,
1681     because counting i is not necessary.
1682     (class Pen, class Brush): Added simple __str__ methods.
1683     (SVGRenderer.draw_polygone_shape): Fix #2698 (transparent polygons are
1684     not exported to svg file) Note: holes still unhandled.
1685    
1686     * Extensions/svgexport/test/test_svgmapwriter.py:
1687     Made a baseclass TestWithDC for test needed a DC.
1688     Added tests for bug #2698 (transparent polygons are not
1689     exported to svg file):
1690     Testobjectexport.test_transparent_polygon()
1691    
1692     * Thuban/Model/base.py (UnsetModified):
1693     Fixed some typos in docstring.
1694    
1695     * Thuban/UI/baserenderer.py (BaseRenderer.draw_polygon_shape()):
1696     Added hints on the used algorithm for handling holes.
1697    
1698 jan 2403 2004-11-20 Jan-Oliver Wagner <[email protected]>
1699    
1700 jan 2412 Some face lifting for the examples.
1701    
1702     * Examples/__init__.py: Make this directory a package.
1703    
1704     * Examples/simple_extensions/__init__.py: Make this directory a package.
1705    
1706     * Examples/simple_extensions/hello_world.py: Moved entry from Extensions
1707     menu to Examples menu.
1708    
1709     * Examples/simple_extensions/simple_command.py: Some more comments,
1710     minor changes.
1711    
1712     * Examples/simple_extensions/simple_tool.py: Minor changes.
1713    
1714     2004-11-20 Jan-Oliver Wagner <[email protected]>
1715    
1716 jan 2407 Changed way of extension registry for wms and added extension
1717     registry for umn_mapserver extension.
1718    
1719     * Extensions/wms/__init__.py: Added registry entry and the importing
1720     of the actual wms module. Included a test for the required PyOGCLib.
1721    
1722     * Extensions/wms/wms.py: Removed registry entry (moved to __init__.py).
1723    
1724     * Extensions/umn_mapserver/__init__.py: Added registry entry and the
1725     importing of the actual umn mapserver management modules.
1726     Included a test for the required Python MapScript.
1727    
1728     2004-11-20 Jan-Oliver Wagner <[email protected]>
1729    
1730 jan 2403 Changed way of extension registry for importAPR, bboxdump
1731     and added extension registry for svgexport.extension registry for
1732     svgexport.
1733    
1734     * Extensions/importAPR/__init__.py: Added registry entry and the importing
1735     of the actual importAPR module.
1736    
1737     * Extensions/importAPR/importAPR.py: Removed registry entry (moved to
1738     __init__.py).
1739    
1740     * Extensions/bboxdump/__init__.py: Added registry entry and the importing
1741     »···of the actual bboxdump module.
1742    
1743     * Extensions/bboxdump/bboxdump.py: Removed registry entry (moved to
1744     »···__init__.py).
1745    
1746     * Extensions/svgexport/__init__.py: Added registry entry and the importing
1747     of the svgsaver module.
1748    
1749     * Extensions/svgexport/svgsaver.py: Moved the menu entry from Extensions
1750     to Experimental menu since this module has yet not reached a stable
1751     status (ie. 1.0).
1752    
1753 jan 2397 2004-11-18 Jan-Oliver Wagner <[email protected]>
1754    
1755     Now the hit test considers the size of point symbols.
1756    
1757     * Thuban/UI/viewport.py (ViewPort._hit_point): Added optional parameter
1758     'size' defaulting to the previously fixed value 5.
1759     Extended doc-string.
1760     (Viewport._find_shape_in_layer): Resolved FIXME regarding flexibility
1761     for symbols.
1762     Now the size of the largest point symbol is determined to find out
1763     about whether the point has been hit.
1764     This fixes the problem that only clicks inside a fixed distance of
1765     5 where found.
1766    
1767 jan 2395 2004-11-17 Jan-Oliver Wagner <[email protected]>
1768    
1769 jan 2397 Another open issue fixed regarding sizeable symbols: correct rendering of
1770 jan 2395 selected symbols.
1771    
1772     * Thuban/UI/renderer.py (ScreenRenderer.draw_selection_incrementally):
1773     Added consideration of the specific size of point symbols.
1774     The property for each point symbol is retrieved and the size applied
1775     for the rendering method.
1776     Added doc-string.
1777    
1778 jan 2393 2004-11-16 Jan-Oliver Wagner <[email protected]>
1779    
1780     Changed way of Extension Registry for gns2shp and profiling.
1781    
1782     * Extensions/gns2shp/gns2shp.py: Removed registry entry (moved to
1783     __init__.py).
1784    
1785     * Extensions/gns2shp/__init__.py: Added registry entry and the importing
1786     of the actual gns2shp module.
1787    
1788     * Extensions/profiling/profiling.py: Removed registry entry (moved to
1789     __init__.py).
1790    
1791     * Extensions/profiling/__init__.py: Added registry entry and the importing
1792     of the actual profiling module.
1793    
1794 bernhard 2388 2004-10-28 Bernhard Reiter <[email protected]>
1795    
1796     * Extensions/svgexport/: Minor improvements to doc strings.
1797    
1798 jan 2387 2004-10-07 Jan-Oliver Wagner <[email protected]>
1799    
1800     Further elements for sizable point objects now
1801     making this feature usable though not yet complete.
1802    
1803     * Thuban/Model/save.py (SessionSaver.write_classification): Write
1804     attribute 'size' for cldata when the shape layer is of point type.
1805     This also now make the test_load.py tests happy.
1806    
1807     * Thuban/Model/classgen.py (CustomRamp.GetProperties): Added size
1808     gradient.
1809    
1810     * Thuban/UI/classifier.py (ID_SELPROP_SPINCTRL): Renamed to
1811     ID_SELPROP_SPINCTRL_LINEWIDTH.
1812     (ID_SELPROP_SPINCTRL_LINEWIDTH): New Id replaces ID_SELPROP_SPINCTRL.
1813     (ID_SELPROP_SPINCTRL_SIZE): New Id.
1814     (SelectPropertiesDialog.__init__): Added a second spin control
1815     for the size in case the corresponding layer is of point type.
1816     (SelectPropertiesDialog._OnSpin): Renamed to _OnSpinLineWidth.
1817     (SelectPropertiesDialog._OnSpinLineWidth): New. Former _OnSpin.
1818     (SelectPropertiesDialog._OnSpinSize): New. Set size of property
1819     and refresh preview.
1820    
1821    
1822    
1823 joey 2381 2004-10-04 Martin Schulze <[email protected]>
1824    
1825     * Extensions/wms/test/test_parser.py
1826     (TestWMSCapabilitiesParser.test_compareLists): Added missing
1827     self-test for compareLists()
1828     (TestWMSCapabilitiesParser.test_compareDicts): Added missing
1829     self-test for compareDicts()
1830 joey 2382 (TestWMSCapabilitiesParser.test_compareLists): Adding more tests
1831     to verify the test routine fails with non-equal arguments
1832     (TestWMSCapabilitiesParser.test_compareDicts): Adding more tests
1833     to verify the test routine fails with non-equal arguments
1834 joey 2381
1835 jan 2370 2004-10-03 Jan-Oliver Wagner <[email protected]>
1836    
1837 jan 2380 First elements for sizeable point objects.
1838    
1839     * Resources/XML/thuban-1.1.dtd: Added size attribute to cldata.
1840    
1841     * Data/iceland_sample_size.thuban: New. Sample for sized point objects.
1842    
1843     * test/test_load.py (ClassificationTest.TestLayers): Added SetSize in case
1844     of a corresponding argument is given.
1845     (TestSymbolSize): New. Test the size attribute of cldata.
1846    
1847     * Thuban/Model/classification.py: Removed some trailing whitespaces.
1848     (ClassGroupProperties.__init__): Set default size.
1849     (ClassGroupProperties.SetProperties): Set the size.
1850     (ClassGroupProperties.GetSize): New. Return the size.
1851     (ClassGroupProperties.SetSize): New. Set the size.
1852     (ClassGroupProperties__eq__): Compare also size.
1853     (ClassGroupProperties__repr__): Print also size.
1854    
1855     * Thuban/Model/load.py (SessionLoader.start_cldata): Also parse
1856     the size attribute.
1857    
1858     * Thuban/UI/classifier.py (ClassDataPreviewer.Draw): Added doc-string.
1859     Also, now there is a return value that indicates whether the drawing
1860     size exceeded the given rect extent and if so the new extent.
1861     Finally, point objects are drawn depending on the size. If either
1862     the width or height is exceeded, the new extent is returned.
1863     (ClassRenderer.Draw): Now when calling the previewer drawing function,
1864     evaluate the return value and, if not None, adapt the grid widget size
1865     accordingly and redraw again.
1866    
1867     * Thuban/UI/baserenderer.py (BaseRenderer.draw_shape_layer_incrementally):
1868     If the draw function is for points, call it with the size as additional
1869     parameter.
1870     (BaseRenderer.draw_point_shape): Added additional, optional parameter for
1871     the size. Compute the radius using the size.
1872    
1873     * Extensions/importAPR/apr.py (APR_BMkSym.GetThubanProp): Now
1874     that Thuban supports size, apply this correctly.
1875    
1876     * Extensions/importAPR/importAPR.py: Bumped version to 0.1.1.
1877    
1878     2004-10-03 Jan-Oliver Wagner <[email protected]>
1879    
1880 jan 2370 * Doc/manual/thuban-manual-de.xml: Started translation of
1881     Map chapter.
1882    
1883 joey 2368 2004-10-01 Martin Schulze <[email protected]>
1884    
1885     * Extensions/wms/properties.py (wmsProperties.__init__): Extended
1886     argument for general use through properties-dialog selector
1887    
1888     * Thuban/UI/classifier.py: Register properties dialog classes for
1889     both provided layer classes/types.
1890    
1891     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): The
1892     map can be retrieved through the parent which is passed to the
1893     constructor anyway and doesn't require an argument of its own,
1894     required for the unification of arguments for general use through
1895     properties-dialog selector.
1896     (MainWindow.OpenOrRaiseDialog): Move the logic for checking
1897     whether a dialog is already opened (and raising it to the users
1898     attention) and creating a new dialog into a function of its own
1899     (MainWindow.OpenLayerProperties): Use the new OpenOrRaiseDialog()
1900     method
1901     (MainWindow.OpenLayerProperties): Utilise the new ClassMapper for
1902     global registration of properties dialog classes (which are indeed
1903     layer-specific).
1904    
1905     * Thuban/UI/classifier.py (Classifier.__init__): Unify arguments
1906     for general use through properties-dialog selector, the map can be
1907     retrieved through the parent and doesn't require an argument of
1908     its own.
1909    
1910     * Extensions/wms/wms.py: Register the properties dialog class for
1911     the provided WMS layer
1912    
1913 jan 2358 2004-09-28 Jan-Oliver Wagner <[email protected]>
1914    
1915     New feature: Registry for Extensions.
1916    
1917     * Thuban/UI/extensionregistry.py: This module defines a registry for
1918     Extensions.
1919    
1920     * Thuban/UI/about.py (About.__init__): Added description
1921     of the registered extensions with all of the information.
1922    
1923     * Thuban/Model/extension.py (Extension): Improved doc-string.
1924    
1925     * Extensions/gns2shp/gns2shp.py, Extensions/importAPR/importAPR.py,
1926     Extensions/bboxdump/bboxdump.py, Extensions/profiling/profiling.py,
1927     Extensions/wms/wms.py: Added registration of the extension.
1928    
1929 bernhard 2352 2004-09-27 Bernhard Reiter <[email protected]>
1930    
1931     More fixes to svgexport to make used ids unique and
1932     conforming to XML's Name production.
1933    
1934     * Extensions/svgexport/test/test_svgmapwriter.py: Added new tests
1935     test_xml_id_constraints(), test_make_ide_nosetbaseid() and
1936     test_make_id_nonintegersetid(). Switched SetID and SetBaseID.
1937     Added Bernhard R. as author.
1938     * Extensions/svgexport/svgmapwriter.py (make_id): Using "_" as
1939     concatenation char now (makes test_make_ide_nosetbaseid() valid).
1940     Also transform second id part with "%d" and catch the TypeError
1941     to raise SVGMapWriterError (making test_make_id_nonintegersetid() ok).
1942     Corrected typo inBernhard's author line.
1943     (SetBaseID): Return the transformed base id. Transform characters
1944     which are not alnum() or in ".-_" to binascii.b2a_hex(). Added
1945     import binascii. If to be set string starts with "xml" or so, add "t".
1946     (draw_shape_layer_incrementally): use the returned value of SetBaseID
1947     for used_baseids checks.
1948    
1949 bh 2351 2004-09-25 Bernhard Herzog <[email protected]>
1950    
1951     * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
1952     Remove a debug print and some tab characters.
1953    
1954 bernhard 2350 2004-09-25 Bernhard Reiter <[email protected]>
1955    
1956     * Extensions/svgexport/svgmapwriter.py: Added Bernhard R. as Author.
1957     (SetBaseID, SetID, make_id): Improved docstring comments to explain
1958     the interaction of the three functions and the XML id contrains.
1959    
1960 bernhard 2352
1961 jan 2346 2004-09-23 Jan-Oliver Wagner <[email protected]>
1962    
1963 jan 2349 * Doc/ThubanModel.xmi: New. UML file for Thuban Model
1964     Module.
1965    
1966     * Doc/README: Added info on ThubanModel.xmi.
1967    
1968     2004-09-23 Jan-Oliver Wagner <[email protected]>
1969    
1970 jan 2346 * Doc/README: New. Some info about how to generate technical
1971     documentation from the source code.
1972     This text was send to the Thuban developer mailing list on
1973     September 21st 2004 by Bernhard Reiter.
1974    
1975 bernhard 2344 2004-09-21 Bernhard Reiter <[email protected]>
1976    
1977     Improved the svgexport to only use unique ids. Will issues
1978     an error message dialoge when two layer names are the same.
1979     ShapeIDs are now added with a dash within the svg ids.
1980    
1981     * Extensions/svgexport/svgmapwriter.py (SVGMapWriterError): New.
1982     * Extensions/svgexport/test/test_svgmapwriter.py: Added imports
1983     (TestSVGRenderer): New test class with test_make_in() and
1984     test_check_for_layer_name_clash()
1985     * Extensions/svgexport/svgmapwriter.py (SVGRenderer): Fixed __init__()
1986     and draw_shape_layer_incrementally() to not use a baseid twice,
1987     satisfying test_check_for_layer_name_clash()
1988     (VirtualDC.make_id): Use a dash between baseit and id, satisfies
1989     test_make_in().
1990     * Extensions/svexport/svgsaver.py: Import SVGMapWriterError, wxOK
1991     and wxICON_HAND.
1992     (write_to_svg): Put dc and rendering in a try statement and on
1993     catching SVGmapWriterError notify the user and delete the target file.
1994    
1995 bernhard 2343 2004-09-20 Bernhard Reiter <[email protected]>
1996    
1997     * Model/base.by, Model/layer.py: Fixed typos in docstrings.
1998    
1999 jschuengel 2342 2004-09-03 Jan Schüngel <[email protected]>
2000    
2001     * Extensions/umn_mapserver/mapfile(MF_Class.add_thubanstyle): Fix a
2002     small bug with the line color. Now the line color will now only set
2003     if it is set in Thuban an not Transparent.
2004    
2005     * Extensions/umn_mapserver/mf_export(tblayer_to_map): Fixed a bug with
2006     deleting the layers from mapfile. Now all layers will delete backwards
2007     from the last.
2008    
2009 silke 2339 2004-08-20 Silke Reimer <[email protected]>
2010 silke 2338
2011 silke 2339 * Thuban/Model/layer.py:
2012     Fixes bug in projection handling: Otherwise very large region might not
2013     have valid values in the layer's projection.
2014    
2015     2004-08-20 Silke Reimer <[email protected]>
2016    
2017 silke 2338 * Thuban/UI/about.py:
2018     small changes to be consistent with coding style.
2019    
2020 joey 2337 2004-08-13 Martin Schulze <[email protected]>
2021    
2022     * Extensions/wms/test/test_ogclib.py (TestOGCLib.compare_URLs):
2023     Adjusted a comment
2024    
2025 silke 2335 2004-08-11 Silke Reimer <[email protected]>
2026 silke 2334
2027 silke 2335 * Thuban/UI/about.py: Small changes to encoding related stuff to avoid
2028     too many and too enhanced imports of locale
2029    
2030 silke 2334 2004-08-10 Silke Reimer <[email protected]>
2031    
2032     * Thuban/UI/about.py: Fixed encoding problem of about dialog: Added
2033 silke 2339 function unicodeToLocale() to convert special characters to users
2034     locale encoding
2035 silke 2334
2036 jan 2333 2004-08-10 Jan-Oliver Wagner <[email protected]>
2037    
2038     * Doc/technotes/coding_guidelines.txt: Added rule 'Method names start with
2039     lower case letter'
2040    
2041 jschuengel 2331 2004-08-09 Jan Schüngel <[email protected]>
2042    
2043     * ChangeLog: Rewrite the last ChangeLog entry to follow
2044     the standard way.
2045    
2046     * Extensions/umn_mapserver/mapfile: Moved the import AnnotationLayer to
2047     the function where it is needed, because it don't works if it stands
2048     at the beginning.
2049     (MF_Layer.__init__): Removed the extra numclassed variable. Now
2050     numclasses from the mapscript will be used.
2051     (MF_Layer.get_index): New. Return the index of the layer in mapfile.
2052     (MF_Layer.set_classes): New. A Classlist will be set to the layer.
2053     (MF_Layer.set_metadata): New. A Metadata mapscript object will set.
2054     (MF_Layer.remove_allclasses): New. All class of the layer will remove.
2055     (MF_Map.create_new_layer): New. A new Layer is created and associated
2056     with the mapscript object.
2057     (MF_Map.set_layerorder): New. The Layer order like in thuban is set in
2058     the mapscript.
2059     (MF_Map.add_thubanlayer): Now a new layerobj is created if no one is
2060     linked to the layer in thuban, else the layerobject linked to the
2061     thubanlayer will be used.
2062     AnnotationLayer will now store the filename of the shapefile.
2063     (MF_Map.remove_layer): If a layer is removed the associated object
2064     must be set new.
2065    
2066     * Extensions/umn_mapserver/mf_export.py(tb_layer_to_map): Add all
2067     layers which are exists in thuban to the mapobj. All removed Layers
2068     will be removed from the mapobj.
2069     Added comments to all functions.
2070     (thuban_to_map): No layer will be removed here.
2071    
2072     * Extensions/umn_mapserver/mf_handle.py
2073     (_has_umn_mapobj_and_selectedlayer): Activating the layer menu. Now
2074     Layersettings for the mapserver kann be edited.
2075    
2076     * Extensions/umn_mapserver/mf_import.py: Now all layers which are
2077     imported, will be linked with the associated MF_Layer.
2078     (import_mapfile): All layers, which are not selected, will be removed.
2079     Disable the "import layer from mapfile" menu option.
2080    
2081     * Extensions/umn_mapserver/sample/iceland.map: Set the status of the
2082     Annotation Layer from DEFAULT to OFF. The DEFAULT setting turns the
2083     layer on permanently.
2084    
2085 jschuengel 2323 2004-08-03 Jan Schüngel <[email protected]>
2086    
2087 jschuengel 2331 * Extensions/umn_mapserver/mapfile.py(MF_Metadata.remove_allmetadata):
2088     New. This function removes all metadata
2089     (MF_Layer.set_group): New. Set the group setting.
2090     (MF_Layer.get_group): New. Get the group setting.
2091     (MF_Map): Removed the extra numlayers variable, used the mapscript
2092     parameter instead.
2093     (MF_Map.get_numlayers): New. This get numlayers.
2094     (MF_Map.remove_all_layers): New. Removes all layers from the mapobj.
2095 jschuengel 2323 (MF_Map.add_thubanlayer): Replaced the exception handling by a check
2096     if the object is an instance. Also added the annotation layer here to
2097     export, but only the layer is created in the mapfile.
2098    
2099 jschuengel 2331 * Extensions/umn_mapserver/mf_export.py(export_mapfile): Removed
2100     the check if a mapobj exist, because its not needed anymore. The
2101     export function is only available if a mapobj exist.
2102     Use the new function to remove all layers.
2103 jschuengel 2323
2104 jschuengel 2331 * Extensions/umn_mapserver/mf_handle.py(Layer_Dialog): Added a group
2105     option and the metadata button. The layer dialog is temporary disabled.
2106     (Metadata_CustomDataTable): Added some functions to show the grid
2107 jschuengel 2323 correct.
2108    
2109 jschuengel 2331 * Extensions/umn_mapserver/mf_import.py: Moved the code for showing
2110     the number of layer from import_mapfile to this function.
2111     (AnnotationLayer): New. This Class shows the Annotation layer in
2112     thuban. The layer don't do anything. It's only to show the layer
2113     and to save the layer order.
2114     (add_annotationlayer): New. Import an annotation layer to thuban.
2115     (select_layer2import): New. Import only layers to thuban and not
2116     the other settings like projection or scalebar.
2117     (create_new_mapfile): Moved the _has_umn_mapobj function and the
2118     create_new_mapfile functions from mf_handle.py to mf_import.py.
2119 jschuengel 2323
2120     * Extensions/umn_mapserver/sample/iceland.map: Added the group
2121     parameter to the roads and cultural layers. Also added a new
2122     Annotation Layer for the cultural points.
2123    
2124     * Extensions/umn_mapserver/sample/iceland.html: Added the select
2125     option for the annotation layer.
2126    
2127     * Extensions/umn_mapserver/sample/index.html: Added the start
2128     parameter for the annotation layer.
2129    
2130 jan 2315 2004-08-01 Jan-Oliver Wagner <[email protected]>
2131    
2132     * Doc/manual/thuban-manual-de.xml (Chapter Session Management):
2133     translation completed.
2134    
2135     * Doc/manual/thuban-manual.xml (Chapter Session Management):
2136     Fixed unprecise description for Save Session.
2137    
2138 jan 2312 2004-07-31 Jan-Oliver Wagner <[email protected]>
2139    
2140     Started translation of Users Manual into german.
2141    
2142     * Doc/manual/thuban-manual-de.xml: New. German Users Manual.
2143    
2144     * Doc/manual/Makefile: Added build instructions for german
2145     users manual.
2146    
2147     * Doc/manual/thuban-manual.xml: Minor corrections in Introduction.
2148    
2149 jschuengel 2308 2004-07-28 Jan Schüngel <[email protected]>
2150    
2151     * Extensions/umn_mapserver/mapfile.py(MF_Metadata): Changed all class
2152     functions. Now all metadata will handle by the function and its not
2153     needed to initialize it from outside. Therefor the associated mapobj
2154     will be stored in the Metadata Object. So we can use the special
2155     functions from the associated mapobj to get the Metadata.
2156     Therefor all initialization code for the metadata is removed from the
2157     other classes.
2158     (MF_Layer): Added a function to get the metadata object.
2159     (MF_Map): Added a function to set the mappath, the path where
2160     the mapfile ist stored.
2161    
2162     * Extensions/umn_mapserver/mf_export.py(thuban_to_map): Changed the code
2163     to set the extent in the mapfile. Now the code is set by the displayed
2164     data in the Thuban-view.
2165     (export_mapfile): The shapepath is now set empty, until relative
2166     pathnames are supported.
2167    
2168     * Extension/umn_mapserver/mf_handle.py: Added a dialog to handle
2169     metadata. Yet only mapfile metadata are supported. Layer and class
2170     supported are not implemented.
2171     Added a dialog to handle layer informations. The dialog only shows the
2172     selected layer at the moment.
2173    
2174     * Extensions/umn_mapserver/mf_import.py(import_mapfile): Changed the
2175     code for setting the extent in thuban. Now the extent is set to the
2176     given extent from the mapfile.
2177     Fixed a logical mistake. Now the extent is set when realy a layer is
2178     loaded, and not if one is selected to load.
2179    
2180     * Extensions/umn_mapserver/sample/iceland.html: Added code to zoom and
2181     move the shown map in the browser.
2182    
2183     * Extensions/umn_mapserver/sample/iceland.map: Added a new metadata
2184     line to the mapobj and added metadata to the political layer.
2185    
2186     * Extensions/umn_mapserver/test/test_mapserver.py: Changed the test
2187     for Metadata.
2188    
2189 joey 2300 2004-07-26 Martin Schulze <[email protected]>
2190    
2191     * Thuban/Lib/classmapper.py (ClassMapper.has): Added the new
2192     ClassMapper
2193    
2194     * test/test_classmapper.py (TestMapping.test_mapper): Added a Test
2195     case for the new ClassMapper
2196    
2197    
2198 bh 2296 2004-07-22 Bernhard Herzog <[email protected]>
2199    
2200 bh 2297 * Thuban/UI/viewport.py (ViewPort.VisibleExtent): New. Return the
2201     visible extent of the map in projected coordinates
2202    
2203     * test/test_viewport.py (SimpleViewPortTest.test_default_size)
2204     (SimpleViewPortTest.test_init_with_size): Add some VisibleExtent()
2205     tests.
2206     (SimpleViewPortTest.test_visible_extent): New. The real test for
2207     VisibleExtent()
2208    
2209     2004-07-22 Bernhard Herzog <[email protected]>
2210    
2211 bh 2296 * test/test_viewport.py: Use support.run_tests as the main
2212     function when running asa script.
2213    
2214 jschuengel 2295 2004-07-22 Jan Schüngel <[email protected]>
2215    
2216     * Extensions/umn_mapserver/mf_export.py: Added "import os"
2217     Removed the old "import Thuban.UI.mainwindow" code.
2218     (tbextent_to_map): Removed the extra function and at the code direct
2219     to "thuban_to_map" function.
2220     (write_creatorcomment): Added. Now a short comment is added to the
2221     beginning of an generated mapfile.
2222     (export_mapfile): Now the Path and filename are saved in to variables,
2223     and not together in one variable. This is needed for the new
2224     write_creatorcomment function.
2225    
2226     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Added the
2227     import module "re". Also added Range and the ClassGroupRange import
2228     from Thuban. Both are needed for the new range expression import.
2229     (create_rangeexpression): Added. Creates a Range Expression in Thuban
2230     style from a given mapfile expression.
2231     (added_rasterlayer): Make some small code changes. The shapepath is
2232     now stored in an extra variable and the clazz_name is set empty if no
2233     class name set in the mapfile.
2234     Changed the Error message for Range Expressions, becaus the new
2235     function create a error string which will be shown in the dialog.
2236    
2237     * Extensions/umn_mapserver/test/test_mapserver.py: Added a test for the
2238     range expression import.
2239 jan 2312
2240 jan 2291 2004-07-21 Jan-Oliver Wagner <[email protected]>
2241    
2242     * Extensions/umn_mapserver/README: Added hint that
2243     installation as root can be avoided. Removed all tabs.
2244    
2245 bh 2289 2004-07-16 Bernhard Herzog <[email protected]>
2246    
2247     * test/test_viewport.py
2248     (ViewPortTest.test_changing_map_projection): Check that changing
2249     the projection of an empty map shown in a viewport doesn't lead to
2250     exceptions in the viewport's handler for the
2251     MAP_PROJECTION_CHANGED messages
2252    
2253     * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Only
2254     try to keep the same region visible when the map actually contains
2255     something
2256    
2257 jschuengel 2288 2004-07-15 Jan Schüngel <[email protected]>
2258    
2259     * Extensions/umn_mapserver/mapfile.py: Added a function to get the
2260     mappath directly from the mapobj. Is needed because of the changes
2261     in mf_import.py.
2262     (MF_Layer.add_thubanclass): Added a new comment.
2263     (MF_Map.set_extent): Fixed a bug with exporting empty mapobj. If the
2264     mapobj is empty there is no extent get from thuban an so no one can
2265     set to th mapobj.
2266    
2267     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Updated
2268     the discription.
2269     Split the funktion in to three smaller ones. The new functions are
2270     add_rasterlayer, add_polygonlayer and select_layer2import.
2271     Removed the mapfilepath and filepath initialisation, because its know
2272     include in the new functions.
2273     Now nothing will be imported if cancel is pressed in the
2274     layer choice dialog.
2275    
2276 jschuengel 2285 2004-07-14 Jan Schüngel <[email protected]>
2277    
2278     * Extensions/umn_mapserver/mapfile.py: Added ClassGroupDefault to
2279     import.
2280     (MF_Symbolset): Removed the extra variable for numsymbols.
2281     (MF_Class.__init__): Added a comment to the exception clause.
2282     Removed the extent init, because it was not needed anymore.
2283     (MF_Layer.add_thubanclass): Added the code to set the class name to
2284     the expression value from thuban if no label is defined.
2285     Added the code to export Range expressions from thuban to the mapfile.
2286     (MF_Map.set_extent): Removed the exception and replace it by some if
2287     code. If the size of a map is not defined the size will be set to 1,1.
2288     This is necessary because if the extent is set, mapscript checks if
2289     the size is greater than zero.
2290     (MF_Web): Added the get and set function for the template.
2291    
2292     * Extensions/umn_mapserver/mf_export.py: Added the function to check
2293     if a mapobject exists and used it to set the status of the menu items.
2294     If no mapfile exists the settings could not be edditied.
2295     Define after which menuitem the exportitem will include.
2296    
2297     * Extensions/umn_mapserver/mf_handle.py: Removed the import
2298     Thuban.UI.mainwindow clause, because it is not needed.
2299     Added the command Refresh() to all "OnChangeColor()" functions,
2300     because the color preview window was not updated on a color change.
2301     Added the function to check if a mapobject exists and used it to set the
2302     status of the menu items. If no mapobject exists the settings could not
2303     be edditied.
2304     (Map_Dialog): Moved the imagetype selector from the
2305     Outputformat_Dialog to Map_Dialog and removed Outputformat_Dialog.
2306     (Web_Dialog): Removed the name label and added the template textbox.
2307    
2308     * Extensions/umn_mapserver/mf_import.py (import_mapfile): Replace
2309     the exception handling on loading the layers by an if statement. It
2310     is not necessary to us the exception there.
2311     The Filepath creation now use os.path.join to build the path.
2312    
2313     * Extensions/umn_mapserver/test/test_mapserver.py: Moved the testMap
2314     definition from global to the setUp function. Now the testMap will
2315     initialize new on each test.
2316    
2317     * Extensions/umn_mapserver/sample/iceland.map: Include three new
2318     classes in the Line Layer, to test logical Expressions.
2319     Set the status of the class "Point9" in the Point Layer to off
2320    
2321 bh 2278 2004-07-13 Bernhard Herzog <[email protected]>
2322    
2323     * Thuban/UI/baserenderer.py
2324     (BaseRenderer.render_map_incrementally): Fix a logic bug in the
2325     optimization that tries not to draw layers under a raster layer.
2326     The bug was harmless. All it effectively did was to produce The a
2327     strange messages about not being able to draw Layer instances for
2328     all vector layers below a raster layer which would be invisible
2329     anyway because the raster layer currently always covers the entire
2330     window
2331    
2332 jschuengel 2277 2004-07-08 Jan Schüngel <[email protected]>
2333    
2334     * Extensions/umn_mapserver/mapfile.py: Added code to generade and get
2335     a list of supported outputformats. This formats are not alle supported
2336     because there is no possibility to get the outputformat without the
2337     name known. Make some formal changes to the code.
2338     (MF_Map.set_name()): Fixed a bug if the name is None.
2339    
2340     * Extensions/umn_mapserver/mf_handle.py: Removed the image_type import
2341     statement, because its not needed anymore. The Outputformat is now
2342     given as string from the object. Make some formal changes to the code.
2343    
2344     * Extensions/umn_mapserver/test/test_mapserver.py: Added new test for
2345     most of the new setting which were added during the last changes.
2346     Removed the MF_Size Test.
2347    
2348     * Extensions/umn_mapserver/test/test.map: Added a new class to the
2349     cultural Layer to test expressions and the the status of that layer
2350     from on to default.
2351     Changed the data path the the correct Thuban Data
2352     Added the Outputformat Object and Symbol Object
2353    
2354 jschuengel 2272 2004-07-07 Jan Schüngel <[email protected]>
2355    
2356     * Extensions/umn_mapserver/mapfile.py: Added some new
2357     settings to edit (outputformat, label, imagetype)
2358    
2359     * Extensions/umn_mapserver/mf_handle.py: Added some setting to
2360     the Label Dialog and add the OutputDialog.
2361     Make some changes to the code order.
2362    
2363 jschuengel 2269 2004-07-06 Jan Schüngel <[email protected]>
2364    
2365     * Extensions/umn_mapserver/mapfile.py: Added the symbolObj, pointObj
2366     and line Obj and add the scalebar_status_type, scalebar_style_type and
2367     scalebar_position_type.
2368     Added the symbol- and symbolsetObject (MF_Symbol,MF_Symbolset). The
2369     are only used to create a Symbol like the circle in Thuban.
2370     Added the scalebarObject (MF_Scalebar)
2371     (MF_Class): Added set_status and get_status.
2372     (MF_Layer.add_thubanclass): Added code to set the class status
2373     (MF_Map): Added code to handle the symbols and scalebar
2374     (MF_Label): Added the set_partials and get_partials functions
2375    
2376     * Extensions/umn_mapserver/mf_export.py: Added MF_Symbol to import
2377     from mapfile. Added a function to create a circle object like the one
2378     from thuban if no one exists.
2379    
2380     * Extensions/umn_mapserver/mf_handle.py: All colors are now set when
2381     press ok in the assosiated dialog and not at the end of the
2382     colordialog.
2383     Added the Dialog for the Scalebar.
2384     (Label_Dialog): Added the offset option
2385    
2386     * Extensions/umn_mapserver/mf_import.py: Added code to import the
2387     status of the Classes.
2388     Fixed a bug with the projection. Now the to_meter parameter will be
2389     added to the Projection only if it doesn't exists.
2390    
2391 jschuengel 2264 2004-07-01 Jan Schüngel <[email protected]>
2392    
2393     Added the functionality to handle the content thuban is not
2394     able to handle directly.
2395    
2396     * Extensions/umn_mapserver/mf_handle.py: New. This module extents
2397     Thuban with the possibility to edit the mapfile content.
2398    
2399     * Extensions/umn_mapserver/mf_import.py: Added the possibility
2400     to import mapfiles without any layer selected. So it is possible
2401     to edit the other settings in a mapfile.
2402     (import_mapfile): Added code to use the editing functions.
2403     Added the possibility to import the projection to a layer if one
2404     is defined.
2405     Status settings (On,Off) will now set in thuban (visible, invisible).
2406     fixed a bug with with classnames. If no classname is set in mapfile
2407     the value in Thuban will set to the expression.
2408    
2409     * Extensions/umn_mapserver/mf_export.py(export_mapfile): Added the
2410     possibility to save a new mapfile or use the old one which is
2411     imported or new created.
2412     Added code to use the editing functions.
2413     Remove some not needed import statements
2414    
2415     * Extensions/umn_mapserver/mapfile.py: Added new types which are
2416     need for the editing functions.
2417     Added needed set-functions for the editing functions.
2418     Added the possibility to export rasterimages.
2419     Added new classes (MF_Web, MF_Label, MF_Legend, MF_Symbol,
2420     MF_SymbolSet). MF_Symbol and MF_SymbolSet are not needed at the
2421     moment.
2422     (MF_Class.set_thubanstyle): Now point layers will set to a default
2423     symbol to show a circle in mapserver and not only a 1px dot.
2424     (MF_Style.__init__): Fixed a bug with the color. Color was not set
2425     correct before.
2426     (MF_Size): Removed, because it is not needed.
2427    
2428     * Extensions/umn_mapserver/README: Added the hints to use the
2429     export and editing functions, too.
2430    
2431     * Extensions/umn_mapserver/sample/iceland.map: Added the
2432     new parameter "UNITS METERS".
2433     Change the political layer to status OFF.
2434    
2435     * Extensions/umn_mapserver/sample/README: Added some
2436     more details to setup the sample in the MapServer.
2437    
2438 bernhard 2256 2004-06-26 Bernhard Reiter <[email protected]>
2439    
2440     * Extensions/svgexport/test/test_svgmapwriter.py:
2441     Removed class VFile and used standard StringIO instead.
2442    
2443 jschuengel 2255 2004-06-23 Jan Schüngel <[email protected]>
2444    
2445     Add the export function to the umn_mapserver extension.
2446    
2447     * Extension/umn_mapserver/mf_export.py: New. This module extents
2448     Thuban with the possibility to export the Thuban content.
2449    
2450     * Extensions/umn_mapserver/mapfile.py: Expand the classes to use
2451     with the export module. Especially added the possibility to
2452     add thuban objects directly to the map objects.
2453    
2454     * Extensions/umn_mapserver/mf_import.py: Removed the wxCHANGE_DIR,
2455     because of the hint from Bernhard Herzog.
2456     Corrected the handling of absolute pathnames.
2457     Changed the Text of the Menu-Item, now the beginning is upper case.
2458    
2459     * Extensions/umn_mapserver/README: Added the --with-tiff statement.
2460    
2461 jschuengel 2250 2004-06-16 Jan Schüngel <[email protected]>
2462 jschuengel 2242
2463 jschuengel 2250 Add a sample and make some changes.
2464    
2465     * Extension/umn_mapserver/mf_import.py: Changed the wxPython.wx
2466     import from * to explicit used statements. Changed the
2467     Thuban.UI.mainwindow import phrase, too.
2468     (import_mapfile):Corrected a clerical mistake.
2469     Added wxCHANGE_DIR in OpenFile Dialog.
2470     Added a MultipleChoiceDialog, to select the layers to load from
2471     mapfile into thuban. Thereby the projection is only set if one layer
2472     is selected.
2473     Added the possibility to handle relative pathnames which uses
2474     up-level references.
2475     Removed some doubled code.
2476     Corrected an error with integer values used as label in thuban
2477     ClassGroup.
2478    
2479     * Extensions/umn_mapserver/sample: New.
2480    
2481     * Extensions/umn_mapserver/sample/README: New. Describes the
2482     usage of the sample files.
2483    
2484     * Extensions/umn_mapserver/sample/iceland.map: New. This is
2485     a suitable .map-file for the iceland data.
2486    
2487     * Extensions/umn_mapserver/sample/index.html: New. The template
2488     for the mapfile.
2489    
2490     * Extensions/umn_mapserver/sample/iceland.html: New. Initialisation
2491     file for the Iceland Application on web.
2492    
2493     * Extensions/umn_mapserver/README: Corrected a inaccuracy and added
2494     some details.
2495    
2496     * Extensions/umn_mapserver/test/test_mapserver
2497     (mapserver_import_Test_generalClasses.test_MF_Color):
2498     Corrected the thubancolor test.
2499    
2500     2004-06-15 Jan Schüngel <[email protected]>
2501    
2502 jschuengel 2242 * Extensions/umn_mapserver/README: New. Install instruction.
2503    
2504 bernhard 2240 2004-06-14 Bernhard Reiter <[email protected]>
2505    
2506     * libraries/thuban/cpl_mfile.h: Added copyright header.
2507    
2508     * libraries/thuban/ cpl_mfile.cpp, cpl_mfile.h: Added non-protecting
2509     Free Software License so that it is most useful with gdalwarp
2510     and bmpdataset.
2511    
2512 bh 2239 2004-06-14 Bernhard Herzog <[email protected]>
2513    
2514     * Thuban/UI/multiplechoicedialog.py (__version__): Add missing
2515     import of wxPython.wx itself (as opposed to the contents of
2516     wxPython.wx). For some reason wxPython.wx is available as
2517     wxPython.wx.wx in at least some 2.4 releases. Fixes RT#2482
2518     wrt. wxPython 2.4.
2519    
2520 jschuengel 2238 2004-06-10 Jan Schüngel <[email protected]>
2521    
2522     Initial version of new extension "umn_mapserver". This extension aims
2523     to manage configuration for the UMN MapServer application. This
2524     inital version just imports the .map-files and displays all, Thuban is
2525     capable of.
2526    
2527     * Extensions/umn_mapserver, Extensions/umn_mapserver/test: New.
2528    
2529     * Extensions/umn_mapserver/test/README: New. Describes how to run the
2530     tests.
2531    
2532     * Extensions/umn_mapserver/test/test.map: New. This is a test
2533     .map-file for automated tests of the umn_mapserver extension of
2534     Thuban.
2535    
2536     * Extensions/umn_mapserver/test/test_mapserver.py: New. Tests for
2537     UMN Mapserver classes.
2538    
2539     * Extensions/umn_mapserver/__init__.py: New. Init to make this
2540     directory a package.
2541    
2542     * Extensions/umn_mapserver/mapfile.py: New. Classes to represent
2543     '.map'-file objects.
2544    
2545     * Extensions/umn_mapserver/mf_import.py: New. This module extends
2546     Thuban with the possibility to handle UMN MapServer mapfiles.
2547    
2548 bh 2230 2004-06-03 Bernhard Herzog <[email protected]>
2549    
2550     * Thuban/Model/layer.py (Layer.TreeInfo): Convert the bounding box
2551     to a tuple before using it as arguments to the % operator. This
2552     fixes the formatting issue filed in RT#2239 on 2004-01-13 and
2553     reported today on thuban-list by Jan Schüngel
2554    
2555     * test/test_layer.py (TestLayerModification.setUp): Save the
2556     filename as an instance variable so we can refer to it in tests
2557     (TestLayerModification.test_tree_info): Uncomment this method
2558     again and make it work. This tests for the formatting issue
2559     filed in RT#2239 on 2004-01-13
2560    
2561 bh 2224 2004-05-28 Bernhard Herzog <[email protected]>
2562    
2563     * Thuban/UI/baserenderer.py: Fix some typos.
2564    
2565 jan 2217 2004-05-18 Jan-Oliver Wagner <[email protected]>
2566    
2567     * Extensions/gns2shp/gns2shp.py (gns2shp): Fixed a bug
2568     by increasing a field size.
2569    
2570 bh 2213 2004-05-17 Bernhard Herzog <[email protected]>
2571    
2572     Update to newest shapelib and get rid of Thuban specific
2573     extensions, i.e. use the new DBFUpdateHeader instead of our
2574     DBFCommit kludge
2575    
2576     * libraries/shapelib/shpopen.c: Update to version from current
2577     shapelib CVS.
2578    
2579     * libraries/shapelib/shapefil.h: Update to version from current
2580     shapelib CVS.
2581    
2582     * libraries/shapelib/dbfopen.c: Update to version from current
2583     shapelib CVS.
2584     (DBFCommit): Effectively removed since shapelib itself has
2585     DBFUpdateHeader now which is better for what DBFCommit wanted to
2586     achieve.
2587     We're now using an unmodified version of dbfopen.
2588    
2589     * setup.py (extensions): Add the HAVE_UPDATE_HEADER macro with
2590     value '1' to the Lib.dbflibc extension. This simply reflects the
2591     shapelib and pyshapelib updates
2592    
2593 jan 2211 2004-05-16 Jan-Oliver Wagner <[email protected]>
2594    
2595     Finished introduction of Menu.FindOrInsertMenu.
2596    
2597     * Extensions/drawshape/drawshape.py: Add the command
2598     to the experimental menu additionally to the toolbar.
2599    
2600     * Extensions/svgexport/svgsaver.py: Use FindOrInsertMenu() instead of
2601     finding menu on its own.
2602    
2603     * Doc/manual/thuban-manual.xml: updated sample file
2604     to use FindOrInsertMenu().
2605    
2606     * Examples/simple_extensions/hello_world.py: Use FindOrInsertMenu()
2607     instead of finding menu on its own.
2608    
2609 jan 2206 2004-05-11 Jan-Oliver Wagner <[email protected]>
2610    
2611     * test/test_menu.py (MenuTest.test): Added testing
2612     of method Menu.FindOrInsertMenu.
2613    
2614 jan 2204 2004-05-10 Jan-Oliver Wagner <[email protected]>
2615    
2616     Introduce and use Menu.FindOrInsertMenu.
2617    
2618     * Thuban/UI/menu.py (Menu.FindOrInsertMenu): New. Find a
2619     given menu or, if not found, insert it.
2620    
2621     * Extensions/bboxdump/bboxdump.py, /Extensions/gns2shp/gns2shp.py,
2622     /Extensions/importAPR/importAPR.py, Extensions/profiling/profiling.py,
2623     /Extensions/wms/wms.py: Use FindOrInsertMenu() instead of finding
2624     menu on its own.
2625    
2626 jan 2201 2004-05-06 Jan-Oliver Wagner <[email protected]>
2627    
2628     Introduce a abstract ColorDialog class and remove
2629     and outdated file.
2630    
2631     * Thuban/UI/proj4dialog.py: Removed. It is has been
2632     replaced by projdialog for quite a while and is not used
2633     anymore.
2634    
2635     * Thuban/UI/colordialog.py: New. Abstraction for color selection
2636     dialog(s).
2637    
2638     * Thuban/UI/classifier.py (SelectPropertiesDialog.__GetColor):
2639     Now calls the abstract ColorDialog instead of wxColourDialog.
2640     This also removed the dependency to Color class conversion
2641     from this function.
2642    
2643 frank 2197 2004-05-04 Frank Koormann <[email protected]>
2644    
2645     * Extensions/bboxdump/__init__.py: Fixed string left over from
2646     copying.
2647    
2648     * Extensions/bboxdump/bboxdump.py (bboxdump):
2649     Use layer.ShapeStore().AllShapes() to loop over shapes instead of
2650     xrange(layer.NumShapes()). Compile the bboxmessage from a list
2651     of formatted outputs (string.join) instead of appending to the
2652     message. Two progress bar dialogs to report progress on the sometimes
2653     lenghty processing.
2654    
2655 frank 2196 2004-04-22 Frank Koormann <[email protected]>
2656    
2657     New Extension to dump bounding boxes of all shapes of the selected
2658     layer. An optional column can be specified to group the objects,
2659     in this case the bounding box is a union of the separate boxes.
2660     Dump can be displayed in a ScrolledMessageDialog or written to file.
2661     The Extension is simply a combination of available and well tested
2662     Thuban functionality.
2663    
2664     * Extensions/bboxdump/__init__.py: New: Init to make this
2665     directory a package.
2666    
2667     * Extensions/bboxdump/bboxdump.py: New: Dump bounding boxes of
2668     all shapes of the selected layer.
2669    
2670 jan 2192 2004-04-22 Jan-Oliver Wagner <[email protected]>
2671    
2672     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Fixed two
2673     strings to be i18n now.
2674    
2675 jan 2188 2004-04-18 Jan-Oliver Wagner <[email protected]>
2676    
2677     Changing popup menu of legend from direct building
2678     to using the Menu construction as used for the mainwindow.
2679    
2680     * Thuban/UI/mainwindow.py: New method commands: layer_to_top,
2681     layer_to_bottom, layer_visibility
2682     (MainWindow.LayerToTop): New. Put current layer to the top.
2683     (MainWindow.LayerToBottom): New. Put current layer to bottom.
2684     (MainWindow.HideLayer, MainWindow.ShowLayer, _has_visible_map):
2685     Replace 1,0 by True, False.
2686     (MainWindow.ToggleLayerVisibility): New. Toggle visibility of
2687     current layer.
2688     (MainWindow.LayerShowTable): Removed raising of dialog.
2689     (_has_selected_layer_visible): New. Support function.
2690    
2691     * Thuban/UI/legend.py: ID_POP_xxx: removed.
2692     (LegendPanel.__init__): Removed EVT_MENU bindings.
2693     (LegendTree._OnRightClick): Replace direct creation of
2694     menu via wx Classes by applying the menu definition
2695     as of Menu class of menu.py.
2696    
2697 jan 2185 2004-04-16 Jan-Oliver Wagner <[email protected]>
2698    
2699     * Thuban/UI/exceptiondialog.py (ExceptionDialog.dialog_layout): Improved
2700     button string to stronger clearify that Thuban will be closed when hitting
2701     the button.
2702    
2703     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Added docstring.
2704     Now for layers without a ShapeStore a corresponding message is given
2705     to the user, that this layer has no table to show.
2706    
2707 joey 2182 2004-04-15 Martin Schulze <[email protected]>
2708    
2709     * Extensions/wms/layer.py (WMSLayer.setWMSFormat): Need to
2710     recalculate the format for the internal render engine as well.
2711    
2712     * Extensions/wms/properties.py (wmsProperties): First start for a
2713     properties dialog. It's functional for a first selection of
2714     layers, but still has some weired wxWidgets/GTK problems but
2715     beautification can be done later.
2716    
2717     * Extensions/wms/layer.py: Added more documentation
2718     (WMSLayer.getFormats): New: Return list of supported image formats
2719     by the WMS server
2720     (WMSLayer.getLayers): New: Return the list of layer names
2721     supported by the WMS server
2722     (WMSLayer.getLayerTitle): New: Return the title of the named layer
2723     (WMSLayer.getWMSFormat): New: Return the image format that is used
2724     for WMS GetMap requests
2725     (WMSLayer.setWMSFormat): New: Set the image format that is used
2726     for WMS GetMap requests
2727     (WMSLayer.__init__): Move away from using only one layer to using
2728     a list of layers (unsorted at the moment, though).
2729     (WMSLayer.getVisibleLayers): New: Return the list of names for all
2730     visible layers
2731     (WMSLayer.setVisibleLayers): New: Set the list of names for all
2732     visible layers
2733    
2734     * Extensions/wms/wms.py: Moved the WMS layer into layer.py in
2735     order to establish a clean structure.
2736    
2737     * Extensions/wms/layer.py: Moved the WMS layer into a file on its
2738     own in order to establish a clean structure.
2739    
2740 joey 2174 2004-04-13 Martin Schulze <[email protected]>
2741    
2742     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Added
2743     support for oldstyle (WMS 1.0 apparently) image format
2744     specification.
2745    
2746     * Extensions/wms/wms.py (WMSLayer.calcFormat): Reduce the list of
2747     supported graphic formats back to JPEG and BMP, PNG and others are
2748     too *cough* experimental... Sorry, I meant to filter this out
2749     before I committed this part. This should make the WMS extension
2750     run from CVS again.
2751     (wms_dialog): Reset an empty URL to None so that the subsequent
2752     program can depend on this, since the dialog will indeed return an
2753     empty URL, causing another declaration of love by Python.
2754    
2755     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerBBox):
2756     Whenever a native BoundingBox request cannot be fulfilled, check
2757     whether the requested SRS is EPSG:3426, in which case return the
2758     LatLonBoundingBox values.
2759    
2760     * Extensions/wms/test/test_parser.py
2761     (TestWMSCapabilitiesParser.test_LayerSRS): Added a test for
2762     ignoring AUTO:* SRS.
2763     (TestWMSCapabilitiesParser.test_LatLonBoundingBoxes_as_bboxes):
2764     Added another test method to test whether the LatLonBoundingBox
2765     values will be returned if BoundingBox values are requested with
2766     SRS set to EPSG:3426.
2767    
2768     * Extensions/wms/parser.py (WMSCapabilitiesParser.peekLayers):
2769     Added rudimentary support for non-EPSG SRS, i.e. ignore them for
2770     the moment by placing them into a variable which is currently
2771     unused. Also test whether the EPSG SRS is numerical as it should
2772     be and add an error message if it is not.
2773    
2774     * Extensions/wms/test/sample.xml: Added AUTO:* SRS since they
2775     appear in the real world as well. Since we cannot handle them yet
2776     (OGCLib can't either), we will ignore them for the moment.
2777    
2778     * Extensions/wms/parser.py: Use a variable for denoting the sample
2779     filename
2780     (WMSCapabilitiesParser.peekLayers): Added support for error
2781     messages during grok(). They will be aggregated in an array and
2782     may be displayed later. We may have to add a classification
2783     "Warning" and "Error" to this. That requires more experience,
2784     though, since not every error may be lethal.
2785    
2786     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Raise the
2787     ShowTable() dialog/frame when the user attempts to display it
2788     while it has been opened before already and not closed again.
2789    
2790 joey 2161 2004-04-11 Martin Schulze <[email protected]>
2791    
2792     * Extensions/wms/infodialog.py: Adjusted the class documentation
2793    
2794     * Extensions/wms/wms.py (WMSLayer.__init__, WMSLayer.GetMapImg):
2795     Switch to using Thuban{Begin,End}BusyCursor instead of the pure
2796     wxWidgets variants.
2797     (WMSLayer.__init__): The epsg_id variable is named top_srs now.
2798    
2799     * Extensions/wms/infodialog.py: Added an information dialog that
2800     will display various information about the WMS current resource,
2801     so that additional information such as the title, the abstract,
2802     fees and access constraints can be displayed for the user if they
2803     are documented in the WMS XML.
2804    
2805 joey 2156 2004-04-10 Martin Schulze <[email protected]>
2806    
2807     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Adjusted
2808     string handling. It's "foo".lower() and not lower(foo) without
2809     lower imported from strings or something.
2810    
2811     * Extensions/wms/wms.py (WMSLayer): Incorporated WMSCapabilities
2812     from capabilities.py and parser.py. Implement priority list for
2813     supported graphics formats, take care of wbmp != bmp. PNG, TIFF
2814     and GIF are supported here, but not yet by main Thuban. Hence,
2815     support for them may be removed later. Special contribution to
2816     usability: get wxWidgets to change the cursor when we're waiting
2817     for data from the network so the user won't start to worry. This
2818     causes a redrawing error/warning, though.
2819    
2820     * Extensions/wms/parser.py (WMSCapabilitiesParser.grok): Unlink
2821     the DOM object.
2822    
2823     2004-04-01 Martin Schulze <[email protected]>
2824    
2825     * Extensions/wms/capabilities.py: Adjusted documentation
2826     (WMSCapabilities.__init__): Improved documentation, fixed syntax
2827     (WMSCapabilities.saveCapabilities): Only catch IOError when
2828     handling files
2829     (WMSCapabilities.loadCapabilities): Only catch IOError when
2830     handling files
2831     __main__: corrected variable naming
2832     (WMSCapabilities.fetchCapabilities,loadCapabilities): Make this
2833     class a specialisation of WMSCapabilitiesParser as well. Also
2834     execute grok() after loading or fetching capabilities, if that
2835     went well, so that subsequent calls can already access the data.
2836     (WMSCapabilities.getVersion): Export the used version of the
2837     GetCapabilities request, so we can use it for subsequent calls,
2838     i.e. for GetMap requests.
2839     (WMSCapabilities.fetchCapabilities): Added proper error handling
2840     when the GetCapabilities request failed, so that the surrounding
2841     program can act accordingly.
2842    
2843 joey 2146 2004-03-30 Martin Schulze <[email protected]>
2844    
2845     * Extensions/wms/parser.py (WMSCapabilitiesParser.getLayerSRS):
2846     Adjusted the getLayerSRS method to return the list of SRSes
2847     extracted from <SRS> elements instead of <BoundingBox> elements.
2848     Added a bit of documentation as well.
2849     (WMSCapabilitiesParser.checkLayerSRS): Removed integrity test
2850     since it was only implemented due to a misunderstanding.
2851    
2852     * Extensions/wms/test/test_parser.py
2853     (TestWMSCapabilitiesParser.test_LayerSRS): Adjust the tests to
2854     reflect the corrected interpretation of the standard: i.e. a layer
2855     does not have to define a BoundingBox for all SRSes it supports.
2856     Hence the <SRS></SRS> specification is authoritative, not the list
2857     of BoundingBoxes.
2858     (TestWMSCapabilitiesParser.test_BoundingBoxes): Added a new test
2859     to ensure None is returned for a non-existing SRS.
2860     (TestWMSCapabilitiesParser.test_grok): Removed test_grok method
2861     since it is not applicable anymore. Listing more SRSes in <SRS>
2862     elements is valid according to the specs.
2863    
2864 bernhard 2140 2004-03-26 Bernhard Reiter <[email protected]>
2865 joey 2146
2866 bernhard 2140 * README: Nicer formatting of text. Improved descriptions.
2867     Reflected wxWidgets name change.
2868    
2869     * Thuban/UI/about.py: Extended copyright to 2004 and added
2870     information about the thuban-devel mailinglist.
2871    
2872 joey 2138 2004-03-24 Martin Schulze <[email protected]>
2873 joey 2120
2874 joey 2138 * Extensions/wms/capabilities.py: Renamed the class to contain
2875     'WMS', also added a linebreak where required
2876    
2877     * Extensions/wms/parser.py: Finally added the XML parser for the
2878     GetCapabilities response.
2879    
2880     * Extensions/wms/test/sample.xml: Adjusted the sample file so that
2881     <SRS> elements match the <BoundingBox> elements, except for the
2882     layer 'beschriftung'.
2883    
2884     * Extensions/wms/test/test_parser.py: Encode non-ascii strings
2885     since Python uses unicode strings internally, otherwise
2886     comparisons will fail. Removed tests for getLayerBBoxSRS() since
2887     the SRS will be calculated anyway and this method is obsoleted by
2888     getLayerSRS(). Denote SRS as strings and not as cardinal numbers.
2889     Move loading the sample file into the setUp method. Added a test
2890     for finding the integrity problem in the sample response.
2891     Improved formatting.
2892    
2893     * Extensions/wms/domutils.py: Added convenience routines for
2894     handling of Document Object Model (DOM) nodes.
2895    
2896     * Extensions/wms/test/test_domutils.py: Added a test for the
2897     domutils module
2898    
2899     2004-03-19 Martin Schulze <[email protected]>
2900    
2901 joey 2120 * Extensions/wms/test/test_parser.py (TestWMSCapabilitiesParser):
2902     Moved path detection and adding into a module of its own,
2903     adjustpath, which exports thubandir as main Thuban directory.
2904    
2905     * Extensions/wms/test/test_ogclib.py (TestWMSLib): Moved path
2906     detection and adding into a module of its own, adjustpath, which
2907     exports thubandir as main Thuban directory. Reorganised the
2908     module in order to support the SkipTest feature for Thuban test
2909     cases.
2910    
2911     * Extensions/wms/test/adjustpath.py: Moved path detection and
2912     adding into a module of its own.
2913    
2914 joey 2115 2004-03-18 Martin Schulze <[email protected]>
2915    
2916     * Extensions/wms/test/test_parser.py: Added another test for
2917     checking whether the WMS XML parser (to be implemented) returns
2918     the information we expect. This requires a sample WMS WML file
2919     (sample.xml) which has been extracted from the frida server and
2920     "improved" manually.
2921    
2922     * Extensions/wms/test/test_ogclib.py: Added legacy code to add the
2923     main Thuban directory to the path in order to be able to import
2924     random modules. Adjusted the PyOGCLib detection to reuse the
2925     information gathered. Also added a note about the PYTHONPATH
2926     environment variable.
2927    
2928     * Extensions/wms/test/test_ogclib.py: The format specification is
2929     a mime-type, not a graphic format, hence image/jpeg wou ld be the
2930     proper format and not JPEG. We'll also have to take care of the
2931     encoding of / as %2F.
2932    
2933 joey 2111 2004-03-16 Martin Schulze <[email protected]>
2934    
2935     * Extensions/wms/test/test_ogclib.py: Added a (hopefully)
2936     comprehensive test for the getMapURL method, built compare URLs
2937     according to the documentation in OGC 01-068r3
2938    
2939     * Extensions/wms/capabilities.py (WMSCapabilities): Added the
2940     class WMSCapabilities to manage capabilites, will incorporate
2941     parsing the capabilities response and provide details for other
2942     classes.
2943    
2944 bh 2105 2004-03-12 Bernhard Herzog <[email protected]>
2945    
2946 bh 2107 Support views in addition to normal tables in the postgis
2947     shapestore
2948    
2949     * Thuban/Model/postgisdb.py
2950     (PostGISShapeStore._fetch_table_information): Add a fallback for
2951     the case where the table name is not in the geometry_columns
2952     table. This is usually the case for views. Also, set
2953     self.shapestore here.
2954     (PostGISShapeStore.ShapeType): No need to query the database all
2955     the time. The shape type is now determined in
2956     _fetch_table_information
2957    
2958     * test/postgissupport.py (PostgreSQLServer.new_postgis_db)
2959     (PostgreSQLServer.get_static_data_db, PostGISDatabase.__init__):
2960     New parameter to specify views.
2961     (PostGISDatabase.has_data): Also compare the views. New views
2962     parameter
2963     (PostGISDatabase.initdb): Create the views.
2964     (PostgreSQLServer.get_default_static_data_db): Add the v_landmarks
2965     view
2966    
2967     * test/test_postgis_db.py
2968     (TestPostGISShapestorePointFromViews): New. Test a
2969     PostGISShapeStore with a view
2970     (TestPostGISShapestorePointOIDAsGIDColumn.setUp): Pass the name of
2971     the geometry_column explicitly to test whether that works
2972    
2973     2004-03-12 Bernhard Herzog <[email protected]>
2974    
2975 bh 2105 Final step for explicit id/geometry columns: Loading and saving
2976    
2977     * Resources/XML/thuban-1.1.dtd: New. Derived from thuban-1.0.dtd
2978     with the following changes:
2979     (dbshapesource): Two new attributes id_column and geometry_column
2980    
2981     * Thuban/Model/save.py (SessionSaver.write): Use the new dtd
2982     (SessionSaver.write_session): Use the new namespace
2983     (SessionSaver.write_data_containers): Write the new dbshapesource
2984     parameters
2985    
2986     * Thuban/Model/load.py (SessionLoader.__init__): New namespace for
2987     the new file format version
2988     (SessionLoader.start_dbshapesource): Handle the new db parameters
2989    
2990     * test/test_save.py: Update to the new dtd and namespace
2991     (SaveSessionTest.test_save_postgis): Update the NonConnectionStore
2992     mock object to provide a working IDColumn method.
2993    
2994     * test/test_load_1_0.py: New. Copy of the test_load.py before
2995     today's changes but with the round-trip tests removed.
2996    
2997     * test/test_load_0_9.py: Update doc-string.
2998    
2999     * test/test_load.py: Update all .thuban files to the new dtd and
3000     namespace.
3001     (TestPostGISLayer.file_contents): Add the new dbshapesource
3002     paramters
3003    
3004 bh 2100 2004-03-11 Bernhard Herzog <[email protected]>
3005    
3006 bh 2103 Next step for explicit id/geometry columns: User interaction
3007    
3008     * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Rework how
3009     the dialog is constructed. Add combo boxes to select id and
3010     geometry column. Rename some instance variables.
3011     (ChooseDBTableDialog.GetTable): Return id and geometry column
3012     names
3013     (ChooseDBTableDialog.OnTableSelect): New. Event handler for
3014     selections in the table list
3015    
3016     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Use id_column
3017     and geometry_column
3018    
3019     * Thuban/Model/session.py (Session.OpenDBShapeStore): Add the new
3020     parameters for id_column and geometry column of PostGISShapeStore
3021     here as well.
3022    
3023     * Thuban/Model/postgisdb.py (type_map): Add ROWID psycog type.
3024     (_raw_type_map): New. Map raw PostgreSQL type ints to thuban types
3025     (PostGISConnection.GeometryTables): Use a better query to
3026     determine which relations in the database might be usable for
3027     shapestores. Now supports views as well but is more PostgreSQL
3028     specific
3029     (PostGISConnection.table_columns): New. Somewhat experimental
3030     method to let the db dialogs provide lists of columns to users so
3031     that they can select id and geometry columns.
3032     (PostGISTable.__init__): The default value of the id_column
3033     parameter is now None it still means "gid" effectively, though.
3034     (PostGISTable.IDColumn): New introspection method to return a
3035     column object for the id column
3036     (PostGISShapeStore.GeometryColumn): New introspection method to
3037     return a column object for the geometry column
3038    
3039     * test/test_postgis_db.py
3040     (TestPostGISConnection.test_gis_tables_non_empty):
3041     Removed. Subsumed by the new:
3042     (TestPostGISConnection.test_gis_tables_with_views_and_tables):
3043     New. Tes the GeometryTables and table_columns methods with actual
3044     tables and views.
3045     (PointTests.test_id_column, PointTests.test_geometry_column):
3046     New. tests for the new methods.
3047     (TestPostGISShapestorePoint.setUp)
3048     (TestPostGISShapestorePointSRID.setUp)
3049     (TestPostGISShapestorePointExplicitGIDColumn.setUp): Fill the
3050     instance variables needed by the new tests
3051    
3052     2004-03-11 Bernhard Herzog <[email protected]>
3053    
3054 bh 2100 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): The row
3055     numbers given to ReadValue are ordinals.
3056    
3057     2004-03-11 Bernhard Herzog <[email protected]>
3058    
3059     Elimiate the requirement for PostGIS tables to have a column
3060     called "gid".
3061    
3062     * Thuban/Model/postgisdb.py (PostGISTable.__init__): New parameter
3063     id_column to specify which column to use to identify rows. Also
3064     new instance variables id_column and quoted_id_column
3065     (PostGISTable.RowIdToOrdinal, PostGISTable.RowOrdinalToId)
3066     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue)
3067     (PostGISTable.SimpleQuery): Use the id column name provided to the
3068     constructor instead of "gid"
3069     (PostGISShapeStore.__init__): New parameter id_column analogously
3070     to PostGISTable.__init__. This parameter is simply passed through
3071     to the base class constructor
3072     (PostGISShapeStore._create_col_from_description): Fix typo in
3073     doc-string
3074     (PostGISShapeStore.Shape, PostGISShapeStore.AllShapes)
3075     (PostGISShapeStore.ShapesInRegion): Use the id column name
3076     provided to the constructor instead of "gid"
3077    
3078     * test/postgissupport.py
3079     (PostgreSQLServer.get_default_static_data_db): New static table
3080     landmarks_point_id with an id column != "gid. Update the comments
3081     a bit.
3082     (skip_if_addgeometrycolumn_does_not_use_quote_ident): Fix typo in
3083     doc-
3084     (upload_shapefile): New parameter gid_column to use a name other
3085     than "gid" for the column to store the shape ids
3086    
3087     * test/test_postgis_db.py (TableTests): New. Mixin-class
3088     containing all tests previously in TestPostGISTable. The actual
3089     tests are the same but the code is a bit more configurable to
3090     allow for different id columns etc.
3091     (TestPostGISTable): Derive from TableTests now for the actual
3092     tests.
3093     (TestPostGISTableExplicitGIDColumn): New. Like TestPostGISTable
3094     except that it the landmarks_point_id table to test the id_column
3095     parameter
3096     (PointTests): Extend the doc-string
3097     (TestPostGISShapestorePointExplicitGIDColumn)
3098     (TestPostGISShapestorePointOIDAsGIDColumn): New classes derived
3099     from PointTests to test the explicit id_column parameter. One
3100     tests with the name of the column holding the shape ids, the other
3101     uses PostgreSQL's OID column. For the latter a number of methods
3102     have to be overwritten to make them independent of the actual id
3103     values.
3104    
3105 silke 2095 2004-03-08 Silke Reimer <[email protected]>
3106    
3107     Update debian directory:
3108    
3109     * debian/changelog: Added new version.
3110     * deiban/rules: Updated management of patches (with cbds)
3111     * debian/control: Added cbds to dependencies
3112     * debian/patches/*: New. Adds better support for patches of thuban in
3113     debian
3114     * debian/menu: Syntax of menu changed slightly
3115     * debian/setup.py.patch: removed because it has been moved to
3116     debian/patechs/setup.py.patch
3117    
3118    
3119 bh 2094 2004-02-26 Bernhard Herzog <[email protected]>
3120    
3121     Create the Doc/technotes directory for text files with information
3122     for developers
3123    
3124     * Doc/technotes/README: New. README for the technotes
3125    
3126     * Doc/technotes/coding_guidelines.txt: New. Coding guidelines for
3127     Thuban
3128    
3129     * Doc/technotes/release_process.txt: New. Used to be
3130     HOWTO-Release. Now slightly adapted to technote formatting style.
3131    
3132     * HOWTO-Release: Removed. It's contents are now in
3133     Doc/technotes/release_process.txt
3134    
3135 bh 2089 2004-02-25 Bernhard Herzog <[email protected]>
3136    
3137     * libraries/thuban/wxproj.cpp (get_wx_version): New. Return the
3138     version of wxWindows the module was compiled with so we can check
3139     that against the wxPython version.
3140    
3141     * Thuban/version.py (thuban_branch, thuban_release): New variables
3142     controlling which and how Thuban versions are shown. See the
3143     comments for details.
3144     (verify_versions): Also check that the wx version that wxproj is
3145     compiled against matches that of the wxPython we use at runtime
3146    
3147 bh 2080 2004-02-20 Bernhard Herzog <[email protected]>
3148    
3149 bh 2087 * Extensions/wms/wms.py (epsg_code_to_projection): Use
3150     get_system_proj_file to read the epsg projections. The old way
3151     depended on the current directory being the top Thuban directory.
3152    
3153     2004-02-20 Bernhard Herzog <[email protected]>
3154    
3155 bh 2085 * Extensions/svgexport/test/test_svgmapwriter.py
3156     (TestVirtualDC.test_clippath): Remove a debug print
3157    
3158     2004-02-20 Bernhard Herzog <[email protected]>
3159    
3160 bh 2083 * Extensions/svgexport/__init__.py: New. Turn
3161     Extensions/svgexport into a package.
3162    
3163     * Extensions/svgexport/svgmapwriter.py: Reorder the imports and
3164     doc-string a bit. The doc-string must come first, otherwise it's
3165     not a doc-string. The __future__ import must be the first thing
3166     after the doc-string. Use only double quotes in doc-strings.
3167     Single quotes trip up emacs syntax highlighting if the text
3168     contains apostrophes.
3169    
3170     2004-02-20 Bernhard Herzog <[email protected]>
3171    
3172 bh 2080 * Extensions/svgexport/test/__init__.py,
3173     Extensions/svgexport/test/test_svgmapwriter.py: New. Initial test
3174     suite for svgexport
3175    
3176     * test/runtests.py (find_test_modules): New. Function with the
3177     module finding code from main.
3178     (main): Use find_test_modules to figure out the default test
3179     modules and take modules from Extensions.svgexport.test too.
3180    
3181 bh 2075 2004-02-19 Bernhard Herzog <[email protected]>
3182    
3183 bh 2077 * Thuban/UI/application.py (ThubanApplication.OnInit): Make sure
3184     the mainwindow has a reference to the map of the initial session.
3185     This fixes a bug introduced with the fix for RT#2245
3186    
3187     2004-02-19 Bernhard Herzog <[email protected]>
3188    
3189 bh 2075 * Extensions/svgexport/svgsaver.py,
3190     Extensions/svgexport/svgmapwriter.py,
3191     Extensions/svgexport/maplegend.py: Added again. This time in the
3192     correct place.
3193    
3194 bh 2070 2004-02-17 Bernhard Herzog <[email protected]>
3195    
3196 bh 2073 Fix for RT#2245
3197    
3198     * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
3199     instance variables before trying to create any windows. Creating
3200     windows can start an event loop if e.g. message boxes are popped
3201     up for some reason, and event handlers, especially EVT_UPDATE_UI
3202     may want to access things from the application.
3203     (ThubanApplication.maps_changed): The mainwindow may not have been
3204     created yet, so check whether it has been created before calling
3205     its methods
3206    
3207     * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
3208     have a map
3209    
3210     2004-02-17 Bernhard Herzog <[email protected]>
3211    
3212 bh 2070 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
3213     Extensions/svgmapwriter.py, Extensions/maplegend.py,
3214     extensions/svgexport/svgsaver.py,
3215     extensions/svgexport/svgmapwriter.py,
3216     extensions/svgexport/maplegend.py: Removed. These files were in
3217     the wrong places or didn't work at all.
3218    
3219 bh 2067 2004-02-16 Bernhard Herzog <[email protected]>
3220    
3221 bh 2069 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
3222     line
3223    
3224     2004-02-16 Bernhard Herzog <[email protected]>
3225    
3226 bh 2067 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
3227    
3228 mrechtie 2064 2004-02-15 Markus Rechtien <[email protected]>
3229    
3230     * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
3231     to write a session to a file in SVG format.
3232     * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
3233     to write a SVG map of a session.
3234     * Extensions/svgexport/maplegend: New. Writes a basic maplegend
3235     in SVG format for the current session.
3236    
3237 bh 2062 2004-02-13 Bernhard Herzog <[email protected]>
3238    
3239     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
3240     can't be created, return immediately after displaying the error
3241     message.
3242    
3243 bh 2060 2004-02-11 Bernhard Herzog <[email protected]>
3244    
3245     Handle postgis tables with more than one geometry column.
3246    
3247     * Thuban/Model/postgisdb.py
3248     (PostGISTable._fetch_table_information): Delegate the creation of
3249     column objects to a different method so that we can extend that in
3250     derived classes
3251     (PostGISTable._create_col_from_description): New. Column object
3252     creation part of _fetch_table_information
3253     (PostGISShapeStore._create_col_from_description): New. Extend
3254     inherited method to handle geometry columns
3255     (PostGISShapeStore.__init__): New parameter geometry_column to
3256     specify which geometry column to use. Optional but mandatory for
3257     tables with more than one geometry column
3258     (PostGISShapeStore._fetch_table_information): Also use the name of
3259     the geometry column when looking for the srid
3260     (PostGISShapeStore.ShapeType): Also use the name of the geometry
3261     column when looking for the shape type
3262    
3263     * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
3264     NonConnectionStore to changes in the PostGISShapeStore
3265    
3266     * test/test_postgis_db.py
3267     (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
3268     PostGISShapeStore with tables having two geometry columns.
3269    
3270 bh 2058 2004-02-10 Bernhard Herzog <[email protected]>
3271    
3272     Fix some postgis problems. What remains to be done is real
3273     handling of SRIDs as they affect how reprojection is done
3274    
3275     * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
3276     doc-string
3277     (PostGISShapeStore._fetch_table_information): New. Extend
3278     inherited method to retrieve srid
3279     (PostGISShapeStore.BoundingBox): Handle tables without data.
3280     extent yields NULL for those
3281     (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
3282    
3283     * test/test_postgis_db.py
3284     (TestPostGISSpecialCases.test_shapestore_empty_table): New test
3285     for the special case of a table without any data
3286     (TestPostGISShapestorePointSRID): New class with tests for a table
3287     that uses srids
3288     (PolygonTests): Fix a doc-string typo
3289    
3290     * test/postgissupport.py (PostGISDatabase.__init__): New parameter
3291     reference_systems with a specification of spacial reference
3292     systems to create in the new db.
3293     (PostgreSQLServer.new_postgis_db)
3294     (PostgreSQLServer.get_static_data_db): New parameter
3295     reference_systems to be passed through ultimately to
3296     PostGISDatabase. In new_postgis_db also check whether an existing
3297     db already has the right srids
3298     (PostgreSQLServer.get_default_static_data_db): Add srids and a
3299     table that uses srids
3300     (PostGISDatabase.initdb): Create the entries for the reference
3301     systems
3302     (PostGISDatabase.has_data): Add reference_systems parameter to
3303     check for those too
3304     (upload_shapefile): New parameter srid to create tables with a
3305     specific srid
3306    
3307 frank 2055 2004-02-06 Frank Koormann <[email protected]>
3308    
3309     * po/pt_BR.po: Fixed charset
3310    
3311 frank 2054 2004-02-05 Frank Koormann <[email protected]>
3312    
3313     * po/pt_BR.po: Fixed format string for error message, missing %s
3314     added (Thuban/UI/application.py:273)
3315    
3316 frank 2053 2004-02-03 Frank Koormann <[email protected]>
3317    
3318     First version of Portuguese (Brazilian) translation
3319    
3320     * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
3321     Brazilian Portuguese by Eduardo Patto Kanegae.
3322    
3323     * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
3324     translators.
3325    
3326    
3327 frank 2052 2004-01-22 Frank Koormann <[email protected]>
3328    
3329     * Doc/manual/thuban-manual.xml: Added section on installation of
3330     Thuban under Win32 systems. Fixed image path references in the postgis
3331     section. Some minor source formattings.
3332    
3333 frank 2051 2004-01-21 Frank Koormann <[email protected]>
3334    
3335     Make Thuban remember path selections (at least for one application run).
3336    
3337     * Thuban/UI/application.py (Application.OnInit): Initialize path as a
3338     attribute of application object. Path is a dictionary of
3339     strings, currently with the items "data" and "projection".
3340     (Application.SetPath): New, stores path for the specified item.
3341     (Application.Path): New, return path for the specified item.
3342    
3343     * Thuban/UI/mainwindow.py
3344     (MainWindow.OpenSession, MainWindow.SaveSessionAs,
3345     MainWindow.AddLayer, MainWindow.AddRasterLayer,
3346     MainWindow.TableOpen): Access "data" path information of the
3347     application.
3348    
3349     * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
3350     Access "projection" path information of the application.
3351    
3352 bh 2048 2004-01-05 Bernhard Herzog <[email protected]>
3353    
3354 bh 2050 * po/ru.po: Updated translations from Alex Shevlakov
3355    
3356     2004-01-05 Bernhard Herzog <[email protected]>
3357    
3358 bh 2048 * po/Makefile, po/README: Move the description of how to generate
3359     the translation statistics to the README.
3360    
3361 bh 2042 2003-12-23 Bernhard Herzog <[email protected]>
3362    
3363 bh 2045 * NEWS: Update for 1.0.0
3364    
3365     * po/it.po: Another update from Maurizio Napolitano
3366    
3367     2003-12-23 Bernhard Herzog <[email protected]>
3368    
3369 bh 2042 * po/it.po: Updated translation from Maurizio Napolitano
3370    
3371     2003-12-23 Bernhard Herzog <[email protected]>
3372    
3373     * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
3374     for translation
3375    
3376     * Thuban/UI/mainwindow.py (MainWindow.TableRename)
3377     (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
3378     strings for translation
3379    
3380     * po/de.po: Update with the newly marked strings.
3381    
3382 bh 2033 2003-12-22 Bernhard Herzog <[email protected]>
3383    
3384 bh 2039 * HOWTO-Release: Fix the places where version numbers have to be
3385     updated
3386    
3387     2003-12-22 Bernhard Herzog <[email protected]>
3388    
3389 bh 2037 * setup.py (setup call): 1.0.0, yeah!
3390    
3391     * Thuban/version.py (longversion): 1.0.0, yeah!
3392    
3393     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
3394     1.0.0 namespace too
3395    
3396     * Thuban/Model/save.py (SessionSaver.write_session): Save with
3397     1.0.0 namespace
3398    
3399     * test/test_load.py (LoadSessionTest.dtd)
3400     (TestSingleLayer.file_contents)
3401     (TestNonAsciiColumnName.file_contents)
3402     (TestLayerVisibility.file_contents)
3403     (TestClassification.file_contents, TestLabels.file_contents)
3404     (TestLayerProjection.file_contents)
3405     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3406     (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
3407     (TestPostGISLayerPassword.file_contents)
3408     (TestLoadError.file_contents, TestLoadError.test): Update for
3409     1.0.0 namespace
3410    
3411     * test/test_save.py (SaveSessionTest.dtd)
3412     (SaveSessionTest.testEmptySession)
3413     (SaveSessionTest.testSingleLayer)
3414     (SaveSessionTest.testLayerProjection)
3415     (SaveSessionTest.testRasterLayer)
3416     (SaveSessionTest.testClassifiedLayer)
3417     (SaveSessionTest.test_dbf_table)
3418     (SaveSessionTest.test_joined_table)
3419     (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
3420    
3421     2003-12-22 Bernhard Herzog <[email protected]>
3422    
3423 bh 2035 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
3424     alignment flags are byte strings not unicode and that they have
3425     valid values
3426    
3427     * test/test_load.py (TestLabelLayer): New. Test loading (and
3428     indirectly saving) of maps with labels.
3429    
3430     2003-12-22 Bernhard Herzog <[email protected]>
3431    
3432 bh 2033 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
3433     (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
3434     unsubscribe all subscribers.
3435     (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
3436     self.grid since it may already have been destroyed.
3437     Fixes RT #2256
3438    
3439 bh 2031 2003-12-19 Bernhard Herzog <[email protected]>
3440    
3441     * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
3442    
3443 bh 2028 2003-12-16 Bernhard Herzog <[email protected]>
3444 silke 2029
3445     * debian/bitmappath.patch, debian/setup.py.patch:
3446     added to ensure compliance with FHS for debian
3447     * debian/rules, debian/changelog:
3448     added patches in rules to ensure compliance with FHS for debian
3449 bh 2028
3450 silke 2029 2003-12-16 Bernhard Herzog <[email protected]>
3451    
3452 bh 2028 * po/Makefile (mo): Make the output a bit nicer so that it prints
3453     statistics about the translations. Add a comment how produce even
3454     nicer statistics with sed.
3455    
3456 frank 2026 2003-12-09 Frank Koormann <[email protected]>
3457    
3458     * Resources/Projections/defaults.proj:
3459     French projection sample with correct accents (UNICODE).
3460    
3461 bh 2025 2003-12-05 Bernhard Herzog <[email protected]>
3462    
3463     * MANIFEST.in: Add the devtools directory
3464    
3465     * setup.py (setup call): Use license instead of licence. This
3466     silences a deprecation warning on Python 2.3
3467    
3468 frank 2022 2003-12-05 Frank Koormann <[email protected]>
3469    
3470 frank 2023 Documentation synced with 1.0rc1
3471    
3472     * Doc/manual/thuban-manual.xml:
3473     Minor formatting changes and references to database layers .
3474     Introduction.Internationalization: New section on i18n.
3475     MapManagement.AddingandRemovingLayers: Added item on database layers.
3476     MapManagement.TheLegend: Added section and screenshot on popup menu.
3477     ProjectionManagement: Updated screenshot and sentence on EPSG.
3478     Appendix.SupportedDataSources: Added PostGIS.
3479     Appendix.WorkingwithPostGIS: New section.
3480    
3481     * Doc/manual/images/6_projection.png: Updated screenshot including
3482     EPSG checkboxes.
3483    
3484     * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
3485    
3486     * Doc/manual/images/app_postgis_add_layer.png,
3487     Doc/manual/images/app_postgis_db_add.png,
3488     Doc/manual/images/app_postgis_db_management.png:
3489     New screenshots focussing on database layers
3490    
3491     2003-12-05 Frank Koormann <[email protected]>
3492    
3493 frank 2022 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
3494     write warning to stderr instead of rising a warning dialog
3495    
3496 bh 2016 2003-12-03 Bernhard Herzog <[email protected]>
3497    
3498 bh 2021 Fix for RT #2243
3499    
3500 bh 2020 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
3501     New. Like has_selected_layer but for shape layers only
3502     (_has_selected_shape_layer): New. Like _has_selected_layer but for
3503     shape layers only
3504     (layer_show_table command, layer_jointable command): Use these
3505     commands should only be available for shape layers
3506    
3507     2003-12-03 Bernhard Herzog <[email protected]>
3508    
3509 bh 2018 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
3510     publishers that are wx objects and may have been destroyed by wx
3511     already. Fixes RT #2242.
3512    
3513     2003-12-03 Bernhard Herzog <[email protected]>
3514    
3515 bh 2016 * po/ru.po: Updates from Alex Shevlakov
3516    
3517 silke 2013 2003-12-03 Silke Reimer <silkeintevation.de>
3518    
3519     * debian/control, debian/changelog: Added gdal-support to
3520     debian package, updated to new thuban version
3521    
3522    
3523 bh 2012 2003-12-03 Bernhard Herzog <[email protected]>
3524    
3525     * Thuban/Lib/version.py: New. Module for version number
3526     manipulations. The version of make_tuple here also deals better
3527     with more unusual version number strings, such as e.g.
3528     "1.2+cvs20031111"
3529    
3530     * Thuban/version.py (make_tuple): Removed. It's now in
3531     Thuban.Lib.version. Use that implementation instead.
3532    
3533     * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
3534    
3535 bh 2005 2003-12-02 Bernhard Herzog <[email protected]>
3536    
3537 bh 2010 * MANIFEST.in: Add debian files
3538    
3539 bh 2008 * setup.py (setup call): Add packages for the Extensions so that
3540     they're installed too
3541     (data_files): Add READMEs and sample data from some Extensions
3542    
3543     * NEWS: Add note about the extensions in binary packages
3544    
3545     2003-12-02 Bernhard Herzog <[email protected]>
3546    
3547 bh 2005 * Thuban/Model/save.py (SessionSaver.write_session): Save files
3548     with the thuban-1.0rc1
3549    
3550     * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
3551     thuban-1.0rc1 namespace too
3552    
3553     * test/test_save.py (SaveSessionTest.dtd)
3554     (SaveSessionTest.testEmptySession)
3555     (SaveSessionTest.testSingleLayer)
3556     (SaveSessionTest.testLayerProjection)
3557     (SaveSessionTest.testRasterLayer)
3558     (SaveSessionTest.testClassifiedLayer)
3559     (SaveSessionTest.test_dbf_table)
3560     (SaveSessionTest.test_joined_table)
3561     (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
3562     namespace
3563    
3564     * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
3565     namespace
3566     (TestSingleLayer.file_contents)
3567     (TestNonAsciiColumnName.file_contents)
3568     (TestLayerVisibility.file_contents)
3569     (TestClassification.file_contents, TestLabels.file_contents)
3570     (TestLayerProjection.file_contents)
3571     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3572     (TestPostGISLayer.file_contents)
3573     (TestPostGISLayerPassword.file_contents)
3574     (TestLoadError.file_contents, TestLoadError.test): Update to
3575     thuban-1.0rc1 namespace
3576    
3577 bh 1996 2003-12-01 Bernhard Herzog <[email protected]>
3578    
3579 bh 2003 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
3580     nt to better match Intevation's current w32 setup
3581    
3582 bh 2001 * HOWTO-Release: Add note about updating MANIFEST.in
3583    
3584     * MANIFEST.in: Add the Extensions
3585    
3586 bh 1998 * NEWS: Update for 1.0rc1
3587    
3588     2003-12-01 Bernhard Herzog <[email protected]>
3589    
3590 bh 1996 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
3591     cards for the dialog so that shapefiles ending in all uppercase
3592     SHP are listed too
3593    
3594 bh 1988 2003-11-28 Bernhard Herzog <[email protected]>
3595    
3596 bh 1996 * Thuban/version.py (longversion): Update to 1.0rc1
3597    
3598     * setup.py (setup call): Update version to 1.0rc1. Use the
3599     [email protected] email address as author email instead of my
3600     personal one.
3601    
3602     2003-11-28 Bernhard Herzog <[email protected]>
3603    
3604 bh 1992 * po/de.po: Update german translation.
3605    
3606     2003-11-28 Bernhard Herzog <[email protected]>
3607    
3608 bh 1990 Unify the filenames stored in .thuban files so that the .thuban
3609     files are more platform independend
3610    
3611     * Thuban/Model/save.py (unify_filename): New. Unify filenames so
3612     that they can be used on both windows and unix
3613     (SessionSaver.prepare_filename): New. Handle all filename
3614     transformations for filenames stored in the thuban file
3615     (SessionSaver.write_data_containers, SessionSaver.write_layer):
3616     Use prepare_filename
3617    
3618     * test/test_save.py (SaveSessionTest.testSingleLayer)
3619     (SaveSessionTest.testLayerProjection)
3620     (SaveSessionTest.testRasterLayer)
3621     (SaveSessionTest.testClassifiedLayer)
3622     (SaveSessionTest.test_dbf_table)
3623     (SaveSessionTest.test_joined_table): Filenames are always stored
3624     with slashes on all currently supported platforms so adapt all
3625     tests to this
3626    
3627     * test/test_load.py (LoadSessionTest.filenames): With the new
3628     filename scheme the filenames in the tests should be
3629     understandable on all currently supported platforms so we turn
3630     this into an empty list because we don't have to normalize them
3631     anymore
3632    
3633     2003-11-28 Bernhard Herzog <[email protected]>
3634    
3635 bh 1988 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
3636     Add the ellipsoid to the projection since some Proj versions
3637     complain if it's missing.
3638    
3639 bh 1984 2003-11-27 Bernhard Herzog <[email protected]>
3640    
3641     Corect some bounding box projection problems
3642    
3643     * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
3644     version of ForwardBBox
3645     (Projection._transform_bbox): New. common implementation of
3646     ForwardBBox and InverseBBox
3647     (Projection.ForwardBBox): Use _transform_bbox.
3648    
3649     * test/test_proj.py (TestProjection.test): Add test for
3650     InverseBBox
3651    
3652     * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
3653     (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
3654     new InverseBBox method to determine the unprojected bounding box
3655     (Layer.ShapesInRegion): Use the ForwardBBox method to project the
3656     bbox.
3657    
3658     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
3659     Removed.
3660     (TestLayer.test_arc_layer_with_projection): New. This test is
3661     better able to test whether bounding boxes are projected correctly
3662     than test_point_layer_with_projection
3663    
3664 bh 1986 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
3665     InverseBBox to unproject bboxes
3666    
3667 bh 1975 2003-11-25 Bernhard Herzog <[email protected]>
3668    
3669 bh 1981 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
3670     source code.
3671    
3672     2003-11-25 Bernhard Herzog <[email protected]>
3673    
3674 bh 1979 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
3675     there for backwards compatibility and all code relying on that
3676     should have been updated by now.
3677    
3678     2003-11-25 Bernhard Herzog <[email protected]>
3679    
3680 bh 1977 * test/test_load.py (TestClassification.test): Add the missing
3681     round trip test.
3682     (TestClassification.file_contents): Update to the newest file
3683     format
3684    
3685     2003-11-25 Bernhard Herzog <[email protected]>
3686    
3687 bh 1975 Add very experimental (and possibly dangerous) extension to draw
3688     polygons:
3689    
3690     * Extensions/drawshape/README: New. Brief installation
3691     instructions
3692    
3693     * Extensions/drawshape/drawshape.py: New. Implementation of the
3694     drawshape extensions
3695    
3696     * Extensions/drawshape/patch.diff: Patch to apply before the
3697     extension can be used.
3698    
3699 bh 1971 2003-11-24 Bernhard Herzog <[email protected]>
3700    
3701 bh 1973 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
3702     (ShapefileStore.__init__): Factor opening the shapefile into a
3703     separate method (the new _open_shapefile). This makes the code a
3704     bit more readable but the real reason is that it makes some evil
3705     hacks easier. :-)
3706    
3707     2003-11-24 Bernhard Herzog <[email protected]>
3708    
3709 bh 1971 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
3710     converter is specified for an attribute assume it's a string
3711     containing only Latin1 characters. Update doc-string accordingly.
3712     This change should fix many places where unicode objects might
3713     accidentally enter Thuban.
3714    
3715     * test/test_load.py (TestNonAsciiColumnName): New test to check
3716     what happens with column names in DBF files that contain non-ascii
3717     characters
3718    
3719 bh 1969 2003-11-21 Bernhard Herzog <[email protected]>
3720    
3721     Enable the experimental attribute editing again and introduce a
3722     command line switch to actually activate it
3723    
3724     * Thuban/UI/main.py (options): New. Container for options set on
3725     the commmand line
3726     (main): Add the --enable-attribute-editing flag.
3727    
3728     * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
3729     editing is enabled use the grid ctrl which allows editing of the
3730     values
3731    
3732     * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
3733     New. Just delegate this to the underlying table.
3734    
3735 bh 1967 2003-11-20 Bernhard Herzog <[email protected]>
3736    
3737     * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
3738     Skip this test if run under non-posix systems since it only works
3739     there
3740    
3741 bh 1960 2003-11-19 Bernhard Herzog <[email protected]>
3742    
3743 bh 1965 * Thuban/Model/resource.py: Rework the way gdal support is
3744     determined so that we can give a reason in the about why gdal is
3745     not supported.
3746     (gdal_support_status): New. Variable holding a string with the
3747     reason for no gdal support
3748    
3749     * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
3750     not supported to the message
3751    
3752     2003-11-19 Bernhard Herzog <[email protected]>
3753    
3754 bh 1963 Remove the old table interface and its test cases
3755    
3756     * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
3757     (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
3758     anymore
3759    
3760     * Thuban/Model/transientdb.py (TransientTableBase)
3761     (AutoTransientTable): Do not derive from OldTableInterfaceMixin
3762     anymore
3763    
3764     * test/test_table.py: Removed since the old interface it tests is
3765     gone.
3766    
3767     * test/runtests.py (main): The old table interface is gone and
3768     with it the deprecation warnings so remove the code that turns
3769     these warnings into errors
3770    
3771     2003-11-19 Bernhard Herzog <[email protected]>
3772    
3773 bh 1960 * test/test_table.py: Revert to revision 1.5 again. Changing the
3774     tests to use the new table interface is completely wrong since the
3775     whole purpose of the tests in this module is to test the old
3776     interface.
3777    
3778 bh 1954 2003-11-18 Bernhard Herzog <[email protected]>
3779    
3780 bh 1958 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
3781     New. Test whether the connection matches a set of connection
3782     parameters
3783    
3784     * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
3785     (DBFrame.OnAdd): Use the new MatchesParameters method when looking
3786     for existing connections with the same parameters and break out of
3787     the loop correctly.
3788    
3789     * test/test_postgis_db.py (TestBriefDescription)
3790     (TestPostGISSimple.test_brief_description): Rename
3791     TestBriefDescription to TestPostGISSimple and the test method to
3792     test_brief_description so that we can add more test methods.
3793     (TestPostGISSimple.test_matches_parameters): New. Test the new
3794     MatchesParameters method
3795    
3796     2003-11-18 Bernhard Herzog <[email protected]>
3797    
3798 bh 1960 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
3799 bh 1954 _was_destroyed, to indicate whether an publisher instance has
3800     already been destroyed.
3801     (Publisher.Unsubscribe): Only disconnect if the publisher has not
3802     been destroyed yet.
3803     (Publisher.Destroy): Set the _was_destroyed flag to true.
3804    
3805     * test/test_connector.py
3806     (TestPublisher.test_unsubscribe_after_destroy): New. Test that
3807     calling Unsubscribe after Destroy doesn't raise an exception
3808    
3809 bh 1951 2003-11-14 Bernhard Herzog <[email protected]>
3810    
3811     * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
3812     typo in doc-string
3813    
3814 bh 1949 2003-11-13 Bernhard Herzog <[email protected]>
3815    
3816     Quote table and column names properly for postgis.
3817    
3818     * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
3819     quote an identifier for use in an sql statement
3820     (PostGISColumn.__init__): Add the quoted_name attribute
3821     (PostGISTable.__init__): New instance variable quoted_tablename
3822     (PostGISTable._fetch_table_information): Use the quoted table
3823     name. New isntance variable quoted_geo_col with a quoted version
3824     of geometry_column
3825     (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
3826     (PostGISTable.RowOrdinalToId): Use the quoted table name
3827     (PostGISTable.ReadValue, PostGISTable.ValueRange)
3828     (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
3829     (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
3830     (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
3831     Use quoted table and column names
3832    
3833     * test/test_postgis_db.py (TestPostGISSpecialCases)
3834     (TestPostGISIgnoredColumns): Rename the class to
3835     TestPostGISSpecialCases because that better describes the new
3836     cases
3837     (TestPostGISSpecialCases.test_unsupported_types)
3838     (TestPostGISSpecialCases.test): Rename the method to
3839     test_unsupported_types because we need a more descriptive name now
3840     that there are more methods
3841     (TestPostGISSpecialCases.test_table_name_quoting)
3842     (TestPostGISSpecialCases.test_column_name_quoting)
3843     (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
3844     cases to test quoting of table and column names in PostGISTable
3845     and PostGISShapeStore
3846    
3847     * test/postgissupport.py
3848     (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
3849     AddGeometryColumn desn't support table or column names with sapces
3850     or double quotes
3851    
3852 jan 1945 2003-11-12 Jan-Oliver Wagner <[email protected]>
3853    
3854     * Extensions/wms/__init__.py: New: Init to make this
3855     directory a package.
3856    
3857     * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
3858    
3859 bh 1932 2003-11-11 Bernhard Herzog <[email protected]>
3860    
3861 bh 1942 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
3862     Constant for the file woth deprecated epsg projections
3863     (get_system_proj_file): Update doc-string
3864    
3865     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
3866     above the EPS widgets, introduce a check box for the deprecated
3867     eps projections and a label for the epsg widgets
3868     (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
3869     too
3870    
3871     2003-11-11 Bernhard Herzog <[email protected]>
3872    
3873 bh 1939 Avoid warnings when run under Python 2.3
3874    
3875     * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
3876     (BaseRenderer.draw_label_layer): Coordinates must be ints.
3877    
3878     * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
3879     real method so that we can convert to int.
3880     (MapRenderer.label_font): The font size mist be an int.
3881    
3882     * Thuban/UI/common.py (Color2wxColour): The color values must be
3883     ints. Also, remove the unnecessary asserts.
3884    
3885     * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
3886     (TestUnicodeStrings.test): Python source code should not contain
3887     non-ascii characters unless an encoding is specified in the file.
3888     Therefore use \x escapes in the string literals for non-ascii
3889     characters.
3890    
3891     2003-11-11 Bernhard Herzog <[email protected]>
3892    
3893 bh 1934 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
3894     parameter so that this function can be used for all proj files in
3895     Resource/Projections
3896     (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
3897     get_system_proj_file
3898    
3899     * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
3900     ProjFile self.__sysProjFile use a dictionary of system ProjFile
3901     objects self._sys_proj_files
3902     (ProjFrame.build_dialog): Adapt to the new changes in the
3903     ProjectionList constructor. Add a check button to toggle whether
3904     EPSG projections are shown
3905     (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
3906     events.
3907     (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
3908     the busy cursor if the files have not yet been loaded by the
3909     dialog.
3910     (ProjFrame.load_system_proj): Add a parameter for the name of the
3911     proj file. Maintain the dictionary of system projections
3912     self._sys_proj_files
3913    
3914     * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
3915     user_projs parameters into one parameter proj_files which is a
3916     list of proj files.
3917     (ProjectionList._subscribe_proj_files)
3918     (ProjectionList._unsubscribe_proj_files): New. Move
3919     subscription/unsubscription of projfile messages to separate
3920     methods
3921     (ProjectionList.Destroy): The unsubscribe is now done in
3922     _unsubscribe_proj_files
3923     (ProjectionList.update_projections): We now have a list of proj
3924     file objects
3925     (ProjectionList.SetProjFiles): New method to set a new list of
3926     proj file objects
3927    
3928     * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
3929     Specify explicitly which system proj file to load.
3930    
3931     2003-11-11 Bernhard Herzog <[email protected]>
3932    
3933 bh 1932 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
3934     instance variables to cut cyclic references. The GC would have
3935     collected the loader eventually but it can happen that it doesn't
3936     run at all until thuban is closed (2.3 but not 2.2 tries a bit
3937     harder and forces a collection when the interpreter terminates)
3938     (load_session): Call the handler's Destroy method to make sure
3939     that it gets garbage collected early. Otherwise it will be
3940     collected very late if at all and it holds some references to e.g.
3941     shapestores and the session which can lead to leaks (of e.g. the
3942     temporary files)
3943    
3944     * test/test_load.py (TestSingleLayer.test_leak): New. test for the
3945     resource leak in load_session
3946    
3947 bh 1929 2003-11-10 Bernhard Herzog <[email protected]>
3948    
3949     * Thuban/UI/baserenderer.py: Add a way to specify how layers in
3950     extensions are to be rendered.
3951     (_renderer_extensions): New. List with renderer for layers in
3952     extensions
3953     (add_renderer_extension): New. Add a renderer extension
3954     (init_renderer_extensions): New. Init the renderer extensions
3955     (BaseRenderer.render_map_incrementally): Search
3956     _renderer_extensions for how to draw unknown layer types
3957     (BaseRenderer.draw_raster_data): Add format parameter so that
3958     formats other than BMP can be drawn
3959     (BaseRenderer.draw_raster_layer): Pass an explicit format to
3960     draw_raster_data
3961    
3962     * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
3963     strings of the format parameter of draw_raster_data method to wx
3964     constants
3965     (MapRenderer.draw_raster_data): Add the format parameter and use
3966     raster_format_map to map it to the right wxwindows constant for
3967     wxImageFromStream
3968    
3969     * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
3970     the format parameter and record it
3971     (TestBaseRenderer.test_raster_no_projection): check the format
3972     paramter of the draw_raster_data method
3973     (TestBaseRenderer.test_renderer_extension): New. Test the renderer
3974     extension facility
3975    
3976 bh 1925 2003-11-07 Bernhard Herzog <[email protected]>
3977    
3978     Tweak the usage of the sqlite database to make common use cases
3979     more responsive. In most cases copying the data to the sqlite
3980     database takes so long that using sqlite doesn't have enough
3981     advantages.
3982    
3983     * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
3984     comments about performance and query the min and max in separate
3985     statements because only that way will indexes be used.
3986     (TransientTableBase.UniqueValues): Add some comments about
3987     performance.
3988     (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
3989     Do not copy the data to the transient DB but use the transient
3990     copy if it exists. See the new comments for the performance trade
3991     offs
3992    
3993     * test/test_transientdb.py
3994     (TestTransientTable.test_auto_transient_table): Make sure that the
3995     data is copied to the transient database at some point.
3996    
3997 bh 1913 2003-11-03 Bernhard Herzog <[email protected]>
3998    
3999 bh 1922 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
4000     globals to locals so that it's a bit faster
4001    
4002     2003-11-03 Bernhard Herzog <[email protected]>
4003    
4004 bh 1920 * Thuban/UI/baserenderer.py
4005     (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
4006     method. ReadValue is faster than ReadRowAsDict since it only reads
4007     one cell especially now that the dbf file objects actually
4008     implement it.
4009    
4010     * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
4011     read_attribute method of the dbf objects
4012    
4013     2003-11-03 Bernhard Herzog <[email protected]>
4014    
4015 bh 1916 * Extensions/profiling/profiling.py (popup_dialog_box): New config
4016     variable to indicate whether the result should be shown in a
4017     dialog box
4018     (profile_screen_renderer, time_screen_renderer): Only show a
4019     dialog box if popup_dialog_box is true.
4020     (profile_screen_renderer): Flush stdout after the printing the
4021     first part of the "profiling..." message
4022    
4023     * Thuban/UI/baserenderer.py
4024     (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
4025     brushes for the groups so that they're not created over and over
4026     again
4027    
4028 bh 1913 * Thuban/Model/classification.py (Classification.__getattr__)
4029     (Classification._compile_classification)
4030     (Classification._clear_compiled_classification): New. Methods to
4031     manage a 'compiled' representation of the classification groups
4032     which is created on demand
4033     (Classification.InsertGroup, Classification.RemoveGroup)
4034     (Classification.ReplaceGroup): reset the compiled representation
4035     (Classification.FindGroup): Use the compiled representation to
4036     find the matching group
4037     (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
4038    
4039 bh 1904 2003-10-31 Bernhard Herzog <[email protected]>
4040    
4041 bh 1911 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
4042     Send a CLASS_CHANGED message
4043     (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
4044     not return the removed group since it wasn't used.
4045    
4046     * test/test_classification.py
4047     (TestClassification.test_set_default_group): New. Test the
4048     SetDefaultGroup method
4049     (TestClassification.test_insert_group): New. Test the InsertGroup
4050     method
4051     (TestClassification.test_remove_group): New. Test the RemoveGroup
4052     method
4053     (TestClassification.test_replace_group): New. Test the
4054     ReplaceGroup method
4055    
4056     2003-10-31 Bernhard Herzog <[email protected]>
4057    
4058 bh 1908 * test/test_classification.py (TestClassification.setUp):
4059     Subscribe to the CLASS_CHANGED messages
4060     (TestClassification.tearDown): New. Destroy the classification
4061     properly
4062     (TestClassification.test_defaults): Add tests for the default line
4063     width and whether no messages were sent yet
4064     (TestClassification.test_set_default_properties): Add tests for
4065     messages and setting the default line width
4066     (TestClassification.test_add_singleton)
4067     (TestClassification.test_add_range)
4068     (TestClassification.test_multiple_groups): Add tests for messages
4069    
4070     2003-10-31 Bernhard Herzog <[email protected]>
4071    
4072 bh 1906 Some more refactoring in preparation for new tests:
4073    
4074     * test/test_classification.py (TestClassification.setUp): New.
4075     Instantiate the classification here. Update the test methods
4076     accordingly.
4077     (TestClassification.test_multiple_groups): Make sure that the two
4078     singletons matching 1 are considered different.
4079    
4080     2003-10-31 Bernhard Herzog <[email protected]>
4081    
4082 bh 1904 * test/test_classification.py (red, green, blue): New. These
4083     constants were used in several cases. Update the relevant methods.
4084     (TestClassification.test_defaults)
4085     (TestClassification.test_set_default_properties)
4086     (TestClassification.test_add_singleton)
4087     (TestClassification.test_add_range)
4088     (TestClassification.test_multiple_groups)
4089     (TestClassification.test_deepcopy): New. These were formerly all
4090     part of the single method test.
4091     (TestClassification.test_deepcopy): Removed.
4092     (TestClassIterator): Removed. The test case is now a method of
4093     TestClassification since it tests part of the public interface of
4094     Classification
4095     (TestClassification.test_iterator): New. Used to be
4096     TestClassIterator effectively
4097    
4098 jan 1902 2003-10-31 Jan-Oliver Wagner <[email protected]>
4099    
4100     GUIfied the functions of the profiling extension.
4101    
4102     * /Extensions/profiling/__init__.py: New: Init to make this
4103     directory a package.
4104    
4105     * Extensions/profiling/profiling.py: Moved menu entries to
4106     the Extensions menu. Applied _() for strings.
4107     (profile_screen_renderer): Catch the detailed printout and present
4108     it in a dialog.
4109 bh 1904 (time_screen_renderer): Raise a dialog to present the result instead
4110 jan 1902 of printing it to stdout.
4111    
4112 bh 1897 2003-10-31 Bernhard Herzog <[email protected]>
4113    
4114 bh 1899 * test/test_classification.py (TestClassGroupProperties)
4115     (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
4116     (TestClassGroupSingleton, TestClassIterator, TestClassification):
4117     Split TestClassification into several classes, one for each class
4118     being tested. TestClassification itself now only tests
4119     Classification. This split makes changes to the tests a bit easier
4120    
4121     2003-10-31 Bernhard Herzog <[email protected]>
4122    
4123 bh 1897 * Extensions/profiling/profiling.py: New. Extension to measure
4124     Thuban performance
4125    
4126 frank 1895 2003-10-31 Frank Koormann <[email protected]>
4127    
4128     Added two items to legend popup menu: Remove Layer and Show Layer Table
4129    
4130     * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
4131     LegendPanel._OnShowTable): New event handlers, call the corresponding
4132     mainwindow methods.
4133     (LegendTree._OnRightClick): Added items to popup menu.
4134    
4135 bh 1894 2003-10-30 Bernhard Herzog <[email protected]>
4136    
4137     * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
4138     EVT_WINDOW_DESTROY
4139     (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
4140     nothing but is convenient for the derived classes.
4141    
4142     * Thuban/UI/tableview.py
4143     (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
4144     Unsubscribe the messages here not in OnClose because that might
4145     get called multiple times. Fixes RT #2196
4146     (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
4147     anymore.
4148    
4149     * README: Update the minimum requirement for wxPython. Since we
4150     now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
4151     the version in which that was introduced for all platforms
4152    
4153 frank 1890 2003-10-30 Frank Koormann <[email protected]>
4154    
4155     * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
4156     the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
4157     frame.
4158    
4159 jan 1889 2003-10-30 Jan-Oliver Wagner <[email protected]>
4160    
4161     Improved APR import extension, added further EPSG definitions
4162     and some cleanup regarding string class.
4163    
4164     * test/test_proj.py (TestProjection.test_get_projection_units_geo):
4165     Added test for alias 'longlat'.
4166    
4167     * Resources/Projections/epsg-deprecated.proj: New. Contains
4168     deprecated EPSG definitions.
4169    
4170     * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
4171     the variable names for objects.
4172    
4173     * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
4174     Copied from importAPR and provided with documentation.
4175    
4176     * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
4177     Moved to apr.py.
4178     (APR_View): Added object ref 'ITheme'.
4179    
4180     * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
4181     split function by corresponding use of the string class method.
4182    
4183     * Thuban/Model/xmlwriter.py: Replaced string replace function by
4184     corresponding string method.
4185    
4186 bh 1880 2003-10-29 Bernhard Herzog <[email protected]>
4187    
4188     * Thuban/UI/baserenderer.py
4189     (BaseRenderer.draw_shape_layer_incrementally): Speed up the
4190     special case of a classification that only has the default group
4191    
4192 bh 1868 2003-10-27 Bernhard Herzog <[email protected]>
4193    
4194 bh 1878 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
4195    
4196 bh 1876 * po/de.po: Update.
4197    
4198     * Thuban/UI/application.py
4199     (ThubanApplication.ShowExceptionDialog): Handle translation of the
4200     dialog message properly
4201    
4202     2003-10-27 Bernhard Herzog <[email protected]>
4203    
4204 bh 1873 Rework how localization works so that we use wx's translation
4205     functions when running Thuban as a normal application but not when
4206     we don't need any UI, such as in the test suite. See the comment
4207     in Thuban/__init__.py for details
4208    
4209     * Thuban/__init__.py (_): Add one level of indirection to make the
4210     translation handling more flexible and to make it possible to use
4211     either wx's translation services or not.
4212     (gettext_identity, translation_function_installed)
4213     (install_translation_function): New function to help with this
4214    
4215     * Thuban/UI/__init__.py: Install the wx specific translation
4216     function if it's OK to do that
4217    
4218     * test/support.py (initthuban): Install a dummy translation
4219     function so that importing Thuban.UI doesn't install a wx specific
4220     one for which would need to import wxPython
4221    
4222     2003-10-27 Bernhard Herzog <[email protected]>
4223    
4224 bh 1870 * HOWTO-Release: Source archives should be created first and the
4225     binary packages should be created from the source archives.
4226     There's an official debian package now so there's no need to test
4227     the rpm on debian anymore
4228    
4229     2003-10-27 Bernhard Herzog <[email protected]>
4230    
4231 bh 1868 Several rendering changes:
4232    
4233     - Render the selection into a separate bitmap so that only that
4234     bitmap needs to be redrawn when the selection changes
4235    
4236     - Render incrementally showing previews and allowing interaction
4237     before rendering is complete
4238    
4239     - Update the renderer interface a bit. Most parameters of
4240     RenderMap are now parameters of the constructor
4241    
4242     * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
4243     and the update region as parameters. Update the doc-string
4244     (BaseRenderer.render_map_incrementally): New. Generator function
4245     to renders the map incrementally
4246     (BaseRenderer.render_map): Remove the map argument (it's now in
4247     the constructor) and simply iterate over the
4248     render_map_incrementally generator to draw the map.
4249     (BaseRenderer.draw_shape_layer_incrementally)
4250     (BaseRenderer.draw_shape_layer): Renamed to
4251     draw_shape_layer_incrementally and changed into a generator that
4252     yields True every 500 shapes. Used by render_map_incrementally to
4253     render shape layers incrementally
4254    
4255     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
4256     map and region parameters which are now in the constructor
4257     (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
4258     the inherited render_map_incrementally.
4259     (BaseRenderer.draw_shape_layer): Removed.
4260     (ScreenRenderer.draw_selection_incrementally): New. The selection
4261     drawing part of the removed draw_shape_layer as a generator
4262     (ScreenRenderer.layer_shapes): Update because of the region
4263     parameter change
4264     (ExportRenderer.__init__): New. Extend the inherited constructor
4265     with the destination region for the drawing
4266     (ExportRenderer.RenderMap): Removed the map and region parameters
4267     which are now in the constructor
4268    
4269     * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
4270     bitmap suitable for a preview in a tool
4271     (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
4272     bitmap
4273     (MapPrintout.draw_on_dc): Adapt to new renderer interface
4274     (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
4275     exists
4276     (MapCanvas.OnIdle): Update the logic to deal with incremental
4277     rendering and the selection bitmap
4278     (MapCanvas._do_redraw): Handle the instantiation of the render
4279     iterator and the redraws during rendering
4280     (MapCanvas._render_iterator): New. Generator to incrementally
4281     redraw both bitmaps
4282     (MapCanvas.Export): Adapt to new renderer interface.
4283     (MapCanvas.full_redraw): Reset the selection bitmap and the
4284     renderer iterator too
4285     (MapCanvas.redraw_selection): New. Force a redraw of the selection
4286     bitmap
4287     (MapCanvas.shape_selected): Only redraw the selection bitmap
4288    
4289     * test/test_baserenderer.py
4290     (TestBaseRenderer.test_polygon_no_projection)
4291     (TestBaseRenderer.test_raster_no_projection)
4292     (TestBaseRenderer.test_point_map_projection)
4293     (TestBaseRenderer.test_point_layer_and_map_projection)
4294     (TestBaseRenderer.test_point_layer_projection)
4295     (TestBaseRenderer.test_point_with_classification): Adapt to new
4296     renderer interface
4297    
4298 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
4299    
4300     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
4301     (point_in_polygon_shape, shape_centroid): Raise an exception if
4302     the shape can't be read. Previously invalid shape ids would lead
4303     to a segfault.
4304    
4305     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
4306     New. test whether an exception is raised for invalid shape ids
4307    
4308 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
4309    
4310 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
4311     as alias for 'latlong'.
4312    
4313     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
4314     as alias for 'latlong'.
4315    
4316     2003-10-24 Jan-Oliver Wagner <[email protected]>
4317    
4318 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
4319     the projection even for the UnknownPanel.
4320     (UnknownProjPanel.__init__): Define the text and create the textctrl
4321     widget.
4322     (UnknownProjPanel._DoLayout): Replaced static text widget by the
4323     textctrl created in __init__.
4324     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
4325     including the parameters of the projection.
4326    
4327     2003-10-24 Jan-Oliver Wagner <[email protected]>
4328    
4329 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
4330     EPSG codes with parameters for proj. The list has been
4331     generated using devtools/create_epsg.py based on the
4332     file nad/epsg of the proj 4.4.7 package. Four projection
4333     definitions have been deleted as they are not accepted by proj:
4334     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
4335     and "HD72 / EOV".
4336    
4337 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
4338    
4339     Some more tweaks to the projection dialog which should fix RT
4340     #1886.
4341    
4342     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
4343     the ProjFile's messages and call the base class methods correctly
4344     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
4345     flag on the newly selected item too. Otherwise some other item is
4346     focused and the first time the focus is moved with the keyboard
4347     the selection moves in unexpected ways.
4348    
4349     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
4350     focus on the OK button, only on the projection list. That way the
4351     list really has the focus initially
4352     (ProjFrame.OnClose): Call the projection list's Destroy method to
4353     make it unsubscribe all messages
4354    
4355 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
4356    
4357 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
4358     and most of 2168
4359    
4360     * Thuban/UI/projlist.py: New. The class ProjectionList is a
4361     special wxListCtrl to show a list of projections in a more MVC
4362     fashion
4363    
4364     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
4365     throughout the class. The main change is to use the ProjectionList
4366     class instead of a normal wxListBox. Also, add an explicit
4367     "Unknown" projection to the projection choice control.
4368     (ProjPanel.__init__): Add an "unknown" ellipsoid
4369     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
4370     instantiation of the panel's controls to make the tab-order more
4371     natural
4372    
4373     2003-10-21 Bernhard Herzog <[email protected]>
4374    
4375 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
4376     (TestSingleLayer.test): Add non-ascii characters to the titles of
4377     session, map and layer. This is effectively a port of the
4378     TestUnicodeStrings test in test_load_0_8.py which for some reason
4379     was only added there.
4380    
4381     * test/test_load_0_9.py (TestSingleLayer.file_contents)
4382     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
4383     characters to the titles of session, map and layer,.
4384    
4385     2003-10-21 Bernhard Herzog <[email protected]>
4386    
4387 bh 1847 Add EPSG projection handling to .thuban files
4388    
4389     * test/test_save.py (SaveSessionTest.dtd)
4390     (SaveSessionTest.testEmptySession)
4391     (SaveSessionTest.testLayerProjection)
4392     (SaveSessionTest.testRasterLayer)
4393     (SaveSessionTest.testClassifiedLayer)
4394     (SaveSessionTest.test_dbf_table)
4395     (SaveSessionTest.test_joined_table)
4396     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
4397     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
4398     use a and epsg projection to test saving them
4399    
4400     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
4401     namespace
4402     (TestLayerVisibility.file_contents, TestLabels.file_contents)
4403     (TestLayerProjection.file_contents)
4404     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
4405     (TestPostGISLayer.file_contents)
4406     (TestPostGISLayerPassword.file_contents)
4407     (TestLoadError.file_contents, TestLoadError.test): Update to use
4408     1.0-dev namespace
4409     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
4410     use 1.0-dev namespace and use an EPSG projection to test whether
4411     loading it works
4412    
4413     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
4414     as of Thuban 0.9. These are now tests to determine whether Thuban
4415     can still read files generated by Thuban 0.9
4416    
4417     * Thuban/Model/save.py (SessionSaver.write)
4418     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
4419     namespace
4420     (SessionSaver.write_projection): Write the projection's epsg
4421     attribute
4422    
4423     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
4424     thuban-1.0-dev.dtd namespace
4425     (SessionLoader.check_attrs): Allow a callable object as conversion
4426     too
4427     (SessionLoader.start_projection, SessionLoader.end_projection)
4428     (SessionLoader.start_parameter): Handle the epsg attribute and
4429     rename a few instance variables to lower case
4430    
4431     * Resources/XML/thuban-1.0.dtd: New. Only difference to
4432     thuban-0.9.dtd is the epsg attribute for projections.
4433    
4434     2003-10-21 Bernhard Herzog <[email protected]>
4435    
4436 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
4437     on the command line
4438    
4439     * test/support.py (ThubanTestResult.getDescription): Override to
4440     give a better short description. The description can be used as a
4441     parameter to run_tests to run that particular test in isolation.
4442    
4443 frank 1837 2003-10-21 Frank Koormann <[email protected]>
4444    
4445     Popup menu for legend. Scheduled for the 1.2 release this was too
4446     simple to implement: The popup menu is bound to the legend tree, while
4447     the events are hanlded by its anchestor, the legend panel. This
4448     allows reuse of all the event handlers already implemented for the
4449     legend toolbar buttons.
4450    
4451     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
4452     to add handlers for the events issued by the popup menu.
4453     (LegendPanel._OnToggleVisibility): Handler for toggling layer
4454     visibility event
4455     (LegendPanel._OnProjection): Handler for layer projection event.
4456     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
4457     (LegendTree._OnRightClick): Event handler for right click, select item
4458     and pop up menu.
4459     (LegendTree.ToggleVisibility): Toggle layer visibility
4460     (LegendTree.LayerProjection): Raise layer projection dialog for
4461     current layer.
4462    
4463 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
4464    
4465     * Resources/Projections/defaults.proj: Use correct DOCTYPE
4466     declaration. The top-level element is projectionlist not projfile
4467    
4468 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
4469    
4470     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
4471     method to write a projfile and display a busy cursor and error
4472     dialogs.
4473     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
4474     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
4475     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
4476     busy cursor while loading the user and system prj files.
4477    
4478 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
4479    
4480     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
4481     ProjFile objects
4482     (clear_proj_file_cache): New function to clear the cache. Mainly
4483     useful for use by the test suite
4484     (read_proj_file): Use the cache.
4485    
4486     * test/test_proj.py (TestProjFile): Clarify the doc-string
4487     (ProjFileReadTests): Update doc-string
4488     (ProjFileReadTests.test_get_system_proj_file): Check whether the
4489     system proj files is cached.
4490     (ProjFileLoadTestCase): New base class for the proj file tests
4491     derived from support.FileLoadTestCase to provide some common
4492     behavior.
4493     (TestLoadingProjFile)
4494     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
4495     (TestProjFileWithInvalidParameters.file_contents): Derive from
4496     ProjFileLoadTestCase
4497     (TestLoadingProjFile.test_caching): New. Test whether the cache
4498     works
4499    
4500 silke 1829 2003-10-16 Silke Reimer <[email protected]>
4501    
4502     * debian/*: New directory with configuration files for building a thuban
4503     deb-package.
4504    
4505 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
4506    
4507 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
4508     __main__ so that missing unsubscribes are detected
4509     (TestProjFile.tearDown): Destroy the proj_file properly
4510    
4511     2003-10-14 Bernhard Herzog <[email protected]>
4512    
4513 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
4514     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
4515     the ProjFile objects
4516    
4517     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
4518     easily send messages when the projections change
4519     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
4520     when the change was successful
4521    
4522     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
4523     proj file messages
4524     (TestProjFile.test_add_remove)
4525     (TestProjFile.test_remove_non_existing)
4526     (TestProjFile.test_replace)
4527     (TestProjFile.test_replace_non_existing): Test whether the right
4528     messages are sent
4529    
4530     2003-10-14 Bernhard Herzog <[email protected]>
4531    
4532 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
4533     tests
4534     (TestProjFile.test_add_remove)
4535     (TestProjFile.test_remove_non_existing)
4536     (TestProjFile.test_replace)
4537     (TestProjFile.test_replace_non_existing): Some of the new
4538     individual test cases
4539     (TestProjFileSimple): New class for the rest of the test cases
4540     that came out of the refactoring
4541     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
4542     derived classes don't have to
4543    
4544 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
4545    
4546 bh 1820 Add an optional EPSG code to the projection objects and extend the
4547     .proj file format accordingly.
4548    
4549     * Resources/XML/projfile.dtd (element projection): Add epsg
4550     attribute
4551    
4552     * Thuban/Model/proj.py (Projection.__init__): New parameter and
4553     instance variable epsg. Update doc-string
4554     (Projection.EPSGCode, Projection.Label): New methods to provide
4555     access to EPSG code and a label for use in dialogs
4556    
4557     * Thuban/Model/resource.py (ProjFileReader.start_projection)
4558     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
4559     Handle the epsg code attribute when reading or writing proj files
4560    
4561     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
4562     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
4563     (ProjFrame.__FillAvailList): Use the projection's Label method to
4564     get the string for the list box
4565    
4566     * test/test_proj.py (TestProjection.test_label)
4567     (TestProjection.test_label_epsg)
4568     (TestProjection.test_epsgcode_for_non_epsg_projection)
4569     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
4570     for the label and EPSGCode methods
4571     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
4572     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
4573     objects in the test cases and put the expected contents into the
4574     test case methods too. Update doTestWrite accordingly
4575     (TestLoadingProjFile)
4576     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
4577     read tests from TestProjFile.
4578     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
4579     tests are now in the new classes.
4580     (sample_projfile, sample_projfile_data)
4581     (sample_projfile2, sample_projfile_data2): Removed. Not used
4582     anymore.
4583     (TestProjFile.test_read_unreadable_file): No need to reset the
4584     permissions at the end anymore since we use a unique filename
4585    
4586     2003-10-13 Bernhard Herzog <[email protected]>
4587    
4588 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
4589     (ProjFileTest): New base class for the proj file tests.
4590     (TestProjFile): Derive from ProjFileTest
4591     (TestProjFile.test_read_unreadable_file)
4592     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
4593     the new filename method to get a unique filename
4594     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
4595     (WriteProjFileTests): New class for proj file write tests.
4596     Contains the write test that were in TestProjFile originally.
4597    
4598     2003-10-13 Bernhard Herzog <[email protected]>
4599    
4600 bh 1812 * test/test_proj.py (TestProjFile.testRead)
4601     (TestProjFile.test_read_non_existing_file)
4602     (TestProjFile.test_read_unreadable_file)
4603     (TestProjFile.test_read_empty_file): Split into several methods.
4604    
4605 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
4606    
4607 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
4608    
4609     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
4610     all projection type specific panels and put them into a
4611     NotebookLikeSizer. This way the dialog doesn't change its size
4612     when a different projection is selected
4613     (ProjFrame.__init__): Rename projection_panels
4614     projection_panel_defs and reuse projection_panels for a list of
4615     the instantiated panels.
4616     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
4617     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
4618     the panels
4619     (UnknownProjPanel._DoLayout): Place the newlines in the message
4620     differently to make the panel narrower.
4621     (TMPanel._DoLayout): Layout the parameters in one column.
4622    
4623     2003-10-10 Bernhard Herzog <[email protected]>
4624    
4625 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
4626     that contains all the setup for the dialog's widgets, layout and
4627     event handling.
4628     (__): Call build_dialog to build the dialog.
4629     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
4630     Their functionality is now in build_dialog
4631     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
4632     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
4633     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
4634     different widget names and hierarchy introduced with build_dialog.
4635    
4636     2003-10-10 Bernhard Herzog <[email protected]>
4637    
4638 bh 1805 * README: Fix typo.
4639    
4640 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
4641    
4642     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
4643     projection is already in the list. This is *a lot* faster when
4644     loading files with hundreds of projections since it saves a linear
4645     search. OTOH this will allow adding the same projection to the
4646     user.proj file multiple times in the projection dialog but we'll
4647     deal with that later
4648    
4649 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
4650    
4651     * devtools: New. Directory for developer tools that are not intended
4652     for the regular user.
4653    
4654     * devtools/create_epsg.py: New. Convert the epsg file of proj into
4655     a python .proj file.
4656    
4657 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
4658    
4659     * test/test_proj.py
4660     (TestProjection.test_get_parameter_without_equals_sign): New. Test
4661     whether GetParameter handles parameters without "=" sign correctly
4662    
4663     * Thuban/Model/proj.py (Projection.GetParameter): Handle
4664     parameters that do not contain a "=". Update the doc-string
4665    
4666 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
4667    
4668 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
4669     length limit on the projname text control
4670    
4671     2003-10-08 Bernhard Herzog <[email protected]>
4672    
4673 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
4674     (TestProjection.test_get_projection_units_normal): New. Tests for
4675     the Projection.GetProjectedUnits method
4676    
4677 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
4678    
4679     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
4680     Added missing 'val' parameter.
4681    
4682 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
4683    
4684 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
4685     projection type of the currently selected projection is not known,
4686     i.e. there's no panel for it, use the UnknownProjPanel
4687     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
4688     the actual replacing of the proj panel into the new method
4689     _show_proj_panel.
4690     (UnknownProjPanel): Add doc-string.
4691     (UnknownProjPanel._DoLayout): Insert a newline into the text so
4692     that the panel is not so wide.
4693    
4694     2003-10-08 Bernhard Herzog <[email protected]>
4695    
4696 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
4697     too. Update the doc-string
4698     (get_proj_files): Removed. It wasn't used anywhere
4699     (get_system_proj_files, get_system_proj_file): Rename to
4700     get_system_proj_file and return the ProjFile object and not a list
4701     of ProjFile objects. Update the callers.
4702     (get_user_proj_files, get_user_proj_file): Rename to
4703     get_user_proj_file return the ProjFile object and not a list of
4704     ProjFile objects. Update the callers.
4705     (ProjFileReader.__init__): New instance variable for the warnings.
4706     Rename the __pf ivar to projfile. Update the methods referring to
4707     __pf
4708     (ProjFileReader.end_projection): Catch any errors raised when
4709     instantiating the projection and record that as an error. The
4710     projection will not be in the final ProjFile object.
4711     (ProjFileReader.GetWarnings): New method to return the warnings.
4712    
4713     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
4714     show the warnings from the projfile reader
4715     (ProjFrame._OnImport): Deal with any warnings returned by
4716     read_proj_file
4717     (ProjFrame.__FillAvailList): Deal with any warnings returned by
4718     get_system_proj_file or get_user_proj_file.
4719    
4720     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
4721     (TestProjFileWithInvalidParameters.file_contents): New test cases
4722     to test whether read_proj_file handles invalid projection
4723     parameters correctly
4724     (TestProjFile.test_get_system_proj_file): New. Simple test for
4725     resource.get_system_proj_file
4726    
4727 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
4728    
4729     * test/test_derivedshapestore.py
4730     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
4731     properly so that the temporary directories get deleted correctly
4732    
4733 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
4734    
4735 bh 1783 Handle the title changes in a proper MVC way.
4736    
4737     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4738     canvas' TITLE_CHANGED messages
4739     (MainWindow.update_title): New. Update the main window's title
4740     (MainWindow.__SetTitle): Removed. Use update_title instead.
4741     (MainWindow.SetMap): Use update_title instead of __SetTitle
4742     (MainWindow.RenameMap): Do change the window title explicitly
4743     here. That's handled in a proper MVC way now.
4744     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
4745     messages
4746    
4747     * Thuban/Lib/connector.py (Conduit): New class to help classes
4748     that forward messages
4749    
4750     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
4751     (ViewPort): Derive from Conduit instead of Publisher
4752     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
4753     when calling the inherited versions
4754     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
4755     methods to subscribe and unsubscribe map messages
4756     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
4757     handle the map subscriptions
4758     (ViewPort.Map, ViewPort.map_projection_changed)
4759     (ViewPort.layer_projection_changed): Add or update doc-strings
4760    
4761     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
4762     typo
4763     (MyConduit): Helper class for the Conduit test.
4764     (TestConduit): Test cases for Conduit
4765    
4766     * test/test_connector.py: Use support.run_tests as main.
4767    
4768     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
4769     the TITLE_CHANGED messages
4770     (ViewPortTest.test_forwarding_title_changed): New test to check
4771     whether the viewport forwards the map's TITLE_CHANGED messages
4772     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
4773     after the port's because the latter may require a still functional
4774     map.
4775    
4776     2003-10-06 Bernhard Herzog <[email protected]>
4777    
4778 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
4779     doc-string
4780    
4781     2003-10-06 Bernhard Herzog <[email protected]>
4782    
4783 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
4784     (SimpleViewPortTest.test_init_with_size): Move the test for the
4785     initial size as a constructor parameter from ViewPortTest.setUp
4786     method to a new separate test in SimpleViewPortTest.
4787    
4788     2003-10-06 Bernhard Herzog <[email protected]>
4789    
4790 bh 1773 * test/test_viewport.py (MockView): New class derived from
4791     ViewPort with a mock implementation of GetTextExtent to be used in
4792     the test cases
4793     (ViewPortTest.setUp): Use MockView instead of ViewPort
4794    
4795     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
4796     into what would be a "pure virtual function" in C++: always raise
4797     NotImplementedError. Mock implementations for test cases don't
4798     belong into the real code
4799    
4800 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
4801    
4802     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
4803     close the dbf file we create so that it's contents have been
4804     written properly.
4805    
4806     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
4807     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
4808     Update to shapelib 1.2.10
4809    
4810 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
4811    
4812     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
4813     it annoys lintian which warns about these files not being
4814     executable. The #! isn't necessary here since if you absolutely
4815     must execute them you can always say "python <filename>".
4816    
4817 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
4818    
4819 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
4820     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
4821     is ported to a newer the import will fail, so it should be noticed
4822     immediately that this function is gone.
4823     Fixes RT#1919
4824    
4825     2003-09-26 Bernhard Herzog <[email protected]>
4826    
4827 bh 1757 Add a DTD for the projection files and make thuban write valid
4828     projection files
4829    
4830     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
4831     files
4832    
4833     * Thuban/Model/resource.py (ProjFileSaver.write): Use
4834     'projectionlist' as the name in the document type declaration so
4835     that it matches the element type of the root element.
4836    
4837     * test/test_proj.py (sample_projfile, sample_projfile2): Use
4838     'projectionlist' as the name in the document type declaration just
4839     as it is done now in the files thuban would write
4840     (sample_projfile, sample_projfile_data): Fix spelling of
4841     "Mercator"
4842     (TestProjFile.doTestWrite): Validate the written and the expected
4843     XML data
4844     (TestProjFile): Derive from ValidationTest so that we can run xml
4845     validation tests
4846    
4847 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
4848    
4849     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
4850     modify the list returned by map.Layers() in place since it is the
4851     actual list of layers used by the map.
4852    
4853 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
4854    
4855     * Doc/manual/thuban-manual.xml: Added subsection to chapter
4856     Extensions to describe the extensions coming with the Thuban
4857     standard package (gns2shp and importAPR).
4858    
4859 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
4860    
4861     * libraries/thuban/wxproj.cpp (project_point): if there's an
4862     inverse but no forward projection, convert to degrees after
4863     applying the inverse projection. Fixes RT#2096
4864    
4865     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
4866     implicitly tests for the fix to RT#2096
4867    
4868     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
4869     Check that the sequences have the same lengths
4870    
4871     * Resources/Projections/defaults.proj (Geographic projection): Use
4872     a much more precise value for the to_meter attribute.
4873    
4874 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
4875    
4876     * test/support.py (initthuban): Make sure to unset the LANG env.
4877     var. so that tests that compare translated strings work. Solves RT
4878     #2094
4879    
4880 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
4881    
4882 jan 1735 Small improvement of APR import.
4883    
4884     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
4885     Added tests for text-ranges.
4886    
4887     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
4888     returns a string object if the range is based on text.
4889    
4890     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
4891     range retrieval.
4892    
4893     2003-09-22 Jan-Oliver Wagner <[email protected]>
4894    
4895 jan 1730 Initial version of the importAPR extension which is in
4896     experimental state.
4897    
4898     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
4899     /Extensions/importAPR/test/: New directories.
4900    
4901     * /Extensions/importAPR/samples/README: New: Howto load the samples.
4902    
4903     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
4904     file which refers to the Thuban Iceland demo data.
4905    
4906     * /Extensions/importAPR/test/README: New: Howto execute the tests.
4907    
4908     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
4909    
4910     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
4911     as in '.apr'-files.
4912    
4913     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
4914     ODB Objects as in '.apr', '.avl' and other files.
4915    
4916     * /Extensions/importAPR/__init__.py: New: Init to make this
4917     directory a package.
4918    
4919     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
4920     project file (.apr) and convert it to Thuban.
4921    
4922     2003-09-22 Jan-Oliver Wagner <[email protected]>
4923    
4924     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
4925    
4926 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
4927    
4928     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
4929     with description on RPM installation and RPM binary package
4930     creation.
4931    
4932 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
4933    
4934     * setup.py (data_files): Only add the mo files if the Locales
4935     directory actually exists, so that setup.py works with a fresh CVS
4936     checkout
4937    
4938 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
4939    
4940     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
4941     in viewport, not anymore in view
4942    
4943 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
4944    
4945     Introducing first Extension (gns2shp).
4946    
4947     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
4948    
4949     * Extensions/__init__.py: New. init to make this dir a package.
4950    
4951     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
4952    
4953     * Extensions/gns2shp/test/README: New. some info on this test directory.
4954    
4955     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
4956    
4957     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
4958     of Shapefile from GNS text file format
4959    
4960 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
4961    
4962 jan 1707 Fix/workaround for bug #2019:
4963     https://intevation.de/rt/webrt?serial_num=2019
4964    
4965     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
4966     (IdentifyView.__init__): Added another button that allows to
4967     stop the identify mode.
4968     (IdentifyView.OnStop): New. Stops the identify mode.
4969    
4970     2003-09-03 Jan-Oliver Wagner <[email protected]>
4971    
4972 jan 1705 Introducing a new exception dialog that allows to exit the
4973     application immediately.
4974     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
4975    
4976     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
4977    
4978     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
4979     Made strings available to translations. Exchanged the simple
4980     ScrolledMessageDialog by the new ExceptionDialog.
4981    
4982 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
4983    
4984 bh 1701 * NEWS: New. Summary of changes and release notes.
4985    
4986     * MANIFEST.in: Add NEWS
4987    
4988     2003-09-01 Bernhard Herzog <[email protected]>
4989    
4990 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
4991     include the documentation too.
4992    
4993     * setup.py (data_files): Add the .mo files
4994     (setup call): Up to version 0.9.0
4995    
4996     2003-09-01 Bernhard Herzog <[email protected]>
4997    
4998 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
4999     parameter list to just parent and session
5000     (ChooseDBTableDialog.__set_properties): Removed. Setting the
5001     selection of empty list boxes is not allowed (and produces C++
5002     assertion errors) and the rest of the setup is better done in
5003     __init__ anyway.
5004     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
5005     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
5006     builtins True/False for booleans to avoid warnings from wxPython
5007    
5008     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
5009     ChooseDBTableDialog constructor parameters.
5010    
5011     2003-09-01 Bernhard Herzog <[email protected]>
5012    
5013 bh 1694 * Thuban/Model/postgisdb.py
5014     (PostGISTable): Extend doc-string
5015     (PostGISTable._fetch_table_information): Set the column index
5016     correctly, pretending ignored columns don't exist.
5017    
5018     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
5019     for postgis tables with data types not yet supported by thuban.
5020    
5021 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
5022    
5023     * HOWTO-Release: Tweak item about running the tests.
5024    
5025 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
5026    
5027     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
5028    
5029 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
5030    
5031     Add some missing parameters to projections. Proj complains about
5032     them on windows but for some reason not on Linux.
5033    
5034     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
5035     missing required projection parameters
5036    
5037     * test/test_proj.py (TestProjFile.test): Add missing required
5038     projection parameters
5039    
5040     * test/test_load_0_8.py (TestLayerProjection.file_contents)
5041     (TestLayerProjection.test): Add missing required projection
5042     parameters and tests for them
5043    
5044     * test/test_load.py (TestLayerProjection.file_contents)
5045     (TestLayerProjection.test): Add missing required projection
5046     parameters and tests for them
5047    
5048     * test/test_layer.py (TestLayer.test_base_layer): Add missing
5049     required projection parameters
5050    
5051     2003-08-29 Bernhard Herzog <[email protected]>
5052    
5053     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
5054     access the pj_errno because directly accessing pj_errno doesn't
5055     work on windows if the proj library is in a DLL
5056    
5057     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
5058    
5059 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
5060    
5061 bh 1685 * test/test_proj.py: Import things from Thuban after calling
5062     initthuban
5063    
5064     * test/test_load.py (LoadSessionTest.filenames): New class
5065     variable with the filename attributes to normalize
5066     (LoadSessionTest.check_format): Pass self.filenames to
5067     sax_eventlist to normalize the filename attributes
5068    
5069     * test/xmlsupport.py: Add cvs keywords
5070     (SaxEventLister.__init__): New parameter filenames which indicates
5071     attributes that contain filenames
5072     (SaxEventLister.startElementNS): Normalize the filename attributes
5073     with os.path.normpath
5074     (sax_eventlist): New parameter filenames to pass through to
5075     SaxEventLister
5076    
5077     * test/test_derivedshapestore.py: Make this file callable as a
5078     program to execute the tests
5079     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
5080     the session to self.session so that it gets destroyed properly
5081    
5082     * test/test_layer.py (TestLayer.tearDown): Call the session's
5083     Destroy method
5084    
5085     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
5086     too if it exists
5087     (TestMapAddLayer.test_add_layer): Bind the session to self.session
5088     so that it gets destroyed properly
5089    
5090     * test/postgissupport.py (reason_for_not_running_tests): Add a
5091     test for the existence of popen2.Popen4.
5092    
5093     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
5094     reliable way to destroy the sessions created in the test cases
5095     (SaveSessionTest.test_dbf_table): Bind the session to self.session
5096     so that it gets destroyed properly
5097     (SaveSessionTest.testLayerProjection): Bind the session to
5098     self.session so that it gets destroyed properly
5099    
5100     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
5101     sure that the session is destroyed properly
5102    
5103     * test/test_shapefilestore.py: Make this callable as a program to
5104     execute the tests
5105    
5106     * test/test_scalebar.py: Remove unnecessary import of _ from
5107     Thuban
5108    
5109     * test/support.py (print_garbage_information): Call initthuban
5110     here because it may be called indirectly from test cases that test
5111     test support modules which do not use anything from thuban itself
5112     (ThubanTestProgram.runTests): Remove unnecessary debug print
5113    
5114     2003-08-28 Bernhard Herzog <[email protected]>
5115    
5116 bh 1672 * Thuban/version.py (longversion): Update to 0.9
5117    
5118     * Thuban/UI/mainwindow.py: Remove some unused imports
5119    
5120     * README: Add section about required additional software. Add date
5121     and revision CVS keywords
5122    
5123     * HOWTO-Release: Add item about the translations. Add date and
5124     revision CVs keywords and change formatting to match README a bit
5125     better
5126    
5127     * po/de.po: Update for 0.9
5128    
5129     * test/README: Tweak the wording a little because many tests are
5130     not really unittest.
5131    
5132 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
5133    
5134 bh 1665 As preparation for the 0.9 release, switch thuban files to a
5135     non-dev namespace
5136    
5137     * Thuban/Model/save.py (SessionSaver.write_session): Write files
5138     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
5139     namespace
5140    
5141     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
5142     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
5143    
5144     * test/test_save.py (SaveSessionTest.dtd)
5145     (SaveSessionTest.testEmptySession)
5146     (SaveSessionTest.testSingleLayer)
5147     (SaveSessionTest.testLayerProjection)
5148     (SaveSessionTest.testRasterLayer)
5149     (SaveSessionTest.testClassifiedLayer)
5150     (SaveSessionTest.test_dbf_table)
5151     (SaveSessionTest.test_joined_table)
5152     (SaveSessionTest.test_save_postgis): Update for new namespace
5153    
5154     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
5155     (TestLayerVisibility.file_contents, TestLabels.file_contents)
5156     (TestLayerProjection.file_contents)
5157     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
5158     (TestPostGISLayer.file_contents)
5159     (TestPostGISLayerPassword.file_contents)
5160     (TestLoadError.file_contents, TestLoadError.test): Update for new
5161     namespace
5162    
5163     2003-08-27 Bernhard Herzog <[email protected]>
5164    
5165 bh 1663 Make the table interface distinguish between row ids (an integer
5166     that uniquely identifies a row) and row ordinals (a simple row
5167     count from 0 to NumRows() - 1)
5168    
5169     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
5170     (PostGISTable.RowOrdinalToId): New methods to conver between row
5171     ids and row ordinals
5172     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
5173     parameter row_is_ordinal to indicate whether the row parameter is
5174     the row id or the ordinal
5175    
5176     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
5177     (TransientTableBase.RowOrdinalToId)
5178     (AutoTransientTable.RowIdToOrdinal)
5179     (AutoTransientTable.RowOrdinalToId): Same new methods as in
5180     PostGISTable.
5181     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
5182     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
5183     Same new parameter as in PostGISTable.
5184    
5185     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
5186     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
5187     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
5188     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
5189     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
5190     parameter as in PostGISTable.
5191    
5192     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
5193     (DataTable.RowOrdinalToId): New methods to convert between row ids
5194     and row ordinals.
5195     (TableGrid.SelectRowById): New method to select a row based on its
5196     ID as opposed to its ordinal
5197     (DataTable.GetValue, TableGrid.OnRangeSelect)
5198     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
5199     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
5200     (LayerTableFrame.__init__): Convert between row ids and row
5201     ordinals as appropriate
5202    
5203     * test/postgissupport.py (PostGISDatabase.__init__): Add
5204     doc-string.
5205     (PostGISDatabase.initdb): The optional third item in a tuple in
5206     tables is now a (key, value) list with additional arguments to
5207     pass to upload_shapefile
5208     (upload_shapefile): New parameter gid_offset to allow gids that
5209     are not the same as the shapeids in the shapefile
5210     (PostgreSQLServer.get_default_static_data_db): Use the new
5211     gid_offset to make the gids in landmarks 1000 higher than the
5212     shapeids in the shapefile
5213    
5214     * test/test_viewport.py
5215     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
5216     new shapeids in the landmarks table
5217    
5218     * test/test_transientdb.py
5219     (TestTransientTable.run_iceland_political_tests)
5220     (TestTransientTable.test_transient_joined_table): Add tests for
5221     the new table methods and new keywords arguments.
5222    
5223     * test/test_postgis_db.py
5224     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
5225     (TestPostGISTable.test_read_value_row_count_mode)
5226     (TestPostGISTable.test_row_id_to_ordinal)
5227     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
5228     table methods and the new arguments
5229     (TestPostGISShapestorePoint.test_shapes_in_region)
5230     (TestPostGISShapestorePoint.test_shape_raw_data)
5231     (TestPostGISShapestorePoint.test_shape_points)
5232     (TestPostGISShapestorePoint.test_shape_shapeid)
5233     (TestPostGISShapestorePoint.test_all_shapes)
5234     (TestPostGISTable.test_simple_query)
5235     (TestPostGISTable.test_simple_query)
5236     (TestPostGISTable.test_simple_query)
5237     (TestPostGISTable.test_read_value)
5238     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
5239     shapeids in the landmarks table
5240    
5241     * test/test_memory_table.py
5242     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
5243     (TestMemoryTable.test_read_value_row_count_mode)
5244     (TestMemoryTable.test_row_id_to_ordinal)
5245     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
5246     table methods and the new arguments
5247    
5248     * test/test_dbf_table.py
5249     (TestDBFTable.test_read_row_as_dict_row_count_mode)
5250     (TestDBFTable.test_read_value_row_count_mode)
5251     (TestDBFTable.test_row_id_to_ordinal)
5252     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
5253     methods and the new arguments
5254    
5255 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
5256    
5257 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
5258     more postgis specific but much faster method to get the bounding
5259     box
5260    
5261     2003-08-26 Bernhard Herzog <[email protected]>
5262    
5263 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
5264     (PostGISShapeStore.AllShapes): Add these missing methods.
5265     (PostGISShapeStore.ShapesInRegion): No need to raise
5266     StopIteration. We can simply return
5267    
5268     * test/test_postgis_db.py (TestPostGISTable.test_title)
5269     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
5270     new methods
5271    
5272 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
5273    
5274 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
5275    
5276     * test/test_postgis_db.py (PolygonTests): New class containing
5277     those tests from TestPostGISShapestorePolygon that can also be
5278     used to test MUTLIPOLYGON tables
5279     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
5280     so derive from that
5281     (TestPostGISShapestoreMultiPolygon): New class with tests for
5282     MUTLIPOLYGON tables
5283    
5284     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
5285     tables argument to have tuples with three items to override the
5286     WKT type used.
5287     (PostgreSQLServer.get_default_static_data_db): Use the above to
5288     create a polygon table with MUTLIPOLYGONs
5289     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
5290     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
5291     coords_to*
5292     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
5293     (wkt_converter): New. Map WKT types to converters
5294     (upload_shapefile): New parameter force_wkt_type to use a
5295     different WKT type than the default
5296    
5297     2003-08-25 Bernhard Herzog <[email protected]>
5298    
5299 bh 1655 * Thuban/UI/application.py
5300     (ThubanApplication.run_db_param_dialog): New. Suitable as a
5301     db_connection_callback. Main difference is that the dialog run
5302     from this method doesn't have a parent so it can be used even when
5303     there is no main window
5304     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
5305     no db_connection_callback was given. This way the dialog pops up
5306     even when the .thuban file was given as a command line parameter.
5307    
5308     2003-08-25 Bernhard Herzog <[email protected]>
5309    
5310 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
5311     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
5312     which leads to an effectively frozen X session because the user
5313     can only interact with the dialog but the mouse is still grabbed
5314     by the canvas.
5315     Also, call the tool's Hide method before MouseLeftUp because
5316     MouseLeftUp may change the tool's coordinates.
5317    
5318     2003-08-25 Bernhard Herzog <[email protected]>
5319    
5320 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
5321     LoadCancelled exceptions and handle them by returning immediately.
5322    
5323     2003-08-25 Bernhard Herzog <[email protected]>
5324    
5325 bh 1649 GUI part of loading sessions with postgis connections which may
5326     require user interaction to get passwords or updated parameters
5327    
5328     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
5329     bit nucer and be more generic.
5330     (DBFrame.OnAdd): Adapt to new DBDialog interface
5331    
5332     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
5333     optional parameter db_connection_callback which is passed to
5334     load_session.
5335    
5336     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
5337     Suitable as a db_connection_callback
5338     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
5339     db_connection_callback of the application's OpenSession method
5340    
5341    
5342     2003-08-25 Bernhard Herzog <[email protected]>
5343    
5344 bh 1647 Basic loading of sessions containing postgis connections:
5345    
5346     * Thuban/Model/load.py (LoadError): Add doc-string
5347     (LoadCancelled): New exception class to indicate a cancelled load
5348     (SessionLoader.__init__): Add the db_connection_callback parameter
5349     which will be used by the loader to get updated parameters and a
5350     password for a database connection
5351     (SessionLoader.__init__): Add the new XML elements to the
5352     dispatchers dictionary
5353     (SessionLoader.check_attrs): Two new conversions, ascii to convert
5354     to a byte-string object and idref as a generic id reference
5355     (SessionLoader.start_dbconnection)
5356     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
5357     elements
5358     (load_session): Add the db_connection_callback to pass through the
5359     SessionLoader
5360    
5361     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
5362     New classes to test loading of sessions with postgis database
5363     connections.
5364    
5365     2003-08-25 Bernhard Herzog <[email protected]>
5366    
5367 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
5368     replace it and the comment with __BuildDate__ by the Source: and
5369     Id: cvs keywords as used in the other files.
5370    
5371     2003-08-25 Bernhard Herzog <[email protected]>
5372    
5373 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
5374     LoadError when a required attribute is missing. The code used to
5375     be commented out for some reason, but probably should have been
5376     active.
5377    
5378     * test/test_load.py (TestLoadError.test): Test the message in the
5379     LoadError too to make sure it really is about the missing
5380     attribute
5381    
5382 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
5383 bh 1641
5384     * test/test_save.py (SaveSessionTest.test_dbf_table)
5385     (SaveSessionTest.test_joined_table): Add XML validation tests.
5386    
5387     2003-08-22 Bernhard Herzog <[email protected]>
5388    
5389 bh 1639 Implement saving a session with a postgis connection
5390 bh 1632
5391 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
5392     elements for database connections and shapestores using db
5393     connections
5394     (session): Add the dbconnections to the content model
5395    
5396     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
5397     Write the db connections
5398     (SessionSaver.write_session): Call write_db_connections to write
5399     the connection before the data sources
5400     (SessionSaver.write_data_containers): Handle postgis shapestores
5401    
5402     * test/test_save.py (SaveSessionTest.thubanids)
5403     (SaveSessionTest.thubanidrefs): Update for new DTD
5404     (SaveSessionTest.test_save_postgis): New. Test saving a session
5405     with postgis connections
5406    
5407     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
5408     (PostGISTable.TableName): New accessor methods for the connection
5409     and table name
5410    
5411     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
5412     (TestPostGISTable.test_dbname): New methods to test the new
5413     PostGISConnection methods
5414    
5415     2003-08-22 Bernhard Herzog <[email protected]>
5416    
5417 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
5418     for exceptions occurring when establishing a Database connection
5419     (PostGISConnection.connect): Catch psycopg.OperationalError during
5420     connects and raise ConnectionError.
5421    
5422     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
5423     tests for database exceptions
5424    
5425     2003-08-22 Bernhard Herzog <[email protected]>
5426    
5427 bh 1635 Prepare the test suite for tests with required authentication
5428    
5429     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
5430     variables with two predefined users/passwords, one for the admin
5431     and one for a non-privileged user.
5432     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
5433     the non-privileged user to the database and set the admin password
5434     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
5435     Better error reporting
5436     (PostgreSQLServer.connection_params)
5437     (PostgreSQLServer.connection_string): New methods to return
5438     information about how to connect to the server
5439     (PostgreSQLServer.execute_sql): New. Convenience method to execute
5440     SQL statements
5441     (PostgreSQLServer.require_authentication): Toggle whether the
5442     server requires authentication
5443     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
5444     Add or alter users
5445     (PostGISDatabase.initdb): Pass the admin name one the
5446     subprocesses' command lines. Grant select rights on
5447     geometry_columns to everybody.
5448     (upload_shapefile): Use the admin name and password when
5449     connecting. Grant select rights on the new table to everybody.
5450    
5451     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
5452     server's new methods to get the connection parameters.
5453    
5454     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
5455     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
5456     server's new methods to get the connection parameters.
5457    
5458     * test/test_postgis_db.py
5459     (TestPostGISConnection.test_gis_tables_empty)
5460     (TestPostGISConnection.test_gis_tables_non_empty)
5461     (PostGISStaticTests.setUp): Use the server's new methods to get
5462     the connection parameters.
5463    
5464     2003-08-22 Bernhard Herzog <[email protected]>
5465    
5466 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
5467    
5468     * Thuban/version.py: Add psycopg version
5469    
5470     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
5471     version of the psycopg module
5472    
5473     2003-08-22 Bernhard Herzog <[email protected]>
5474    
5475     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
5476     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
5477     at the moment. The functionality should probably be implemented
5478     some time, though.
5479 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
5480     removed because it's still in use.
5481 bh 1632
5482 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
5483    
5484     * Thuban/UI/about.py (About.__init__): split up the huge about
5485     text into elements/lists for easier translation. This fixes bug
5486     https://intevation.de/rt/webrt?serial_num=2058
5487     Also, made some forgotten string available for the i18n.
5488    
5489 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
5490    
5491     Make postgis support really optional including insensitive menu
5492     items.
5493    
5494     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
5495     whether the postgis is supported.
5496    
5497     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
5498     to make postgis support optional
5499    
5500     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
5501     version of Thuban.Model.postgisdb.has_postgis_support
5502     (database_management command): Make it only sensitive if postgis
5503     is supported.
5504    
5505 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
5506    
5507 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
5508     (section Adding and Removing Layers): Added text and described
5509     multi-selection.
5510     (chapter Extensions): New.
5511    
5512     2003-08-21 Jan-Oliver Wagner <[email protected]>
5513    
5514 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
5515     settings to allow multiple files to load into the map.
5516     Also reduced selection to *.shp as a default.
5517    
5518 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
5519    
5520     Add dialogs and commands to open database connections and add
5521     database layers.
5522    
5523     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
5524     method to open the database connection management dialog
5525     (MainWindow.AddDBLayer): New method to add a layer from a database
5526     (_has_dbconnections): New helper function to use for sensitivity
5527     (database_management command, layer_add_db command): New commands
5528     that call the above new methods.
5529     (main_menu): Add the new commands to the menu.
5530    
5531     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
5532     (PostGISConnection.connect): Establish the actual connection in a
5533     separate method and call it in __init__. This makes it easier to
5534     override the behavior in test cases
5535     (PostGISConnection.BriefDescription): New method to return a brief
5536     description for use in dialogs.
5537    
5538     * test/test_postgis_db.py (NonConnection): DB connection that
5539     doesn't actually connect
5540     (TestBriefDescription): New class with tests for the new
5541     BriefDescription method
5542    
5543 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
5544    
5545     Moved anything from extensions to libraries.
5546    
5547     * libraries: New.
5548    
5549     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
5550    
5551     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
5552     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
5553     been moved here from thuban/extensions/pyprojection/
5554     See there in the Attic for the older history.
5555    
5556     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
5557     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
5558     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
5559     have been moved here from thuban/extensions/pyshapelib/
5560     See there in the Attic for the older history.
5561    
5562     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
5563     files have been moved here from thuban/extensions/shapelib/
5564     See there in the Attic for the older history.
5565    
5566     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5567     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
5568     thuban/extensions/thuban/
5569     See there in the Attic for the older history.
5570    
5571     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
5572    
5573     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
5574     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
5575    
5576     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
5577     Moved to libraries/shapelib.
5578    
5579     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
5580     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
5581     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
5582     Moved to libraries/pyshapelib.
5583    
5584     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
5585     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
5586     Moved to libraries/pyprojection.
5587    
5588     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
5589    
5590     * extensions: Removed.
5591    
5592 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
5593    
5594 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
5595     facilities of FileTestMixin so don't derive from it.
5596     (TestViewportWithPostGIS): New class with tests for using a
5597     viewport on a map with postgis layers.
5598    
5599     2003-08-19 Bernhard Herzog <[email protected]>
5600    
5601     Add the db connection management to the session.
5602    
5603     * Thuban/Model/session.py (Session.__init__): New instance
5604     variable db_connections
5605     (Session.AddDBConnection, Session.DBConnections)
5606     (Session.HasDBConnections, Session.CanRemoveDBConnection)
5607     (Session.RemoveDBConnection): New methods to manage and query the
5608     db connections managed by the session
5609     (Session.OpenDBShapeStore): New method to open a shapestore from a
5610     db connection
5611    
5612     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
5613     messages for the db connection handling in the session
5614    
5615     * test/test_postgis_session.py: New. test cases for the session's
5616     db connection handling with postgis connections
5617    
5618     2003-08-19 Bernhard Herzog <[email protected]>
5619    
5620 bh 1606 Add very basic postgis database support and the corresponding test
5621     cases. The test cases require a PostgreSQL + postgis installation
5622     but no existing database. The database will be created
5623     automatically by the test cases
5624    
5625     * test/README: Add note about skipped tests and the requirements
5626     of the postgis tests.
5627    
5628     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
5629    
5630     * test/test_postgis_db.py: New. Test cases for the postgis
5631     support.
5632    
5633     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
5634     format
5635    
5636     * test/test_wellknowntext.py: New. Test cases for the
5637     wellknowntext parser
5638    
5639     * test/postgissupport.py: New. Support module for tests involving
5640     a postgis database.
5641    
5642     * test/support.py (execute_as_testsuite): Shut down the postmaster
5643     if it's still running after the tests
5644    
5645     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
5646     well known text format
5647    
5648 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
5649    
5650     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
5651     message dialog.
5652    
5653 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
5654    
5655 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
5656     reason for the skips in the output to make it a bit more readable.
5657     (execute_as_testsuite): New helper function to run a test suite
5658     and print some more information.
5659     (run_tests): Use execute_as_testsuite to run the tests
5660    
5661     * test/runtests.py (main): Use execute_as_testsuite to run the
5662     tests
5663    
5664     2003-08-18 Bernhard Herzog <[email protected]>
5665    
5666 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
5667     changes introduced in Python 2.3:
5668    
5669     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
5670     filename is an absolute name
5671    
5672     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
5673     filename is an absolute name
5674    
5675     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
5676     unique filename to save to and use the correct relative filename
5677     in the expected output.
5678     (SaveSessionTest.test_dbf_table): Use the correct relative
5679     filename in the expected output.
5680    
5681     * test/test_layer.py (TestLayer.test_raster_layer): Update the
5682     test to check whether the filename is absolute.
5683    
5684 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
5685    
5686     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
5687    
5688 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
5689    
5690 bh 1594 Change the way shapes are returned by a shape store. The
5691     ShapesInRegion method returns an iterator over actual shape
5692     objects instead of a list of shape ids.
5693    
5694     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
5695     id.
5696     (ShapefileStore.ShapesInRegion): Return an iterator over the
5697     shapes which yields shape objects instead of returning a list of
5698     shape ids
5699     (ShapefileStore.AllShapes): New. Return an iterator over all
5700     shapes in the shape store
5701     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
5702    
5703     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
5704     doc-string.
5705    
5706     * Thuban/UI/baserenderer.py
5707     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
5708     layer_shapes and make it return an iterator containg shapes
5709     instead of a list of ids.
5710     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
5711     layer_shapes() change
5712    
5713     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
5714     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
5715    
5716     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
5717     changes in the ShapesInRegion return value.
5718     (ViewPort._get_hit_tester): Remove commented out code
5719    
5720     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
5721     new return value.
5722     (SimpleShapeStore.AllShapes): New. Implement this method too.
5723    
5724     * test/test_layer.py (TestLayer.test_arc_layer)
5725     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5726     (TestLayer.test_point_layer_with_projection)
5727     (TestLayer.test_derived_store): Adapt to changes in the
5728     ShapesInRegion return value.
5729    
5730     * test/test_shapefilestore.py
5731     (TestShapefileStoreArc.test_shapes_in_region)
5732     (TestShapefileStorePolygon.test_shapes_in_region)
5733     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
5734     in the ShapesInRegion return value.
5735     (TestShapefileStorePoint.test_all_shapes)
5736     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
5737     methods
5738    
5739     * test/test_derivedshapestore.py
5740     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
5741     the ShapesInRegion return value.
5742     (TestDerivedShapeStore.test_all_shapes)
5743     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
5744     methods
5745    
5746     2003-08-15 Bernhard Herzog <[email protected]>
5747    
5748 bh 1592 Make the renderers deal correctly with raw vs. python level
5749     representation of shape geometries
5750    
5751     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
5752     Return a flag useraw in addition to the callable and the parameter
5753     to indicate whether the callable can deal with the raw shape data
5754     or uses the higher level python lists of coordinates. The callable
5755     now should accept either the raw data or the return value of the
5756     shape's Points() method.
5757     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
5758     change
5759     (BaseRenderer.projected_points): Instead of the shape id use the
5760     points list as parameter.
5761     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
5762     (BaseRenderer.draw_point_shape): Adapt to projected_points()
5763     change and accept the points list as parameter instead of the
5764     shape id.
5765    
5766     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
5767     the useraw flag as required by the BaseRenderer
5768     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
5769     changes.
5770    
5771     * test/test_baserenderer.py
5772     (TestBaseRenderer.test_point_with_classification): New test for
5773     rendering a map with classifications.
5774    
5775     2003-08-15 Bernhard Herzog <[email protected]>
5776    
5777 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5778     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
5779     (ViewPort._get_hit_tester, ViewPort.projected_points)
5780     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
5781     (ViewPort._find_label_at): Split the find_shape_at method into
5782     several new methods and use the functions in the hit-test module.
5783    
5784     * Thuban/UI/hittest.py: New module with Python-level hit-testing
5785     functions
5786    
5787     * test/test_hittest.py: New. Test for the new hittest module
5788    
5789     2003-08-15 Bernhard Herzog <[email protected]>
5790    
5791 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
5792     projection to all corners of the bounding box to get a better
5793     approximation of the projected bounding box
5794    
5795     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
5796     New. Test coordinate handling of a layer with a projection.
5797     Catches the bug fixed in Layer.ShapesInRegion
5798    
5799     2003-08-15 Bernhard Herzog <[email protected]>
5800    
5801 bh 1586 Move some of the mock objects in test_baserenderer into their own
5802     module so they can easily be used from other tests
5803    
5804     * test/mockgeo.py: New test helper module with some mock objects
5805     for geometry related things like shapes, shapestores and
5806     projections.
5807    
5808     * test/test_mockgeo.py: New. Tests for the new helper module
5809    
5810     * test/test_baserenderer.py: Some of the mock-objects are in
5811     mockgeo now.
5812    
5813 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
5814    
5815     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
5816    
5817 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
5818    
5819 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
5820    
5821     2003-08-12 Bernhard Herzog <[email protected]>
5822    
5823 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
5824     strings have to be one string literal.
5825    
5826 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
5827    
5828 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
5829     New. This method was used in various derived classes, but it's
5830     better to have it here.
5831    
5832     * test/test_shapefilestore.py
5833     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
5834     FloatComparisonMixin
5835    
5836     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
5837     It's now in FloatComparisonMixin
5838    
5839     * test/test_derivedshapestore.py
5840     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
5841     in FloatComparisonMixin
5842    
5843     2003-08-11 Bernhard Herzog <[email protected]>
5844    
5845 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
5846     error message
5847    
5848 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
5849    
5850 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
5851     with version number.
5852     Changed title to reflect version number of Thuban.
5853    
5854     2003-08-08 Jan-Oliver Wagner <[email protected]>
5855    
5856 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
5857     the list corresponds to the "About" web page.
5858    
5859 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
5860    
5861     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
5862     Make sure translated strings are recognized as one string literal.
5863    
5864     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
5865     Make sure translated strings are recognized as one string literal.
5866    
5867     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
5868     translated strings are recognized as one string literal.
5869    
5870     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5871     sure translated strings are recognized as one string literal.
5872    
5873 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
5874    
5875 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
5876     Simply delegates to the original shapestore.
5877    
5878     * test/test_derivedshapestore.py
5879     (TestDerivedShapeStore.test_raw_format): New. Test case for
5880     DerivedShapeStore.RawShapeFormat
5881    
5882     2003-08-07 Bernhard Herzog <[email protected]>
5883    
5884 bh 1561 Add raw data interface to shape objects.
5885    
5886     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
5887     class to ShapefileShape which now holds shapefile specific
5888     information.
5889     (ShapefileShape.compute_bbox): Simplified to not cache any
5890     information. The way this method is used that shouldn't matter
5891     performance wise.
5892     (ShapefileShape.RawData): New. Return the shapeid which is the raw
5893     data format for shapes from shapefiles.
5894     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
5895     in the shape objects returned by a shapestore. For a
5896     ShapefileStore this is always RAW_SHAPEFILE.
5897     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
5898     method.
5899    
5900     * test/test_shapefilestore.py
5901     (TestShapefileStore.test_raw_format): New test to test the raw
5902     format feature of shapes.
5903    
5904 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
5905     data. It was only there for interface compatibility but it's not
5906 bh 1561 used inside of Thuban and the generic Shape class has gone away.
5907 bh 1560
5908 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
5909     the raw data format and only use an optimized version of its a
5910     shapefile.
5911    
5912 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
5913    
5914 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
5915     tests.
5916     (SimpleShapeStore.Shape): Use SimpleShape instead of
5917     Thuban.Model.data.Shape to make the tests independed of the coming
5918     changes.
5919    
5920     2003-08-07 Bernhard Herzog <[email protected]>
5921    
5922 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
5923     (ThubanTestProgram): New classes that extend the respective
5924     classes from unittest. These new version support skipping tests
5925     under certain expected conditions. In the Thuban test suite we
5926     uses this for tests that require the optional gdal support.
5927     (run_tests): Use ThubanTestProgram instead of the unittest.main()
5928    
5929     * test/runtests.py (main): Use the new ThubanTestRunner instead of
5930     the normal one from unittest
5931    
5932     * test/test_layer.py (TestLayer.test_raster_layer): If this test
5933     is not run because gdal support isn't available report this to the
5934     runner.
5935    
5936     * test/test_baserenderer.py
5937     (TestBaseRenderer.test_raster_no_projection): Do not run this test
5938     if gdal support isn't available and report this to the runner.
5939    
5940 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
5941    
5942     Rearrange the renderers a bit, partly in preparation for changes
5943     required for the postgis merge, partly to make it more testable.
5944     Also make the representation of coordinates in Shapes more
5945     consistent.
5946    
5947     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
5948     this class is now in BaseRenderer. This class is now practically
5949     only a specialization of BaseRenderer for rendering to an actual
5950     wx DC.
5951     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
5952     to get the shapetype specific rendering functions.
5953    
5954     * Thuban/UI/baserenderer.py: New file with the basic rendering
5955     logic. The code in this file is completely independend of wx.
5956     (BaseRenderer): Class with the basic rendering logic
5957    
5958     * test/test_baserenderer.py: New. Test cases for BaseRenderer
5959    
5960     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
5961     error_on_redraw to guard agains endless loops and stack overflows
5962     when there's a bug in the rendering code that raises exceptions.
5963     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
5964     rendering into a separate method _do_redraw so that error handling
5965     is a bit easier. When an exception occurs, set error_on_redraw to
5966     true. When it's true on entry to OnIdle do nothing and return
5967     immediately.
5968    
5969     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
5970     Shape object will always have the coordinates as a list of list of
5971     coordinate pairs (tuples).
5972     (Shape.compute_bbox): Adapt to new representation.
5973    
5974     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
5975     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
5976     Shape objects.
5977    
5978     * test/test_shapefilestore.py
5979     (ShapefileStoreTests.assertFloatTuplesEqual)
5980     (ShapefileStoreTests.assertPointListEquals): Rename to
5981     assertPointListEquals and change purpose to checking equality of
5982     the lists returned by Shape.Points().
5983     (TestShapefileStoreArc.test_shape)
5984     (TestShapefileStorePolygon.test_shape)
5985     (TestShapefileStorePoint.test_shape): Use the new
5986     assertPointListEquals instead of assertFloatTuplesEqual
5987    
5988     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
5989     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
5990     and change purpose to checking equality of the lists returned by
5991     Shape.Points().
5992     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
5993     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
5994     (TestLayer.test_derived_store): Use the new assertPointListEquals
5995     instead of assertFloatTuplesEqual
5996    
5997     * test/test_derivedshapestore.py
5998     (TestDerivedShapeStore.assertFloatTuplesEqual)
5999     (TestDerivedShapeStore.assertPointListEquals): Rename to
6000     assertPointListEquals and change purpose to checking equality of
6001     the lists returned by Shape.Points().
6002     (TestDerivedShapeStore.test_shape): Use the new
6003     assertPointListEquals instead of assertFloatTuplesEqual
6004    
6005 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
6006    
6007     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
6008     a bounding box. A dialog is raised in case, no bounding box
6009     is found. This fixes bug #2043:
6010     https://intevation.de/rt/webrt?serial_num=2043
6011    
6012 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
6013    
6014     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
6015     object look like a Color instantiation. Formerly it looked like a
6016     tuple.
6017    
6018     * test/test_color.py (TestColor.test_repr)
6019     (TestColor.test_equality, TestColor.test_inequality): New. test
6020     some more apects of the Color class
6021     (TestTransparent.test_repr, TestTransparent.test_hex)
6022     (TestTransparent.test_equality): New. Test cases for the
6023     Transparent object.
6024    
6025 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
6026    
6027     * Doc/manual/thuban-manual.xml: a number of small improvements.
6028     The resulting file is the version submitted for GREAT-ER II.
6029    
6030 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
6031    
6032 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
6033     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
6034     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
6035    
6036     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
6037     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
6038     (ThubanEndBusyCursor): Add doc-strings
6039    
6040     2003-08-01 Bernhard Herzog <[email protected]>
6041    
6042 bh 1540 First step towards PostGIS integration. More abstraction by movin
6043     more code from the layer to the shapestore. More methods of the
6044     layer are now simply delegated to the equivalent method of the
6045     shapestore. The SHAPETYPE_* constants are now in data not in
6046     layer.
6047    
6048     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6049     (SHAPETYPE_POINT, Shape): Move these constants and classes from
6050     layer.py to data.py
6051     (ShapefileStore.__init__): More Initialization for the new methods
6052     and functionality.
6053     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
6054     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
6055     (ShapefileStore.Shape): New methods that were formerly implemented
6056     in the layer.
6057     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
6058     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
6059     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
6060     equivalents of the new shape methods. These versions are simply
6061     delegated to the original shapstore.
6062    
6063     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
6064     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
6065     (Layer.SetShapeStore): Removed the initializatin of instance
6066     variables that were needed for the stuff that's now in
6067     ShapefileStore
6068     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
6069     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
6070     shapestore.
6071    
6072     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
6073     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
6074     instead of layer.
6075    
6076     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
6077    
6078     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
6079    
6080     * test/test_layer.py: Import the SHAPETYPE_* constants from data
6081     instead of layer.
6082     (TestLayer.test_derived_store): Remove the test for the exception
6083     when instantiating the DerivedShapeStore with an incompatible
6084     table which is now in test_derivedshapestore.py. Add some more
6085     tests of the layer methods to determine whether they work for a
6086     DerivedShapeStore as well.
6087    
6088 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
6089    
6090     * Doc/manual/thuban-manual.xml: Fix the list of required packages
6091     by just listing the name and where they can be found.
6092    
6093 frank 1532 2003-07-31 Frank Koormann <[email protected]>
6094    
6095     * Doc/manual/thuban-manual.xml:
6096     Changed the screenshot elements to figure.
6097     Changed some variablelist elements to itemizedlist.
6098     Added section on GDAL formats.
6099    
6100 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
6101    
6102     * Doc/manual/thuban-manual.xml: Added a few sentences about
6103     the Fix Border Color option when generating classes.
6104    
6105 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
6106    
6107     * Thuban/Model/classgen.py: Add docstrings. Rename specific
6108     Ramp instances to use lower_case_style.
6109    
6110     * Thuban/UI/classgen.py: Use renamed Ramp instances.
6111    
6112     * Thuban/UI/classifier.py: Add docstrings.
6113    
6114     * Thuban/UI/dock.py: Add docstrings.
6115    
6116     * test/test_classgen.py: Use renamed Ramp instances.
6117    
6118 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
6119    
6120 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
6121     was never used in Thuban.
6122    
6123     2003-07-30 Bernhard Herzog <[email protected]>
6124    
6125 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
6126     method directly instead of going through the transient_table
6127     method. This faster because transient_table may force the copy of
6128     a DBF file into the transient database and setting a table's title
6129     doesnm't affect the title of the associated transient table, so
6130     this fixes RT #2042
6131    
6132     * Thuban/UI/main.py (__version__): Don't import the already
6133     removed show_exception_dialog.
6134    
6135 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
6136    
6137 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6138     Put back this method and remove the equivalent function since we
6139     are setting the exception hook from within this class (OnInit).
6140    
6141     2003-07-29 Jonathan Coles <[email protected]>
6142    
6143 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
6144     Doc/manual/images/5_2_quantiles.png,
6145     Doc/manual/images/5_2_uniform_dist.png,
6146     Doc/manual/images/5_2_unique_values.png,
6147     Doc/manual/images/8_int_error.png: New screen shots.
6148    
6149     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
6150     some points, and added more screen shots.
6151    
6152 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
6153    
6154 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
6155    
6156     2003-07-29 Bernhard Herzog <[email protected]>
6157    
6158 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
6159     deprecated since before the 0.8 release and isn't used in Thuban
6160     itself anymore.
6161    
6162 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
6163    
6164 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
6165 jonathan 1506
6166     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
6167     python exception hook here so that we are sure to catch any
6168     Thuban exception that happen during initialization.
6169    
6170     * Thuban/UI/main.py (main): Don't set the exception hook here,
6171     it will get set in ThubanApplication.OnInit.
6172    
6173     2003-07-29 Jonathan Coles <[email protected]>
6174 jonathan 1503
6175     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6176     Removed and called it show_exception_dialog() so that the exception
6177     handler can be set before the class is created.
6178    
6179     * Thuban/UI/main.py (main): Install the exception handler before
6180     a ThubanApplication is created.
6181    
6182 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
6183    
6184     * po/it.po: New. Italian translation by Maurizio Napolitano
6185    
6186     * po/ru.po: New. Russian translation by Alex Shevlakov
6187    
6188 frank 1497 2003-07-29 Frank Koormann <[email protected]>
6189    
6190 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
6191     projections.
6192    
6193     2003-07-29 Frank Koormann <[email protected]>
6194    
6195 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
6196    
6197 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
6198    
6199 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
6200     on white background.
6201    
6202     2003-07-29 Jonathan Coles <[email protected]>
6203    
6204 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
6205     descriptions for the legend toolbar.
6206    
6207     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
6208     cursor from dialog box.
6209    
6210     2003-07-28 Jonathan Coles <[email protected]>
6211    
6212     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
6213    
6214     * Doc/manual/images/2_4_session_tree.png,
6215     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
6216     Doc/manual/images/4_2_layer_properties.png,
6217     Doc/manual/images/4_2_raster_layer_properties.png,
6218     Doc/manual/images/5_3_genclass.png,
6219     Doc/manual/images/5_classification.png,
6220     Doc/manual/images/6_projection.png,
6221     Doc/manual/images/7_1_table_view.png,
6222     Doc/manual/images/7_2_5_join.png: New screenshots.
6223    
6224     2003-07-24 Jonathan Coles <[email protected]>
6225    
6226     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
6227    
6228     2003-07-24 Jonathan Coles <[email protected]>
6229    
6230     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
6231     chapter on Layer Management.
6232    
6233     * Doc/manual/Makefile: New. Makefile to generate all formats for the
6234     manual and images.
6235    
6236 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
6237    
6238     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
6239     it annoys lintian which warns about these files not being
6240 jan 1767 executable. The #! isn't necessary here since if you absolutely
6241 bh 1483 must execute them you can always say "python <filename>".
6242    
6243     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
6244     superfluous code to set brush and pen for point shapes
6245    
6246     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
6247     belong in viewport anyway
6248    
6249 frank 1479 2003-07-24 Frank Koormann <[email protected]>
6250    
6251     * Doc/manual/thuban-manual.xml: Added section on table management.
6252    
6253 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
6254    
6255     * test/runtests.py (main): Recognize the long "verbose" option
6256     correctly.
6257    
6258 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
6259    
6260     * Doc/manual/thuban-manual.xml: Continue to write first revision
6261     of the manual.
6262    
6263     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
6264     with Begin/EndDrawing() calls to ensure we aren't doing to
6265     many updates to the dc during rendering.
6266     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
6267     a pen and brush argument so they need to be passed to the function.
6268    
6269     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
6270     Calculates the minimum and maximum scale values. Factored out
6271     of set_view_transform so that it could be used to zoom all the
6272     way into a single point.
6273     (ViewPort.set_view_transform): Call calc_min_max_scales().
6274     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
6275     if only a single point is selected.
6276    
6277     * Doc/manual/images/1_2_legend_close.png,
6278     Doc/manual/images/1_2_legend_dock.png,
6279     Doc/manual/images/1_2_mainwindow.png,
6280     Doc/manual/images/1_2_mainwindow.ps,
6281     Doc/manual/images/1_2_mainwindow.sk,
6282     Doc/manual/images/3_2_fullextent.png,
6283     Doc/manual/images/3_2_fulllayerextent.png,
6284     Doc/manual/images/3_2_fullshapeextent.png,
6285     Doc/manual/images/3_2_pan.png,
6286     Doc/manual/images/3_2_zoomin.png,
6287     Doc/manual/images/3_2_zoomout.png,
6288     Doc/manual/images/3_3_identify.png,
6289     Doc/manual/images/3_3_label.png,
6290     Doc/manual/images/3_5_invisible.png,
6291     Doc/manual/images/3_5_movedown.png,
6292     Doc/manual/images/3_5_moveup.png,
6293     Doc/manual/images/3_5_props.png,
6294     Doc/manual/images/3_5_tobottom.png,
6295     Doc/manual/images/3_5_totop.png,
6296     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
6297    
6298 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
6299    
6300 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
6301    
6302     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
6303     after the new map has been assigned
6304    
6305     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
6306     Delegate MAP_REPLACED to the canvas too
6307     (MainWindow.prepare_new_session): Removed. Thanks to the new
6308     MAP_REPLACED message it's no longer needed
6309     (MainWindow.OpenSession, MainWindow.NewSession):
6310     prepare_new_session has been removed.
6311    
6312     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
6313     MAP_REPLACED so that we can close the dialog if a new map is set.
6314     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
6315     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
6316     dialog
6317    
6318     * test/test_viewport.py (SimpleViewPortTest)
6319     (SimpleViewPortTest.test_default_size): Add doc-strings
6320     (ViewPortTest.setUp): Bind map to self.map so we can use it in
6321     tests. Subscribe to MAP_REPLACED messages too.
6322     (ViewPortTest.tearDown): No need to explicitly unsubscribe
6323     (ViewPortTest.test_set_map): New test for the SetMap method.
6324    
6325     2003-07-18 Bernhard Herzog <[email protected]>
6326    
6327 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
6328     Move this test from ViewPortTest.setUp to this new separate test
6329     case. setUp is not the place for the actual tests.
6330     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
6331     more of the test from setUp to the new test test_inital_settings.
6332     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
6333     (ViewPortTest.test_proj_conv): Split test_proj_conv into
6334     test_win_to_proj and test_proj_to_win and make the tests easier to
6335     understand
6336     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
6337     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
6338     (ViewPortTest.test_unprojected_rect_around_point)
6339     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
6340     Reformat to increase readability.
6341    
6342     2003-07-18 Bernhard Herzog <[email protected]>
6343    
6344 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
6345    
6346     2003-07-18 Bernhard Herzog <[email protected]>
6347    
6348 bh 1459 * test/runtests.py: The test suite can now be run without an X
6349     connection. To make sure this remains true, remove the DISPLAY
6350     environment variable so that an error occurs if the wxGTK is
6351     imported accidentally
6352    
6353     2003-07-18 Bernhard Herzog <[email protected]>
6354    
6355 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
6356    
6357     * Thuban/UI/view.py: Remove unused imports
6358    
6359     2003-07-18 Bernhard Herzog <[email protected]>
6360    
6361 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
6362     function is now in viewport.py and is called output_transform
6363     (TestScalebar.test_output_transform)
6364     (TestScalebar.test_OutputTransform): Renamed to
6365     test_output_transform and updated to use output_transform instead
6366     of OutputTransform
6367    
6368     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
6369     renamed.
6370     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
6371     renamed to output_transform
6372    
6373     * Thuban/UI/viewport.py (OutputTransform, output_transform):
6374     Rename to output_transform
6375    
6376     2003-07-18 Bernhard Herzog <[email protected]>
6377    
6378 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
6379     classificationField to classificatin_column and init it here so
6380     that it can be used in SetClassificationColumn
6381     (Layer.GetClassificationColumn, Layer.GetClassificationField):
6382     Rename to GetClassificationColumn.
6383     (Layer.SetClassificationColumn, Layer.SetClassificationField):
6384     Rename to SetClassificationColumn and issue a LAYER_CHANGED
6385     message if the column changes.
6386     (Layer._classification_changed, Layer.ClassChanged): Rename to
6387     _classification_changed. Update the callers.
6388     (Layer.SetShapeStore): Further field->column renames.
6389    
6390     * Thuban/Model/load.py (SessionLoader.start_classification)
6391     (SessionLoader.start_clpoint): Updates because of
6392     field->column method name changes in the Layer class
6393    
6394     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
6395     because of field->column method name changes in the Layer class
6396    
6397     * Thuban/UI/classifier.py (Classifier.__init__)
6398     (Classifier._OnTry, Classifier._OnRevert): Updates because of
6399     field->column method name changes in the Layer class
6400    
6401     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
6402     because of field->column method name changes in the Layer class
6403    
6404     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
6405     of field->column method name changes in the Layer class
6406    
6407     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
6408     (SaveSessionTest.testClassifiedLayer): Update because of
6409     field->column method name changes in the Layer class
6410    
6411     * test/test_layer.py (SetShapeStoreTests.setUp)
6412     (SetShapeStoreTests.test_sanity): Update because of field->column
6413     method name changes in the Layer class
6414     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
6415     (TestLayerModification.test_sanity)
6416     (TestLayerModification.test_initial_settings): remove unsued code
6417     and rename to test_sanity.
6418     (TestLayerModification.test_set_classification): New test for
6419     SetClassification and SetClassificationField.
6420    
6421     2003-07-18 Bernhard Herzog <[email protected]>
6422    
6423 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
6424     the non-fixed values as well. The old test would have accepted a
6425     fixed ramp that only returnes the fixed properties
6426    
6427 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
6428    
6429     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
6430     shots for the manual. The XCF file is the source image and
6431     has additional layers to support changes.
6432    
6433     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
6434    
6435     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
6436     Return both the new class and the field name.
6437    
6438     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
6439     fit the map to the window as this changes any zoom level that
6440     the user may have set.
6441    
6442 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
6443    
6444     * Thuban/Model/classgen.py (generate_singletons,
6445     generate_uniform_distribution, generate_quantiles): Remove
6446     fixes parameter, but maintain the same functionality by having
6447     the calling function pass a FixedRamp object for the ramp.
6448     (FixedRamp): New. Adapts a ramp to have fixed property values.
6449    
6450     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
6451     (Classification): Inherit from Publisher.
6452     (Classification.__init__): Remove the layer parameter.
6453     Classifications no longer need to have a parent layer.
6454     (Classification.GetField, Classification.GetFieldType,
6455     Classification.SetFieldInfo): Removed. The field name is stored
6456     in the layer, and the type can be retreived by calling
6457     Layer.GetFieldType().
6458     (Classification._set_layer, Classification.GetLayer): Removed.
6459     Classifications no longer have a parent layer.
6460    
6461     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
6462     classification.
6463     (Layer.SetShapeStore): Reset the classification first while
6464     we still have the old shape store to work with.
6465     (Layer.GetClassificationField, Layer.SetClassificationField):
6466     New. Method for getting/setting the field to classify on.
6467     (Layer.SetClassification): Simplified now that the layer
6468     simply has to hold a reference to the classification and not
6469     tell the classification who owns it.
6470     Fixes RTbug #2023.
6471    
6472     * Thuban/Model/load.py (SessionLoader.start_classification):
6473     Set the field name on the layer, not the classification.
6474    
6475     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
6476     classification is modified.
6477    
6478     * Thuban/Model/save.py (SessionSaver.write_classification):
6479     Get the field name and type from the layer.
6480    
6481     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
6482     parameter records to rows and add docstring. Fixes RTbug #1997.
6483    
6484     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
6485     ramp when we need to fix certain values of a ramp rather than
6486     using the old fixes parameter. Fixes RTbug #2024.
6487    
6488     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
6489     parameter.
6490     (ClassTable.Reset): Add fieldType parameter and use it, rather
6491     than asking the classification.
6492     (Classifier.__init__): Remember the original class's field
6493     and ask the layer for the field type, rather than the classification.
6494     (Classifier.__SetGridTable): Retrieve the field and field type
6495     for the table because they are not in the classification.
6496     (Classifier._OnTry, Classifier._OnRevert): Set the classification
6497     field on the layer in addition to the classification itself.
6498    
6499     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
6500     classification field from layer.
6501    
6502     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
6503     classification field from layer. Split up tests and remove
6504     *-imports. Fixes RTbug #1992.
6505    
6506     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
6507    
6508     * test/test_classification.py
6509     (TestClassification.test_classification): Remove tests for methods
6510     that no longer exist.
6511    
6512     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
6513     __init__ no longer has a field parameter, use SetClassificationField.
6514     (SetShapeStoreTests.test_sanity): Use layer object to get class
6515     field info.
6516    
6517     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
6518     SetClassificationField on layer to set class field info.
6519    
6520     * test/test_viewport.py: Renamed from test/test_view.py.
6521    
6522 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
6523    
6524     * Doc/manual/thuban-manual.xml: Added authors and an initial
6525     coarse structure.
6526    
6527 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
6528    
6529 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
6530     and therefore should not be derived from any other class.
6531    
6532     * test/test_range.py (RangeTest): FloatComparisonMixin is a
6533     mix-in, so derive from TestCase as well.
6534    
6535     2003-07-15 Bernhard Herzog <[email protected]>
6536    
6537 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
6538     draw_func handling a bit to remove one layer of indirection. This
6539     makes the renderer about 10% faster in the non-classifying case
6540     and the code a bit cleaner
6541     (MapRenderer.draw_point_shape): Add the pen and brush parameters
6542     and set them in the dc. Now the draw_point_shape method and
6543     wxproj's draw_polygon_shape function have basically the same
6544     signature so that both can be directly used as draw_func
6545    
6546     2003-07-15 Bernhard Herzog <[email protected]>
6547    
6548 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
6549     string values (in addition to the labels) as UTF 8
6550    
6551     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
6552     values if the field type is string
6553    
6554     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
6555     saving a session with non-ascii string classification values.
6556    
6557     * test/test_load.py (TestClassification.file_contents)
6558     (TestClassification.test): Check for non-ascii values in string
6559     classifications
6560    
6561 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
6562    
6563     * test/test_view.py: New. Tests for ViewPort.
6564    
6565 frank 1409 2003-07-14 Frank Koormann <[email protected]>
6566    
6567     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
6568     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
6569    
6570 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
6571     unicode strings from session file: session title, map title and
6572     projection name.
6573    
6574 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
6575    
6576 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
6577     drag_stop, not drag_move when the mouse is released.
6578    
6579     2003-07-10 Jonathan Coles <[email protected]>
6580    
6581 jonathan 1403 The most important part of this is the seperation of view.py into
6582     two pieces. viewport.py now has a class called ViewPort which
6583     contains all the non-wx parts of view.py and can therefore be
6584     tested. view.py contains only the wx-specific parts and is fairly
6585     simple.
6586    
6587     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
6588     RTTbug #1992.
6589     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
6590     RTTbug #1992.
6591    
6592     * Thuban/Model/classgen.py (generate_singletons,
6593     generate_uniform_distribution, generate_quantiles):
6594     Added 'fixes' parameter so that property attributes can
6595     be held constant over the generated classification groups.
6596     (CustomRamp.GetProperties): Remove unused variables.
6597    
6598     * Thuban/Model/map.py (Map.SetProjection): Send the old
6599     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
6600     event.
6601    
6602     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
6603     parameter which is a list of records that restricts which
6604     records are saved. Fixes RTbug #1997.
6605    
6606     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
6607     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
6608    
6609     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
6610     to allow the user to fix line color/width on generated groups.
6611     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
6612     functions to optionally fix group properties.
6613    
6614     * Thuban/UI/main.py (main): Set exception hook to the
6615     ShowExceptionDialog. Fixes RTbug #1993.
6616    
6617     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
6618     the table window when it is selectd to be shown.
6619    
6620     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
6621     Export Selection button and move the export buttons underneath
6622     the table.
6623     (QueryTableFrame.UpdateStatusText): Added event argument so
6624     that it can respond to grid selection events. The status text
6625     is now updated even when the table is not associated with a
6626     layer as was previously assumed.
6627     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
6628     UpdateStatusText responds to these events.
6629     (QueryTableFrame.OnSaveAs): Renamed to doExport.
6630     (QueryTableFrame.doExport): Helper function that saves the
6631     entire table, or selected rows, to a file.
6632     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
6633     Respond to export button events and call doExport.
6634    
6635     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
6636     the function doesn't return NULL without first setting a Python
6637     Error.
6638    
6639     * test/runtests.py (main): Only print "Unknown option" for
6640     unsupported options.
6641    
6642     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
6643     optional epsilon argument to specify floating point accuracy.
6644     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
6645     for each item test.
6646    
6647     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
6648     tests for saving selected records.
6649    
6650     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6651     tests for saving selected records.
6652    
6653     * test/test_map.py (TestMapWithContents.test_set_projection):
6654     MAP_PROJECTION_CHANGED events send the old projection.
6655    
6656     * test/test_session.py
6657     (TestSessionWithContent.test_forward_map_projection):
6658     MAP_PROJECTION_CHANGED events send the old projection.
6659    
6660     * test/test_table.py (TableTest): Update tests to use non-deprecated
6661     functions.
6662    
6663 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
6664    
6665 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
6666     constants in the column objects are the standard ones defined in
6667     the table module.
6668    
6669     * test/test_transientdb.py
6670     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
6671     exporting transient tables as DBF works. This should catch the bug
6672     just fixed in TransientTableBase.Width.
6673    
6674     2003-07-08 Bernhard Herzog <[email protected]>
6675    
6676 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
6677     interpolated colors correctly.
6678    
6679     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
6680     New. Test case for the fix in classgen.py
6681    
6682     2003-07-08 Bernhard Herzog <[email protected]>
6683    
6684 bh 1378 * test/runtests.py (main): Make the default output less verbose
6685     and add a verbosity option (-v) to get the old output
6686    
6687     2003-07-08 Bernhard Herzog <[email protected]>
6688    
6689 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
6690     0.9.
6691    
6692     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
6693     New. Return the join type
6694    
6695     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
6696     DTD
6697     (SessionSaver.write_data_containers): Save the join type for
6698     joined tables
6699    
6700     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
6701     namespace
6702     (SessionLoader.start_jointable): Handle the jointype attribute
6703    
6704     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
6705     as of Thuban 0.8. These are now tests to determine whether Thuban
6706     can still read files generated by Thuban 0.8
6707    
6708     * test/test_load.py (LoadSessionTest.dtd)
6709     (TestSingleLayer.file_contents)
6710     (TestLayerVisibility.file_contents, TestLabels.file_contents)
6711     (TestLayerProjection.file_contents)
6712     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
6713     (TestJoinedTable.file_contents)
6714     (TestLoadError.file_contents): Update for new DTD
6715     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
6716     for new join type attribute
6717    
6718     * test/test_save.py (SaveSessionTest.dtd)
6719     (SaveSessionTest.testEmptySession)
6720     (SaveSessionTest.testSingleLayer)
6721     (SaveSessionTest.testLayerProjection)
6722     (SaveSessionTest.testRasterLayer)
6723     (SaveSessionTest.testClassifiedLayer)
6724     (SaveSessionTest.test_dbf_table)
6725     (SaveSessionTest.test_joined_table): Update for new DTD
6726     (SaveSessionTest.test_joined_table): Add test for new join type
6727     attribute
6728    
6729 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
6730    
6731     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
6732     function for table_to_dbf
6733     (table_to_dbf): Deal with names longer than the 10 character limit
6734    
6735     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
6736     doc-string
6737     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
6738     long column names
6739    
6740 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
6741    
6742 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
6743    
6744     2003-07-03 Bernhard Herzog <[email protected]>
6745    
6746 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
6747     for the Thuban manual and README with some basic information about
6748     the manual
6749    
6750     2003-07-03 Bernhard Herzog <[email protected]>
6751    
6752 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
6753     Update doc-string
6754     (TransientJoinedTable.create): Do not modify the column objects of
6755     the input tables in place and copy all columns of the input tables
6756     into the joined table after all.
6757    
6758     * test/test_transientdb.py
6759     (TestTransientTable.test_transient_joined_table_same_column_name):
6760     Update to reflect the new behavior
6761     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6762     Update to reflect the new behavior
6763     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
6764     New test case for a bug which modified the column objects in place
6765    
6766 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
6767 jonathan 1349
6768 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
6769     generate_uniform_distribution, generate_quantiles,
6770 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
6771     one, otherwise we could divide by zero.
6772    
6773     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
6774     ClassGenTest.doClassSingleTest): Call doBoundsTest to
6775     check the end classification groups against the
6776     proper property values.
6777     (ClassGenTest.doBoundsTest): New. Checks the first and
6778     last classification groups to make sure their properties
6779     are the correct upper and lower bounds for a color ramp.
6780    
6781     2003-07-02 Jonathan Coles <[email protected]>
6782    
6783     * Thuban/Model/classgen.py (generate_singletons,
6784     generate_uniform_distribution, generate_quantiles,
6785 jonathan 1360 GenQuantiles0): The denominator was one to high when
6786     calculating the index for the ramp causing the index
6787     to never to reach one.
6788    
6789     2003-07-02 Jonathan Coles <[email protected]>
6790    
6791 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
6792     ClassGroupRange.SetRange() so that the min/max values are
6793     passed as a tuple. This makes a better calling scheme for
6794     when a Range object is passed instead.
6795    
6796     * Thuban/Model/classgen.py: Fixed parameters to
6797     ClassGroupRange constructor.
6798    
6799     * Thuban/Model/classification.py (ClassGroupRange.__init__):
6800     Consolidate the min/max parameters into a single _range which
6801     can either be a tuple or a Range object.
6802     (ClassGroupRange.SetRange): Consolidate the min/max parameters
6803     into a single _range which can either be a tuple or a Range object.
6804    
6805     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
6806     call to ClassGroupRange constructor to use a tuple.
6807    
6808     * Thuban/Model/layer.py (Layer.SetClassification): Switch
6809     the classification instance variable to the new class
6810     before calling _set_layer otherwise subscribers to a
6811     LAYER_CHANGED event will not see any difference.
6812    
6813     * test/test_classification.py: Fix tests of ClassGroupRange
6814     so that they use the new signature.
6815    
6816     * test/test_load.py: Fix use of ClassGroupRange so that it
6817     uses the new signature.
6818    
6819     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
6820     uses the new signature.
6821    
6822     * test/test_save.py: Fix use of ClassGroupRange so that it
6823     uses the new signature.
6824    
6825    
6826     2003-07-01 Jonathan Coles <[email protected]>
6827    
6828 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
6829     Import used objects/class from color.
6830     (generate_singletons): We don't
6831     need the numGroups parameter anymore because we are using
6832     the new ramps with GetProperties().
6833     (generate_uniform_distribution): Use new ramp method
6834     GetProperties().
6835     (generate_quantiles, GenQuantiles0): Use new ramp method
6836     GetProperties().
6837     (CustomRamp.SetNumGroups): Removed. The ramps now map
6838     a value from 0 to 1 to class properties so the number
6839     of groups is not needed ahead of time.
6840     (CustomRamp.next): Removed. CustomRamp does not support
6841     interation anymore.
6842     (CustomRamp.GetProperties): Returns a ClassGroupProperties
6843     object based on the index value from 0 to 1 that is
6844     passed to it.
6845     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
6846     Made into instances of Monochromatic class instread of
6847     deriving from it.
6848     (HotToCold.SetNumGroups): Removed. See CustomRamp.
6849     (HotToCold.next): Removed. See CustomRamp.
6850    
6851     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
6852     (Classification.SetField, Classification.SetFieldType):
6853     Replaced with SetFieldInfo.
6854     (Classification.SetFieldInfo): New. Does a better job of
6855     what SetField and SetFieldType used to do by combining
6856     their function since they should really always be done
6857     at the same time.
6858     (Classification.SetLayer): Renamed to _set_layer.
6859     (Classification._set_layer): Should only be called from
6860     Layer's SetClassification. This does not cause a recursive
6861     call as SetLayer did because we know that Layer knows about
6862     the classification.
6863    
6864     * Thuban/Model/color.py: Fixes RTbug #1971.
6865     (_Transparent): Renamed from Transparent so it doesn't
6866     conflict with the module variable.
6867     (Transparent, Black): Renamed from Color.Transparent,
6868     Color.Black so they are not class variables.
6869    
6870     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
6871     (Layer.Destroy): We don't need to call SetClassification
6872     anymore to clear out the back reference in the classifcation
6873     to the layer. It's better to set it to None using _set_layer,
6874     and we won't be creating another clas object too.
6875     (Layer.SetClassification): Classification._set_layer is not
6876     recursive so remove all the locking variables. Also clean
6877     up the code so that it remains unchanged if something fails.
6878    
6879     * Thuban/Model/load.py: Fixes RTbug #1971.
6880     (SessionLoader.start_classification): Call
6881     Classification.SetFieldInfo().
6882    
6883     * Thuban/Model/save.py: Removed import of Color which wasn't
6884     being used.
6885    
6886     * Thuban/UI/classgen.py: Fixes RTbug #1972.
6887     (ClassGenDialog.__init__): Color ramps are now instances
6888     already so we don't need to create any new objects.
6889     (ClassGenDialog.OnOK): Check for numGroups is no longer
6890     necessary because we never use it.
6891    
6892     * Thuban/UI/classifier.py: Fixes RTbug #1971.
6893     (Classifier.__BuildClassification, Classifier.__SetGridTable):
6894     Call Classification.SetFieldInfo() instead of SetFieldType.
6895    
6896     * Thuban/UI/renderer.py: Fixes RTbug #1971.
6897    
6898     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
6899     (MapCanvas.__init__): Subscribe to the idle time event. Set
6900     background color to white.
6901     (MapCanvas.OnPaint): Set a flag indicating that we should
6902     render the map during idle time. If we already have a bitmap
6903     just draw it now.
6904     (MapCanvas.OnIdle): New. Render the map only during idle time.
6905     This also fixes a problem with the busy cursor under gtk.
6906    
6907     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
6908     Fix calls to generate_singletons because the signature changed.
6909    
6910     * test/test_classification.py: Fix color references and
6911     change calls to Classification.[SetField|SetFieldType] to
6912     SetFieldInfo.
6913    
6914     * test/test_load.py: Fix color references.
6915    
6916     * test/test_load_0_2.py: Fix color references.
6917    
6918     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
6919     Change calls to Classification.[SetField|SetFieldType] to
6920     SetFieldInfo.
6921    
6922 frank 1334 2003-07-01 Frank Koormann <[email protected]>
6923    
6924     MERGE from the greater-ms3 branch.
6925    
6926     * test/test_transientdb.py
6927     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
6928     New. Test join of two tables with partly equal column names.
6929    
6930     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
6931     If duplicates in left and right tables column names are found,
6932     append '_' (underscores) to the name until it is unique.
6933     Create always new internal names for the resulting table and reference
6934     columns in the join statement with <table>.<column>
6935    
6936 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
6937    
6938     * test/test_transientdb.py
6939     (TestTransientTable.test_transient_joined_table_same_column_name):
6940     New. Test whether joining on columns with the same names in both
6941     tables works.
6942 frank 1334
6943 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
6944     sure to use the right internal names even when joining on field
6945     with the same names in both tables. Also, detect duplicate names
6946     in the joined table correctly.
6947    
6948 frank 1325 2003-07-01 Frank Koormann <[email protected]>
6949    
6950     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
6951     Reverse List of layers to render in same order as in desktop legend.
6952    
6953 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
6954    
6955 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
6956     and splits it into a tuple of at most three integers.
6957     Used make_tuple() to make tuple versions of the version
6958     numbers.
6959    
6960     * Thuban/UI/about.py: Add Thuban email addresses.
6961    
6962     2003-06-30 Jonathan Coles <[email protected]>
6963    
6964 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
6965     were too high.
6966    
6967     2003-06-30 Jonathan Coles <[email protected]>
6968    
6969 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
6970    
6971     * MANIFEST.in: Added Projections so that default.proj is
6972     included.
6973    
6974 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
6975    
6976     New About box with lots more information including library
6977     versions and credits. More/better version checking before
6978     Thuban starts.
6979    
6980     * Thuban/UI/about.py: New. New About box that displays
6981     library version information and credits.
6982    
6983     * Thuban/version.py: Added new 'versions' dictionary which
6984     contains the verions of various libraries which are checked
6985     when the module loads.
6986     (verify_versions): Check all version numbers and returns
6987     a list of errors.
6988    
6989     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
6990     Reset the status of the buttons as the situation warrants,
6991     but in a better more reliable way by not relying on the
6992     current status to determine what needs to change.
6993    
6994     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
6995     (verify_versions): Remove most of the code since it is
6996     now in Thuban.version.verify_versions.o
6997    
6998     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
6999     About box in Thuban.UI.about.
7000    
7001     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
7002     Returns the version of gdal library being used as a string.
7003    
7004     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
7005     Removed.
7006     (get_proj_version): Return the version of PROJ that the file
7007     was compiled with.
7008     (get_gtk_version): Return th version of GTK that the file
7009     was compiled with.
7010    
7011 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
7012    
7013     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
7014     of the SelectPropertiesDialog should be self so the window
7015     appears on top.
7016     (ClassGroupPropertiesCtrl.DoEdit): The parent
7017     of the SelectPropertiesDialog should be self so the window
7018     appears on top.
7019    
7020     * Thuban/UI/resource.py: Cleaned up how we determine file
7021     extensions.
7022     (GetImageResource): Return an wxImage from our Resources.
7023    
7024 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
7025    
7026     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
7027     Check that a layer has a classification before trying
7028     to get it. Raster layers don't have classifications.
7029    
7030 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
7031 jonathan 1297
7032     * setup.py: Add Resources/XML to resource list.
7033    
7034     2003-06-23 Jonathan Coles <[email protected]>
7035 jonathan 1286
7036 jonathan 1297 * setup.cfg: Fix copyright dates
7037    
7038     2003-06-23 Jonathan Coles <[email protected]>
7039    
7040 jonathan 1294 * MANIFEST.in: Update with Resources/XML
7041    
7042     * setup.py: Don't include Locale resources yet as we don't
7043     have any and it causes problems building the distribution
7044     for Windows. Update version to 0.8.0.
7045    
7046     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
7047    
7048     * Thuban/UI/mainwindow.py: Add blank line at the end because
7049     file was not being read correctly building the Windows
7050     distribution.
7051    
7052     2003-06-23 Jonathan Coles <[email protected]>
7053    
7054 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
7055    
7056     * Thuban/version.py: Temporarily update longversion for
7057     the 0.8 release so that it doesn't have the cvs revision.
7058    
7059     2003-06-23 Jonathan Coles <[email protected]>
7060    
7061 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
7062     to make sure that we don't create reentrant possibilities with
7063     wxYield.
7064    
7065     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
7066     directly to avoid the wxSafeYield() call which generates an
7067     OnPaint event causing infinite recursion. Don't try to catch
7068     exception anymore. This was for before there were limits on map
7069     scaling.
7070    
7071 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
7072    
7073     Bug fix for RT #1961:
7074    
7075     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
7076     Register DerivedShapestores with the session
7077    
7078     * Thuban/Model/session.py (Session.Tables): Make sure each table
7079     is only listed once.
7080    
7081     * test/test_load.py (TestJoinedTable.test): Add check_format call.
7082     Update file contents to match the one written out.
7083    
7084 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
7085    
7086     * test/xmlsupport.py (SaxEventLister.startElementNS)
7087     (SaxEventLister.endElementNS): Do not include the qname. Python
7088     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
7089     is (presumably incorrectly) None, whereas it's a string with the
7090     element name in the later versions.
7091    
7092     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
7093     (TestEventList.test_even_list_namespace): Update tests to reflect
7094     the new behaviour
7095     (TestEventList.test_even_list_id_normalization): Fix doc-string
7096    
7097 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
7098    
7099 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
7100     by deriving classes to determine if that layer supports shapes.
7101     (Layer): Override HasShapes and return true.
7102    
7103     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
7104     instead of a direct call to wx[Begin|End]CusyCursor().
7105     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
7106     table data.
7107    
7108     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
7109     New. Wrappers around the wxWindows functions that allow us to
7110     make additional calls such as wxYield which gives the native
7111     system a chance to update the cursor correctly.
7112    
7113     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
7114     instead of a direct call to wx[Begin|End]CusyCursor().
7115    
7116     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
7117     instead of a direct call to wx[Begin|End]CusyCursor().
7118     (MapCanvas.find_shape_at): Check if the current search layer
7119     support shapes, otherwise go on to the next layer.
7120    
7121     * test/test_layer.py: Add tests in each type of layer for
7122     HasClassification() and HasShapes()
7123    
7124     2003-06-20 Jonathan Coles <[email protected]>
7125    
7126 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
7127     turning on the busy cursor to allow the system to change the
7128     cursor before we begin painting. This fixes a problem that
7129     was occuring only under GTK. Fixes RTbug #1840.
7130    
7131 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
7132    
7133     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
7134     version.
7135    
7136     * Thuban/Model/save.py (sort_data_stores): New. Make topological
7137     sort of the data sources so they can be written with sources that
7138     data sources that depend on other data sources come after the
7139     sources they depend on.
7140     (SessionSaver.__init__): Add idmap instance variable to map from
7141     objects to the ids used in the file.
7142     (SessionSaver.get_id, SessionSaver.define_id)
7143     (SessionSaver.has_id): New. Methods to manage the idmap
7144     (SessionSaver.write): Use thuban-0.8.dtd
7145     (SessionSaver.write_session): Add a namespace on the session and
7146     write out the data sources before the maps.
7147     (SessionSaver.write_data_containers): New. Write the data
7148     containers.
7149     (SessionSaver.write_layer): Layer elements now refer to a
7150     shapestore and don't contain filenames anymore.
7151    
7152     * Thuban/Model/load.py (LoadError): Exception class to raise when
7153     errors in the files are discovered
7154     (SessionLoader.__init__): Define dispatchers for elements with a
7155     thuban-0.8 namespace too.
7156     (SessionLoader.check_attrs): New helper method to check and
7157     convert attributes
7158     (AttrDesc): New. Helper class for SessionLoader.check_attrs
7159     (SessionLoader.start_fileshapesource)
7160     (SessionLoader.start_derivedshapesource)
7161     (SessionLoader.start_filetable, SessionLoader.start_jointable):
7162     Handlers for the new elements in the new fileformat
7163     (SessionLoader.start_layer): Handle the shapestore attribute in
7164     addition to filename.
7165     (SessionLoader.start_table, SessionLoader.end_table): Removed.
7166     They were never used in the old formats and aren't needed for the
7167     new.
7168    
7169     * Thuban/Model/session.py (Session.DataContainers): New method to
7170     return all "data containers", i.e. shapestores and tables
7171    
7172     * test/xmlsupport.py (SaxEventLister.__init__)
7173     (SaxEventLister.startElementNS, sax_eventlist): Add support to
7174     normalize IDs.
7175    
7176     * test/test_xmlsupport.py
7177     (TestEventList.test_even_list_id_normalization): New test case for
7178     id normalization
7179    
7180     * test/test_load.py (LoadSessionTest.check_format): Use ID
7181     normalization
7182     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
7183     class atrributes used for ID normalization
7184     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
7185     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
7186     file format
7187     (TestJoinedTable): New test for loading sessions with joined
7188     tables.
7189     (TestLoadError): New. Test whether missing required attributes
7190     cause a LoadError.
7191    
7192     * test/test_save.py (SaveSessionTest.thubanids)
7193     (SaveSessionTest.thubanidrefs): New class attributes for ID
7194     normalization in .thuban files.
7195     (SaveSessionTest.compare_xml): Use id-normalization.
7196     (SaveSessionTest.testEmptySession)
7197     (SaveSessionTest.testLayerProjection)
7198     (SaveSessionTest.testRasterLayer)
7199     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
7200     (SaveSessionTest.testLayerProjection): The filename used was the
7201     same as for testSingleLayer. Use a different one.
7202     (SaveSessionTest.test_dbf_table)
7203     (SaveSessionTest.test_joined_table): New test cases for saving the
7204     new data sources structures.
7205     (TestStoreSort, MockDataStore): Classes to test the sorting of the
7206     data stores for writing.
7207    
7208     * test/runtests.py: Add CVS keywords
7209    
7210 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
7211    
7212 jonathan 1267 * test/test_session.py
7213     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
7214     Use the cultural_landmark-point.dbf file for the store so that
7215     the table rows and shape count match.
7216    
7217     2003-06-20 Jonathan Coles <[email protected]>
7218    
7219 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
7220     an exception if the number of shapes is different from the
7221     number of rows in the table. Address RTbug #1933.
7222    
7223     * test/test_layer.py (TestLayer.test_derived_store): Add
7224     a test for the new exception in DerivedShapeStore.__init__.
7225    
7226     * test/support.py (FloatTestCase): Removed since there is
7227     already FloatComparisonMixin. Fixes RTbug #1954.
7228     (FloatComparisonMixin.assertFloatEqual): Include test for
7229     infinity that was part of FloatTestCase.
7230    
7231     * test/test_range.py (RangeTest): Inherit from
7232     support.FloatComparisonMixin now that we don't have
7233     support.FloatTestCase.
7234    
7235 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
7236    
7237 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
7238     the implementation in xmlsupport instead.
7239     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
7240    
7241     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
7242     of test_save
7243    
7244     2003-06-20 Bernhard Herzog <[email protected]>
7245    
7246 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
7247     method to make sure the test files we load might have been written
7248     by the current thuban version.
7249     (ClassificationTest.TestLayers, TestSingleLayer.test)
7250     (TestLayerVisibility.test, TestClassification.test)
7251     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
7252     Add check_format() calls and fix the thuban data to match the data
7253     that would be written by saving the session loaded from it.
7254    
7255     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
7256     the same class and function in test_save.
7257    
7258     * test/test_xmlsupport.py (TestEventList): New. test cases for
7259     sax_eventlist
7260    
7261     2003-06-20 Bernhard Herzog <[email protected]>
7262    
7263 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
7264     Thuban are covered by this DTD
7265     (map): Fix content model for layers and raster layers. There can
7266     be any number or layers and raster layers in any order.
7267    
7268 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
7269    
7270 jonathan 1265 This is mainly about fixing RTbug #1949.
7271    
7272 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
7273     import statement since python 2.2 is the earliest supported
7274     version.
7275    
7276     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
7277     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
7278     depending on the units this projection *forwards* into.
7279    
7280     * Thuban/Model/save.py (SessionSaver.write_classification):
7281     Remove unnecessary use of lambdas and nested functions.
7282    
7283     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
7284     adjustment here if the map projection uses degrees.
7285    
7286     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
7287     scale adjust code since it is now done before calling
7288     this method. Don't do anything if the map projection
7289     is None.
7290    
7291 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
7292    
7293 bh 1248 Move version specific load tests to their own file.
7294    
7295     * test/test_load.py: Expand the doc-string to explain a bit how to
7296     handle file format changes.
7297     (TestClassification.test): Update the docstring as this test is
7298     not about Thuban 0.2 anymore.
7299    
7300     * test/test_load_0_2.py: New file with the load tests for thuban
7301     files created with Thuban 0.2 and earlier.
7302    
7303     2003-06-19 Bernhard Herzog <[email protected]>
7304    
7305 bh 1246 Add XML validation to some of the tests. Validation will only be
7306     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
7307     To make the DTD available to the test cases it's moved into
7308     Resources/XML
7309    
7310     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
7311     for versions up to and including 0.2. Two slight changes: added an
7312     encoding specification and fixed the comment which refered to
7313     GRASS, not Thuban
7314    
7315     * test/xmlsupport.py: New support module for tests involving XML.
7316     Currently there's a mix-in class for XML validation.
7317    
7318     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
7319    
7320     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
7321     so that we can validate the
7322     (SaveSessionTest.testEmptySession)
7323     (SaveSessionTest.testSingleLayer)
7324     (SaveSessionTest.testSingleLayer)
7325     (SaveSessionTest.testLayerProjection)
7326     (SaveSessionTest.testRasterLayer)
7327     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
7328    
7329     * test/runtests.py (main): Call print_additional_summary instead
7330     of print_garbage_information
7331    
7332     * test/support.py (resource_dir): New function to return the
7333     "Resource" subdirectory
7334     (print_additional_summary): New function to combine several
7335     summary functions
7336     (run_tests): Use print_additional_summary instead of calling
7337     print_garbage_information directly
7338    
7339     2003-06-19 Bernhard Herzog <[email protected]>
7340    
7341 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
7342     the classification element.
7343     (projection): Add the "name" attribute
7344    
7345 frank 1242 2003-06-19 Frank Koormann <[email protected]>
7346    
7347     MERGE from the greater-ms3 branch.
7348    
7349     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
7350     scale if projection is latlong to get better estimate.
7351    
7352     Fix problem of hidden properties dialog under windows after double
7353     click on layer tree:
7354     The tree control always gets an Expanded / Collapsed event after
7355 joey 2162 the ItemActivated on double click, which raises the main window again.
7356     We add a second ItemActivated event to the queue, which simply
7357 frank 1242 raises the already displayed window.
7358    
7359     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
7360     raiseProperties initialized to prevent endless loops
7361     (LegendTree._OnItemActivated): Depending on self.raiseProperties
7362     simply raise the properties or open the dialog and issue a second
7363     event.
7364    
7365 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
7366    
7367 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
7368    
7369     2003-06-18 Jonathan Coles <[email protected]>
7370    
7371 jonathan 1235 When Thuban loaded the map was redrawn twice because the
7372     legend was being opened after the mainwindow was created
7373     and not during its creation. This meant the map was drawn
7374     initially and then had to be redrawn when the legend
7375     caused the display to change. Now the legend is opened
7376     in the mainwindow constructor which resolves this issue.
7377    
7378     Also, although we were checking for the existence of
7379     gdal and gdalwarp modules, the gdalwarp extension was
7380     still being compiled (which may fail if the system doesn't
7381     have gdal installed). the build_ext command to setup.py
7382     now accepts the flags --with-gdal and --without-gdal.
7383     If --without-gdal is specified setup.py will try to
7384     use the gdal parameters specified by gdal-config. Under
7385     windows, those parameters have to be set in setup.py
7386     as with proj4 an wxWindows.
7387    
7388     * setup.py: Use a list instead of seperate variables for
7389     extension parameters so we can create a generic function
7390     that runs an appropriate *-config script.
7391     (run_cs_script): Renamed from run_wx_script and modified
7392     to accept a second argument which is a list of lists to
7393     be filled in by the values returned from running the command.
7394     (thuban_build_ext): New. Extends the build_ext command and
7395     provides the options --with-gdal/--without-gdal which then
7396     optionally includes the gdalwarp extension.
7397    
7398     * Thuban/Model/resource.py: First check if we can import
7399     the gdalwarp Thuban extension before checking for gdal.
7400     Also added some comments.
7401    
7402     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
7403     the map is None which may be the case if none has been loaded
7404     yet.
7405    
7406     * Thuban/UI/main.py (main): Remove call to ShowLegend.
7407    
7408     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
7409    
7410     * Thuban/UI/renderer.py: Check for gdal support before importing
7411     gdalwarp.
7412     (MapRenderer.render_map): Only try to optimize if we have gdal
7413     support otherwise nothing will get drawn.
7414    
7415 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
7416     during startup before a map has been created. Check if map is None
7417     before using it and do nothing if it is.
7418    
7419 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
7420    
7421     Fix the problem with raster layers under Windows that caused
7422     Thuban to crash. The view should respond to layer projection
7423     changed events to update the display. Changes to a projection
7424     should not cause the map to be set to full extent.
7425    
7426     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7427     current_map_proj to remember the current map projection so that
7428     when the projection changes we know what the previous projection
7429     was.
7430     (MapCanvas.SetMap): Unsubscribe and subscribe to
7431     LAYER_PROJECTION_CHANGED events.
7432     (MapCanvas.projection_changed): Split into two methods that respond
7433     to map and layer projection changes.
7434     (MapCanvas.map_projection_changed): New. Takes the current view and
7435     projects it using the new projection. This does not cause the
7436     map to be redrawn at full extent.
7437     (MapCanvas.layer_projection_changed): New. Cause a redraw which
7438     will draw each layer in its new projection.
7439    
7440     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
7441     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
7442     under Windows.
7443    
7444     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
7445     to twice sizeof(void*) because there are two digits for each
7446     hex byte.
7447    
7448 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
7449    
7450     Update to the layer interface: Direct access to the table,
7451     shapetable, shapefile and filename attributes is now actively
7452     deprecated by issuing deprecation warnings for all places where
7453     this happens.
7454    
7455     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
7456     to the instance variables table, shapetable, shapefile and
7457     filename via __getattr__ so that we can issue a deprecation
7458     warning.
7459     (Layer.SetShapeStore): Don't set the deprecated instance variables
7460     any more
7461     (Layer.SetShapeStore): Don't use deprecated layer instance
7462     variables
7463     (Layer.Destroy): No need to explicitly remove the instance
7464     variables any more
7465     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
7466     instance variables
7467    
7468     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
7469     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
7470     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
7471     use deprecated layer instance variables
7472    
7473     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
7474     deprecated layer instance variables
7475    
7476     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
7477     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
7478     instance variables
7479    
7480     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
7481     deprecated layer instance variables
7482    
7483     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
7484     deprecated layer instance variables
7485    
7486     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
7487     deprecated layer instance variables
7488    
7489     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
7490     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
7491     variables
7492    
7493     * test/runtests.py (main): Turn Thuban's deprecation warnings into
7494     errors so that they're cought by the tests
7495    
7496     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
7497     layer instance variables
7498    
7499 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
7500    
7501     Fix a problem under Windows whereby if the user double-clicks on a
7502     layer in the legend that tree item will expand or collapse as well
7503     as open the layer properties dialog. The state of the tree item
7504     should not be affected.
7505    
7506     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
7507     preventExpandCollapse and subscribe to expanding and collapsing
7508     events.
7509     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
7510     collapsing events and will veto the event if it has been triggered
7511     by the user double clicking on a layer.
7512     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
7513     that an expanding/collapsing event should be vetoed.
7514    
7515 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
7516    
7517     * Thuban/UI/classifier.py (Classifier.OnClose)
7518     (Classifier.map_layers_removed)
7519     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
7520     in OnClose and not in map_layers_removed or
7521     layer_shapestore_replaced to make sure it always happens when the
7522     dialog is closed
7523    
7524 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
7525    
7526 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
7527     the background of the table view appears correctly.
7528    
7529     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
7530     object that can be used by derived classes to place any
7531     controls (including the grid) onto.
7532     (QueryTableFrame.__init__): Use the panel as the parent window
7533     for all the controls. Reparent the grid so that the panel is
7534     the parent. Call UpdateStatusText() to correctly initialize
7535     the status bar.
7536    
7537     2003-06-13 Jonathan Coles <[email protected]>
7538    
7539 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
7540     from wxFrame (as opposed to wxDialog like the other classes)
7541     but otherwise behaves like the other classes. This is needed
7542     for the TableView which isn't really a dialog and needs to
7543     have a status bar and control buttons.
7544    
7545     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
7546     instance variable to keep track of how many rows are selected.
7547     Subscribe once to the the events we are interested in.
7548     (ThubanGrid.OnRangeSelect): Only handle event if event handling
7549     hasn't been turned off.
7550     (ThubanGrid.OnSelectCell): Only handle event if event handling
7551     hasn't been turned off.
7552     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
7553     as an event listener (which changes the event handler stack)
7554     simply set an instance variable to False. This is checked in
7555     the event handlers.
7556     (ThubanGrid.GetNumberSelected): Return the number of currently
7557     selected rows.
7558     (TableFrame): Inherit from ThubanFrame so we can have a
7559     status bar and control buttons.
7560     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
7561     Explicitly set which items are selected in the operator choice and
7562     action choice so there is always a valid selection. Fixes RTbug #1941.
7563     Subscribe to grid cell selection events so we can update the
7564     status bar.
7565     (QueryTableFrame.UpdateStatusText): Update the status bar with
7566     how many rows are in the grid, how many columns, and how many
7567     rows are selected.
7568     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
7569     Call UpdateStatusText when cells are (de)selected.
7570     (QueryTableFrame.OnQuery): Use the string value in the value
7571     combo if either the selected item index is 0 or if the string
7572     cannot be found in the predefined list (this happens if the
7573     user changes the text). Fixes RTbug #1940.
7574     Only turn off the grid event listeners if there a query comes
7575     back with a none empty list of ids. in the case that the list
7576     is empty this causes a grid.ClearSelection() call to actually
7577     clear the grid selection which causes the selected items in
7578     the map to be deselected. Fixes RTbug #1939.
7579    
7580     * test/test_save.py (XMLWriterTest.Encode): Check return values.
7581     Fixes RTbug #1851.
7582    
7583 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
7584    
7585     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
7586     self.selected_shape with the current selection to make sure the
7587     contents of the dialog are up to date when it's shown for the
7588     first time.
7589     The dialog used to work without this by luck. The recent fix to
7590     the connector module 'broke' a 'feature' the identify view was
7591     relying on, i.e that subscribing to a message in response to
7592     receiving a message of that type would mean that the new
7593     subscriber would also be called for the same message.
7594    
7595 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
7596 jonathan 1175
7597 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
7598     the image is rendered. Fixes RTbug #1937.
7599    
7600     2003-06-12 Jonathan Coles <[email protected]>
7601    
7602 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
7603 jonathan 1193 user directory if it doesn't exist on a posix system.
7604     Fixes RTbug #1815.
7605 jonathan 1191
7606     * Thuban/Model/resource.py (get_user_proj_files): Moved the
7607     called to get_application_dir here, so that the directory
7608     will only be called if this method is invoked.
7609    
7610     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
7611     the projfilepath if no projection is selected.
7612    
7613     2003-06-12 Jonathan Coles <[email protected]>
7614    
7615 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
7616     the scalebar if the current map has no projection set.
7617    
7618     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
7619     projfilepath label to just the basename of the projection file
7620     rather than include the entire path.
7621    
7622     * Thuban/Model/resource.py: Fix missed proj functions that
7623     needed to be renamed.
7624    
7625     2003-06-12 Jonathan Coles <[email protected]>
7626    
7627 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
7628     tested if the variable was an instance of Color.
7629    
7630     * Thuban/Model/color.py (Color): Remove commented code that isn't
7631     used.
7632     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
7633     Fixes RTbug #1835.
7634     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
7635     Needed now that the class doesn't inherit from Color.
7636    
7637     2003-06-12 Jonathan Coles <[email protected]>
7638    
7639 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
7640     check unicode strings.
7641    
7642     * test/test_layer.py: Check for existence of gdal.
7643    
7644     2003-06-12 Jonathan Coles <[email protected]>
7645 jonathan 1172
7646     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
7647     that was in load.py
7648 jonathan 1169
7649 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
7650     that was in save.py
7651    
7652     2003-06-12 Jonathan Coles <[email protected]>
7653    
7654 jonathan 1169 This is largely a collection of bug fixes. We also handle the
7655     case where gdal is not on the system. The XMLReader and XMLWriter
7656     classes were moved into there own files to resolve some circular
7657     import references and because they shouldn't really be in the
7658     file that is dediciated to reading/writing session files since
7659     they are also used elsewhere.
7660    
7661     * Thuban/Model/classgen.py: Renamed functions to follow the
7662     function_names_with_underscores style. Fixes RTbug #1903.
7663     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7664    
7665     * Thuban/Model/layer.py: Import gdal only if it available.
7666     (RasterLayer): Handle the case where the gdal library is unavailable.
7667     Addresses RTbug #1877.
7668    
7669     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7670     xmlreader.py.
7671    
7672 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
7673    
7674     This is largely a collection of bug fixes. We also handle the
7675     case where gdal is not on the system. The XMLReader and XMLWriter
7676     classes were moved into there own files to resolve some circular
7677     import references and because they shouldn't really be in the
7678     file that is dediciated to reading/writing session files since
7679     they are also used elsewhere.
7680    
7681     * Thuban/Model/classgen.py: Renamed functions to follow the
7682     function_names_with_underscores style. Fixes RTbug #1903.
7683     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
7684    
7685     * Thuban/Model/layer.py: Import gdal only if it available.
7686     (RasterLayer): Handle the case where the gdal library is unavailable.
7687     Addresses RTbug #1877.
7688    
7689     * Thuban/Model/load.py (XMLReader): Moved into seperate file
7690     xmlreader.py.
7691    
7692 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
7693     file xmlwriter.py.
7694    
7695     * Thuban/Model/resource.py: Renamed functions to following the
7696     function_names_with_underscores style.
7697     (has_gdal_support): New function that returns true if the gdal
7698     library is available. Addresses RTbug #1877.
7699    
7700     * Thuban/UI/application.py (ThubanApplication.OpenSession):
7701     Display a message box if the gdal library is not available, but
7702     only if there are any layers that would use it. Addresses RTbug #1877.
7703    
7704     * Thuban/UI/classgen.py: Use renamed projection resource functions.
7705     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
7706     when using integers versus floats.
7707    
7708     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
7709     determine if the "Add Image Layer" menu option should be
7710     greyed out or not. Addresses RTbug #1877.
7711    
7712     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
7713    
7714     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
7715     optimize if a raster layer is visible. Fixes RTbug #1931.
7716     Only draw the raster layer if the gdal library is available.
7717     Addresses RTbug #1877.
7718    
7719     * test/test_classgen.py: Add tests for generate_singletons,
7720     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
7721     (test_calculate_quantiles): Fix some tests to catch the new
7722     ValueError that is raised.
7723    
7724     * test/test_proj.py: Use renamed projection resource functions.
7725    
7726     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
7727     test for saving classified layers. Fixes RTbug #1902.
7728     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
7729    
7730 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
7731    
7732     Fix for http://intevation.de/rt/webrt?serial_num=1900.
7733    
7734     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
7735    
7736     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
7737     multiplechoicedialog.py rather than from the wxPython library.
7738    
7739 frank 1151 2003-06-11 Frank Koormann <[email protected]>
7740    
7741 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
7742     update.
7743    
7744     2003-06-11 Frank Koormann <[email protected]>
7745    
7746 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
7747     determine the absolute .thuban/thuban directory under
7748     "posix" (os.expanduser) and "nt" (read AppData registry key).
7749    
7750     * Thuban/Model/resource.py: Use get_application_dir
7751    
7752     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7753     Use get_application_dir.
7754    
7755 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
7756    
7757 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
7758     the messages MAP_LAYERS_REMOVED messages
7759     (LayerTableFrame.OnClose): Unsubscribe from it.
7760     (LayerTableFrame.map_layers_removed): New. Receiver for
7761     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
7762     dialog is showing is removed.
7763    
7764     2003-06-10 Bernhard Herzog <[email protected]>
7765    
7766 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
7767     of the receivers list so that unsubscribing in a receiver doesn't
7768     modify it while iterating over it.
7769    
7770     * test/test_connector.py
7771     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
7772     unsubscribing in a receiver works correctly. See docstring for
7773     details
7774    
7775     2003-06-10 Bernhard Herzog <[email protected]>
7776    
7777 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
7778     message.
7779    
7780     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
7781     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
7782     LAYER_CHANGED will still be sent if the classification changes.
7783    
7784     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
7785     parameter so we can subscribe to some of its messages
7786     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
7787     and the layer's LAYER_SHAPESTORE_REPLACED
7788     (Classifier.unsubscribe_messages): New. Unsubscribe from message
7789     subscribed to in __init__
7790     (Classifier.map_layers_removed)
7791     (Classifier.layer_shapestore_replaced): receivers for the messages
7792     subscribed to in __init__. Unsubscribe and close the dialog
7793    
7794     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
7795     the map to the Classifier dialog
7796    
7797     * test/test_layer.py (SetShapeStoreTests): Derive from
7798     SubscriberMixin as well so we can test messages
7799     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
7800     messages
7801     (SetShapeStoreTests.tearDown): Clear the messages again
7802     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
7803     for the modified flag too
7804     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
7805     to check whether SetShapeStore sets the modified flag
7806     (SetShapeStoreTests.test_set_shape_store_different_field_name)
7807     (SetShapeStoreTests.test_set_shape_store_same_field)
7808     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
7809     Add tests for the messages. This checks both the new
7810     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
7811    
7812 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
7813    
7814     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
7815     the menu items.
7816    
7817 frank 1134 2003-06-05 Frank Koormann <[email protected]>
7818    
7819 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7820     Layout reimplemented without panel. Make life easier to fit the list
7821     in the dialog.
7822    
7823     2003-06-05 Frank Koormann <[email protected]>
7824    
7825 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
7826     once on initialisation (Former implementation resulted in multiple
7827     entries for each projection).
7828     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
7829     if set, select the projection found under the specified name. This
7830     overwrites any other selection estimate.
7831     Removed projchoice filling from this method.
7832     (ProjFrame._OnSave, ProjFrame._OnAddToList):
7833     Updated call of ProjFrame.__FillAvailList
7834     (LCCPanel._DoLayout): Moved parameter controls in more common order.
7835    
7836     * Resources/Projections/defaults.proj: Extended defaults representing
7837     various common European projections.
7838    
7839     2003-06-05 Frank Koormann <[email protected]>
7840    
7841 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7842     Use ListCtrl instead of GridCtrl
7843    
7844     * Thuban/Model/resource.py:
7845     Guess location of .thuban directory from tempdir parent directory.
7846    
7847     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
7848     Guess location of .thuban directory from tempdir parent directory.
7849    
7850 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
7851    
7852     Do not cache the values returned by the tree widget's
7853     GetFirstChild and GetNextChild methods because it led to lots of
7854     segfaults. The new way requires more brute force but is more
7855     reliable.
7856    
7857     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
7858     variable layer2id
7859     (LegendTree.find_layer): New method to do with brute force what
7860     layer2id tried to accomplish
7861     (LegendTree._OnMsgLayerChanged)
7862     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
7863     Use find_layer instead of layer2id
7864     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
7865     update layer2id anymore
7866     (LegendTree._OnMsgMapLayersRemoved)
7867     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
7868    
7869 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
7870    
7871     * Thuban/Model/classgen.py (GenQuantiles0): New function.
7872    
7873 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
7874    
7875 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
7876     New commands.
7877     (main_menu): Add the new commands.
7878     (MainWindow.TableRename): New. Implementation of the table_rename
7879     command.
7880     (MainWindow.RenameLayer): New. Implementation of the layer_rename
7881     command.
7882    
7883     * Thuban/Model/session.py (Session.AddTable): call self.changed to
7884     set the modified flag
7885    
7886     * test/test_session.py (TestSessionSimple.test_add_table): Test
7887     whether the modified flag is set properly
7888    
7889     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
7890     instead of issue so that the modified flags get updated.
7891    
7892     * test/test_base.py (SomeTitledObject): Derive from Modifiable
7893     instead of Publisher to reflect reality better and to accomodate
7894     the fact that SetTitle now calls changed instead of issue
7895    
7896     2003-06-02 Bernhard Herzog <[email protected]>
7897    
7898     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
7899     acquisition has to happen before the try in a try-finally.
7900    
7901     2003-06-02 Bernhard Herzog <[email protected]>
7902    
7903 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
7904     possible that a layer is removed that is not currently selected in
7905     the legend so don't check for this.
7906    
7907 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
7908    
7909 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
7910     variables to None that have direct or indirect references to
7911     shapefiles or dbf files to make sure that they do go away and the
7912     files are closed.
7913    
7914     2003-05-30 Bernhard Herzog <[email protected]>
7915    
7916 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
7917     availImgListIndices when a new image list is created
7918    
7919     2003-05-30 Bernhard Herzog <[email protected]>
7920    
7921 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
7922     changing_selection to indicate whether the LegendTree code itself
7923     is currently changing the selection
7924     (LegendTree.normalize_selection): New method to normalize the
7925     selection by selecting the layer item even if the user clicked on
7926     the classification.
7927     (LegendTree._OnSelChanged): normalize the selection. This works
7928     around a bug in wx which doesn't keep track of the selection
7929     properly when subtrees are deleted.
7930    
7931     2003-05-30 Bernhard Herzog <[email protected]>
7932    
7933 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
7934     maximum and minimum scale factors.
7935    
7936     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
7937     changes in classgen.py
7938    
7939 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
7940    
7941     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
7942     all the methods functions. Fixes RTBug #1903.
7943    
7944     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
7945     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
7946     RTBug #1907.
7947    
7948     * Thuban/UI/classgen.py: Use classgen functions that were part
7949     of the ClassGenerator class. Put try/finally blocks around
7950     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
7951     RTBug #1904.
7952    
7953     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
7954    
7955     * Thuban/UI/legend.py: The legend was cleared and repopulated any
7956     time something changed which caused some state to be lost such
7957     as which children were expanded or collapsed. Fixes RTBug #1901.
7958     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
7959     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
7960     the legend but not in the map.
7961     (LegendTree.__FillTree): Move main functionality out into smaller
7962     methods that can be used by other methods.
7963     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
7964     if they are available.
7965     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
7966     that we override the wxTreeCtrl method. Iterate over children
7967     and call __RemoveLayer.
7968     (LegendTree.__AddLayer): New. Add a new layer to the legend.
7969     (LegendTree.__RemoveLayer): Remove a layer from the legend.
7970     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
7971     Should only be called with the id of a layer branch.
7972     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
7973     Returns the root item or creates one if necessary.
7974    
7975     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
7976     ProjectRasterFile with tuple arguments instead of strings.
7977    
7978     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
7979     with try/finally. Fixes RTBug #1904.
7980    
7981     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
7982     with try/finally. Fixes RTBug #1904.
7983     (MapCanvas.FitSelectedToWindow): If a single point is selected
7984     simply center it on the display. Fixes RTBug #1849.
7985    
7986     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
7987     to be compiled as a standalone app. Now the code can only be
7988     called from Python which simplifies the parameter passing.
7989     (ProjectRasterFile): Handle Python arguments. Remove code that
7990     checks for a destination dataset. Add more clean up code.
7991    
7992     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
7993     TestMapWithContents.test_lower_layer_bottom):
7994     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
7995     Fixes RTBug #1907.
7996    
7997     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
7998     extent to the map when the legend is toggled. Fixes RTBug #1881.
7999    
8000 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
8001    
8002     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
8003     unsubscribes all that is subcribed in __init__.
8004    
8005 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
8006    
8007 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
8008     (MainWindow.CanDuplicateLayer): New methods to implement the
8009     Layer/Duplicate command.
8010     (layer_duplicate command): New.
8011     (main_menu): Add layer_duplicate to the Layer menu.
8012    
8013     2003-05-28 Bernhard Herzog <[email protected]>
8014    
8015 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
8016     renderer so that NULL/None values get displayed differently (by a
8017     gray rectangle).
8018     (TableGrid.__init__): Override the default renderers
8019    
8020     2003-05-28 Bernhard Herzog <[email protected]>
8021    
8022 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
8023     classification to "None" if the type of the field has changed.
8024    
8025     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
8026     test for the Layer.SetShapeStore method
8027    
8028 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
8029 jan 1085
8030 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
8031     does not necessarily have a filename).
8032    
8033     2003-05-28 Jan-Oliver Wagner <[email protected]>
8034    
8035 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
8036     sort the selection list for the dialog.
8037    
8038 frank 1083 2003-05-28 Frank Koormann <[email protected]>
8039    
8040     * extensions/thuban/wxproj.cpp
8041     (project_point): Removed cast to int for projected point coordinates.
8042     (shape_centroid): Return last point if all polygon vertices fall
8043     to one point.
8044    
8045 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
8046    
8047 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
8048     with layers that don't have shapestores, i.e. raster layers.
8049    
8050     2003-05-28 Bernhard Herzog <[email protected]>
8051    
8052 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
8053     when determining the title from the filename.
8054    
8055     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
8056     reflect changes in the way the title is derived from the filename
8057    
8058 frank 1077 2003-05-28 Frank Koormann <[email protected]>
8059    
8060     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
8061     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
8062    
8063 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
8064    
8065 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
8066     delegate SelectedLayer.
8067     (MainWindow.LayerUnjoinTable): Implement.
8068     (_can_unjoin): New. Helper function for the sensitivity of the
8069     layer/unjoin command.
8070    
8071     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
8072     (DerivedShapeStore.OrigShapeStore): New. Return the original
8073     shapestore. Used to figure out how to unjoin.
8074     (DerivedShapeStore.Shapefile): Fix a typo.
8075    
8076     2003-05-27 Bernhard Herzog <[email protected]>
8077    
8078 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
8079     well
8080     (JoinDialog.__init__): Use the layer parameter and only build the
8081     left choice when a layer is given
8082     (JoinDialog.OnJoin): Handle layer joins as well
8083     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
8084     that the user selects the "Select..." item. The sensitivitly
8085     updating is now in update_sensitivity
8086     (JoinDialog.y): New method to refactor the sensitivity update of
8087     the join button into its own method.
8088    
8089     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
8090    
8091     2003-05-27 Bernhard Herzog <[email protected]>
8092    
8093 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
8094     iff there are unreferenced tables in the session
8095    
8096     2003-05-27 Bernhard Herzog <[email protected]>
8097    
8098 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
8099    
8100     * Thuban/Model/session.py (Session.UnreferencedTables): New method
8101     to return tables that are not referenced by other tables or shape
8102     stores and can be removed.
8103     (Session.RemoveTable): Issue a TABLE_REMOVED message after
8104     removing the table
8105    
8106     * Thuban/UI/mainwindow.py: Remove unused imports
8107     (MainWindow.TableClose): Implement.
8108    
8109     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
8110     messages so that the frame will be automatically closed when a new
8111     session is opened or the table is removed.
8112     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
8113     __init__
8114     (TableFrame.close_on_session_replaced)
8115     (TableFrame.close_on_table_removed): New. Subscribers that close
8116     the window
8117    
8118     * test/test_session.py (TestSessionMessages.test_remove_table)
8119     (TestSessionSimple.test_remove_table): Move the test to
8120     TestSessionSimple and add test for the TABLE_REMOVED message
8121     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
8122     (TestSessionSimple.test_unreferenced_tables) New. Test for the
8123     UnreferencedTables method.
8124     (UnreferencedTablesTests): New. Class with some more sophisticated
8125     tests for UnreferencedTables.
8126    
8127 frank 1065 2003-05-27 Frank Koormann <[email protected]>
8128    
8129 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
8130     display has some unwanted side effects. Removed again.
8131    
8132     2003-05-27 Frank Koormann <[email protected]>
8133    
8134 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
8135    
8136     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
8137    
8138 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
8139    
8140 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
8141     Menu.RemoveItem().
8142 jan 1062
8143 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
8144     the menu.
8145 jan 1062
8146 frank 1059 2003-05-27 Frank Koormann <[email protected]>
8147    
8148     Nonmodal dialogs without parent (i.e. they can fall behind the main
8149     window)
8150    
8151     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
8152     all dialogs in the dialogs dictionary and the canvas.
8153    
8154     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
8155     parent, i.e. can fall behind other windows.
8156     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
8157     dictionary before removing it.
8158    
8159     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
8160    
8161     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
8162     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
8163     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
8164    
8165 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
8166    
8167 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
8168     tableview dialog
8169     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
8170     Also, don't use the table's titles as the dialog names. The titles
8171     aren't guaranteed to be unique.
8172     (MainWindow.TableOpen): Open a table view dialog after opening the
8173     table
8174    
8175     2003-05-27 Bernhard Herzog <[email protected]>
8176    
8177 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
8178     effect can be achieved by simply closing the window showing the
8179     table.
8180     (MainWindow.TableHide): Removed.
8181     (main_menu): Removed "table_hide"
8182    
8183 frank 1051 2003-05-27 Frank Koormann <[email protected]>
8184    
8185     Fix legend tree display problems under Win32
8186    
8187     * Thuban/UI/legend.py: BMP_SIZE_W = 15
8188     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
8189     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
8190    
8191     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
8192    
8193 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
8194    
8195     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
8196     'after' now allows to insert separators almost anywhere in the menu.
8197    
8198 frank 1046 2003-05-27 Frank Koormann <[email protected]>
8199    
8200     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
8201     "S" of selection box label to hint on hot key (Alt-S). Works under
8202     Win32 but is ignored under GTK.
8203    
8204     2003-05-26 Frank Koormann <[email protected]>
8205    
8206     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
8207     Center Choices.
8208    
8209 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
8210    
8211 bh 1044 Remove the Precision methods again. They're too DBF specific to be
8212     part of the table interface and they're only used in table_to_dbf
8213     anyway.
8214    
8215     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
8216     fixed precision of 12 for doubles.
8217     (TransientTableBase.Precision): Removed
8218     (AutoTransientTable.Width): Delegate to self.table.
8219    
8220     * Thuban/Model/table.py (DBFTable.Precision)
8221     (MemoryTable.Precision): Removed.
8222     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
8223     (table_to_dbf): Use a fixed precision of 12 for floats unless the
8224     column object specifies something else.
8225    
8226     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
8227     test for table_to_dbf
8228    
8229     2003-05-26 Bernhard Herzog <[email protected]>
8230    
8231     * test/test_transientdb.py
8232     (TestTransientTable.run_iceland_political_tests): Fix a comment.
8233    
8234     2003-05-26 Bernhard Herzog <[email protected]>
8235    
8236 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
8237     implementation. Mark parts of the file format strings for
8238     localization.
8239    
8240     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
8241     file and add the table to the tables managed by the session
8242    
8243 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
8244     New. test case for OpenTableFile
8245    
8246 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
8247    
8248 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
8249     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
8250     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
8251     Replace the true/false of wxWindows by True/False of Python 2.2.1.
8252    
8253     2003-05-26 Jan-Oliver Wagner <[email protected]>
8254    
8255 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
8256     already a selection present, update the grid accordingly.
8257 jan 1033
8258     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
8259     resizeable and increase its initial size.
8260    
8261 frank 1030 2003-05-26 Frank Koormann <[email protected]>
8262    
8263     Table export functionality
8264    
8265     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
8266     Return width (in characters) for a column.
8267     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
8268     (table_to_dbf): Write table to dbf file.
8269     (table_to_csv): Write table to csv file.
8270    
8271     * Thuban/Model/transientdb.py (TransientTableBase.Width,
8272     TransientTableBase.Precision): Return column width and precision.
8273    
8274     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
8275     or table_to_csv depending on file selection.
8276    
8277     * test/test_dbf_table.py:
8278     Test table_to_dbf (extension of former part of test).
8279    
8280     * test/test_csv_table.py:
8281     Test table_to_csv.
8282    
8283 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
8284    
8285 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
8286     Use QueryTableFrame instead of TableFrame.
8287 jan 1021
8288 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
8289     table window with 'Layer Table:' instead of 'Table:'.
8290    
8291     2003-05-23 Jan-Oliver Wagner <[email protected]>
8292    
8293     Give all tables a title via mix-in TitledObject.LayerShowTable
8294    
8295 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
8296     only if it exists.
8297    
8298     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
8299     and call its init-method with a default title. Remove Title() method.
8300    
8301     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
8302     AutoTransientTable): mix-in TitledObject and call its init-method with
8303     a default title. Remove Title() method.
8304    
8305 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
8306    
8307     * Thuban/Model/session.py (Session.AddShapeStore): Define
8308     AddShapeStore analogously to AddTable.
8309    
8310     * test/test_session.py (TestSessionSimple.test_add_shapestore):
8311     New. Test for AddShapeStore
8312    
8313 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
8314    
8315     Introducing QueryTableFrame and a very coarse ShowTable implementation.
8316    
8317     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
8318     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
8319     The latter implements the selection GUI without dependency on a layer.
8320     LayerTableFrame now is derived from QueryTableFrame and connects
8321     to a layer.
8322    
8323     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
8324     implementation that still needs work.
8325    
8326     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
8327    
8328 frank 1011 2003-05-22 Frank Koormann <[email protected]>
8329    
8330     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
8331     Added "outer_join = False" as optional parameter.
8332     (TransientJoinedTable.create): If outer join is true, perform a
8333     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
8334     the left table. Records not matching are filled with 0 / None.
8335    
8336     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
8337     (JoinDialog.OnJoin): Consider outer join check box.
8338    
8339 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
8340    
8341 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
8342     somewhat safer way. Storing the traceback in a local variable can
8343     lead to memory leaks
8344    
8345     2003-05-22 Bernhard Herzog <[email protected]>
8346    
8347 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
8348     the wxMessageDialog's Destroy() method.
8349    
8350 frank 1004 2003-05-22 Frank Koormann <[email protected]>
8351    
8352     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
8353     TransientTable.Title()
8354    
8355     2003-05-22 Frank Koormann <[email protected]>
8356    
8357     Join Dialog, initial version.
8358    
8359     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
8360    
8361     * Thuban/UI/join.py (JoinDialog): Functional implementation of
8362     former framework. Renamed Table1/Table2 to LeftTable/RightTable
8363     in all occurences.
8364    
8365     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
8366     Typo fixed.
8367    
8368 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
8369    
8370 bh 999 Give the tables titles so that the GUI can display more meaningful
8371     names. For now the titles are fixed but depend on e.g. filenames
8372     or the titles of the joined tables.
8373    
8374     * Thuban/Model/transientdb.py (TransientTable.Title)
8375     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
8376    
8377     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
8378    
8379     * test/test_transientdb.py
8380     (TestTransientTable.test_auto_transient_table_title): New. Test
8381     for the Title method
8382     (TestTransientTable.test_transient_joined_table)
8383     (TestTransientTable.test_transient_table): Add test for the Title
8384     methods
8385    
8386     * test/test_memory_table.py (TestMemoryTable.test_title): New.
8387     Test for the Title method
8388    
8389     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
8390     the Title method
8391    
8392     2003-05-22 Bernhard Herzog <[email protected]>
8393    
8394 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
8395     Provide a better way to destroy the layers
8396     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
8397     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
8398     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
8399     the new way to destroy the layers.
8400     (TestLayer.test_derived_store): New. Test for using a layer with a
8401     DerivedShapeStore
8402    
8403     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
8404     filename if the shape store actually has one.
8405    
8406     2003-05-22 Bernhard Herzog <[email protected]>
8407    
8408 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
8409     for the filename
8410    
8411     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
8412     for the FileName method
8413     (TestDBFTableWriting.test_write): Fix spelling of filename
8414    
8415 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
8416    
8417     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
8418     from SciParam that now really is immutable.
8419    
8420 frank 992 2003-05-22 Frank Koormann <[email protected]>
8421    
8422     Layer Top/Bottom placement added to legend.
8423    
8424     * Thuban/UI/legend.py
8425     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
8426     bound to tool events.
8427     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
8428     New, methods binding the event methods with the map methods.
8429    
8430     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
8431     layer at top/bottom of layer stack.
8432    
8433     * Resources/Bitmaps/top_layer.xpm: New button icon.
8434    
8435     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
8436    
8437 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
8438    
8439     * Thuban/Model/session.py (Session.RemoveTable): New method to
8440     remove tables
8441    
8442     * test/test_session.py (TestSessionSimple.test_remove_table): New.
8443     Test for RemoveTable
8444    
8445 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
8446    
8447     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
8448     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
8449    
8450 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
8451    
8452 bh 985 Implement a way to discover dependencies between tables and
8453     shapestores.
8454    
8455     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
8456     (TransientJoinedTable.Dependencies)
8457     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
8458     interface
8459     (TransientJoinedTable.__init__): Keep tack of the original table
8460     objects in addition to the corresponding transient tables.
8461    
8462     * Thuban/Model/table.py (DBFTable.Dependencies)
8463     (MemoryTable.Dependencies): New. Implement the dependencies
8464     interface
8465    
8466     * Thuban/Model/data.py (ShapeTable): New. Helper class for
8467     ShapefileStore
8468     (ShapefileStore.__init__): Use ShapeTable instead of
8469     AutoTransientTable
8470     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
8471     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
8472     methods for filename and type
8473     (ShapefileStore.Dependencies): New. Implement the dependencies
8474     interface
8475     (DerivedShapeStore): New class to replace SimpleStore. The main
8476     difference to SimpleStore is that it depends not on a shapefile
8477     but another shapestore which expresses the dependencies a bit
8478     better
8479     (SimpleStore.__init__): Add deprecation warning.
8480    
8481     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
8482     Test for the Dependencies method.
8483    
8484     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
8485     New. Test for the Dependencies method.
8486    
8487     * test/test_transientdb.py
8488     (TestTransientTable.test_auto_transient_table_dependencies): New.
8489     Test for the Dependencies method.
8490     (TestTransientTable.test_transient_joined_table): Add test for the
8491     Dependencies method.
8492    
8493     * test/test_session.py (TestSessionSimple.setUp)
8494     (TestSessionSimple.tearDown): New. Implement a better way to
8495     destroy the sessions.
8496     (TestSessionSimple.test_initial_state)
8497     (TestSessionSimple.test_add_table): Bind session to self.session
8498     so that it's destroyed by tearDown
8499     (TestSessionSimple.test_open_shapefile): New. Test for
8500     OpenShapefile and the object it returns
8501    
8502     2003-05-22 Bernhard Herzog <[email protected]>
8503    
8504 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
8505     register tables with the session.
8506     (Session.Tables): Return the tables registered with AddTable too.
8507    
8508     * test/test_session.py (TestSessionSimple.test_add_table): New.
8509     Test case for the AddTable method
8510    
8511 frank 981 2003-05-22 Frank Koormann <[email protected]>
8512    
8513     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
8514     lower right corner, center labels for selections, initialize controls
8515     in reasonable order for keyboard navigation.
8516    
8517     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
8518     (ProjFrame.__DoOnProjAvail): Determine position of current projection
8519     using the wxListBox.FindString() method. Still a problem (#1886)
8520    
8521     * Thuban/UI/classifier.py
8522     (Classifier.__init__, SelectPropertiesDialog.__init__)
8523    
8524     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
8525     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
8526     different classification types from here to __init__.
8527     (GenUniquePanel.__init__): Set the column width of the first field
8528     in the Field ListCtrl to the full width.
8529    
8530     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
8531     Button to 'Export'. Center Buttons in Selection Box, set Focus to
8532     Grid.
8533     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
8534     changes focus to the Selection when pressing "Alt-S".
8535    
8536     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
8537     the text if not visible. The italic font sometimes exceeds the
8538     rendering area.
8539    
8540 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
8541 jonathan 971
8542 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
8543     to OnClose so that Thuban closes correctly.
8544    
8545     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
8546     DockFrame.OnClose, not DockFrame._OnClose.
8547    
8548     2003-05-21 Jonathan Coles <[email protected]>
8549    
8550 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
8551     references to 'inf' and use new Range __init__ to pass floats
8552     directly rather than converting them to strings first.
8553     Fixes RTBug #1876.
8554    
8555     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
8556     Use new Range ___init__ to pass floats.
8557    
8558     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
8559     filename is a valid image file. Throw IOError otherwise.
8560    
8561     * Thuban/Model/range.py: Brought over new Range from SciParam that
8562     is immutable and has an __init__ which can accept floats.
8563    
8564     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
8565     into try block. AddLayer doesn't throw any exceptions anymore.
8566     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
8567     try block.
8568    
8569     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
8570     the first item in choices. Fixes RTBug #1882.
8571    
8572     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
8573     has gone to 0 which is a serious problem. abort.
8574     (MapRenderer.draw_raster_layer): Catch IOError seperately and
8575     print the error from GDAL.
8576    
8577     * Thuban/UI/tableview.py (TableGrid.__init__): Call
8578     ToggleEventListeners to turn on listening.
8579     (TableGrid.ToggleEventListeners): New. Turns event listening on
8580     and off so as to prevent excessive messages.
8581     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
8582     to suppress excessive messages when selecting many rows.
8583     Fixes RTBug #1880.
8584    
8585     * Thuban/UI/view.py: Added checks against if scale == 0. This
8586     is a serious problem that can occur when an image without
8587     geo data is loading and causes the map projection bounds to
8588     go to infinity. Right now, the solution is to simply try
8589     to recover.
8590    
8591     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
8592     to set the MFILEReceiver attributes even if the data is NULL.
8593    
8594     * extensions/thuban/gdalwarp.cpp: Improved the error handling
8595     and passed GDAL messages back up to the Python layer. Also
8596     tried to fix some memory leaks that were present in the original
8597     utility but didn't matter because the program aborted.
8598    
8599     * test/test_range.py: Copied over tests from SciParam. Removed
8600     tests against importing. Fixes RTBug #1867.
8601    
8602 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
8603    
8604     * test/test_load.py: Remove unused imports and restructure the
8605     test code
8606     (LoadSessionTest): Split into one class for each test and turn
8607     LoadSessionTest itself into the base class for all such session
8608     tests.
8609     (ClassificationTest): New base class for load tests that test
8610     classifications
8611     (TestSingleLayer, TestLayerVisibility, TestClassification)
8612     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
8613     for the individual tests
8614    
8615     * test/support.py (FileLoadTestCase.filename): New base class for
8616     file loading tests
8617    
8618 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
8619    
8620     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
8621     Mercator' to 'UTM Zone 32' as a more convenient example.
8622     Added 'Gauss Krueger Zone 6'.
8623    
8624     * Data/iceland_sample_raster.thuban: political polygon now
8625     filled transparent to have the raster image visible at once.
8626    
8627 frank 952 2003-05-21 Frank Koormann <[email protected]>
8628    
8629     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
8630     OnClose() to keep in sync with extensions. Internally Thuban
8631     still uses "underscored" names.
8632    
8633 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
8634    
8635     This puts back Raster layer support. These layers support projections
8636     through the GDAL library. Currently, the CVS version is being used.
8637     There are no Debian packages available although this may change soon.
8638     A GDAL driver was extended to support writing to memory rather to
8639     files.
8640    
8641     There is still some work that needs to be done, such as some error
8642     handling when loading invalid images or when there is a problem
8643     projecting the image. This putback simply checks in the majority
8644     of the work.
8645    
8646     * setup.py: Add gdalwarp library extension.
8647    
8648     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
8649     Defaults to False, but can be overridden by subclasses if they
8650     support classification.
8651     (RasterLayer): New. Defines a new layer that represents an
8652     image.
8653    
8654     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
8655     tag handler.
8656     (SessionLoader.start_layer): Encode the filename.
8657     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
8658     New. Supports reading a rasterlayer tag.
8659    
8660     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
8661    
8662     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
8663     get a string in Latin1. If we get such as string convert it to
8664     unicode first, otherwise leave if alone before encoding.
8665     (SessionSaver.write_layer): Add support for writing both Layers
8666     and RasterLayers.
8667    
8668     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
8669     The right argument may not be a string, it could also be a Column.
8670    
8671     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
8672     Make initial window size 600x400. Fixes RTBug #1872.
8673    
8674     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
8675     the dialog is constructed so that we can support layers that
8676     do not have classifications.
8677     (Classifier._OnTry): Only build a classification if the layer
8678     supports one.
8679    
8680     * Thuban/UI/legend.py: Change all checks that a layer is an
8681     instance of Layer into checks against BaseLayer.
8682     (LegendTree.__FillTreeLayer): Only add children to a branch if
8683     the layer supports classification.
8684    
8685     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
8686     MainWindow.OpenSession): Don't proceed with an action if the
8687     user chooses Cancel when they are asked to save changes.
8688     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
8689     user to select an image file. Create a new RasterLayer and add
8690     it to the map.
8691    
8692     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
8693     for rendering RasterLayer layers.
8694     (MapRenderer.draw_raster_layer): Actually method that calls
8695     the GDALWarp python wrapper and constructs an image from the
8696     data returned.
8697    
8698     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
8699     Choices symbols to match those used in the table query method.
8700     Replace deprecated method calls on table with new method names.
8701    
8702     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
8703     how small the scale can get. This still needs more testing.
8704    
8705     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
8706     Provides a driver to output in .bmp format.
8707    
8708     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
8709     New. Provides IO routines which write to memory, rather than a file.
8710    
8711     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
8712     of the gdalwarp utility provided in GDAL. Added function calls
8713     that can be accessed from python.
8714    
8715     * Data/iceland_sample_raster.thuban: New. Sample file that uses
8716     a raster layer.
8717    
8718     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
8719     layer image data.
8720    
8721     * Doc/thuban.dtd: Added rasterlayer attribute definition.
8722    
8723     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
8724     tests associated with the raster layer code.
8725    
8726     * test/test_transientdb.py
8727     (TestTransientTable.test_auto_transient_table_query): Added a test
8728     for using a Column object as the "right" parameter to a query.
8729    
8730 frank 924 2003-05-19 Frank Koormann <[email protected]>
8731    
8732 frank 927 * Thuban/version.py (get_changelog_date):
8733     Catch exceptions if ChangeLog does not exist.
8734    
8735     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
8736    
8737     2003-05-19 Frank Koormann <[email protected]>
8738    
8739 frank 924 Extended version information for Thuban
8740    
8741     * Thuban/version.py: New, version information for Thuban: Last
8742     modification date and last ChangeLog entry date.
8743    
8744     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
8745     information: Display Thuban, wxPython and Python version.
8746    
8747 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
8748    
8749 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
8750     __future__ import for nested_scopes as Thuban relies on Python 2.2
8751     now.
8752     (XMLWriter.encode): Remove the special case for a None argument.
8753     In the saver encode is always called with a string argument.
8754    
8755     2003-05-16 Bernhard Herzog <[email protected]>
8756    
8757 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
8758     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
8759     of the bug was that e.g. float("1.2") would fail. Thuban now
8760     requires 2.4.x.
8761    
8762 frank 917 2003-05-16 Frank Koormann <[email protected]>
8763    
8764     Printing enhancement and WMF export (under Win32)
8765    
8766     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
8767     ScreenRenderer. Renders Map, Legend and Scalebar for export.
8768     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
8769     PrintRender.
8770    
8771     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
8772     to fullfil information needed for PrinterRenderer.
8773     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
8774     (MapCanvas.Print): Adapted to new MapPrintout.
8775     (OutputTransform): General calculations to transform from canvas
8776     coordinates to export/printing devices.
8777    
8778     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
8779     new method_command to call ExportMap, with platform dependency (only
8780     __WXMSW__)
8781    
8782     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
8783     of scalebar drawing area as new parameters.
8784    
8785     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
8786    
8787     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
8788     Update to extended scalebar.DrawScalebar header.
8789    
8790     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
8791    
8792     * test/test_scalebar.py: Made test executable as standalone.
8793    
8794 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
8795    
8796     * Thuban/Model/table.py (Table): Remove this compatibility alias
8797     for DBFTable.
8798    
8799     * test/test_table.py: Import DBFTable as Table because that alias
8800     doesn't exist anymore.
8801    
8802     * Thuban/UI/classgen.py: Remove some unused imports
8803    
8804 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
8805    
8806     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
8807     Fix docstring.
8808     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
8809     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
8810     values of the supplied range to determine the beginning and end
8811     bounds of the generated classes.
8812    
8813     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
8814     do not have a leading 0 (.5 is now accepted as well as 0.5).
8815    
8816     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
8817     call to ClassGenerator.GenUniformDistribution.
8818    
8819     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
8820     layout bug with the 'Projection' label.
8821    
8822     * test/support.py (FloatTestCase): New. Needed for the Range tests.
8823    
8824     * test/test_range.py: New. Imported from SciParam.
8825    
8826 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
8827    
8828 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
8829     to table.UniqueValues() with calls that retrieve all the values
8830     from the table. This will need to be replaced by a method on table
8831     which can simply return the list (perhaps more efficiently).
8832    
8833     2003-05-12 Jonathan Coles <[email protected]>
8834    
8835 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
8836     Refer to the documentation for details.
8837    
8838     * test/test_classgen.py: Modified Quantile tests to use the
8839     new return values.
8840    
8841     * Thuban/Model/classgen.py
8842     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
8843     use new return values from CalculateQuantiles to produce the correct
8844     range bounds in the Classification.
8845     (ClassGenerator.CalculateQuantiles): Add more comments describing
8846     the return values and parameters. Make minor adjustments to improve
8847     the legibility of the code. Fix problem with adjusted not being set
8848     in most cases.
8849    
8850 frank 893 2003-05-12 Frank Koormann <[email protected]>
8851    
8852     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
8853     and latin1. Fixes #1851 finally.
8854    
8855 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
8856    
8857 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
8858    
8859     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
8860     Clean up debugging statement, add comments, fix a small bug in the
8861     returned adjusted percentiles.
8862    
8863     2003-05-09 Jonathan Coles <[email protected]>
8864    
8865 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
8866     and such ranges can now be saved and loaded from disk.
8867    
8868     Quantiles are now available in the Classification Generator.
8869    
8870     Initial support for building Queries on a table. Doesn't do anything
8871     but run some tests.
8872    
8873     * Thuban/Model/classification.py: Explicit imports.
8874     (ClassGroupRange): Use the Range class to store the underlying
8875     range information. The interface remains the same, except for
8876     GetRange(), and you can also supply a Range object as the min
8877     parameter to SetRange or __init__.
8878    
8879     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
8880     string appropriately for use in Thuban. Fixes RTbug #1851.
8881     (SessionLoader.end_projection): Handle the context of the
8882     projection tag a bit better by looking at what objects are not
8883     None. There was an assumption that a projection tag for a map
8884     could occur before any layers.
8885     (SessionLoader.start_clrange): Provide backward compatibility for
8886     reading min/max values as well as the new range parameter.
8887    
8888     * Thuban/Model/map.py: Explicit imports.
8889    
8890     * Thuban/Model/resource.py: Import _.
8891     (ProjFileSaver.write): write header using projfile.dtd.
8892    
8893     * Thuban/Model/save.py: Explicit imports.
8894     (XMLWriter.encode): New. Encode the given string from a format
8895     used by Thuban into UTF-8. Fixes RTbug #1851.
8896    
8897     * Thuban/UI/classgen.py: Explicit imports.
8898     (ClassGenDialog.__init__): Clean up the code and add support
8899     for Quantiles.
8900     (ClassGenDialog.OnOK): Add support for Quantiles.
8901     (GenQuantilesPanel): New. Input panel for Quantiles.
8902     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
8903     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
8904    
8905     * Thuban/Model/classgen.py: New. Contains all the classes named above.
8906    
8907     * Thuban/UI/classifier.py: Explicit imports.
8908     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
8909     ClassTable.SetValueAsCustom): Reworked to use new Range class.
8910    
8911     * Thuban/UI/legend.py: Explicit imports.
8912    
8913     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
8914     a Table menu and associated method calls.
8915     (MainWindow.choose_color): Removed. No longer needed.
8916    
8917     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
8918     should be disabled if no projection is selected in the available
8919     list.
8920    
8921     * Thuban/UI/renderer.py: Explicit imports.
8922    
8923     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
8924     with correctly selecting the rows and issuing the right events.
8925     Be sure to call Skip() to allow the grid to do some of its own
8926     handling which allows the rows to actually be selected.
8927     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
8928     selecting multiple shapes.
8929     (LayerTableFrame): Support for building Queries.
8930     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
8931    
8932     * Thuban/UI/tree.py: Explicit imports.
8933    
8934     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
8935     table view can call it.
8936    
8937     * test/test_classification.py: Explicit imports.
8938     (TestClassification.test_ClassGroupRange): Fix test for new
8939     Range class.
8940    
8941     * Doc/thuban.dtd: Add range parameter for clrange.
8942    
8943     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
8944     object in ClassGroupRange, and also uesd for inputting ranges in
8945     the classifer table and elsewhere.
8946    
8947     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
8948     yet.
8949    
8950 frank 872 2003-05-09 Frank Koormann <[email protected]>
8951    
8952     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
8953    
8954 frank 860 2003-05-08 Frank Koormann <[email protected]>
8955    
8956 frank 870 Coding style updates
8957    
8958     * test/test_scalebar.py: Replaced tab indentation by spaces.
8959    
8960     * Thuban/UI/scalebar.py: Explicit imports.
8961    
8962     2003-05-08 Frank Koormann <[email protected]>
8963    
8964 frank 867 * Thuban/UI/scalebar.py
8965     (ScaleBar.DrawScalebar): Format string bug fixed.
8966    
8967     2003-05-08 Frank Koormann <[email protected]>
8968    
8969 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
8970    
8971     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
8972     (deriveInterval):
8973     Calculate scalebar interval and unit which fits in width for scale.
8974     (roundInterval): Round float.
8975    
8976     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
8977    
8978     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
8979    
8980     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
8981    
8982     2003-05-08 Frank Koormann <[email protected]>
8983    
8984 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
8985     Initialize ScaleBar with canvas.map
8986    
8987     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
8988     round intervals to display smarter lengths
8989     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
8990     layer. If the maps has no projection applied grey the scalebar.
8991    
8992 frank 857 2003-05-07 Frank Koormann <[email protected]>
8993    
8994     Basic Scalebar features added.
8995    
8996     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
8997    
8998     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
8999     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
9000     and the renderer.
9001    
9002     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
9003    
9004     * Thuban/UI/messages.py: SCALE_CHANGED added.
9005    
9006 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
9007    
9008 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
9009     variable shapestores to hold a list of all open shapestore objects
9010     (Session.ShapeStores): New. Accessor method for the shapestores
9011     list.
9012     (Session._add_shapestore, Session._clean_weak_store_refs): New.
9013     Internal methods to maintain the shapestores list.
9014     (Session.Tables): New. Return all tables open in the session.
9015     (Session.OpenShapefile): Insert the new ShapeStore into the
9016     shapestores list.
9017    
9018     * test/test_session.py (TestSessionSimple.test_initial_state): Add
9019     tests for ShapeStores and Tables
9020     (TestSessionWithContent.test_shape_stores)
9021     (TestSessionWithContent.test_tables): New. Test cases for
9022     ShapeStores and Tables
9023    
9024     2003-05-07 Bernhard Herzog <[email protected]>
9025    
9026 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
9027     Add comments about the optimizations used.
9028     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
9029     Implement the ReadValue table interface method.
9030    
9031     * test/test_transientdb.py
9032     (TestTransientTable.run_iceland_political_tests)
9033     (TestTransientTable.test_transient_joined_table): Add tests for
9034     ReadValue
9035    
9036 frank 848 2003-05-07 Frank Koormann <[email protected]>
9037    
9038     * Resources/Bitmaps/fulllayerextent.xpm,
9039     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
9040     new icons.
9041    
9042 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
9043    
9044 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
9045     New. Simply delegate to the transient table's version.
9046    
9047     * test/test_transientdb.py
9048     (TestTransientTable.test_auto_transient_table_query): New. Test
9049     case for AutoTransientTable's SimpleQuery
9050    
9051     2003-05-06 Bernhard Herzog <[email protected]>
9052    
9053 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
9054     Implement a simple query method for the query dialog
9055     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
9056     the row index or shapeid.
9057     (TransientTable.create): Insert the right value of the row index
9058     (TransientJoinedTable.create): Copy the row index of the left
9059     table to the joined result table
9060    
9061     * test/test_transientdb.py
9062     (TestTransientTable.test_transient_table_read_twice): Fix
9063     doc-string
9064     (TestTransientTable.test_transient_table_query): New. Test for the
9065     SimpleQuery method
9066    
9067     2003-05-06 Bernhard Herzog <[email protected]>
9068    
9069 bh 840 Convert all table users to use the new table interface. This only
9070     covers Thuban itself, not GREAT-ER or other applications built on
9071     Thuban yet, so the compatibility interface stays in place for the
9072     time being but it now issues DeprecationWarnings.
9073    
9074     Finally, the new Table interface has a new method, HasColumn.
9075    
9076     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
9077     issue deprecation warnings when they're. The warnings refer to the
9078     caller of the method.
9079     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
9080     for the deprecation warnings
9081    
9082     * test/test_table.py: Ignore the deprecation warnings for the old
9083     table in the tests in this module. The purpose of the tests is to
9084     test the old interface, after all.
9085    
9086     * test/test_transientdb.py
9087     (TestTransientTable.run_iceland_political_tests): Use the
9088     constants for the types. Add a test for HasColumn
9089     (TestTransientTable.test_transient_joined_table): Adapt to new
9090     table interface. Add a test for HasColumn
9091     (TestTransientTable.test_transient_table_read_twice): Adapt to new
9092     table interface
9093    
9094     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
9095     Adapt to new table interface
9096    
9097     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
9098     new table interface
9099    
9100     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
9101     (RecordTable.SetTable): Adapt to new table interface
9102    
9103     * Thuban/UI/classifier.py (Classifier.__init__)
9104     (Classifier.__init__): Adapt to new table interface
9105    
9106     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
9107     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
9108     to new table interface
9109    
9110     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
9111     (AutoTransientTable.HasColumn): Implement the new table interface
9112     method
9113     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
9114     (AutoTransientTable.UniqueValues): Adapt to new table interface
9115    
9116     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
9117     Adapt to new table interface
9118    
9119     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
9120     simplify opening shapefiles a bit easier.
9121     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9122     (TestLayer.test_point_layer): Use the new helper method
9123     (TestLayer.test_get_field_type): New. Test for the GetFieldType
9124     method
9125    
9126     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
9127     the new table method
9128    
9129     * test/test_memory_table.py (TestMemoryTable.test_has_column):
9130     Test for the new table method HasColumn
9131    
9132 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
9133    
9134     Addresses the "Selection Extent" wish of RTbug #1787.
9135    
9136     * Resources/Bitmaps/fulllayerextent.xpm,
9137     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
9138     extent. These are just place holders for the real bitmaps.
9139    
9140     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
9141     calculate the bounding box once (the first time compute_bbox() is
9142     called).
9143     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
9144     the bounding box for the shapes in lat/long coordinates.
9145    
9146     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
9147     option.
9148     (MainWindow.has_selected_shapes): New. Returns true if there are
9149     any selected shapes.
9150     (MainWindow.FullSelectionExtent): New. Calls
9151     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
9152     (_has_selected_shapes): New. Returns true if there are any
9153     selected shapes.
9154    
9155     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
9156     true if there are any selected shapes.
9157    
9158     * Thuban/UI/view.py (MapCanvas): Added delegated method
9159     HasSelectedShapes.
9160     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
9161     shapes on the canvas using the map projection (if any).
9162    
9163     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
9164     for Layer.ShapesBoundingBox().
9165    
9166 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
9167    
9168     * Resources/Projections/defaults.proj: Fix spelling of Mercator
9169    
9170 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
9171    
9172     Addresses the "Full Layer Extent" wish of RTbug #1787.
9173    
9174     * Resources/Projections/defaults.proj: Added UK National Grid.
9175    
9176     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
9177     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
9178     when the user selects the menu option.
9179    
9180     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
9181     scales the given layer on the canvas using the map projection.
9182    
9183 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
9184    
9185     Convert the table implementations to a new table interface. All
9186     tables use a common mixin class to provide backwards compatibility
9187     until all table users have been updated.
9188    
9189     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
9190     provide backwards compatibility for table classes implementing the
9191     new interface
9192     (DBFTable, MemoryTable): Implement the new table interface. Use
9193     OldTableInterfaceMixin as base for compatibility
9194     (DBFColumn, MemoryColumn): New. Column description for DBFTable
9195     and MemoryTable resp.
9196    
9197     * test/test_dbf_table.py: New. Test cases for the DBFTable with
9198     the new table interface.
9199    
9200     * test/test_memory_table.py: New. Test cases for the MemoryTable
9201     with the new table interface.
9202    
9203     * test/test_table.py: Document the all tests in this file as only
9204     for backwards compatibility. The equivalent tests for the new
9205     interface are in test_memory_table.py and test_dbf_table.py
9206     (MemoryTableTest.test_read): field_info should be returning tuples
9207     with four items
9208     (MemoryTableTest.test_write): Make doc-string a more precise.
9209    
9210     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
9211     table interface. Derive from from OldTableInterfaceMixin for
9212     compatibility.
9213     (TransientTableBase.create): New intance variable column_map to
9214     map from names and indices to column objects
9215     (TransientTable.create): Use the new table interface of the input
9216     table
9217     (AutoTransientTable): Convert to new table interface. Derive from
9218     from OldTableInterfaceMixin for compatibility.
9219     (AutoTransientTable.write_record): Removed. It's not implemented
9220     yet and we still have to decide how to handle writing with the new
9221     table and data framework.
9222    
9223     * test/test_transientdb.py
9224     (TestTransientTable.run_iceland_political_tests)
9225     (TestTransientTable.test_transient_joined_table): Use the new
9226     table interface
9227    
9228 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
9229    
9230     This is namely a collection of UI updates to improve user interactivity.
9231     Tabbing between controls now exists and you can use ESC to close dialog
9232     boxes; ENTER will active the default button.
9233    
9234     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
9235     order that the controls are created so that tabbing works correctly.
9236     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
9237     wxDialog can handle the default button correctly.
9238     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
9239     same reasons as for OnOK.
9240     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
9241     when we ask the table for the maximum/minimum values of a field
9242     which could take a very long time.
9243    
9244     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
9245     order that the controls are created so that tabbing works correctly.
9246     (SelectPropertiesDialog.__init__): Rearrange the order that the
9247     controls are created so that tabbing works correctly.
9248    
9249     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
9250     to derive from a wxDialog but behave like the original implementation
9251     which was derived from a wxFrame. wxDialog provides useful key
9252     handling functionality like ESC calling OnCancel and ENTER calling
9253     OnOK which is lost with wxFrame.
9254    
9255     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
9256     new dialogs.
9257    
9258     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
9259     order that the controls are created so that tabbing works correctly.
9260     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
9261     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
9262     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
9263     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
9264     can provide the "UK National Grid" as a default projection.
9265     (UTMPanel.__init__): Rearrange the order that the controls are
9266     created so that tabbing works correctly.
9267    
9268 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
9269    
9270 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
9271     (project_point): If a map projection but no layer projection is
9272     given, convert degrees to radians before applying the map
9273     projection.
9274    
9275 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
9276     (TableGrid.allow_messages): New methods to make it possible to
9277     inhibit message sending.
9278     (TableGrid.issue): Only send the message if not inhibited.
9279     (LayerTableGrid.select_shape): Use the new methods to make sure
9280     that no ROW_SELECTED message is sent while we're updating the
9281     selected rows to match the selected shapes.
9282    
9283 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
9284    
9285     Implementation of MemoryTable.
9286    
9287     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
9288     implementation that operates on a list of tuples. All of the data
9289     are kept in the memory.
9290    
9291     * test/test_table.py (MemoryTableTest): New.
9292    
9293     * test/test_transientdb.py (SimpleTable): Removed.
9294     (TestTransientTable.test_transient_joined_table,
9295     (TestTransientTable.test_transient_table_read_twice): Replaced
9296     SimpleTable by MemoryTable.
9297    
9298 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
9299    
9300 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
9301     for each of the layers.
9302    
9303     * Resources/Projections/defaults.proj: Geographic projection
9304     contains unit conversion parameter.
9305    
9306     2003-04-30 Jonathan Coles <[email protected]>
9307    
9308 jonathan 793 The most important part of this putback is the projection changes.
9309     It should now be possible to specify the projection that a layer
9310     is in and then specify a different projection for the map. The
9311     projection dialog has an extra parameter for a geographic projection
9312     which lets the user select if the input is in degrees or radians.
9313    
9314     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
9315     to say that the parameter is a tuple of unprojected
9316     points (which is what the callers to this method were assuming).
9317     Also, since the points are unprojected we need to projected them.
9318    
9319     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
9320     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
9321     groups are selected, move the layer up/down. Fixes RTbug #1833.
9322    
9323     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
9324    
9325     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
9326     parameter in call to SetClientData.
9327     (GeoPanel): Add support for selecting the units that the
9328     source data is in (Radians or Degrees).
9329    
9330     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
9331     the rendering loop by reducing the number of if's, removing the
9332     unnecessary try/except block, and checking if the old group
9333     is the same as the new one (which happens a lot if there is
9334     no classification, or lots of shapes are in the same group).
9335    
9336     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
9337     around the redraw routine to try to catch problems that the user
9338     may create by selecting invalid projections for the data set and
9339     map. Clears the display if there are any problems and prints the
9340     error.
9341     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
9342     rectangle.
9343    
9344     * extensions/thuban/wxproj.cpp (project_point): First invert the
9345     supplied point (which should be in projected coordinates) using
9346     the layer's projection and then project the point using the
9347     map's projection.
9348     (project_points): Use project_point() to project each point.
9349    
9350 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
9351    
9352     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
9353     don't set the Classification to None if the classfication field
9354     is None (ie only a DEFAULT).
9355    
9356 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
9357    
9358 bh 790 * Thuban/UI/view.py: Fix some typos.
9359    
9360 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
9361     not pop up the dialog if the selection becomes empty (this could
9362     happen if e.g. a new selection is opened while the identify tool
9363     is active and dialog had been closed)
9364    
9365     2003-04-30 Bernhard Herzog <[email protected]>
9366    
9367 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
9368     instance variable read_record_last_result
9369     (TransientTableBase.read_record): Make sure reading the same
9370     record twice works. The implementation uses the new instance
9371     variable read_record_last_result
9372    
9373     * test/test_transientdb.py
9374     (TestTransientTable.test_transient_table_read_twice): New test
9375     case for the above bug-fix.
9376    
9377 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
9378    
9379     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
9380    
9381     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
9382    
9383     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
9384     (ClassTable.SetValueAsCustom): Rename keyword argument in
9385     ClassGroup* constructors to match argument name.
9386    
9387 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
9388    
9389     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
9390     transient DB if it exists to make sure it doesn't leave a journal
9391     file in the temp directory.
9392    
9393     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
9394     self.conn to None after closing the connection to make sure it's
9395     not closed twice
9396    
9397 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9398    
9399 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
9400     "true". If anything other than "false" is specified we also assume
9401 jonathan 776 "true". Addresses RTbug #1025.
9402 jonathan 769
9403     * Doc/thuban.dtd: Add visible parameter to a layer.
9404    
9405     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
9406     of visible from 1 to True.
9407     (Layer.__init__): Change default value of visible from 1 to True.
9408    
9409     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
9410     parameter.
9411    
9412     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
9413     parameter.
9414    
9415     * test/test_load.py: Add new test data contents_test_visible.
9416     (LoadSessionTest.setUp): save test data.
9417     (LoadSessionTest.testLayerVisibility): Test if the visible flag
9418     is loaded correctly.
9419    
9420     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
9421     for saving an invisible layer.
9422    
9423     2003-04-29 Jonathan Coles <[email protected]>
9424    
9425 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
9426     legend dialog box and tell it to change its map to the one
9427     supplied to SetMap(). Fixes RTbug #1770.
9428    
9429 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
9430    
9431 bh 766 Next step of table implementation. Introduce a transient database
9432     using SQLite that some of the data is copied to on demand. This
9433     allows us to do joins and other operations that require an index
9434     for good performance with reasonable efficiency. Thuban now needs
9435     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
9436     haven't tested that.
9437    
9438     * Thuban/Model/transientdb.py: New. Transient database
9439     implementation.
9440    
9441     * test/test_transientdb.py: New. Tests for the transient DB
9442     classes.
9443    
9444     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
9445     classes to help automatically remove temporary files and
9446     directories.
9447     (Session.__init__): New instance variables temp_dir for the
9448     temporary directory and transient_db for the SQLite database
9449     (Session.temp_directory): New. Create a temporary directory if not
9450     yet done and return its name. Use AutoRemoveDir to have it
9451     automatically deleted
9452     (Session.TransientDB): Instantiate the transient database if not
9453     done yet and return it.
9454    
9455     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
9456     AutoTransientTable so that data is copied to the transient DB on
9457     demand.
9458     (SimpleStore): New class that simply combines a table and a
9459     shapefile
9460    
9461     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
9462     DBFTable and update its doc-string to reflect the fact that this
9463     is only the table interface to a DBF file. Table is now an alias
9464     for DBFTable for temporary backwards compatibility.
9465    
9466     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
9467     the last reference to the session goes away so that the temporary
9468     files are removed properly.
9469    
9470     * test/test_load.py (LoadSessionTest.tearDown): Remove the
9471     reference to the session to make sure the temporary files are
9472     removed.
9473    
9474     2003-04-29 Bernhard Herzog <[email protected]>
9475    
9476 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
9477     the __parser instance variable into a normal local variable in
9478     read. It's only used there and read will never be called more than
9479     once. Plus it introduces a reference cycle that keeps can keep the
9480     session object alive for a long time.
9481    
9482 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
9483 jonathan 735
9484 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
9485     Projection an immutable item. Fixes RTbug #1825.
9486     (Projection.__init__): Initialize instance variables here.
9487     (ProjFile.Replace): New. Replace the given projection object with
9488     the new projection object. This solves the problem of needing the
9489     mutator Projection.SetProjection() in the ProjFrame class and
9490     allows a projection to change parameters without changing its
9491     location in the file.
9492    
9493     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
9494     be of type wxSAVE and should verify overwriting a file.
9495    
9496     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
9497     ProjFile.Replace() method instead of the mutator
9498     Projection.SetProjection(). Also requires that we reassign the
9499     client data to the new projection.
9500    
9501     * test/test_proj.py (TestProjection.test): Test GetName() and
9502     GetAllParameters()
9503     (TestProjFile.test): Remove tests for Set*() methods. Add tests
9504     for Replace().
9505    
9506     2003-04-25 Jonathan Coles <[email protected]>
9507    
9508 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
9509     to save the name of the projection.
9510    
9511     * test/test_save.py (SaveSessionTest.testLayerProjection): New
9512     test to verify layer projections are saved correctly.
9513    
9514     2003-04-25 Jonathan Coles <[email protected]>
9515    
9516 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
9517     to "Unknown" if name is None.
9518     (Projection.SetAllParameters): New. Set the projection's
9519     parameter list to the one supplied.
9520     (Projection.SetProjection): New. Set the projection's
9521     properties to those of the supplied Projection.
9522    
9523     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
9524     the dialog title to include the map's title.
9525     (MainWindow.LayerProjection): Set the dialog title to include
9526     the layer's title.
9527    
9528     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
9529     error dialogs into a single method call.
9530     (ProjFrame.__VerifyButtons): Add more states to check.
9531     (ProjFrame.__GetProjection): Return the current state of an
9532     edited projection or None.
9533     (ProjFrame.__FillAvailList): Remove checks for states that
9534     shouldn't exist.
9535     (ProjFrame._OnNew): Clear all selected items and supply
9536     a projection panel if necessary.
9537    
9538     * test/test_proj.py (TestProjFile.test): Add tests for
9539     ProjFile.SetAllParameters, ProjFile.SetProjection,
9540     ProjFile.SetName.
9541    
9542     2003-04-25 Jonathan Coles <[email protected]>
9543    
9544 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
9545     takes an optional argument to select the current projection.
9546     This does not guarantee that the item is visible due to
9547     limited wxWindows functionality. Fixes RTBug #1821.
9548    
9549     2003-04-25 Jonathan Coles <[email protected]>
9550    
9551 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
9552     the projection name and use it when constructing the Projection
9553     object.
9554    
9555     * Thuban/Model/proj.py (Projection.__init__): Change the default
9556     value for 'name' to None and then test if name is equal to None
9557     in the body of the constructor. This way the caller doesn't have to
9558     know what the default value should be. Namely, useful in load.py
9559     where we have to pick a default value if the 'name' parameter
9560     doesn't exist in the XML file.
9561    
9562     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
9563     Tests a file where a layer has a projection.
9564    
9565     2003-04-25 Jonathan Coles <[email protected]>
9566    
9567 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
9568     tree for projection information.
9569    
9570     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
9571     XMLReader.GetFileName.
9572     (SessionLoader): Added support for loading projection tags that
9573     appear inside a layer.
9574    
9575     * Thuban/Model/proj.py (ProjFile): Document the class. Move
9576     back to using a list because the order of the projections in
9577     the file is important to maintain. Fixes RTbug #1817.
9578    
9579     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
9580     to ProjFile.GetFilename.
9581    
9582     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
9583     information.
9584    
9585     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
9586     ProjFrame._OnSaveAs. Removed old dead code from previous
9587     implementation.
9588     (ProjFrame._OnExport): Add support for exporting more than one
9589     projection to a single file.
9590     (ProjFrame.__FillAvailList): use string formatting (% operator)
9591     to build strings that are (partly) translated. Fixes RTbug #1818.
9592    
9593     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
9594     class.
9595    
9596 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
9597    
9598     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
9599    
9600     * po/fr.po: New. French translation by Daniel Calvelo Aros
9601    
9602     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
9603     empty strings.
9604    
9605 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
9606 jonathan 724
9607     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
9608     implement the interface that the ProjFrame dialog expects.
9609    
9610     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
9611     name of the projection to be changed.
9612     (ProjFile): Use a dictionary instead of a list so that removing
9613     projections is easier and we are sure about uniqueness.
9614     (ProjFile.Remove): Remove the given projection object.
9615    
9616     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
9617     Return a list with only one projection file instead of searching for
9618     any projection file. This simplifies many things if the user can
9619     only have one system file and one user file.
9620    
9621     * Thuban/UI/classgen.py: Change all references to
9622     genCombo to genChoice.
9623    
9624     * Thuban/UI/mainwindow.py: Add a Projection option under the
9625     layer menu.
9626     (MainWindow.LayerProjection): New. Open up a projection window
9627     for a layer.
9628    
9629     * Thuban/UI/projdialog.py: Large changes to how the dialog is
9630     laid out. Use three panels instead of one. One for the list of
9631     projections, one for the edit controls, and one for the buttons.
9632     Fixed resizing problems so that the dialog resizes correctly
9633     when the projection panel changes. Added import/export, save, and
9634     new buttons/functionality.
9635    
9636 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
9637    
9638     First step towards table management. Introduce a simple data
9639     abstraction so that we replace the data a layer uses more easily
9640     in the next step.
9641    
9642     * Thuban/Model/data.py: New file with a simple data abstraction
9643     that bundles shapefile and dbffile into one object.
9644    
9645     * Thuban/Model/session.py (Session.OpenShapefile): New method to
9646     open shapefiles and return a shape store object
9647    
9648     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
9649     object instead of a shapefile filename. This introduces a new
9650     instance variable store holding the datastore. For intermediate
9651     backwards compatibility keep the old instance variables.
9652     (open_shapefile): Removed. No longer needed with the shape store.
9653     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
9654     get the shape store used by a layer.
9655     (Layer.Destroy): No need to explicitly destroy the shapefile or
9656     table anymore.
9657    
9658     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
9659     (MainWindow.AddLayer): Use the session's OpenShapefile method to
9660     open shapefiles
9661    
9662     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
9663     session's OpenShapefile method to open shapefiles
9664    
9665     * test/test_classification.py
9666     (TestClassification.test_classification): Use the session's
9667     OpenShapefile method to open shapefiles and build the filename in
9668     a more platform independed way
9669    
9670     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
9671     Implement to have a session to use in the tests
9672     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
9673     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
9674     session's OpenShapefile method to open shapefiles
9675     (TestLayerLegend.setUp): Instantiate a session so that we can use
9676     it to open shapefiles.
9677     (TestLayerLegend.tearDown): Make sure that all references to
9678     layers and session are removed otherwise we may get a resource
9679     leak
9680    
9681     * test/test_map.py (TestMapAddLayer.test_add_layer)
9682     (TestMapWithContents.setUp): Instantiate a session so that we can
9683     use it to open shapefiles.
9684     (TestMapWithContents.tearDown): Make sure that all references to
9685     layers, maps and sessions are removed otherwise we may get a
9686     resource leak
9687     ("__main__"): use support.run_tests() so that more info about
9688     uncollected garbage is printed
9689    
9690     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
9691     session's OpenShapefile method to open shapefiles
9692     ("__main__"): use support.run_tests() so that more info about
9693     uncollected garbage is printed
9694    
9695     * test/test_selection.py (TestSelection.tearDown): Make sure that
9696     all references to the session and the selection are removed
9697     otherwise we may get a resource leak
9698     (TestSelection.get_layer): Instantiate a session so that we can
9699     use it to open shapefiles.
9700     ("__main__"): use support.run_tests() so that more info about
9701     uncollected garbage is printed
9702    
9703     * test/test_session.py (TestSessionBase.tearDown)
9704     (TestSessionWithContent.tearDown): Make sure that all references
9705     to the session and layers are removed otherwise we may get a
9706     resource leak
9707     (TestSessionWithContent.setUp): Use the session's OpenShapefile
9708     method to open shapefiles
9709    
9710 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
9711    
9712     * Thuban/Model/load.py (XMLReader.read): Should have been checking
9713     if the file_or_filename object had the 'read' attribute.
9714    
9715 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
9716    
9717 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
9718     (ReadProjFile): Add documentation about which exceptions are raised.
9719     Always pass the exceptions up to the caller.
9720     (GetProjFiles): If the directory can't be read return an empty list.
9721     If any of the proj files can't be read skip that file and go
9722     on to the next one.
9723    
9724     * test/test_proj.py: Added test cases to handle nonexistent files,
9725     unreadable files, and files that don't parse correctly.
9726    
9727     2003-04-23 Jonathan Coles <[email protected]>
9728    
9729 jonathan 716 Projection dialog. Allows the user to select from a list
9730     of projection templates and optionally edit them and save new ones.
9731    
9732     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
9733     (ProjPanel): Base class for projection specific panels.
9734     (TMPanel): Projection panel for Transverse Mercartor.
9735     (UTMPanel): Projection panel for Universal Transverse Mercartor.
9736     (LCCPanel): Projection panel for Lambert Conic Conformal.
9737     (GeoPanel): Projetion panel for Geographic Projection.
9738    
9739     2003-04-23 Jonathan Coles <[email protected]>
9740    
9741 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
9742     promote symmetry. There now exists XMLReader and XMLWriter.
9743     (XMLReader.read): New. Call to read the given file descriptor or
9744     filename.
9745     (XMLReader.close): New. Make sure the file is closed.
9746     (XMLReader.GetFileName): New. Return just the file name that is being
9747     read from.
9748     (XMLReader.GetDirectory): New. Return just the directory of the file
9749     that is being read.
9750     (XMLReader.AddDispatchers): New. Take a dictionary which contains
9751     the names of functions to call as the XML tree is parsed.
9752     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
9753     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
9754     (SessionLoader): Removed class variables start_dispatcher and
9755     end_dispatcher since this functionality is now part of a class
9756     instance. Fixes RTbug #1808.
9757     (SessionLoader.__init__): Add dispatcher functions.
9758     (load_xmlfile): Code was moved into the XMLReader.read().
9759     (load_session): Use modified SessionLoader.
9760    
9761     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
9762     map's projection.
9763    
9764     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
9765     GetAllParameters.
9766     (Projection.GetParameter): Returns the value for the given parameter.
9767    
9768     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
9769     (GetProjFiles): Renamed from GetProjections. Now returns a list
9770     of ProjFile objects.
9771     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
9772     a list of ProjFile objects whose files are not user defined.
9773     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
9774     list of ProjFile objects whose files are user defined.
9775     (ProjFileReader): Extend new XMLReader.
9776    
9777     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
9778     promote symmetry.
9779    
9780     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
9781     control instead of a wxComboBox. wxChoice controls do not generate
9782     events as the uses highlights possible choices which fixes problems
9783     with resizing the dialog when the use selects an option.
9784    
9785     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
9786     control instead of a wxComboBox.
9787    
9788     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
9789     dialog.
9790    
9791     * test/test_proj.py (TestProjection.test): New tests for GetParameter
9792     method.
9793    
9794 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
9795    
9796 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
9797     constants
9798    
9799 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
9800     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
9801    
9802 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
9803    
9804 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
9805     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
9806     anymore.
9807     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
9808     (Layer.ShapeType, Layer.Shape): No need to call
9809     self.open_shapefile since it's always called in __init__
9810    
9811 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
9812     In wxPython 2.4 there's no need to extend MainLoop anymore since
9813     wxPython itself makes sure OnExit is called.
9814    
9815 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
9816    
9817 jonathan 693 Initial putback of projection management code. Includes new
9818     classes to read and write projection files. The current load
9819     and save classes were abstracted a bit so they could be reused.
9820     The Projection class was extended to provide new methods and
9821     have a name.
9822    
9823     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
9824     general XML reading methods that were part of ProcessSession.
9825    
9826     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
9827     name.
9828     (ProjFile): New. Represents a file that contains projection
9829     information.
9830    
9831     * Thuban/Model/resource.py: New. Contains general utilities
9832     for read and writing projection files.
9833    
9834     * Thuban/Model/save.py (XMLSaver): New. Contains all the
9835     general XML writing methods that were part of SessionSaver.
9836     (SessionSaver): Renamed from Saver.
9837    
9838     * test/test_proj.py: New test cases for the projection
9839     file read and write functions.
9840    
9841     2003-04-16 Jonathan Coles <[email protected]>
9842    
9843 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
9844     in the ClassGroup*.__repr__() methods so it is clearer when
9845     a value is a string and when it is a number.
9846    
9847     * test/test_load.py: Rework the classification test to test
9848     that we can load old files.
9849     (testLabels): Test a file where the groups have labels.
9850    
9851 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
9852    
9853     Safer implementation of the performance enhancements of the
9854     low-level renderer:
9855    
9856     * extensions/thuban/wxproj.cpp (extract_projection)
9857     (extract_pointer): Rename extract_projection to extract_pointer
9858     and redefine its purpose to return the pointer stored in a CObject
9859     returned by the object's cobject method. Update all callers.
9860     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
9861     handling of these low-level parameters so that each s_draw_info
9862     instance is handled as a CObject at python level that also
9863     contains real references to the actual python objects which
9864     contain the values in the struct. Add free_draw_info as the
9865     destructor.
9866     (draw_polygon_shape): Add the py_draw_info parameter which must a
9867     cobject containing an s_draw_info pointer.
9868    
9869     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
9870     method to instantiat the low-level render parameter
9871     (MapRenderer.draw_shape_layer): Use the new method. Remove some
9872     commented out code.
9873     (MapRenderer.draw_polygon_shape): Make the first parameter not the
9874     layer but the low-level render parameter
9875     (ScreenRenderer.draw_shape_layer): Use the low-level render
9876     parameter.
9877    
9878 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
9879    
9880 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
9881     the ClassGroup* classes to make debugging a bit easier.
9882     (ClassGroup.SetLabel): Check that the string is an instance
9883     of StringTypes not StringType. Accounts for Unicode strings.
9884    
9885     * Thuban/Model/color.py: Implemented __repr__ to make
9886     debugging a bit easier.
9887    
9888     * Thuban/Model/save.py (Saver.write_classification): Need to
9889     save the group label.
9890    
9891     * test/test_load.py (testClassification): New. Loads the
9892     iceland_sample_test.thuban file and checks if it was loaded
9893     correctly.
9894    
9895     2003-04-15 Jonathan Coles <[email protected]>
9896    
9897 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
9898     to improve rendering performance by initializing the variables
9899     that are not change each time draw_polygon_shape() is called.
9900     The values are stored in a global struct draw_info.
9901     (draw_polygon_shape): Removed initialization code that is
9902     now in draw_polygon_init().
9903    
9904     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
9905 jonathan 674 drawing initialization call to draw_polygon_init()
9906     (MapRenderer.draw_polygon_shape): Use new signature of
9907     draw_polygon_shape.
9908 jonathan 673
9909 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
9910     weirdness by setting the range to (1, maxint).
9911 jonathan 673
9912 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
9913     instance variables private and optimize comparison operator
9914     by first checking if the color references are the same.
9915     (ClassGroupSingleton): Make instance variables private.
9916     (ClassGroupRange): Make instance variables private.
9917 jonathan 673
9918 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
9919    
9920 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
9921    
9922     First stab at internationalized messages:
9923    
9924     * Thuban/__init__.py (_): Implement the translation function for
9925     real using the python gettext module.
9926    
9927     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
9928     translate empty strings.
9929    
9930     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
9931     Add a missing space to a warning message
9932    
9933     * po/README: New. Notes about the management of the translation
9934     files.
9935    
9936     * po/Makefile: New. Makefile to help manage the translation files.
9937    
9938     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
9939    
9940     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
9941     translations and support files in po/
9942    
9943     * setup.py (data_files): Add the *.mo files to the data_files too
9944    
9945     * README: Add note about the translations when building from CVS
9946    
9947 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
9948    
9949     * Thuban/UI/dock.py: Fixes some window resizing problems most
9950     noticable under windows. Always assume the button bitmaps will
9951     be there. Code clean up.
9952     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
9953     images for the dock/undock button to the same images.
9954     Work around for RTbug #1801.
9955    
9956     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
9957     be allowed to grow within the sizer. Fixes a bug under Windows
9958     where the toolbar wasn't being drawn.
9959    
9960 frank 664 2003-04-14 Frank Koormann <[email protected]>
9961    
9962     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
9963     Updated design to try to make the button functionality more
9964     transparent.
9965    
9966 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
9967    
9968     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
9969     finalize the intialization of the panel.
9970    
9971     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
9972     creation of the panel. Should be the last thing called in the
9973     initializer of a subclass.
9974    
9975     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
9976     set the current selections in the combo boxes. This is needed
9977     under Windows.
9978    
9979     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
9980     level panel to the dialog so that the background colors are
9981     consistent under Windows.
9982    
9983 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
9984    
9985 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
9986     not black.
9987    
9988     * Thuban/UI/legend.py: Enable/disable the legend buttons when
9989     the legend changes. Fixes RTbug #1793.
9990    
9991     * test/test_classification.py: Added test for copying of
9992     classifications.
9993    
9994     2003-04-11 Jonathan Coles <[email protected]>
9995    
9996 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
9997     such as bitmaps.
9998    
9999     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
10000     added images to the move buttons, added 'reverse' button.
10001     (CustomRampPanel.__init__): Added images to the move buttons.
10002     (GreyRamp): New. Generates a ramp from white to black.
10003     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
10004    
10005     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
10006     ID_PROPERTY_*.
10007     (Classifier.__init__): Minor changes to the layout.
10008     (Classifier._OnTitleChanged): Listen for when the user edits the
10009     title and update the dialog's title and the layer's title.
10010    
10011     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
10012    
10013     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
10014     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
10015     if the layer's title changes.
10016    
10017     * Thuban/UI/mainwindow.py: Added new menu item and associated code
10018     to open a dialog to rename the map.
10019     (MainWindow): Use new resource class to import bitmaps.
10020    
10021     2003-04-11 Jonathan Coles <[email protected]>
10022    
10023 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
10024 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
10025     Resources/Bitmaps/group_use_none.xpm,
10026     Resources/Bitmaps/group_use_not.xpm,
10027     Resources/Bitmaps/hide_layer.xpm,
10028     Resources/Bitmaps/layer_properties.xpm,
10029     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
10030     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
10031     New.
10032 jonathan 646
10033 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
10034    
10035 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
10036     Should pass group to ClassGroup constructor.
10037    
10038     2003-04-10 Jonathan Coles <[email protected]>
10039    
10040 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
10041     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
10042     here. Implement SetVisible(), IsVisible().
10043     (ClassGroup.__init__): Add group parameter which acts as a copy
10044     constructor.
10045    
10046     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
10047     "Visible" check boxes.
10048     (Classifier): Rename the buttons and refactor the code to match
10049     the new labels.
10050    
10051     * Thuban/UI/legend.py: Classify button is now called "Properties".
10052     Refactored the code to change variable names.
10053     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
10054    
10055     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
10056     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
10057     renamed to MainWindow.LayerEditProperties.
10058     (MainWindow.ToggleLegend): Don't include map name in legend title.
10059     (MainWindow.SetMap): Added the map name to the window title.
10060     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
10061     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
10062     Functionality is found in the layer properties dialog.
10063    
10064     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10065     draw visible groups.
10066    
10067 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
10068    
10069 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
10070     addition and selection of new color schemes.
10071     (MonochromaticRamp): New. Generates a ramp between two colors.
10072     (RedRamp): New. Generates a ramp of all red.
10073     (GreenRamp): New. Generates a ramp of all green.
10074     (BlueRamp): New. Generates a ramp of all blue.
10075    
10076     2003-04-09 Jonathan Coles <[email protected]>
10077    
10078 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
10079     Need to copy over field and fieldType attributes.
10080    
10081     * Thuban/Model/table.py (Table.field_range): New. Retrive the
10082     maximum and minimum values over the entire table for a given
10083     field.
10084     (Table.GetUniqueValues): New. Retrieve all the unique values
10085     in the table for a given field.
10086    
10087     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
10088     (GenUniquePanel): New. Controls to allow the user to select
10089     which unique field values they would like in the classification.
10090     (CustomRampPanel): Code that was in ClassGenDialog that allows
10091     the user to select the properties for a custom ramp.
10092     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
10093    
10094     * Thuban/UI/classifier.py: Removed a lot of debugging code.
10095     (Classifier._SetClassification): Callback method so that the
10096     class generator can set the classification in the grid.
10097     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
10098     editing of a group properties class into a wxWindows control.
10099    
10100     * Thuban/UI/dock.py: It was decided that if the user closes
10101     a dockable window the window should simply hide itself. That
10102     way if the user wants to show the dock again it appears in the
10103     same place as it was when it was closed.
10104     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
10105     (DockableWindow._OnButtonClose): Hide the window instead of
10106     destroying it.
10107     (DockableWindow._OnClose): Hide the window instead of
10108     destroying it.
10109    
10110     * Thuban/UI/legend.py (LegendTree): Use a private method to
10111     consistently set the font and style of the text. Fixes RTbug #1786.
10112    
10113     * Thuban/UI/mainwindow.py: Import just the Classifier class.
10114    
10115 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
10116    
10117 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
10118     to the map module
10119    
10120     2003-04-07 Bernhard Herzog <[email protected]>
10121    
10122 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
10123     favor of ToggleSessionTree
10124     (MainWindow.ToggleSessionTree): New method to toggle visibility of
10125     the session tree.
10126     (MainWindow.SessionTreeShown): New method to return whether the
10127     session tree is currently shown.
10128     (MainWindow.ToggleLegend): New method to toggle visibility of the
10129     legend
10130     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
10131     LegendShown
10132     (MainWindow.LegendShown): New method to return whether the legend
10133     is currently shown.
10134     (_method_command): Add checked parameter so we can define check
10135     menu items
10136     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
10137     mainwindow methods.
10138     (show_session_tree, show_legend commands): Removed.
10139     (toggle_session_tree, toggle_legend commands): New commands to
10140     toggle the visibility of the dialogs
10141    
10142 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
10143    
10144 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
10145    
10146     * Thuban/UI/dock.py: Fix Windows problem.
10147    
10148     * Thuban/UI/mainwindow.py: Use False instead of false.
10149     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
10150    
10151     2003-04-07 Jonathan Coles <[email protected]>
10152    
10153 jonathan 612 Since we now say that the order of the groups in a classification
10154     matters, it makes sense to be able to manipulate that order. Most
10155     of the changes to Thuban/Model/classification.py are to that end.
10156    
10157     * Thuban/Model/classification.py (Classification.AppendGroup,
10158     Classification.InsertGroup, Classification.ReplaceGroup,
10159     Classification.RemoveGroup, Classification.GetGroup): Do as the
10160     names imply.
10161     (Classification.FindGroup): This was called GetGroup, but GetGroup
10162     takes an index, while FindGroup takes a value.
10163     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
10164     REFERENCE. Currently there is a cyclic reference between the layer
10165     and its classification. If the classification doesn't need to know
10166     its owning layer we can change this, since it may make sense to be
10167     able to use the same classification with different layers.
10168    
10169     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
10170    
10171     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
10172     not AddGroup()
10173    
10174     * Thuban/UI/classifier.py: Now that we can depend on the order in
10175     a Classification and have methods to manipulate that order we don't
10176     need to use our own data structures in the grid. We can simply make
10177     the grid/table access the information they need from a copy of
10178     the classification object.
10179     (Classifier._OnCloseBtn): Event handler for when the user clicks
10180     'Close'. This is needed so if the user applies changes and then
10181     continues to change the table the user has the option of discarding
10182     the most recent changes and keeping what they applied.
10183    
10184     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
10185     into the same group.
10186    
10187     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
10188     with a really old version of proj, PJ_VERSION won't even be defined.
10189     If it isn't defined then just compile so that the function always
10190     returns Py_False.
10191    
10192     * test/test_classification.py: Fix tests to use the renamed methods.
10193     Still need to write tests for the new methods.
10194    
10195 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
10196 jonathan 608
10197 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
10198     call to SetSelection out of the method and before the call
10199     to __SelectField in __init__. This prevents a recursion of events
10200     when _OnFieldSelect is triggered by the user.
10201    
10202     2003-04-04 Jonathan Coles <[email protected]>
10203    
10204 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
10205     Color.Transparent.
10206     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
10207     Don't bother copying the color, since Colors are immutable.
10208    
10209     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
10210     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
10211     Thuban/UI/renderer.py, Thuban/UI/view.py:
10212     Rename Color.None to Color.Transparent.
10213    
10214     * test/test_classification.py, test/test_load.py: Rename Color.None
10215     to Color.Transparent.
10216    
10217     2003-04-04 Jonathan Coles <[email protected]>
10218 jonathan 603
10219     * Thuban/Model/classification.py: Fix assert calls.
10220     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
10221     Copy the color parameter rather than hold onto a reference.
10222 jonathan 601
10223 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
10224     the color object.
10225     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
10226     are sure there exists only one refernce to Color.None in the system.
10227     This allows us to use 'is' rather than the comparision functions.
10228    
10229     * Thuban/Model/save.py: Fix assert calls.
10230    
10231     * Thuban/UI/classifier.py: Fix assert calls.
10232     (ClassGrid._OnCellDClick): Call up to the classifier to open the
10233     dialog to edit the groups properties.
10234     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
10235     correctly if a cell is resized.
10236     (ClassTable.SetClassification): New. Changes the classification
10237     that is in the table.
10238     (ClassTable.__SetRow): Allow groups to be prepended.
10239     (Classifier): New code for opening the EditProperties and
10240     GenerateRanges dialogs.
10241     (SelectPropertiesDialog.__GetColor): Only set the color in the
10242     color dialog if the current color is not None.
10243    
10244     * Thuban/UI/dock.py: Fix assert calls.
10245    
10246     * Thuban/UI/legend.py: Fix assert calls.
10247    
10248     * Thuban/UI/renderer.py: Fix assert calls.
10249    
10250     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
10251     classifications.
10252     (GenRangePanel): Panel specific to range generation.
10253     (GenSingletonPanel): Panel specific to singleton generation.
10254     (ClassGenerator): Class responsible for actually generating
10255     the classification from the data gathered in the dialog box.
10256     (PropertyRamp): Generates properties whose values range from
10257     a starting property to an ending property.
10258 jonathan 601
10259 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
10260    
10261     * test/support.py (print_garbage_information): New function that
10262     prints information about still connected messages and memory
10263     leaks.
10264     (run_suite): Removed.
10265     (run_tests): New function for use as a replacement of
10266     unittest.main in the test_* files. This one calls
10267     print_garbage_information at the end.
10268    
10269     * test/runtests.py (main): Use support.print_garbage_information
10270    
10271     * test/test_layer.py: Use support.run_tests instead of
10272     unittest.main so we get memory leak information
10273     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
10274     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
10275     (TestLayerLegend.test_visibility): Call the layer's Destroy method
10276     to fix a memory leak.
10277    
10278     * test/test_classification.py: Use support.run_tests instead of
10279     unittest.main so we get memory leak information
10280     (TestClassification.test_classification): Call the layer's Destroy
10281     method to fix a memory leak.
10282    
10283 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
10284    
10285 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
10286     Handle the reference counts of the return value and errors in
10287     PyArg_ParseTuple correctly.
10288    
10289 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
10290     sure the filename is absolute to avoid problems when saving the
10291     session again
10292    
10293 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
10294    
10295 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
10296    
10297 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
10298 jonathan 587 that there actually are points in the returned list of points
10299     before trying to index into the list. The list may be empty if
10300     the shape is a Null Shape.
10301    
10302 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
10303    
10304     * test/test_map.py: Don't use from <module> import *
10305    
10306 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
10307    
10308     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
10309     LAYER_LEGEND_CHANGED
10310    
10311     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
10312     self.Destroy() to close the window after yesterday's changes.
10313    
10314     * test/test_map.py, test/test_session.py: Fix messages that
10315     are sent from maps and layers.
10316    
10317 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
10318    
10319     * Thuban/UI/classifier.py: Commented out some debugging statements.
10320     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
10321     RTbug #1769.
10322    
10323     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
10324     position (although position doesn't work yet under GTK).
10325     (DockableWindow.Destroy): New. Called when the window must be
10326     closed. Namely needed when the DockFrame closes and must close
10327     its children.
10328     (DockFrame): Listen for EVT_CLOSE and destroy all children.
10329    
10330     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
10331     when then window is told to close.
10332     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
10333     comment in source for more info.
10334    
10335     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
10336    
10337     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
10338     symmetry with other such methods.
10339     (MainWindow.ShowLegend): Show the legend docked by default.
10340    
10341 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
10342    
10343     * Thuban/UI/classifier.py: Support for highlighting a specific
10344     group within the grid when the classification dialog is opened.
10345     Also contains a lot of debugging printouts which will later
10346     be removed.
10347    
10348     * Thuban/UI/dock.py: Complete rework on the dock code so that
10349     that it is fairly removed from the rest of the Thuban application.
10350     It is easy to add new docks which the rest of the program having
10351     to be aware of them.
10352    
10353     * Thuban/UI/legend.py: Modifications to support selecting a
10354     specific group in the classification dialog. Changed how layers
10355     are drawn when the layer is visible/invisible.
10356    
10357     * Thuban/UI/mainwindow.py: Removed legend specific code and
10358     replaced it with calls to the new dock code.
10359    
10360     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
10361     to check if scale > 0. Trying to track down a divide by zero.
10362    
10363 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
10364    
10365 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
10366     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
10367     now part of DockableWindow.
10368     (LegendPanel.DoOnSelChanged): Select the current layer in the
10369     map.
10370     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
10371     with the selected layer and/or group.
10372    
10373     2003-03-26 Jonathan Coles <[email protected]>
10374    
10375 jonathan 557 This putback contains the code for dockable windows. There is
10376     no support in wxWindows as of this date for windows that can
10377     attach themselves to other windows.
10378    
10379     The current model contains a DockableWindow which has a parent
10380     window for when it is detached and a dock window that it puts
10381     its contents in when it is docked. The contents of a DockableWindow
10382     must be a DockPanel. DockPanel itself derives from wxPanel.
10383    
10384     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
10385     message, not a LAYER_LEGEND_CHANGED message.
10386    
10387     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
10388    
10389     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
10390     as one of the style properties for the fieldTypeText item to
10391     be sure that its size is correct when the text changes.
10392    
10393     * Thuban/UI/dock.py: New. Classes for the DockPanel and
10394     DockableWindow.
10395    
10396     * Thuban/UI/legend.py: Added some more buttons and made the
10397     LegendPanel a DockPanel.
10398    
10399     * Thuban/UI/mainwindow.py: Added sash windows to the main window
10400     and supporting functions for manipulating the sashes.
10401     (MainWindow.ShowLegend): Create a DockableWindow with the
10402     LegendPanel as the contents.
10403    
10404     * Thuban/UI/messages.py: Added DOCKABLE_* messages
10405    
10406     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
10407     not LAYER_LEGEND_CHANGED, messages.
10408    
10409 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
10410    
10411     * setup.py: Added custom script bdist_rpm_build_script so that
10412     when the rpm is built the path to wx-config is correct.
10413    
10414     * setup.cfg: Added line saying to use the custom build script
10415    
10416 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
10417    
10418     Initial implementation of the Legend.
10419    
10420     * Thuban/UI/legend.py: New. Creates a window that shows the map's
10421     Legend information and allows the user to add/modify classifications
10422     and how the layers are drawn on the map.
10423    
10424     * setup.py: New command 'build_docs' which currently uses
10425     happydoc to generate html documentation for Thuban.
10426    
10427     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
10428     Returns a string which is appropriately describes the group.
10429    
10430     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
10431     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
10432    
10433     * Thuban/Model/map.py (Map): Rename messages and use new, more
10434     specific, messages.
10435    
10436     * Thuban/Model/messages.py: New message to indicate that a layer's
10437     data has changed (LAYER_CHANGED). New map messages to indicate
10438     when layers have been added/removed/changed or if the stacking order
10439     of the layers has changed.
10440    
10441     * Thuban/Model/session.py: Rename and use new messages.
10442    
10443     * Thuban/UI/classifier.py: Remember if any changes have actually
10444     been applied so that if the dialog is cancelled without an application
10445     of changes we don't have to set a new classification.
10446     (ClassDataPreviewer): Pulled out the window specific code and put it
10447     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
10448     symbols on any DC.
10449    
10450     * Thuban/UI/mainwindow.py: New code to open the legend.
10451    
10452     * Thuban/UI/view.py: Use new message names.
10453    
10454 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
10455    
10456     * Thuban/UI/main.py (verify_versions): New. Checks the versions
10457     of Python, wxPython, and some other libraries.
10458    
10459     * extensions/thuban/wxproj.cpp (check_version): Checks the given
10460     version against what wxproj was compiled with.
10461     (check_version_gtk): If wxproj was compiled with gtk then check
10462     the given version against the version of the gtk library
10463     currently being used.
10464    
10465 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
10466    
10467     * test/test_command.py: Run the tests when the module is run as a
10468     script
10469    
10470     2003-03-14 Bernhard Herzog <[email protected]>
10471    
10472     Implement selection of multiple selected shapes in the same layer:
10473    
10474     - Introduce a new class to hold the selection. This basically
10475     replaces the interactor which was nothing more than the
10476     selection anyway. A major difference is of course that the new
10477     selection class supports multiple selected shapes in one layer
10478    
10479     - Move the object that represents the selection from the
10480     application to the canvas. The canvas is a better place than the
10481     application because the selection represents which shapes and
10482     layer of the map displayed by the canvas are selected and
10483     affects how the map is drawn.
10484    
10485     - Make the selection and its messages publicly available through
10486     the mainwindow.
10487    
10488     - The non-modal dialogs do not get a reference to the interactor
10489     anymore as they can simply refer to their parent, the
10490     mainwindow, for the what the interactor had to offer.
10491    
10492     * Thuban/UI/selection.py: New module with a class to represent the
10493     selection.
10494    
10495     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
10496     these unused messages
10497    
10498     * Thuban/UI/application.py (ThubanApplication.OnInit)
10499     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
10500     interactor is gone now.
10501     (ThubanApplication.CreateMainWindow): There is no interactor
10502     anymore so we pass None as the interactor argument for now for
10503     compatibility.
10504    
10505     * Thuban/UI/view.py (MapCanvas.delegated_messages)
10506     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
10507     Unsubscribe, delegate messages according to the delegated_messages
10508     class variable.
10509     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
10510     attributes from instance variables as described with the
10511     delegated_methods class variable.
10512     (MapCanvas.__init__): New instance variable selection holding the
10513     current selection
10514     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
10515     pass them on to the renderer
10516     (MapCanvas.SetMap): Clear the selection when a different map is
10517     selected.
10518     (MapCanvas.shape_selected): Simple force a complete redraw. The
10519     selection class now takes care of only issueing SHAPES_SELECTED
10520     messages when the set of selected shapes actually does change.
10521     (MapCanvas.SelectShapeAt): The selection is now managed in
10522     self.selection
10523    
10524     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
10525     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
10526     Unsubscribe, delegate messages according to the delegated_messages
10527     class variable.
10528     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
10529     attributes from instance variables as described with the
10530     delegated_methods class variable.
10531     (MainWindow.__init__): The interactor as ivar is gone. The
10532     parameter is still there for compatibility. The selection messages
10533     now come from the canvas.
10534     (MainWindow.current_layer, MainWindow.has_selected_layer):
10535     Delegate to the the canvas.
10536     (MainWindow.LayerShowTable, MainWindow.Classify)
10537     (MainWindow.identify_view_on_demand): The dialogs don't need the
10538     interactor parameter anymore.
10539    
10540     * Thuban/UI/tableview.py (TableFrame.__init__)
10541     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
10542     (LayerTableFrame.row_selected): The interactor is gone. It's job
10543     from the dialog's point of view is now done by the mainwindow,
10544     i.e. the parent. Subscribe to SHAPES_SELECTED instead
10545     of SELECTED_SHAPE
10546    
10547     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
10548     is gone. It's job from the dialog's point of view is now done by
10549     the mainwindow, i.e. the parent.
10550    
10551     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
10552     gone. It's job from the dialog's point of view is now done by the
10553     mainwindow, i.e. the parent.
10554    
10555     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
10556     gone. It's job from the dialog's point of view is now done by the
10557     mainwindow, i.e. the parent.
10558     (SessionTreeCtrl.__init__): New parameter mainwindow which is
10559     stored as self.mainwindow. The mainwindow is need so that the tree
10560     can still subscribe to the selection messages.
10561     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
10562     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
10563     selection is now accessible through the mainwindow. Subscribe to
10564     SHAPES_SELECTED instead of SELECTED_SHAPE
10565    
10566     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
10567     SHAPES_SELECTED message now.
10568     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
10569     so deal with multiple shapes
10570     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
10571     gone. It's job from the dialog's point of view is now done by the
10572     mainwindow, i.e. the parent.
10573    
10574     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
10575     parameter is now a list of shape ids.
10576     (RecordTable.SetTable): The second parameter is now a list of
10577     indices.
10578    
10579     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
10580     selected_shape parameter and ivar to selected_shapes. It's now a
10581     list of shape ids.
10582     (MapRenderer.draw_label_layer): Deal with multiple selected
10583     shapes. Rearrange the code a bit so that the setup and shape type
10584     distinctions are only executed once.
10585    
10586     * test/test_selection.py: Test cases for the selection class
10587    
10588 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
10589    
10590     * Thuban/Model/load.py: Temporary fix so that the xml reader
10591     doesn't cause Thuban to crash.
10592    
10593     * Thuban/Model/layer.py: Handle the cyclic references between
10594     a layer and its classification better, and be sure to disconnect
10595     the classification from the layer when the layer is destroyed
10596     so that we don't maintain a cyclic reference that may not be
10597     garbage collected.
10598    
10599     * Thuban/Model/classification.py: See comment for layer.py.
10600    
10601 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
10602    
10603     * HOWTO-Release: New. Information on the steps for releasing
10604     a new version of Thuban.
10605    
10606 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
10607    
10608     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
10609     Use True instead of true.
10610     (Classifier): Should have a single panel in which all the controls lie.
10611    
10612     * Thuban/UI/proj4dialog.py: Add normal border.
10613    
10614     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
10615    
10616     * Thuban/UI/mainwindow.py: Use True instead of true.
10617    
10618     * setup.py: Update some definitions to use wxWindows2.4 files
10619    
10620     * Data/iceland_sample_class.thuban: Fixed file so that the
10621     field_type information is present.
10622    
10623 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
10624    
10625 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
10626     field type label grow so that when the text changes the
10627     size is updated correctly. This may be a wxWindows bug.
10628    
10629     2003-03-10 Jonathan Coles <[email protected]>
10630    
10631 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
10632     SESSION_REPLACED.
10633    
10634     * Thuban/UI/classifier.py: Wrap text with _().
10635     (ClassGrid.CreateTable): Set dimensions and size hints here,
10636     instead of in Reset, so we only set the size once.
10637    
10638     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
10639    
10640     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10641     Call Close() instead of Shutdown().
10642    
10643     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10644    
10645     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
10646     Go back to using OnClose() instead of Shutdown().
10647    
10648     2003-03-10 Jonathan Coles <[email protected]>
10649    
10650 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
10651     to know the old field index as well as the new one.
10652    
10653     2003-03-10 Jonathan Coles <[email protected]>
10654    
10655 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
10656     to correctly set the table information and call this from
10657     __init__ and from _OnFieldSelect so that all the information
10658     is up to date when the dialog opens and when a field is changed.
10659    
10660     2003-03-10 Jonathan Coles <[email protected]>
10661    
10662 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
10663     layer's message function directly, use the ClassChanged() method
10664     when then classification changes. SetField/SetFieldType/SetLayer
10665     must keep the information about field name and field type in
10666     sync when an owning layer is set or removed.
10667    
10668     * Thuban/Model/layer.py: Added ClassChanged() so that the
10669     classification can tell the layer when its data has changed.
10670     (Layer.SetClassification): Accepts None as an arguement to
10671     remove the current classification and correctly handles
10672     adding a new classification.
10673    
10674     * Thuban/Model/load.py: Comment out print statement
10675    
10676     * test/test_classification.py, test/test_save.py: New and
10677     improved tests.
10678    
10679 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
10680    
10681     * Thuban/Model/classification.py: Implemented __copy__ and
10682     __deepcopy__ for ClassGroup* and ClassGroupProperites so
10683     they can easily be copied by the classifier dialog.
10684     (ClassGroupProperites.__init__): The default line color should
10685     have been Color.Black.
10686    
10687     * Thuban/UI/classifier.py: Setting and Getting table values now
10688     uses a consistent set of functions.
10689     (Classifier): Now non-modal. Has field type label which changes
10690     as the field changes. Keep track of buttons in a list so that
10691     we can enable/disable the buttons when the None field is selected.
10692     (SelectPropertiesDialog): Add buttons to make the colors transparent.
10693    
10694     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
10695     does what OnClose did, but can be called by the application to
10696     close a window. Needed when a session changes, and we have to
10697     close the classifier windows.
10698    
10699     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
10700     Shuts down open dialogs. Used when a new session is created
10701     or a session is opened.
10702     (MainWindow.SaveSession): Should only call application.SaveSession()
10703     if we don't call SaveSessionAs first.
10704     (MainWindow.Classify): Allow different classifier dialogs for
10705     different layers.
10706    
10707     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
10708     the parent class handle it. Add Shutdown() to unsubscibe from
10709     event notification and call the parent Shutdown(). This was
10710     necessary so the application can close the tree window.
10711    
10712 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
10713    
10714     * Thuban/Model/classification.py: Minor documentation changes,
10715     Addition of __eq__ and __ne__ methods.
10716     (Classification.SetLayer): prevent recursion between this method
10717     and Layer.SetClassification().
10718    
10719     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
10720    
10721     * Thuban/Model/layer.py (SetClassification): prevent recursion
10722     between this method and Classification.SetLayer().
10723    
10724     * test/test_classification.py, test/test_load.py,
10725     test/test_session.py: Fixed and added tests for the classification
10726     classes.
10727    
10728 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
10729    
10730     * Thuban/UI/classifier.py (ClassGrid.__init__)
10731     (ClassGrid.CreateTable): Move the SetSelectionMode call to
10732     CreateTable because otherwise it triggers an assertion in
10733     wxPython/wxGTK 2.4.
10734    
10735 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
10736    
10737 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
10738 jonathan 471
10739 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
10740 jonathan 471
10741 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
10742 jonathan 471
10743 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
10744 jonathan 471
10745     2003-03-05 Jonathan Coles <[email protected]>
10746    
10747 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
10748     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
10749     Store just the groups in the table and generate the other
10750     column information when it is requested. Add "None" field
10751     to pull-down to select no classification.
10752    
10753     * Thuban/common.py: Moved FIELDTYPE constants from table.py
10754     (Str2Num): Only catch ValueError exceptions.
10755    
10756     * Thuban/Model/classification.py: Class documentation. Renaming
10757     of methods with Stroke to Line. Groups are stored in a single
10758     list with the default as the first element. Groups are searched
10759     in the order they appear in the list.
10760    
10761     * Thuban/Model/color.py: Documentation.
10762    
10763     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
10764     the kind of data represented by a field.
10765    
10766     * Thuban/Model/load.py (ProcessSession): Use proper string
10767     conversion function; fixes RTbug #1713.
10768    
10769     * Thuban/Model/save.py (Saver): Store field type information.
10770    
10771     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
10772     (Table): Add field_info_by_name() to retrieve field information
10773     by specifying the field name, not the number.
10774    
10775     * Thuban/UI/mainwindow.py: Function name changes.
10776    
10777     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
10778     get the layer classification once. Don't try to classify
10779     values when the field is None: just use the default properties.
10780    
10781     * Thuban/UI/view.py: Function name changes.
10782    
10783     * Doc/thuban.dtd: Add field_type attribute to a classification.
10784    
10785 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
10786    
10787 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
10788     the fill and stroke layer attributes optional with suitable
10789     default values. Add the stroke_width layer attribute. Use correct
10790     syntax for empty elements. Make the attribute list for labels
10791     refer to the label element.
10792    
10793     2003-03-04 Bernhard Herzog <[email protected]>
10794    
10795 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
10796     Python 2.3 containing some of the functionality we implement in
10797     setup.py ourselves.
10798    
10799     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
10800     before the selection mode. Doing it the other way round triggers
10801     an assertion in wxWindows.
10802    
10803     * Thuban/Model/save.py (escape): Fix typo in doc-string
10804    
10805     * Thuban/Model/classification.py: Remove unnecessary wxPython
10806     import
10807    
10808 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
10809    
10810     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
10811     Parameter 'value' should default to None.
10812    
10813     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
10814     the class attribute __classification is now private.
10815    
10816     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
10817     Classifier to ClassGrid. Added support for removing selected rows,
10818     which including code for keeping track of when cells are selected,
10819     and deselected.
10820     (ClassTable): Support for added/removing rows. Fixed a problem
10821     with __ParseInput whereby it would not allow strings (only numbers)
10822     to be entered.
10823     (Classifier): Added button and supporting code for removing
10824     selected rows.
10825    
10826 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
10827 jonathan 434
10828     * Thuban/common.py: Moved color conversion functions into
10829     Thuban/UI/common.py.
10830     (Str2Num): Now converts the float (not the string) to a long/int
10831     so that an exception isn't thrown.
10832    
10833     * Thuban/UI/common.py: Common functions used in several UI modules
10834    
10835     * Thuban/Model/classification.py: Changed the class hierarchy
10836     so that a Classification consists of Groups which return
10837     Properties when a value matches a Group.
10838    
10839     * Thuban/Model/layer.py: Fixed name resolution problem.
10840    
10841     * Thuban/Model/load.py: Use new Classification and Group functions.
10842    
10843     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
10844     failure.
10845     (Saver.write_classification): Use new Classification and Group
10846     functions.
10847    
10848     * Thuban/UI/classifier.py: Changes to use new Classification and Group
10849 jonathan 445 functions. Fix to create a tuple with a single value instead of
10850     simply returning the value.
10851 jonathan 434
10852     * Thuban/UI/renderer.py: Use new Classification and Group functions.
10853     Use common.py functions.
10854    
10855 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
10856 jonathan 447
10857     * test/test_classification.py: Use new Classification and Group
10858     classes.
10859 jonathan 434
10860 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
10861    
10862     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
10863     functions from Thuban color objects to wxWindow colour objects.
10864    
10865     * Thuban/Model/classification.py (Classification): Renamed
10866     GetProperties() to GetClassData(). Used the new iterator
10867     in TreeInfo().
10868     (ClassIterator): Iterator implementation to iterate over the
10869     ClassData objects in a classification object.
10870    
10871     * Thuban/Model/save.py (Saver.write_classificaton): Uses
10872     the new iterator to save the classification information.
10873    
10874     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
10875     for changing the stroke and fill colors and previewing the
10876     changes.
10877    
10878     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
10879     MainWindow.SaveSessionAs): Text string changes so the dialogs
10880     have more meaningful titles.
10881    
10882     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
10883     Classification method name from GetProperties to GetClassData.
10884    
10885     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
10886     instead of accessing now non-existent class variables.
10887    
10888 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
10889    
10890     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
10891     unneeded Shape() call. Rendering is substantially faster without
10892     it and it avoids some problems with broken shape files.
10893    
10894 frank 423 2003-02-20 Frank Koormann <[email protected]>
10895    
10896     Force minimal size of identify and label dialogs. The autosizing
10897     looked too ugly.
10898    
10899     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
10900     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
10901     Set size of listctrl.
10902     * Thuban/UI/identifyview.py (IdentifyView.__init__):
10903     Set size of dialog.
10904    
10905 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
10906    
10907     * test/test_classification.py, test/test_layer.py,
10908     test/test_load.py, test/test_map.py, test/test_session.py:
10909     Updated the tests to use the new functions that are in the
10910     respective classes.
10911    
10912     * Thuban/Model/classification.py (Classification):
10913     Uses the new ClassData* classes. Modification messages are
10914     passed up to the parent layer (if it exists).
10915     (ClassData): New class to encapsulate the common data in each
10916     classification property.
10917     (ClassDataDefault): Represents the Default class. data.
10918     (ClassDataPoint): Represents a single class. data point
10919     (ClassDataRange): Represents a class. range
10920     (ClassDataMap): Represents a class. map (unused).
10921    
10922     * Thuban/Model/color.py: Added Color.None to represent something
10923     with no color. Color.Black represents the color black.
10924     (NoColor): Helper class derived from Color to represent something
10925     with no color.
10926    
10927     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
10928     stroke_width attributes. Made the 'classification' attribute private.
10929     New methods for setting/getting the classification.
10930    
10931     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
10932     to get the classifcation and use the new ClassData* classes to
10933     hold the classification data. Use Str2Num to convert numbers
10934     properly.
10935    
10936     * Thuban/Model/save.py (Saver): Use new Color and Classification
10937     methods
10938    
10939     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
10940     custom grid.
10941     (ClassTable): Support for editing Values and Labels and for
10942     changing what type (point or range) of data is stored in each
10943     property based on how the user enters the data.
10944     (Classifier): Support for saving the new classifications and
10945     launching the dialog to edit a property.
10946     (SelectPropertiesDialog): New class for editing the visual
10947     properties of a classification (stroke color, width, and fill color)
10948     (ClassPreviewer): Took the Draw method from ClassRenderer and
10949     made most of it into this new class. Intend to use this class in
10950     the SelectPropertiesDialog for previewing changes.
10951    
10952     * Thuban/UI/renderer.py: Use new Color and Classification methods.
10953    
10954     * Thuban/UI/tree.py: Formatting changes.
10955    
10956     * Doc/thuban.dtd: Add 'label' element
10957    
10958     * Thuban/common.py: New. Contains common routines used throughout
10959     the code.
10960     (Str2Num): Takes a string and converts it to the "best" type of
10961     number.
10962    
10963 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
10964    
10965     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
10966     dragging flag is always set to 0 even when the tool implementation
10967     raises an exception
10968    
10969 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
10970    
10971     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
10972     method to create a splash screen.
10973     (ThubanApplication.ShowMainWindow): New. Show the main window.
10974     Needed so the splash screen can display the mainwindow
10975     (ThubanApplication.OnInit): Call the
10976     new splash_screen method to determine whether the application
10977     should display a splash screen. If it displays a splash screen do
10978     not immediately show the main window.
10979    
10980 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
10981    
10982     * Thuban/Model/classification.py: Added import line to fix
10983     feature conflicts between running on python2.2 and python2.1.
10984    
10985     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
10986     onto the clinfo parameter, so removed the deepcopy().
10987    
10988 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
10989    
10990 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
10991 jonathan 396 Added element_open variable to track opening and closing of tags
10992     so that tags that don't span more than one line are closed with
10993     /> instead of </tag_name>. Use the GetDefault*() methods of
10994     the Classification class.
10995    
10996     * Thuban/Model/classification.py (Classificaton): Added set and
10997     get methods for the default data. The class also takes a layer
10998     reference so that modification messages can be sent. Fixed the
10999     methods to use the new ClassData class.
11000     (ClassData): New class to encapsulate the classification data
11001    
11002     * Thuban/Model/layer.py (Layer): Remove the
11003 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
11004 jonathan 396 SetDefault*() methods on the layer's classification object.
11005 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
11006 jonathan 396 Classification class.
11007    
11008     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
11009     object instead of a dictionary.
11010    
11011 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
11012 jonathan 396 draw the classifications in the dialog box's table.
11013     (Classifier): Modified to use the ClassRenderer class.
11014    
11015 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
11016     methods of the Classification class.
11017 jonathan 396
11018     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
11019     of the ClassData class.
11020    
11021     * test/test_classification.py, test/test_layer.py,
11022     test/test_map.py, test/test_session.py: Fix the tests to work
11023     with the above code changes.
11024    
11025 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
11026    
11027     * Thuban/Model/classification.py (Classification): Added getNull()
11028     to return the NullData reference
11029    
11030     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
11031     Layer.SetStrokeWidth): Modified these functions to change the
11032     null data in the classification rather than keep these values
11033     directly in the Layer class. Menu options to change these values
11034     work again.
11035    
11036 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
11037    
11038 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
11039 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
11040 jonathan 380 classification data.
11041    
11042 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
11043     Colors in the tree view.
11044    
11045     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
11046     the tree info for classifications. Commented out unnecessary lines.
11047    
11048     * Thuban/Model/classification.py (Classification.TreeInfo): New
11049     function to add information about the classification into the
11050     tree view.
11051    
11052 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
11053 jan 375
11054 tkoester 403 * Thuban/__init__.py (_): New.
11055 jan 375
11056     * Thuban/Model/classification.py, Thuban/Model/extension.py,
11057     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
11058 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
11059     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
11060     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
11061     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
11062     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
11063     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
11064 jan 375
11065 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
11066    
11067 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
11068 jonathan 370
11069 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
11070     a layer classification. Supports specific data points and
11071     ranges.
11072 jonathan 370
11073 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
11074     information.
11075 jonathan 370
11076 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
11077     information.
11078 jonathan 370
11079 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
11080     specifying classification information.
11081 jonathan 370
11082 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
11083     dialog.
11084 jonathan 370
11085 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
11086     classification information.
11087 jonathan 370
11088 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
11089     classification data.
11090 jonathan 370
11091 tkoester 403 * test/test_classification: Tests for the Classification class.
11092 jonathan 370
11093 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
11094    
11095 bh 361 * test/test_command.py: New. Tests for the command classes.
11096    
11097 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
11098     (Command.IsTool): New method to distinguish between command
11099     switching tools and other commands.
11100    
11101     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
11102     the tool to avoid direct assignments to instance variables
11103     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
11104     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
11105     change the tool
11106    
11107     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
11108     active tool's command turns insensitive, disable the tool.
11109     (_tool_command): Use the new ToolCommand class
11110    
11111     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
11112     SelectTool method to change the tool
11113     (iconfile): Use the ToolCommand class
11114    
11115 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
11116    
11117     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
11118     the case of selected items that are not children of Layers or Maps
11119     properly. Previously this bug would trigger an assertion in
11120     wxWindows.
11121    
11122 frank 352 2002-11-06 Frank Koormann <[email protected]>
11123    
11124 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
11125     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
11126     Full Extent).
11127 tkoester 403
11128 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
11129    
11130     * setup.py (setup call): version now 0.1.3
11131    
11132     * MANIFEST.in: Add the files in test/
11133    
11134     * test/README: Add note about tests requiring the iceland data
11135    
11136     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
11137     copyright notice.
11138    
11139 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
11140    
11141     * test/test_map.py
11142     (TestMapWithContents.test_projected_bounding_box): Use an explicit
11143     epsilon.
11144    
11145     * test/support.py (FloatComparisonMixin.assertFloatEqual)
11146     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
11147     message if the assertion fails and don't return the return value
11148     of self.assert_. In assertFloatSeqEqual the return meant that not
11149     all items of the sequence were compared.
11150    
11151 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
11152    
11153 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
11154    
11155     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
11156    
11157 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
11158     the string with the bounding box on the fly because of platform
11159     differences in the way %g is handled.
11160    
11161     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
11162     DBFfile too because Thuban layers can't yet cope missing DBF
11163     files.
11164    
11165     2002-09-20 Bernhard Herzog <[email protected]>
11166    
11167 bh 326 * test/test_menu.py: Use initthuban instead of
11168     add_thuban_dir_to_path to initialize Thuban.
11169    
11170     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
11171     Mixin class for float comparisons
11172     (SubscriberMixin): New. Mixin class to test messages sent through
11173     the Connector class
11174    
11175     * test/README: Fix a typo and add the -v flag to the command for
11176     individual tests
11177    
11178 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
11179    
11180     * test/test_proj.py: New. Test cases for Thuban.Model.proj
11181    
11182     * test/test_map.py: New. Test cases for Thuban.Model.map
11183    
11184     * test/test_layer.py: New. Test cases for Thuban.Model.layer
11185    
11186     * test/test_label.py: New. Test cases for Thuban.Model.label
11187    
11188     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
11189    
11190     * test/test_color.py: New. Test cases for Thuban.Model.color
11191    
11192     * test/test_base.py: New. Test cases for Thuban.Model.base
11193    
11194 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
11195    
11196     * Thuban/Model/session.py (Session.forwarded_channels): Forward
11197     the CHANGED channel too.
11198    
11199     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
11200     CHANGED channel too.
11201     (Map.__init__): Call the Modifiable constructor as well.
11202    
11203     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
11204     event if the modified flag changes.
11205     (Modifiable.changed): Tweak the doc-string.
11206    
11207     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
11208     (MainWindow.set_position_text): Put the code that puts the text
11209     with the mouse position into the status bar into the new method
11210     set_position_text so that it can overwritten in derived classes.
11211    
11212 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
11213    
11214     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
11215     message box on the main window.
11216    
11217 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
11218    
11219     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
11220     the 'E' because it's less likely to interfere with other menu
11221     entries.
11222 bh 315 (MainWindow.build_menu): remove an incorrect comment.
11223 bh 313
11224 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
11225    
11226     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
11227     (_tool_command): Add sensitive parameter
11228     (_has_visible_map): Sensitivity callback to tools and other
11229     commands that require a visible map. Use it in map_zoom_in_tool,
11230     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
11231     and map_full_extent
11232    
11233 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
11234    
11235     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
11236     VIEW_POSITION
11237    
11238 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
11239 frank 306
11240     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
11241    
11242 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
11243    
11244 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
11245     wxWindows already and our implementation doesn't work correctly
11246     with wxGTK 2.3:
11247     (MapCanvas.__init__): Remove the instance variable
11248     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
11249     be drawin
11250     (MapCanvas.OnIdle): Removed.
11251    
11252 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
11253     a parameter to determine the size of the rectangle.
11254     (MapCanvas.find_shape_at): Create the box around the point on a
11255     layer by layer basis and make the size depend on the shape type.
11256     This solves a problem with the selection of point shapes at the
11257     border of the layer's bounding box
11258    
11259 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
11260    
11261 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
11262     for the sensitivity of remove layer.
11263     (_can_remove_layer): New. Sensitivity callback for remove layer
11264     (Command layer_remove): Use _can_remove_layer
11265    
11266     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
11267     determine whether a given layer can be deleted.
11268    
11269 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
11270     (MapCanvas.do_redraw): Get rid of the unused update_region
11271     instance variable
11272    
11273 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
11274    
11275 bh 292 * test/: new subdirectory with a bunch of unit tests.
11276    
11277     * test/README, test/test_table.py, test/test_save.py,
11278     test/test_menu.py, test/test_load.py: Initial set of tests and
11279     brief instructions on how to run them
11280    
11281 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
11282    
11283 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
11284     arcs with multiple parts.
11285    
11286 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
11287     Handle degenrate rectangles.
11288    
11289 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
11290     (Table.__init__): Keep track of whether the DBF is open for
11291     writing
11292     (Table.write_record): Open the DBF file for writing when necessary
11293    
11294 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
11295    
11296     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
11297     dbf files only for reading by default. Use a new writable dbf
11298     object for writing.
11299    
11300 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
11301    
11302 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
11303     (MainWindow.Context): New method to return a context
11304     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
11305     new method
11306    
11307 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
11308     layer table specific code from TableGrid into LayerTableGrid
11309     (TableFrame, LayerTableFrame): Split the layer table specific code
11310     from TableFrame into LayerTableFrame
11311 bh 280 (LayerTableGrid.select_shape): Remove a debug print
11312 bh 278
11313     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
11314     LayerTableFrame
11315    
11316 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
11317    
11318     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
11319     absolute filename.
11320    
11321 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
11322    
11323 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
11324     records.
11325 tkoester 403 (Table.__init__): Open the DBF file for writing too.
11326 bh 275
11327     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
11328     into the underlying table.
11329    
11330     * extensions/shapelib/shapefil.h (DBFCommit),
11331     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
11332     commit any changes made to the DBF file.
11333    
11334 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
11335     (_tool_command): Put the code that generates the "checked"
11336     callback into a separate function so that we can reuse it
11337     elsewhere
11338    
11339 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
11340     session into an XML file. The main reason to introduce a class is
11341     that applications built on Thuban can derive from it so that they
11342     can save additional information in a session file.
11343     (save_session): Delegate almost all the work to the Saver class.
11344     Rename the filename argument to file because it may be a file like
11345     object now.
11346    
11347     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
11348     code. Remove the little test code which would be executed when the
11349     module is run as a script which didn't work anymore since it can't
11350     import the other Thuban modules.
11351     (ProcessSession, load_session): Refactor the ProcessSession to
11352     have one method for each element start and end tag so that derived
11353     classes can easily override the processing of individual tags.
11354     Also, always parse with namespaces enabled because applications
11355     built on top of Thuban will likely use namespaces if they extend
11356     the session file format.
11357    
11358 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
11359    
11360     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
11361     because thubaninit_contents will do it for us.
11362    
11363 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
11364 jan 265
11365     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
11366     tree window already open
11367    
11368 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
11369    
11370 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
11371     with self.
11372    
11373     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
11374     when we have actually captured it.
11375    
11376 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
11377     shapefile and destroy the table.
11378    
11379     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
11380    
11381 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
11382    
11383 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
11384     instance variable columns
11385     (RecordTable.GetTypeName): row and col may be negative in some
11386     cases.
11387    
11388 bh 254 * setup.py (InstallLocal.initialize_options)
11389     (InstallLocal.finalize_options, InstallLocal.user_options): New
11390     option create-init-file to build a thubaninit.py when running
11391     install_local
11392     (InstallLocal.run): Create the thubaninit.py module when requested
11393     (thubaninit_contents): Split the template into several parts and
11394     create a new function thubaninit_contents that creates the
11395     contents of a thubaninit module.
11396     (ThubanInstall.run): Use the new function to create the thubaninit
11397     module.
11398    
11399 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
11400    
11401     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
11402     cleanup.
11403     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
11404    
11405     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
11406     direct base class' Destroy method.
11407    
11408     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
11409     layers.
11410     (Map.Destroy): Destroy the label_layer as well and call the
11411     inherited Desatroymethod first so that no more messages are
11412     issued.
11413     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
11414     message if the stacking order actually has changed. Add
11415     doc-strings.
11416     (Map.BoundingBox): Correct the doc-string.
11417     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
11418     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
11419    
11420     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
11421     all labels.
11422    
11423 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
11424    
11425     * Thuban/Model/map.py (Map.subscribe_layer_channels)
11426     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
11427     to a layer's channels into separate methods.
11428     (Map.RemoveLayer, Map.AddLayer): Call the new methods
11429     (Map.Destroy): Unsubscribe from a layer's channels before
11430     destroying it.
11431    
11432     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
11433     selected_layer parameter to searched_layer which is the layer to
11434     search in.
11435     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
11436     search to that layer. Return the selected layer and shape.
11437    
11438     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
11439     typo
11440    
11441 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
11442    
11443 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
11444     Extend the doc string.
11445     (ThubanApplication.subscribe_session)
11446     (ThubanApplication.unsubscribe_session): New methods to
11447     subscribe/unsubscribe to/from session channels.
11448     (ThubanApplication.SetSession): Call the new methods here.
11449     (ThubanApplication.maps_changed, ThubanApplication.set_map):
11450     Renamed set_map to maps_changed. Its now a subscriber for
11451     MAPS_CHANGED.
11452    
11453     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
11454     x-coordinate in case of simple clicks
11455    
11456     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
11457     don't pass it as a parameter
11458    
11459     * Thuban/Model/session.py (Session.RemoveMap): New
11460    
11461 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
11462     window size into a parameter.
11463    
11464 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
11465    
11466 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
11467     just commands.
11468    
11469 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
11470     parameter list a bit to allow setting the window title and the
11471     initial message in the status bar. Update the callers.
11472    
11473     * Thuban/UI/application.py (ThubanApplication.OnInit)
11474     (ThubanApplication.CreateMainWindow): Put the mainwindow
11475     instantiation into a separate method so that it can be overridden
11476     by a subclass.
11477    
11478 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
11479    
11480 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
11481     another changed message is issued to make it easier to get
11482     notified of changes.
11483     (Session): Update the doc string
11484     (Session.forward): Issue changed-events as CHANGED as well.
11485     (Session.changed): Overwrite the inherited version to issue
11486     CHANGED events as well.
11487    
11488     * Thuban/UI/tree.py: We can now simply subscribe to the session's
11489     CHANGED channel to be informed of changes.
11490     (SessionTreeCtrl.session_channels): Not needed any longer.
11491 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
11492 bh 234 Only have to (un)subscribe CHANGED
11493    
11494     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
11495    
11496 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
11497     for the wxPython locale bug to __init__.py so that it's
11498     automatically executed by anybody using UI code from Thuban.
11499    
11500 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
11501    
11502 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
11503    
11504     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
11505     as parameter and store it in an instance variable
11506     (MainWindow.invoke_command, MainWindow.update_command_ui)
11507     (MainWindow.save_modified_session, MainWindow.NewSession)
11508     (MainWindow.OpenSession, MainWindow.SaveSession)
11509     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
11510     application object.
11511    
11512     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
11513     the main window with self.
11514    
11515 bh 225 * Thuban/UI/context.py: New module with the context class
11516    
11517     * Thuban/UI/command.py (Command): Update doc string.
11518    
11519     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
11520     MainWindow.update_command_ui): Pass an instance of the context
11521     class to the command's methods
11522     (check_current_tool, call_method): Handle the new context
11523     implementation
11524    
11525     * Examples/simple_extensions/simple_tool.py (simple_tool,
11526     check_simple_tool): Handle the new context implementation
11527    
11528     * Examples/simple_extensions/simple_command.py (simple_command):
11529     Handle the new context implementation. Update the comments about
11530     the context.
11531    
11532     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
11533     doc-string
11534     (ThubanApplication.Session): New method to return the session
11535     object
11536    
11537     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
11538     interactor's selected_layer may not be a layer of the current
11539     session when the tree is updated while a new session is being set.
11540    
11541 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
11542    
11543     * Thuban/UI/tree.py (color_string): Removed. No longer used.
11544     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
11545     update_tree into update_tree and add_items. The tree now uses a
11546     more generic way to display the contents of the tree.
11547     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
11548    
11549     * Thuban/Model/layer.py (Layer.TreeInfo),
11550     Thuban/Model/extension.py (Extension.TreeInfo),
11551     Thuban/Model/map.py (Map.TreeInfo),
11552 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
11553 bh 217 Add TreeInfo methods to implement the new tree view update scheme
11554    
11555 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
11556    
11557     * Thuban/UI/application.py: Don't use "import from" for the
11558     MainWindow. It can't always be resolved.
11559     (ThubanApplication.OnInit): change reference to MainWindow
11560     accordingly.
11561    
11562     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
11563     completely
11564    
11565 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
11566    
11567     * setup.py (create_init_module): New configurable variable whose
11568     default depends on the platform we're running on.
11569     (ThubanInstall.initialize_options): Initialize
11570     self.create_init_module from the global create_init_module
11571     (ThubanInstall.user_options): indictate that the options
11572     create-init-module and init-module-dir have arguments.
11573    
11574     * setup.py: In the setup call change the version number to include
11575     cvs.
11576    
11577     * MANIFEST.in: Add the files in Examples
11578    
11579 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
11580    
11581 bh 210 * setup.py: In the setup call, use the thuban homepage as the
11582     value of the url parameter.
11583    
11584 bh 208 * Examples: New subdirectory for examples.
11585    
11586     * Examples/simple_extensions/simple_tool.xpm,
11587     Examples/simple_extensions/simple_tool.py,
11588     Examples/simple_extensions/simple_command.py,
11589     Examples/simple_extensions/README: Simple examples showing how to
11590     add new commands and tools.
11591    
11592 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
11593     bdist_rpm that we also have an install script.
11594     (bdist_inno): Add 2002 to the copyright notice.
11595    
11596 bh 205 * setup.py: Create a file in python's site-packages directory to
11597     make installation of Thuban as a library easier.
11598     (ThubanInstall.user_options): Add two new options,
11599     create-init-module and init-module-dir
11600     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
11601     filenames for installation in the default directories.
11602     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
11603     the inherited methods to capture some filenames before they're
11604     transformed too much by distutils.
11605     (ThubanInstall.run): Create the init module if requested.
11606     (ThubanInstall.thuban_init_filename): New method to return the
11607     full name of the init module.
11608     (ThubanInstall.get_outputs): Append the filename of the init
11609     module.
11610    
11611 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
11612    
11613 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
11614     handle the prefix properly which means that the default for the
11615     installation prefix should be /usr for RPMs and /usr/local when
11616     doing a normal source install.
11617     (bdist_rpm_install_script): Script to override the default install
11618     commands in the specfile generated by the bdist_rpm command.
11619     (thuban_bdist_rpm.user_options): Add a prefix option
11620     (thuban_bdist_rpm.initialize_options): Init the prefix option.
11621     Create the script files for the spec files as empty files here
11622     (thuban_bdist_rpm._make_spec_file): Override the inherited method
11623     to fill the script files with content.
11624    
11625 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
11626     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
11627     argument. save_session now automatically uses this version,
11628     solving a problem when saving to a relative filename.
11629    
11630     * setup.py: In the setup call, make sure that the library
11631     directories are under $prefix/lib not directly under $prefix.
11632    
11633 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
11634 jan 199
11635     * Thuban/Model/extension.py: new module to handle extension objects.
11636     * Thuban/Model/messages.py: new messages for extensions.
11637     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
11638     Session.AddExtension): new for handling extensions.
11639     Also some other minor changes to round up extension handling.
11640     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
11641     of Extension titles and title and names of its objects.
11642    
11643 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
11644    
11645     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
11646 bh 202 the events for a command.
11647 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
11648     Call bind_command_events to bind the events. add_toolbar_command
11649     can now bind events too so that it's possible to have commands
11650     that are only available through the toolbar.
11651     (MainWindow.init_ids): New instance variable events_bound to keep
11652     track of for which commands events have been bound.
11653    
11654 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
11655    
11656     * Thuban/UI/menu.py: New module to build and manage menus.
11657    
11658     * Thuban/UI/mainwindow.py: Remove some unused imports.
11659     (MainWindow.__init__, main_menu): move the definition of the main
11660     menu from __init__ to the Menu instance main_menu.
11661     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
11662     build the menu bar and sub-menus from a menu description.
11663    
11664     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
11665     startup file
11666     (ThubanApplication.read_startup_files): New method to run
11667     ~/.thuban/thubanstart.py
11668    
11669 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
11670     Move the toolbar definition to the Menu instance main_toolbar.
11671     (MainWindow.build_toolbar): New method to build the toolbar
11672     similar to the build_menu methods
11673    
11674 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
11675    
11676 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
11677     layer_outline_color. Fix it in the definition of the command too.
11678    
11679 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
11680    
11681 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
11682    
11683     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
11684     in the docstring
11685    
11686 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
11687    
11688 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
11689     when the shapefile is empty.
11690     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
11691     now return None for empty shapefiles. Update doc-strings.
11692    
11693     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
11694     the layer's bbox being None.
11695    
11696     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
11697     layer's bbox being None.
11698    
11699 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
11700     necessary.
11701     (MapCanvas.__init__): New instance variables, last_selected_layer
11702     and last_selected_shape to determine how the selection has
11703     changed.
11704    
11705     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
11706     AutoSizeColumns because it will cause a traversal of the entire
11707     table which for large .dbf files will take a very long time.
11708    
11709 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
11710    
11711     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
11712     maximum depth for the tree than shapelib does by default.
11713    
11714 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
11715    
11716     * setup.py (py_modules): The shptree modules doesn't have a
11717     wrapper, so don't include it in the py_modules
11718    
11719 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
11720    
11721     * extensions/shapelib/shptree.c (compare_ints): Make arguments
11722     const void * as in the qsort prototype
11723     (SHPTreeFindLikelyShapes): Remove some unused variables.
11724    
11725     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
11726     maintains to redraw the window during a drag.
11727     (MapCanvas.unprojected_rect_around_point): New method to determine
11728     a small region around a point for hit-testing.
11729     (MapCanvas.find_shape_at): Only test the shapes in a small region
11730     around the point.
11731    
11732     * setup.py: Increment the version to 0.1.2
11733    
11734     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
11735     debug print and set session to None after unsubscribing
11736    
11737 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
11738    
11739 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
11740     the file to have a .thuban extension.
11741    
11742 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
11743     all the session channels to subscribe to to update the tree
11744     (SessionTreeCtrl.session_changed): Remember the session so that we
11745     can unsubscribe properly. Use the new class constant to
11746     unsubscribe from the old session and subscribe to the new one.
11747     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
11748     subscriptions of the SessionTreeCtrl.
11749     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
11750    
11751     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
11752     Session Tree" command to the file menu.
11753    
11754     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
11755     as update_region to the renderer.
11756    
11757     * Thuban/UI/renderer.py
11758     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
11759     update box is now directly a tuple, not a wxRect anymore.
11760    
11761     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
11762     prints.
11763    
11764     2002-05-07 Bernhard Herzog <[email protected]>
11765    
11766 bh 146 * setup.py: Add the shptree extension module. See
11767     extensions/pyshapelib/ChangeLog for more details.
11768    
11769     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
11770     extensions/shapelib/dbfopen.c: Really update to the versions of
11771     shapelib 1.2.9. For some reason it wasn't really done on
11772     2002-04-11.
11773    
11774     * extensions/shapelib/shptree.c: Modified version of shptree.c of
11775     shapelib 1.2.9. The only real difference is the use of qsort
11776     instead of a bubble sort implementation
11777    
11778     * Thuban/Model/layer.py (Layer.__init__): New instance variable
11779     shapetree to hold the shapelib quadtree for the shapefile
11780     (Layer.open_shapefile): Create the quad tree.
11781     (Layer.ShapesInRegion): New method to return the ids of shapes in
11782     a given region using the quad tree.
11783    
11784     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
11785     comment
11786     (draw_polygon_shape): Accept both arcs and polygons.
11787     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
11788     the api.
11789    
11790     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
11791     return the shape ids to be rendered in a given layer.
11792     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
11793     ids. Use draw_polygon_shape to draw arc shapes as well.
11794     (ScreenRenderer.RenderMap): New parameter for the rectangle that
11795     has to be updated
11796     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
11797     calling it's ShapesInRegion method.
11798    
11799     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
11800     update_region for the update region.
11801     (MapCanvas.OnPaint): Maintain the update region
11802     (MapCanvas.do_redraw): Pass the bounding box of the update_region
11803     to the renderer when drawing the bitmap. Reset the update_region.
11804    
11805 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
11806    
11807 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
11808     MainWindow.OpenSession): Change the file extension of the session
11809     files to .thuban
11810    
11811 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
11812     Move the map channels to be forwarded by the session into the
11813 bh 146 class constant with forwarded_channels. Also add
11814     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
11815     forwarded_channels
11816 bh 129
11817     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
11818     typo and some rewording).
11819    
11820 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
11821    
11822     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
11823     around to speed up most redraws:
11824     (MapCanvas.__init__): New instance variable bitmap which holds the
11825     bitmap
11826     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
11827     self.bitmap to draw.
11828     (MapCanvas.full_redraw): New method to force a full redraw
11829     including the bitmap
11830     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
11831     make sure the bitmap is redrawn.
11832     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
11833     MapCanvas.shape_selected): Call full_redraw instead of readraw to
11834     make sure the bitmap is redrawn.
11835     (MapCanvas.OnSize): New method to handle size events so that the
11836     bitmap can be redrawn.
11837    
11838 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
11839    
11840     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
11841     canvas' VIEW_POSITION event
11842     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
11843     Update the text in the status-bar accordingly.
11844    
11845     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
11846     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
11847     called.
11848     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
11849     current_position
11850     (MapCanvas.set_current_position): New method to set
11851     current_position. Issue a VIEW_POSITION event
11852     (MapCanvas.CurrentPosition): New public method to return the value
11853     of current_position. Should be called when the VIEW_POSITION event
11854     is processed.
11855     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
11856     Update the position.
11857     (MapCanvas.OnLeaveWindow): Set the position to None.
11858    
11859     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
11860     position in the statusbar
11861    
11862 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
11863 frank 120
11864     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
11865    
11866 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
11867    
11868 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
11869    
11870     * Resources/Bitmaps/fullextent.xpm: new
11871 jan 116
11872 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
11873 jan 116
11874 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
11875     box
11876 jan 114
11877 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
11878    
11879 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
11880    
11881     * Thuban/UI/tree.py (update_tree): added added map extent
11882    
11883     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
11884 tkoester 403 icon; added map_full_extend as tool
11885 jan 114
11886 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
11887 jan 107
11888     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
11889     saving _new_ sessions
11890    
11891     * Thuban/Model/session.py (create_empty_session): new session
11892     don't have a filename (set to None)
11893    
11894     * Thuban/UI/tree.py (update_tree): added filename and modified flag
11895    
11896     * Thuban/Model/load.py (ProcessSession): convert projection
11897     parameters from unicode to regular string
11898    
11899     * Data/iceland_sample.session: Added UTM Zone 26 projection.
11900    
11901 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
11902    
11903     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
11904     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
11905     1.2.9
11906    
11907     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
11908     the pyshapelib directoy into the list of include dirs, so that
11909     pyshapelib_api.h can be found.
11910    
11911     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
11912     holds the pyshapelib C-API
11913     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
11914     pyshapelib_api to access the shapelib functions.
11915     (initwxproj): Import the c_api from the shapelib module and
11916     initialize pyshapelib_api.
11917    
11918 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
11919    
11920 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
11921     initialize_options to create the scripts for the rpm.
11922    
11923 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
11924    
11925 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
11926    
11927 bh 87 * setup.py: Increment version to 0.1.1
11928    
11929 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
11930     Layer" and "Remove Layer" commands from the layer menu to the map
11931     menu
11932    
11933 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
11934    
11935     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
11936     argument (python <= 1.5.2 erroneously accepted multiuple
11937     arguments)
11938    
11939 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
11940    
11941     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
11942     RecordGrid in the identifyview.
11943     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
11944     IdentifyListCtrl. The grid allows editing of the values.
11945    
11946     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
11947     implementing a grid for a single row of a thuban table.
11948    
11949     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
11950     layers by default. Easier to use than the previous default of only
11951     searching through the select layer which meant that if no layer
11952     was selected, you couldn't select a shape.
11953    
11954     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
11955    
11956     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
11957     stroke_width attribute
11958    
11959     * Thuban/Model/save.py (save_session): Write the new stroke_width
11960     attribute
11961    
11962     * Thuban/Model/load.py (ProcessSession.startElement): Read the
11963     stroke_width attribute
11964    
11965     * Thuban/Model/layer.py (Layer.__init__): New parameter and
11966     instance variable stroke_width
11967     (Layer.SetStrokeWidth): Set the stroke_width.
11968    
11969 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
11970    
11971     * extensions/thuban/wxproj.cpp (project_points): Fix two
11972     off-by-one errors in the last loop that joins the various parts
11973     together.
11974    
11975 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
11976    
11977     * setup.py (data_dist.make_distribution): Fix some typos
11978    
11979 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
11980    
11981     * README: Slight tweaking in preparation for the 0.1 release
11982    
11983     * setup.cfg: Add section for sdist to create both tgz and zip
11984     archives
11985    
11986     * setup.py: increase version number to 0.1
11987     (data_dist): New command class for data distribution
11988    
11989 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
11990    
11991 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
11992     Handle the case of no layer (i.e. layer is None) properly.
11993    
11994 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
11995 bh 70 Set the initial selection of the combo boxes to reflect the
11996     projection we're starting with in a way that works on windows,
11997     too.
11998    
11999 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
12000     puiblisher's ids in hex to make it easier to compare them to the
12001     standard repr of python methods
12002    
12003     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
12004     messages
12005    
12006 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
12007    
12008 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
12009     deselect the layer if no layer is selected
12010    
12011 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
12012     idle time when there actually is something to draw. If there's
12013     nothing to draw simply clear the window
12014     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
12015     (MapCanvas.SetMap): force a redraw in all cases because
12016     FitMapToWindow doesn't always do it.
12017     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
12018     specify the point to move into the center of the window
12019     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
12020     dragged, zoon in/out by a factor of 2
12021 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
12022     index, i.e. reversed drawing order) so that objects appearing to
12023     be in from of others are selected first. This is probably mostly
12024     relevant for point shapes where the symbols used may overlap
12025 bh 59
12026     * Thuban/Model/session.py (create_empty_session): Unset the
12027     modified bit before returning it
12028    
12029     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
12030     create_empty_session session to create the new, empty session.
12031    
12032     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
12033     the tool bitmaps.
12034     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
12035     the code that asks whether the session should be saved into the
12036     new method save_modified_session.
12037     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
12038     method to save modified session here too.
12039    
12040 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
12041    
12042     * setup.py (InnoIconItem): fix typo
12043    
12044     (thuban_bdist_inno.run):
12045     (bdist_inno.run): Move the decision not to create symlinks on
12046     non-nt platforms to thuban_bdist_inno and do it unconditinally
12047     since we never want to create the symlinks here
12048    
12049 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
12050    
12051 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
12052     identify view immediately
12053    
12054     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
12055     and SelectableRecordListCtrl that implement the code shared by the
12056     identify view and the label dialog
12057    
12058     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
12059     new class RecordListCtrl
12060    
12061     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
12062     return value of GetValue is None instead of using it as a boolean
12063     directly so that Zero numbers are handled properly.
12064     (LabelListCtrl): Derive from the new class
12065     SelectableRecordListCtrl
12066    
12067 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
12068     (Proj4Dialog.dialogLayout): Make the window resizable and set the
12069     size of the text control explicitly to make the sizers work on
12070     both Windows and X.
12071    
12072 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
12073    
12074     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
12075     that can limit the search to the currently selected layer.
12076     (MapCanvas.SelectShapeAt): Make sure that the currently selected
12077     layer stays selected even when no shape is found
12078 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
12079     height do nothing (avoids zero division errors)
12080 bh 44
12081 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
12082    
12083 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
12084     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
12085     convenient :-)
12086     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
12087     a new instvar layer_to_item to map layers to tree items
12088     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
12089     to match the current selection in the interactor
12090    
12091 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
12092     (Interactor.HasSelectedLayer): New methods to query the current
12093     selection
12094    
12095     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
12096     (MainWindow.has_selected_layer): Simply call the appropriate
12097     interactor method
12098    
12099     * Thuban/UI/mainwindow.py (MainWindow.__init__):
12100     (MainWindow.LayerShowTable):
12101     (MainWindow.identify_view_on_demand): Store the interactor in an
12102     instvar and use that reference instead of going through main.app
12103    
12104 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
12105     * Thuban/UI/application.py (ThubanApplication.OnInit):
12106 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
12107     with the new mainwindow method ShowSessionTree and not directly
12108     the application's OnInit method
12109    
12110     * Thuban/UI/tree.py (myTreeCtrlPanel):
12111     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
12112     TreeCtrl isntead of a panel. This affects most method since we now
12113     refer to self instead of self.tree
12114     (SessionTreeView): New class implementing a non-modal dialog
12115     showing the session tree.
12116    
12117 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
12118     layer to the tableview dialog.
12119    
12120     * Thuban/UI/tableview.py: Add some doc-strings
12121 tkoester 403 (TableGrid):
12122 bh 35 (TableGrid.OnRangeSelect):
12123     (TableGrid.OnSelectCell):
12124     (TableFrame.__init__):
12125     (TableFrame.row_selected):
12126     Selecting rows in the grid view now updates the selected shapes
12127     through the TableFrame. To achieve this we derive TableGrid from
12128     Publisher and introduce the message type ROW_SELECTED which the
12129     TableFrame subscribes to and which is issued by OnRangeSelect and
12130     OnSelectCell
12131    
12132     (DataTable.SelectRow): Removed because it's no longer needed in
12133     the row/shape selection scheme
12134    
12135 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
12136     dialogs
12137    
12138     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
12139     the SELECTED_SHAPE message anymore. This is now handled by the
12140     parent.
12141     (TableGrid.select_shape): Only update the selection if the shape
12142     is not None.
12143     (TableFrame): Inherit from the new NonModalDialog class.
12144     (TableFrame.__init__, TableFrame.select_shape): Handle the
12145     SELECT_SHAPE message.
12146     (TableFrame.OnClose): Extend the inherited method to unsubscribe
12147     SELECT_SHAPE
12148    
12149     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
12150     (MainWindow.add_dialog):
12151     (MainWindow.dialog_open):
12152     (MainWindow.remove_dialog):
12153     (MainWindow.get_open_dialog): New methods to maintain a dictionary
12154     of opened non-modal dialogs.
12155    
12156     (MainWindow.__init__): Initialize the new non-modal dictionary
12157     management code
12158     (MainWindow.LayerShowTable): maintain separate dialogs for each
12159     table using the non-modal dialog management code to only open a
12160     view once for each table.
12161    
12162     (MainWindow.IdentifyTool):
12163     (MainWindow.__init__):
12164     (MainWindow.identify_view_on_demand): Don't open the identify view
12165     in IdentifyTool anymore. This will be done automatically by the
12166     new method identify_view_on_demand which handles the
12167     SELECTED_SHAPE message so that the identify view will be opened on
12168     demand
12169    
12170     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
12171     the interactor argument. The SELECTED_SHAPE message is now handled
12172     by the parent.
12173     (IdentifyView.__init__): Add the interactor argument so that we
12174     can handle the SELECTED_SHAPE message here
12175     (IdentifyView.selected_shape): New method to handle the
12176     SELECTED_SHAPE messages
12177    
12178     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
12179     NonModalDialog class
12180     (IdentifyView.OnClose): Extend the inherited version to
12181     unsubscribe SELECT_SHAPE
12182    
12183     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
12184    
12185 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
12186    
12187     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
12188 tkoester 403
12189 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
12190     interactor to pass through to the MapCanvas
12191 tkoester 403
12192 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
12193     argument to the MainWindow constructor to get rid of the ugly hack
12194     that made main.app available early just so that the mapcanvas
12195     could access the interactor object.
12196    
12197 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
12198    
12199 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
12200     that runs a modal message box
12201     (MainWindow.OnClose): Use the new method
12202     (MainWindow.RemoveLayer): Just do nothing in case no layer is
12203     selected. The command should be grayed out anyway, so there's no
12204     need to pop up a message box.
12205     (MainWindow.AddLayer): Pop up a message box with an error message
12206     if the shape file can't be opened
12207    
12208     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
12209     immediately. This will cause an exception in case the file can't
12210     be opened and we can display an appropriate message.
12211    
12212 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
12213    
12214     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
12215     specific bdist_rpm command.
12216    
12217     * Thuban/UI/main.py: Catch ImportError exceptions when importing
12218     the locale module because it may not be available on some
12219     installations.
12220    
12221     * extensions/pyprojection/LICENSE: Copy of the license text in
12222     Projection.i. Having it in a separate file makes it easier to
12223     refer to license text in e.g. RPMs
12224    
12225 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
12226    
12227 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
12228     more generic
12229    
12230     * setup.py (ThubanInstall.get_outputs): Add the symlink in
12231     <prefix>/bin to the outputs
12232     (ThubanInstall.link_file): New method to link files. We need this
12233     because the standard copy_files refuses to link non-existing
12234     files.
12235     (ThubanInstall.run): Remove the leading install root from the
12236     script filename if an install root was specified and use the new
12237     link_file method
12238 tkoester 403
12239 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
12240     the window when the first layer is added to the map.
12241    
12242     * setup.py (ThubanInstall.run): Honor the build root (self.root)
12243     when linking thuban.py to <prefix>/bin
12244    
12245 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
12246    
12247     * setup.py: In the setup call, the install parameters shouldn't
12248     have trailing slashes because distutils on non-posix platforms
12249     doesn't like that. The same applies to other directories like
12250     "Resources/Bitmaps"
12251    
12252     In the configuration section for nt, move the wxWindows directory
12253     optins into the part clearly marked as editable.
12254    
12255     (InstallLocal.initialize_options):
12256     (InstallLocal.user_options): remove the currently unused debug
12257     flag
12258     (thuban_build_py.find_all_modules): Add this method so that it
12259     works for our case of having packages and modules in one
12260     distribution as well.
12261     (ThubanInstall.initialize_options):
12262     (ThubanInstall.finalize_options):
12263     (ThubanInstall.user_options):
12264     (ThubanInstall.boolean_options): Add new options, do-symlink and
12265     extra files. Since these are the first ThubanInstall specific
12266     options, override user_options and boolean_options
12267     (ThubanInstall.run): Honor the new do-symlink and extra-files
12268     options.
12269     (ThubanInstall.get_outputs): Add to override the base-class's
12270     version and add the extra-files to the outputs
12271     (bdist_inno): New class for windows distributions with Inno Setup
12272     (InnoIconItem): Helper class for bdist_inno
12273     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
12274     this together with the appropriate parameters, to the setup call.
12275 tkoester 403
12276 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
12277     installer
12278    
12279     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
12280     changing_selection to avoid recursive selection events when
12281     modifying the selection in response to a selection event.
12282     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
12283     changing the tree's selection.
12284     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
12285     we're not being called indirectly from normalize_selection.
12286    
12287     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
12288     event.Check only if the command is actuall checkable.
12289     (MainWindow.__init__): Call the toolbar's Realize method to make
12290     sure that the items are actually shown
12291    
12292 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
12293    
12294 bh 9 * setup.py: Fix some doc strings
12295    
12296 bh 7 * ChangeLog: started
12297    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26