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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1865 - (hide annotations)
Fri Oct 24 17:26:04 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 308639 byte(s)
update ChangeLog

1 bh 1865 2003-10-24 Bernhard Herzog <[email protected]>
2    
3     * libraries/thuban/wxproj.cpp (draw_polygon_shape)
4     (point_in_polygon_shape, shape_centroid): Raise an exception if
5     the shape can't be read. Previously invalid shape ids would lead
6     to a segfault.
7    
8     * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
9     New. test whether an exception is raised for invalid shape ids
10    
11 jan 1857 2003-10-24 Jan-Oliver Wagner <[email protected]>
12    
13 jan 1862 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
14     as alias for 'latlong'.
15    
16     * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
17     as alias for 'latlong'.
18    
19     2003-10-24 Jan-Oliver Wagner <[email protected]>
20    
21 jan 1859 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
22     the projection even for the UnknownPanel.
23     (UnknownProjPanel.__init__): Define the text and create the textctrl
24     widget.
25     (UnknownProjPanel._DoLayout): Replaced static text widget by the
26     textctrl created in __init__.
27     (UnknownProjPanel.SetProjection): Set the text for the text ctrl
28     including the parameters of the projection.
29    
30     2003-10-24 Jan-Oliver Wagner <[email protected]>
31    
32 jan 1857 * Resources/Projections/epsg.proj: New. This is a list of
33     EPSG codes with parameters for proj. The list has been
34     generated using devtools/create_epsg.py based on the
35     file nad/epsg of the proj 4.4.7 package. Four projection
36     definitions have been deleted as they are not accepted by proj:
37     "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
38     and "HD72 / EOV".
39    
40 bh 1855 2003-10-22 Bernhard Herzog <[email protected]>
41    
42     Some more tweaks to the projection dialog which should fix RT
43     #1886.
44    
45     * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
46     the ProjFile's messages and call the base class methods correctly
47     (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
48     flag on the newly selected item too. Otherwise some other item is
49     focused and the first time the focus is moved with the keyboard
50     the selection moves in unexpected ways.
51    
52     * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
53     focus on the OK button, only on the projection list. That way the
54     list really has the focus initially
55     (ProjFrame.OnClose): Call the projection list's Destroy method to
56     make it unsubscribe all messages
57    
58 bh 1840 2003-10-21 Bernhard Herzog <[email protected]>
59    
60 bh 1852 Rework the projection dialog to fix a few bugs, including RT 2166
61     and most of 2168
62    
63     * Thuban/UI/projlist.py: New. The class ProjectionList is a
64     special wxListCtrl to show a list of projections in a more MVC
65     fashion
66    
67     * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
68     throughout the class. The main change is to use the ProjectionList
69     class instead of a normal wxListBox. Also, add an explicit
70     "Unknown" projection to the projection choice control.
71     (ProjPanel.__init__): Add an "unknown" ellipsoid
72     (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
73     instantiation of the panel's controls to make the tab-order more
74     natural
75    
76     2003-10-21 Bernhard Herzog <[email protected]>
77    
78 bh 1849 * test/test_load.py (TestSingleLayer.file_contents)
79     (TestSingleLayer.test): Add non-ascii characters to the titles of
80     session, map and layer. This is effectively a port of the
81     TestUnicodeStrings test in test_load_0_8.py which for some reason
82     was only added there.
83    
84     * test/test_load_0_9.py (TestSingleLayer.file_contents)
85     (TestSingleLayer.test): Same as in test_load.py: add non-ascii
86     characters to the titles of session, map and layer,.
87    
88     2003-10-21 Bernhard Herzog <[email protected]>
89    
90 bh 1847 Add EPSG projection handling to .thuban files
91    
92     * test/test_save.py (SaveSessionTest.dtd)
93     (SaveSessionTest.testEmptySession)
94     (SaveSessionTest.testLayerProjection)
95     (SaveSessionTest.testRasterLayer)
96     (SaveSessionTest.testClassifiedLayer)
97     (SaveSessionTest.test_dbf_table)
98     (SaveSessionTest.test_joined_table)
99     (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
100     (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
101     use a and epsg projection to test saving them
102    
103     * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
104     namespace
105     (TestLayerVisibility.file_contents, TestLabels.file_contents)
106     (TestLayerProjection.file_contents)
107     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
108     (TestPostGISLayer.file_contents)
109     (TestPostGISLayerPassword.file_contents)
110     (TestLoadError.file_contents, TestLoadError.test): Update to use
111     1.0-dev namespace
112     (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
113     use 1.0-dev namespace and use an EPSG projection to test whether
114     loading it works
115    
116     * test/test_load_0_9.py: New. Effectively a copy of test_load.py
117     as of Thuban 0.9. These are now tests to determine whether Thuban
118     can still read files generated by Thuban 0.9
119    
120     * Thuban/Model/save.py (SessionSaver.write)
121     (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
122     namespace
123     (SessionSaver.write_projection): Write the projection's epsg
124     attribute
125    
126     * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
127     thuban-1.0-dev.dtd namespace
128     (SessionLoader.check_attrs): Allow a callable object as conversion
129     too
130     (SessionLoader.start_projection, SessionLoader.end_projection)
131     (SessionLoader.start_parameter): Handle the epsg attribute and
132     rename a few instance variables to lower case
133    
134     * Resources/XML/thuban-1.0.dtd: New. Only difference to
135     thuban-0.9.dtd is the epsg attribute for projections.
136    
137     2003-10-21 Bernhard Herzog <[email protected]>
138    
139 bh 1840 * test/runtests.py (main): Let the user specify which tests to run
140     on the command line
141    
142     * test/support.py (ThubanTestResult.getDescription): Override to
143     give a better short description. The description can be used as a
144     parameter to run_tests to run that particular test in isolation.
145    
146 frank 1837 2003-10-21 Frank Koormann <[email protected]>
147    
148     Popup menu for legend. Scheduled for the 1.2 release this was too
149     simple to implement: The popup menu is bound to the legend tree, while
150     the events are hanlded by its anchestor, the legend panel. This
151     allows reuse of all the event handlers already implemented for the
152     legend toolbar buttons.
153    
154     * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
155     to add handlers for the events issued by the popup menu.
156     (LegendPanel._OnToggleVisibility): Handler for toggling layer
157     visibility event
158     (LegendPanel._OnProjection): Handler for layer projection event.
159     (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
160     (LegendTree._OnRightClick): Event handler for right click, select item
161     and pop up menu.
162     (LegendTree.ToggleVisibility): Toggle layer visibility
163     (LegendTree.LayerProjection): Raise layer projection dialog for
164     current layer.
165    
166 bh 1836 2003-10-21 Bernhard Herzog <[email protected]>
167    
168     * Resources/Projections/defaults.proj: Use correct DOCTYPE
169     declaration. The top-level element is projectionlist not projfile
170    
171 bh 1834 2003-10-20 Bernhard Herzog <[email protected]>
172    
173     * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
174     method to write a projfile and display a busy cursor and error
175     dialogs.
176     (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
177     (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
178     (ProjFrame.__FillAvailList): Translate "<None>" too and display a
179     busy cursor while loading the user and system prj files.
180    
181 bh 1832 2003-10-16 Bernhard Herzog <[email protected]>
182    
183     * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
184     ProjFile objects
185     (clear_proj_file_cache): New function to clear the cache. Mainly
186     useful for use by the test suite
187     (read_proj_file): Use the cache.
188    
189     * test/test_proj.py (TestProjFile): Clarify the doc-string
190     (ProjFileReadTests): Update doc-string
191     (ProjFileReadTests.test_get_system_proj_file): Check whether the
192     system proj files is cached.
193     (ProjFileLoadTestCase): New base class for the proj file tests
194     derived from support.FileLoadTestCase to provide some common
195     behavior.
196     (TestLoadingProjFile)
197     (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
198     (TestProjFileWithInvalidParameters.file_contents): Derive from
199     ProjFileLoadTestCase
200     (TestLoadingProjFile.test_caching): New. Test whether the cache
201     works
202    
203 silke 1829 2003-10-16 Silke Reimer <[email protected]>
204    
205     * debian/*: New directory with configuration files for building a thuban
206     deb-package.
207    
208 bh 1822 2003-10-14 Bernhard Herzog <[email protected]>
209    
210 bh 1828 * test/test_proj.py: Execute support.run_tests when run as
211     __main__ so that missing unsubscribes are detected
212     (TestProjFile.tearDown): Destroy the proj_file properly
213    
214     2003-10-14 Bernhard Herzog <[email protected]>
215    
216 bh 1826 * Thuban/Model/messages.py (PROJECTION_ADDED)
217     (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
218     the ProjFile objects
219    
220     * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
221     easily send messages when the projections change
222     (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
223     when the change was successful
224    
225     * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
226     proj file messages
227     (TestProjFile.test_add_remove)
228     (TestProjFile.test_remove_non_existing)
229     (TestProjFile.test_replace)
230     (TestProjFile.test_replace_non_existing): Test whether the right
231     messages are sent
232    
233     2003-10-14 Bernhard Herzog <[email protected]>
234    
235 bh 1822 * test/test_proj.py (TestProjFile.test): Refactor into several
236     tests
237     (TestProjFile.test_add_remove)
238     (TestProjFile.test_remove_non_existing)
239     (TestProjFile.test_replace)
240     (TestProjFile.test_replace_non_existing): Some of the new
241     individual test cases
242     (TestProjFileSimple): New class for the rest of the test cases
243     that came out of the refactoring
244     (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
245     derived classes don't have to
246    
247 bh 1812 2003-10-13 Bernhard Herzog <[email protected]>
248    
249 bh 1820 Add an optional EPSG code to the projection objects and extend the
250     .proj file format accordingly.
251    
252     * Resources/XML/projfile.dtd (element projection): Add epsg
253     attribute
254    
255     * Thuban/Model/proj.py (Projection.__init__): New parameter and
256     instance variable epsg. Update doc-string
257     (Projection.EPSGCode, Projection.Label): New methods to provide
258     access to EPSG code and a label for use in dialogs
259    
260     * Thuban/Model/resource.py (ProjFileReader.start_projection)
261     (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
262     Handle the epsg code attribute when reading or writing proj files
263    
264     * Thuban/UI/projdialog.py (ProjFrame._OnSave)
265     (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
266     (ProjFrame.__FillAvailList): Use the projection's Label method to
267     get the string for the list box
268    
269     * test/test_proj.py (TestProjection.test_label)
270     (TestProjection.test_label_epsg)
271     (TestProjection.test_epsgcode_for_non_epsg_projection)
272     (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
273     for the label and EPSGCode methods
274     (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
275     (WriteProjFileTests.test_write_empty_file): Create the ProjFile
276     objects in the test cases and put the expected contents into the
277     test case methods too. Update doTestWrite accordingly
278     (TestLoadingProjFile)
279     (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
280     read tests from TestProjFile.
281     (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
282     tests are now in the new classes.
283     (sample_projfile, sample_projfile_data)
284     (sample_projfile2, sample_projfile_data2): Removed. Not used
285     anymore.
286     (TestProjFile.test_read_unreadable_file): No need to reset the
287     permissions at the end anymore since we use a unique filename
288    
289     2003-10-13 Bernhard Herzog <[email protected]>
290    
291 bh 1814 * test/test_proj.py: Some more refactoring of the test cases
292     (ProjFileTest): New base class for the proj file tests.
293     (TestProjFile): Derive from ProjFileTest
294     (TestProjFile.test_read_unreadable_file)
295     (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
296     the new filename method to get a unique filename
297     (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
298     (WriteProjFileTests): New class for proj file write tests.
299     Contains the write test that were in TestProjFile originally.
300    
301     2003-10-13 Bernhard Herzog <[email protected]>
302    
303 bh 1812 * test/test_proj.py (TestProjFile.testRead)
304     (TestProjFile.test_read_non_existing_file)
305     (TestProjFile.test_read_unreadable_file)
306     (TestProjFile.test_read_empty_file): Split into several methods.
307    
308 bh 1805 2003-10-10 Bernhard Herzog <[email protected]>
309    
310 bh 1810 * Thuban/UI/sizers.py: New file with custom sizers.
311    
312     * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
313     all projection type specific panels and put them into a
314     NotebookLikeSizer. This way the dialog doesn't change its size
315     when a different projection is selected
316     (ProjFrame.__init__): Rename projection_panels
317     projection_panel_defs and reuse projection_panels for a list of
318     the instantiated panels.
319     (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
320     (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
321     the panels
322     (UnknownProjPanel._DoLayout): Place the newlines in the message
323     differently to make the panel narrower.
324     (TMPanel._DoLayout): Layout the parameters in one column.
325    
326     2003-10-10 Bernhard Herzog <[email protected]>
327    
328 bh 1807 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
329     that contains all the setup for the dialog's widgets, layout and
330     event handling.
331     (__): Call build_dialog to build the dialog.
332     (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
333     Their functionality is now in build_dialog
334     (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
335     (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
336     (ProjFrame.__DoOnProjChoice): Small updates due to slightly
337     different widget names and hierarchy introduced with build_dialog.
338    
339     2003-10-10 Bernhard Herzog <[email protected]>
340    
341 bh 1805 * README: Fix typo.
342    
343 bh 1803 2003-10-09 Bernhard Herzog <[email protected]>
344    
345     * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
346     projection is already in the list. This is *a lot* faster when
347     loading files with hundreds of projections since it saves a linear
348     search. OTOH this will allow adding the same projection to the
349     user.proj file multiple times in the projection dialog but we'll
350     deal with that later
351    
352 jan 1801 2003-10-09 Jan-Oliver Wagner <[email protected]>
353    
354     * devtools: New. Directory for developer tools that are not intended
355     for the regular user.
356    
357     * devtools/create_epsg.py: New. Convert the epsg file of proj into
358     a python .proj file.
359    
360 bh 1799 2003-10-09 Bernhard Herzog <[email protected]>
361    
362     * test/test_proj.py
363     (TestProjection.test_get_parameter_without_equals_sign): New. Test
364     whether GetParameter handles parameters without "=" sign correctly
365    
366     * Thuban/Model/proj.py (Projection.GetParameter): Handle
367     parameters that do not contain a "=". Update the doc-string
368    
369 bh 1794 2003-10-08 Bernhard Herzog <[email protected]>
370    
371 bh 1796 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
372     length limit on the projname text control
373    
374     2003-10-08 Bernhard Herzog <[email protected]>
375    
376 bh 1794 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
377     (TestProjection.test_get_projection_units_normal): New. Tests for
378     the Projection.GetProjectedUnits method
379    
380 jan 1792 2003-10-08 Jan-Oliver Wagner <[email protected]>
381    
382     * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
383     Added missing 'val' parameter.
384    
385 bh 1788 2003-10-08 Bernhard Herzog <[email protected]>
386    
387 bh 1790 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
388     projection type of the currently selected projection is not known,
389     i.e. there's no panel for it, use the UnknownProjPanel
390     (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
391     the actual replacing of the proj panel into the new method
392     _show_proj_panel.
393     (UnknownProjPanel): Add doc-string.
394     (UnknownProjPanel._DoLayout): Insert a newline into the text so
395     that the panel is not so wide.
396    
397     2003-10-08 Bernhard Herzog <[email protected]>
398    
399 bh 1788 * Thuban/Model/resource.py (read_proj_file): Return the warnings
400     too. Update the doc-string
401     (get_proj_files): Removed. It wasn't used anywhere
402     (get_system_proj_files, get_system_proj_file): Rename to
403     get_system_proj_file and return the ProjFile object and not a list
404     of ProjFile objects. Update the callers.
405     (get_user_proj_files, get_user_proj_file): Rename to
406     get_user_proj_file return the ProjFile object and not a list of
407     ProjFile objects. Update the callers.
408     (ProjFileReader.__init__): New instance variable for the warnings.
409     Rename the __pf ivar to projfile. Update the methods referring to
410     __pf
411     (ProjFileReader.end_projection): Catch any errors raised when
412     instantiating the projection and record that as an error. The
413     projection will not be in the final ProjFile object.
414     (ProjFileReader.GetWarnings): New method to return the warnings.
415    
416     * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
417     show the warnings from the projfile reader
418     (ProjFrame._OnImport): Deal with any warnings returned by
419     read_proj_file
420     (ProjFrame.__FillAvailList): Deal with any warnings returned by
421     get_system_proj_file or get_user_proj_file.
422    
423     * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
424     (TestProjFileWithInvalidParameters.file_contents): New test cases
425     to test whether read_proj_file handles invalid projection
426     parameters correctly
427     (TestProjFile.test_get_system_proj_file): New. Simple test for
428     resource.get_system_proj_file
429    
430 bh 1785 2003-10-07 Bernhard Herzog <[email protected]>
431    
432     * test/test_derivedshapestore.py
433     (TestDerivedShapeStoreExceptions.tearDown): Clear the session
434     properly so that the temporary directories get deleted correctly
435    
436 bh 1773 2003-10-06 Bernhard Herzog <[email protected]>
437    
438 bh 1783 Handle the title changes in a proper MVC way.
439    
440     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
441     canvas' TITLE_CHANGED messages
442     (MainWindow.update_title): New. Update the main window's title
443     (MainWindow.__SetTitle): Removed. Use update_title instead.
444     (MainWindow.SetMap): Use update_title instead of __SetTitle
445     (MainWindow.RenameMap): Do change the window title explicitly
446     here. That's handled in a proper MVC way now.
447     (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
448     messages
449    
450     * Thuban/Lib/connector.py (Conduit): New class to help classes
451     that forward messages
452    
453     * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
454     (ViewPort): Derive from Conduit instead of Publisher
455     (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
456     when calling the inherited versions
457     (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
458     methods to subscribe and unsubscribe map messages
459     (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
460     handle the map subscriptions
461     (ViewPort.Map, ViewPort.map_projection_changed)
462     (ViewPort.layer_projection_changed): Add or update doc-strings
463    
464     * test/test_connector.py (TestPublisher.test_issue_simple): Fix
465     typo
466     (MyConduit): Helper class for the Conduit test.
467     (TestConduit): Test cases for Conduit
468    
469     * test/test_connector.py: Use support.run_tests as main.
470    
471     * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
472     the TITLE_CHANGED messages
473     (ViewPortTest.test_forwarding_title_changed): New test to check
474     whether the viewport forwards the map's TITLE_CHANGED messages
475     (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
476     after the port's because the latter may require a still functional
477     map.
478    
479     2003-10-06 Bernhard Herzog <[email protected]>
480    
481 bh 1777 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
482     doc-string
483    
484     2003-10-06 Bernhard Herzog <[email protected]>
485    
486 bh 1775 * test/test_viewport.py (ViewPortTest.setUp)
487     (SimpleViewPortTest.test_init_with_size): Move the test for the
488     initial size as a constructor parameter from ViewPortTest.setUp
489     method to a new separate test in SimpleViewPortTest.
490    
491     2003-10-06 Bernhard Herzog <[email protected]>
492    
493 bh 1773 * test/test_viewport.py (MockView): New class derived from
494     ViewPort with a mock implementation of GetTextExtent to be used in
495     the test cases
496     (ViewPortTest.setUp): Use MockView instead of ViewPort
497    
498     * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
499     into what would be a "pure virtual function" in C++: always raise
500     NotImplementedError. Mock implementations for test cases don't
501     belong into the real code
502    
503 bh 1770 2003-10-02 Bernhard Herzog <[email protected]>
504    
505     * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
506     close the dbf file we create so that it's contents have been
507     written properly.
508    
509     * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
510     libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
511     Update to shapelib 1.2.10
512    
513 jan 1767 2003-10-01 Jan-Oliver Wagner <[email protected]>
514    
515     * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
516     it annoys lintian which warns about these files not being
517     executable. The #! isn't necessary here since if you absolutely
518     must execute them you can always say "python <filename>".
519    
520 bh 1757 2003-09-26 Bernhard Herzog <[email protected]>
521    
522 bh 1760 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
523     only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
524     is ported to a newer the import will fail, so it should be noticed
525     immediately that this function is gone.
526     Fixes RT#1919
527    
528     2003-09-26 Bernhard Herzog <[email protected]>
529    
530 bh 1757 Add a DTD for the projection files and make thuban write valid
531     projection files
532    
533     * Resources/XML/projfile.dtd: New. DTD for thuban's projection
534     files
535    
536     * Thuban/Model/resource.py (ProjFileSaver.write): Use
537     'projectionlist' as the name in the document type declaration so
538     that it matches the element type of the root element.
539    
540     * test/test_proj.py (sample_projfile, sample_projfile2): Use
541     'projectionlist' as the name in the document type declaration just
542     as it is done now in the files thuban would write
543     (sample_projfile, sample_projfile_data): Fix spelling of
544     "Mercator"
545     (TestProjFile.doTestWrite): Validate the written and the expected
546     XML data
547     (TestProjFile): Derive from ValidationTest so that we can run xml
548     validation tests
549    
550 bh 1751 2003-09-24 Bernhard Herzog <[email protected]>
551    
552     * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
553     modify the list returned by map.Layers() in place since it is the
554     actual list of layers used by the map.
555    
556 jan 1745 2003-09-23 Jan-Oliver Wagner <[email protected]>
557    
558     * Doc/manual/thuban-manual.xml: Added subsection to chapter
559     Extensions to describe the extensions coming with the Thuban
560     standard package (gns2shp and importAPR).
561    
562 bh 1743 2003-09-23 Bernhard Herzog <[email protected]>
563    
564     * libraries/thuban/wxproj.cpp (project_point): if there's an
565     inverse but no forward projection, convert to degrees after
566     applying the inverse projection. Fixes RT#2096
567    
568     * test/test_wxproj.py: New. Test cases for wxproj.so. One test
569     implicitly tests for the fix to RT#2096
570    
571     * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
572     Check that the sequences have the same lengths
573    
574     * Resources/Projections/defaults.proj (Geographic projection): Use
575     a much more precise value for the to_meter attribute.
576    
577 bh 1737 2003-09-22 Bernhard Herzog <[email protected]>
578    
579     * test/support.py (initthuban): Make sure to unset the LANG env.
580     var. so that tests that compare translated strings work. Solves RT
581     #2094
582    
583 jan 1730 2003-09-22 Jan-Oliver Wagner <[email protected]>
584    
585 jan 1735 Small improvement of APR import.
586    
587     * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
588     Added tests for text-ranges.
589    
590     * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
591     returns a string object if the range is based on text.
592    
593     * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
594     range retrieval.
595    
596     2003-09-22 Jan-Oliver Wagner <[email protected]>
597    
598 jan 1730 Initial version of the importAPR extension which is in
599     experimental state.
600    
601     * /Extensions/importAPR/, /Extensions/importAPR/samples/,
602     /Extensions/importAPR/test/: New directories.
603    
604     * /Extensions/importAPR/samples/README: New: Howto load the samples.
605    
606     * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
607     file which refers to the Thuban Iceland demo data.
608    
609     * /Extensions/importAPR/test/README: New: Howto execute the tests.
610    
611     * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
612    
613     * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
614     as in '.apr'-files.
615    
616     * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
617     ODB Objects as in '.apr', '.avl' and other files.
618    
619     * /Extensions/importAPR/__init__.py: New: Init to make this
620     directory a package.
621    
622     * /Extensions/importAPR/importAPR.py: New: Import a ArcView
623     project file (.apr) and convert it to Thuban.
624    
625     2003-09-22 Jan-Oliver Wagner <[email protected]>
626    
627     * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
628    
629 jan 1720 2003-09-19 Jan-Oliver Wagner <[email protected]>
630    
631     * Doc/manual/thuban-manual.xml: Extended section 'Installation'
632     with description on RPM installation and RPM binary package
633     creation.
634    
635 bh 1718 2003-09-18 Bernhard Herzog <[email protected]>
636    
637     * setup.py (data_files): Only add the mo files if the Locales
638     directory actually exists, so that setup.py works with a fresh CVS
639     checkout
640    
641 jan 1716 2003-09-12 Jan-Oliver Wagner <[email protected]>
642    
643     * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
644     in viewport, not anymore in view
645    
646 jan 1714 2003-09-04 Jan-Oliver Wagner <[email protected]>
647    
648     Introducing first Extension (gns2shp).
649    
650     * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
651    
652     * Extensions/__init__.py: New. init to make this dir a package.
653    
654     * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
655    
656     * Extensions/gns2shp/test/README: New. some info on this test directory.
657    
658     * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
659    
660     * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
661     of Shapefile from GNS text file format
662    
663 jan 1705 2003-09-03 Jan-Oliver Wagner <[email protected]>
664    
665 jan 1707 Fix/workaround for bug #2019:
666     https://intevation.de/rt/webrt?serial_num=2019
667    
668     * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
669     (IdentifyView.__init__): Added another button that allows to
670     stop the identify mode.
671     (IdentifyView.OnStop): New. Stops the identify mode.
672    
673     2003-09-03 Jan-Oliver Wagner <[email protected]>
674    
675 jan 1705 Introducing a new exception dialog that allows to exit the
676     application immediately.
677     This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
678    
679     * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
680    
681     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
682     Made strings available to translations. Exchanged the simple
683     ScrolledMessageDialog by the new ExceptionDialog.
684    
685 bh 1694 2003-09-01 Bernhard Herzog <[email protected]>
686    
687 bh 1701 * NEWS: New. Summary of changes and release notes.
688    
689     * MANIFEST.in: Add NEWS
690    
691     2003-09-01 Bernhard Herzog <[email protected]>
692    
693 bh 1699 * MANIFEST.in: Correct the include statement for the mo-files and
694     include the documentation too.
695    
696     * setup.py (data_files): Add the .mo files
697     (setup call): Up to version 0.9.0
698    
699     2003-09-01 Bernhard Herzog <[email protected]>
700    
701 bh 1696 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
702     parameter list to just parent and session
703     (ChooseDBTableDialog.__set_properties): Removed. Setting the
704     selection of empty list boxes is not allowed (and produces C++
705     assertion errors) and the rest of the setup is better done in
706     __init__ anyway.
707     (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
708     (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
709     builtins True/False for booleans to avoid warnings from wxPython
710    
711     * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
712     ChooseDBTableDialog constructor parameters.
713    
714     2003-09-01 Bernhard Herzog <[email protected]>
715    
716 bh 1694 * Thuban/Model/postgisdb.py
717     (PostGISTable): Extend doc-string
718     (PostGISTable._fetch_table_information): Set the column index
719     correctly, pretending ignored columns don't exist.
720    
721     * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
722     for postgis tables with data types not yet supported by thuban.
723    
724 bh 1692 2003-08-29 Bernhard Herzog <[email protected]>
725    
726     * HOWTO-Release: Tweak item about running the tests.
727    
728 jan 1690 2003-08-29 Jan-Oliver Wagner <[email protected]>
729    
730     * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
731    
732 bh 1688 2003-08-29 Bernhard Herzog <[email protected]>
733    
734     Add some missing parameters to projections. Proj complains about
735     them on windows but for some reason not on Linux.
736    
737     * test/test_save.py (SaveSessionTest.testLayerProjection): Add
738     missing required projection parameters
739    
740     * test/test_proj.py (TestProjFile.test): Add missing required
741     projection parameters
742    
743     * test/test_load_0_8.py (TestLayerProjection.file_contents)
744     (TestLayerProjection.test): Add missing required projection
745     parameters and tests for them
746    
747     * test/test_load.py (TestLayerProjection.file_contents)
748     (TestLayerProjection.test): Add missing required projection
749     parameters and tests for them
750    
751     * test/test_layer.py (TestLayer.test_base_layer): Add missing
752     required projection parameters
753    
754     2003-08-29 Bernhard Herzog <[email protected]>
755    
756     * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
757     access the pj_errno because directly accessing pj_errno doesn't
758     work on windows if the proj library is in a DLL
759    
760     * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
761    
762 bh 1672 2003-08-28 Bernhard Herzog <[email protected]>
763    
764 bh 1685 * test/test_proj.py: Import things from Thuban after calling
765     initthuban
766    
767     * test/test_load.py (LoadSessionTest.filenames): New class
768     variable with the filename attributes to normalize
769     (LoadSessionTest.check_format): Pass self.filenames to
770     sax_eventlist to normalize the filename attributes
771    
772     * test/xmlsupport.py: Add cvs keywords
773     (SaxEventLister.__init__): New parameter filenames which indicates
774     attributes that contain filenames
775     (SaxEventLister.startElementNS): Normalize the filename attributes
776     with os.path.normpath
777     (sax_eventlist): New parameter filenames to pass through to
778     SaxEventLister
779    
780     * test/test_derivedshapestore.py: Make this file callable as a
781     program to execute the tests
782     (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
783     the session to self.session so that it gets destroyed properly
784    
785     * test/test_layer.py (TestLayer.tearDown): Call the session's
786     Destroy method
787    
788     * test/test_map.py (TestMapBase.tearDown): Destroy self.session
789     too if it exists
790     (TestMapAddLayer.test_add_layer): Bind the session to self.session
791     so that it gets destroyed properly
792    
793     * test/postgissupport.py (reason_for_not_running_tests): Add a
794     test for the existence of popen2.Popen4.
795    
796     * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
797     reliable way to destroy the sessions created in the test cases
798     (SaveSessionTest.test_dbf_table): Bind the session to self.session
799     so that it gets destroyed properly
800     (SaveSessionTest.testLayerProjection): Bind the session to
801     self.session so that it gets destroyed properly
802    
803     * test/test_session.py (UnreferencedTablesTests.tearDown): Make
804     sure that the session is destroyed properly
805    
806     * test/test_shapefilestore.py: Make this callable as a program to
807     execute the tests
808    
809     * test/test_scalebar.py: Remove unnecessary import of _ from
810     Thuban
811    
812     * test/support.py (print_garbage_information): Call initthuban
813     here because it may be called indirectly from test cases that test
814     test support modules which do not use anything from thuban itself
815     (ThubanTestProgram.runTests): Remove unnecessary debug print
816    
817     2003-08-28 Bernhard Herzog <[email protected]>
818    
819 bh 1672 * Thuban/version.py (longversion): Update to 0.9
820    
821     * Thuban/UI/mainwindow.py: Remove some unused imports
822    
823     * README: Add section about required additional software. Add date
824     and revision CVS keywords
825    
826     * HOWTO-Release: Add item about the translations. Add date and
827     revision CVs keywords and change formatting to match README a bit
828     better
829    
830     * po/de.po: Update for 0.9
831    
832     * test/README: Tweak the wording a little because many tests are
833     not really unittest.
834    
835 bh 1663 2003-08-27 Bernhard Herzog <[email protected]>
836    
837 bh 1665 As preparation for the 0.9 release, switch thuban files to a
838     non-dev namespace
839    
840     * Thuban/Model/save.py (SessionSaver.write_session): Write files
841     with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
842     namespace
843    
844     * Thuban/Model/load.py (SessionLoader.__init__): Accept the
845     http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
846    
847     * test/test_save.py (SaveSessionTest.dtd)
848     (SaveSessionTest.testEmptySession)
849     (SaveSessionTest.testSingleLayer)
850     (SaveSessionTest.testLayerProjection)
851     (SaveSessionTest.testRasterLayer)
852     (SaveSessionTest.testClassifiedLayer)
853     (SaveSessionTest.test_dbf_table)
854     (SaveSessionTest.test_joined_table)
855     (SaveSessionTest.test_save_postgis): Update for new namespace
856    
857     * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
858     (TestLayerVisibility.file_contents, TestLabels.file_contents)
859     (TestLayerProjection.file_contents)
860     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
861     (TestPostGISLayer.file_contents)
862     (TestPostGISLayerPassword.file_contents)
863     (TestLoadError.file_contents, TestLoadError.test): Update for new
864     namespace
865    
866     2003-08-27 Bernhard Herzog <[email protected]>
867    
868 bh 1663 Make the table interface distinguish between row ids (an integer
869     that uniquely identifies a row) and row ordinals (a simple row
870     count from 0 to NumRows() - 1)
871    
872     * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
873     (PostGISTable.RowOrdinalToId): New methods to conver between row
874     ids and row ordinals
875     (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
876     parameter row_is_ordinal to indicate whether the row parameter is
877     the row id or the ordinal
878    
879     * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
880     (TransientTableBase.RowOrdinalToId)
881     (AutoTransientTable.RowIdToOrdinal)
882     (AutoTransientTable.RowOrdinalToId): Same new methods as in
883     PostGISTable.
884     (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
885     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
886     Same new parameter as in PostGISTable.
887    
888     * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
889     (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
890     (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
891     (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
892     (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
893     parameter as in PostGISTable.
894    
895     * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
896     (DataTable.RowOrdinalToId): New methods to convert between row ids
897     and row ordinals.
898     (TableGrid.SelectRowById): New method to select a row based on its
899     ID as opposed to its ordinal
900     (DataTable.GetValue, TableGrid.OnRangeSelect)
901     (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
902     (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
903     (LayerTableFrame.__init__): Convert between row ids and row
904     ordinals as appropriate
905    
906     * test/postgissupport.py (PostGISDatabase.__init__): Add
907     doc-string.
908     (PostGISDatabase.initdb): The optional third item in a tuple in
909     tables is now a (key, value) list with additional arguments to
910     pass to upload_shapefile
911     (upload_shapefile): New parameter gid_offset to allow gids that
912     are not the same as the shapeids in the shapefile
913     (PostgreSQLServer.get_default_static_data_db): Use the new
914     gid_offset to make the gids in landmarks 1000 higher than the
915     shapeids in the shapefile
916    
917     * test/test_viewport.py
918     (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
919     new shapeids in the landmarks table
920    
921     * test/test_transientdb.py
922     (TestTransientTable.run_iceland_political_tests)
923     (TestTransientTable.test_transient_joined_table): Add tests for
924     the new table methods and new keywords arguments.
925    
926     * test/test_postgis_db.py
927     (TestPostGISTable.test_read_row_as_dict_row_count_mode)
928     (TestPostGISTable.test_read_value_row_count_mode)
929     (TestPostGISTable.test_row_id_to_ordinal)
930     (TestPostGISTable.test_row_oridnal_to_id): New test for the new
931     table methods and the new arguments
932     (TestPostGISShapestorePoint.test_shapes_in_region)
933     (TestPostGISShapestorePoint.test_shape_raw_data)
934     (TestPostGISShapestorePoint.test_shape_points)
935     (TestPostGISShapestorePoint.test_shape_shapeid)
936     (TestPostGISShapestorePoint.test_all_shapes)
937     (TestPostGISTable.test_simple_query)
938     (TestPostGISTable.test_simple_query)
939     (TestPostGISTable.test_simple_query)
940     (TestPostGISTable.test_read_value)
941     (TestPostGISTable.test_read_row_as_dict): Adapt to the new
942     shapeids in the landmarks table
943    
944     * test/test_memory_table.py
945     (TestMemoryTable.test_read_row_as_dict_row_count_mode)
946     (TestMemoryTable.test_read_value_row_count_mode)
947     (TestMemoryTable.test_row_id_to_ordinal)
948     (TestMemoryTable.test_row_oridnal_to_id): New test for the new
949     table methods and the new arguments
950    
951     * test/test_dbf_table.py
952     (TestDBFTable.test_read_row_as_dict_row_count_mode)
953     (TestDBFTable.test_read_value_row_count_mode)
954     (TestDBFTable.test_row_id_to_ordinal)
955     (TestDBFTable.test_row_oridnal_to_id): New test for the new table
956     methods and the new arguments
957    
958 bh 1659 2003-08-26 Bernhard Herzog <[email protected]>
959    
960 bh 1661 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
961     more postgis specific but much faster method to get the bounding
962     box
963    
964     2003-08-26 Bernhard Herzog <[email protected]>
965    
966 bh 1659 * Thuban/Model/postgisdb.py (PostGISTable.Title)
967     (PostGISShapeStore.AllShapes): Add these missing methods.
968     (PostGISShapeStore.ShapesInRegion): No need to raise
969     StopIteration. We can simply return
970    
971     * test/test_postgis_db.py (TestPostGISTable.test_title)
972     (TestPostGISShapestorePoint.test_all_shapes): New tests for the
973     new methods
974    
975 bh 1643 2003-08-25 Bernhard Herzog <[email protected]>
976    
977 bh 1657 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
978    
979     * test/test_postgis_db.py (PolygonTests): New class containing
980     those tests from TestPostGISShapestorePolygon that can also be
981     used to test MUTLIPOLYGON tables
982     (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
983     so derive from that
984     (TestPostGISShapestoreMultiPolygon): New class with tests for
985     MUTLIPOLYGON tables
986    
987     * test/postgissupport.py (PostGISDatabase.initdb): Allow the
988     tables argument to have tuples with three items to override the
989     WKT type used.
990     (PostgreSQLServer.get_default_static_data_db): Use the above to
991     create a polygon table with MUTLIPOLYGONs
992     (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
993     (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
994     coords_to*
995     (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
996     (wkt_converter): New. Map WKT types to converters
997     (upload_shapefile): New parameter force_wkt_type to use a
998     different WKT type than the default
999    
1000     2003-08-25 Bernhard Herzog <[email protected]>
1001    
1002 bh 1655 * Thuban/UI/application.py
1003     (ThubanApplication.run_db_param_dialog): New. Suitable as a
1004     db_connection_callback. Main difference is that the dialog run
1005     from this method doesn't have a parent so it can be used even when
1006     there is no main window
1007     (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
1008     no db_connection_callback was given. This way the dialog pops up
1009     even when the .thuban file was given as a command line parameter.
1010    
1011     2003-08-25 Bernhard Herzog <[email protected]>
1012    
1013 bh 1653 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
1014     before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
1015     which leads to an effectively frozen X session because the user
1016     can only interact with the dialog but the mouse is still grabbed
1017     by the canvas.
1018     Also, call the tool's Hide method before MouseLeftUp because
1019     MouseLeftUp may change the tool's coordinates.
1020    
1021     2003-08-25 Bernhard Herzog <[email protected]>
1022    
1023 bh 1651 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
1024     LoadCancelled exceptions and handle them by returning immediately.
1025    
1026     2003-08-25 Bernhard Herzog <[email protected]>
1027    
1028 bh 1649 GUI part of loading sessions with postgis connections which may
1029     require user interaction to get passwords or updated parameters
1030    
1031     * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
1032     bit nucer and be more generic.
1033     (DBFrame.OnAdd): Adapt to new DBDialog interface
1034    
1035     * Thuban/UI/application.py (ThubanApplication.OpenSession): New
1036     optional parameter db_connection_callback which is passed to
1037     load_session.
1038    
1039     * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
1040     Suitable as a db_connection_callback
1041     (MainWindow.OpenSession): Use self.run_db_param_dialog as the
1042     db_connection_callback of the application's OpenSession method
1043    
1044    
1045     2003-08-25 Bernhard Herzog <[email protected]>
1046    
1047 bh 1647 Basic loading of sessions containing postgis connections:
1048    
1049     * Thuban/Model/load.py (LoadError): Add doc-string
1050     (LoadCancelled): New exception class to indicate a cancelled load
1051     (SessionLoader.__init__): Add the db_connection_callback parameter
1052     which will be used by the loader to get updated parameters and a
1053     password for a database connection
1054     (SessionLoader.__init__): Add the new XML elements to the
1055     dispatchers dictionary
1056     (SessionLoader.check_attrs): Two new conversions, ascii to convert
1057     to a byte-string object and idref as a generic id reference
1058     (SessionLoader.start_dbconnection)
1059     (SessionLoader.start_dbshapesource): New. Handlers for the new XML
1060     elements
1061     (load_session): Add the db_connection_callback to pass through the
1062     SessionLoader
1063    
1064     * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
1065     New classes to test loading of sessions with postgis database
1066     connections.
1067    
1068     2003-08-25 Bernhard Herzog <[email protected]>
1069    
1070 bh 1645 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
1071     replace it and the comment with __BuildDate__ by the Source: and
1072     Id: cvs keywords as used in the other files.
1073    
1074     2003-08-25 Bernhard Herzog <[email protected]>
1075    
1076 bh 1643 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
1077     LoadError when a required attribute is missing. The code used to
1078     be commented out for some reason, but probably should have been
1079     active.
1080    
1081     * test/test_load.py (TestLoadError.test): Test the message in the
1082     LoadError too to make sure it really is about the missing
1083     attribute
1084    
1085 bh 1632 2003-08-22 Bernhard Herzog <[email protected]>
1086 bh 1641
1087     * test/test_save.py (SaveSessionTest.test_dbf_table)
1088     (SaveSessionTest.test_joined_table): Add XML validation tests.
1089    
1090     2003-08-22 Bernhard Herzog <[email protected]>
1091    
1092 bh 1639 Implement saving a session with a postgis connection
1093 bh 1632
1094 bh 1639 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
1095     elements for database connections and shapestores using db
1096     connections
1097     (session): Add the dbconnections to the content model
1098    
1099     * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
1100     Write the db connections
1101     (SessionSaver.write_session): Call write_db_connections to write
1102     the connection before the data sources
1103     (SessionSaver.write_data_containers): Handle postgis shapestores
1104    
1105     * test/test_save.py (SaveSessionTest.thubanids)
1106     (SaveSessionTest.thubanidrefs): Update for new DTD
1107     (SaveSessionTest.test_save_postgis): New. Test saving a session
1108     with postgis connections
1109    
1110     * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
1111     (PostGISTable.TableName): New accessor methods for the connection
1112     and table name
1113    
1114     * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
1115     (TestPostGISTable.test_dbname): New methods to test the new
1116     PostGISConnection methods
1117    
1118     2003-08-22 Bernhard Herzog <[email protected]>
1119    
1120 bh 1637 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
1121     for exceptions occurring when establishing a Database connection
1122     (PostGISConnection.connect): Catch psycopg.OperationalError during
1123     connects and raise ConnectionError.
1124    
1125     * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
1126     tests for database exceptions
1127    
1128     2003-08-22 Bernhard Herzog <[email protected]>
1129    
1130 bh 1635 Prepare the test suite for tests with required authentication
1131    
1132     * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
1133     variables with two predefined users/passwords, one for the admin
1134     and one for a non-privileged user.
1135     (PostgreSQLServer.createdb): Pass the admin name to initdb and add
1136     the non-privileged user to the database and set the admin password
1137     (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
1138     Better error reporting
1139     (PostgreSQLServer.connection_params)
1140     (PostgreSQLServer.connection_string): New methods to return
1141     information about how to connect to the server
1142     (PostgreSQLServer.execute_sql): New. Convenience method to execute
1143     SQL statements
1144     (PostgreSQLServer.require_authentication): Toggle whether the
1145     server requires authentication
1146     (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
1147     Add or alter users
1148     (PostGISDatabase.initdb): Pass the admin name one the
1149     subprocesses' command lines. Grant select rights on
1150     geometry_columns to everybody.
1151     (upload_shapefile): Use the admin name and password when
1152     connecting. Grant select rights on the new table to everybody.
1153    
1154     * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
1155     server's new methods to get the connection parameters.
1156    
1157     * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
1158     (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
1159     server's new methods to get the connection parameters.
1160    
1161     * test/test_postgis_db.py
1162     (TestPostGISConnection.test_gis_tables_empty)
1163     (TestPostGISConnection.test_gis_tables_non_empty)
1164     (PostGISStaticTests.setUp): Use the server's new methods to get
1165     the connection parameters.
1166    
1167     2003-08-22 Bernhard Herzog <[email protected]>
1168    
1169 bh 1632 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
1170    
1171     * Thuban/version.py: Add psycopg version
1172    
1173     * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
1174     version of the psycopg module
1175    
1176     2003-08-22 Bernhard Herzog <[email protected]>
1177    
1178     * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
1179     (DBFrame.OnEdit): Removed because it's not used and wouldn't work
1180     at the moment. The functionality should probably be implemented
1181     some time, though.
1182 bh 1633 (DBFrame.OnRemove): Display a message if the connection can't be
1183     removed because it's still in use.
1184 bh 1632
1185 jan 1629 2003-08-22 Jan-Oliver Wagner <[email protected]>
1186    
1187     * Thuban/UI/about.py (About.__init__): split up the huge about
1188     text into elements/lists for easier translation. This fixes bug
1189     https://intevation.de/rt/webrt?serial_num=2058
1190     Also, made some forgotten string available for the i18n.
1191    
1192 bh 1627 2003-08-21 Bernhard Herzog <[email protected]>
1193    
1194     Make postgis support really optional including insensitive menu
1195     items.
1196    
1197     * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
1198     whether the postgis is supported.
1199    
1200     * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
1201     to make postgis support optional
1202    
1203     * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
1204     version of Thuban.Model.postgisdb.has_postgis_support
1205     (database_management command): Make it only sensitive if postgis
1206     is supported.
1207    
1208 jan 1623 2003-08-21 Jan-Oliver Wagner <[email protected]>
1209    
1210 jan 1626 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
1211     (section Adding and Removing Layers): Added text and described
1212     multi-selection.
1213     (chapter Extensions): New.
1214    
1215     2003-08-21 Jan-Oliver Wagner <[email protected]>
1216    
1217 jan 1623 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
1218     settings to allow multiple files to load into the map.
1219     Also reduced selection to *.shp as a default.
1220    
1221 bh 1621 2003-08-20 Bernhard Herzog <[email protected]>
1222    
1223     Add dialogs and commands to open database connections and add
1224     database layers.
1225    
1226     * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
1227     method to open the database connection management dialog
1228     (MainWindow.AddDBLayer): New method to add a layer from a database
1229     (_has_dbconnections): New helper function to use for sensitivity
1230     (database_management command, layer_add_db command): New commands
1231     that call the above new methods.
1232     (main_menu): Add the new commands to the menu.
1233    
1234     * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
1235     (PostGISConnection.connect): Establish the actual connection in a
1236     separate method and call it in __init__. This makes it easier to
1237     override the behavior in test cases
1238     (PostGISConnection.BriefDescription): New method to return a brief
1239     description for use in dialogs.
1240    
1241     * test/test_postgis_db.py (NonConnection): DB connection that
1242     doesn't actually connect
1243     (TestBriefDescription): New class with tests for the new
1244     BriefDescription method
1245    
1246 jan 1619 2003-08-19 Jan-Oliver Wagner <[email protected]>
1247    
1248     Moved anything from extensions to libraries.
1249    
1250     * libraries: New.
1251    
1252     * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
1253    
1254     * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
1255     Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
1256     been moved here from thuban/extensions/pyprojection/
1257     See there in the Attic for the older history.
1258    
1259     * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
1260     dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
1261     shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
1262     have been moved here from thuban/extensions/pyshapelib/
1263     See there in the Attic for the older history.
1264    
1265     * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
1266     files have been moved here from thuban/extensions/shapelib/
1267     See there in the Attic for the older history.
1268    
1269     * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
1270     gdalwarp.cpp, wxproj.cpp: These files have been moved here from
1271     thuban/extensions/thuban/
1272     See there in the Attic for the older history.
1273    
1274     * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
1275    
1276     * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
1277     gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
1278    
1279     * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
1280     Moved to libraries/shapelib.
1281    
1282     * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
1283     shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
1284     ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
1285     Moved to libraries/pyshapelib.
1286    
1287     * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
1288     LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
1289     Moved to libraries/pyprojection.
1290    
1291     * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
1292    
1293     * extensions: Removed.
1294    
1295 bh 1606 2003-08-19 Bernhard Herzog <[email protected]>
1296    
1297 bh 1609 * test/test_viewport.py (ViewPortTest): We don't use the
1298     facilities of FileTestMixin so don't derive from it.
1299     (TestViewportWithPostGIS): New class with tests for using a
1300     viewport on a map with postgis layers.
1301    
1302     2003-08-19 Bernhard Herzog <[email protected]>
1303    
1304     Add the db connection management to the session.
1305    
1306     * Thuban/Model/session.py (Session.__init__): New instance
1307     variable db_connections
1308     (Session.AddDBConnection, Session.DBConnections)
1309     (Session.HasDBConnections, Session.CanRemoveDBConnection)
1310     (Session.RemoveDBConnection): New methods to manage and query the
1311     db connections managed by the session
1312     (Session.OpenDBShapeStore): New method to open a shapestore from a
1313     db connection
1314    
1315     * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
1316     messages for the db connection handling in the session
1317    
1318     * test/test_postgis_session.py: New. test cases for the session's
1319     db connection handling with postgis connections
1320    
1321     2003-08-19 Bernhard Herzog <[email protected]>
1322    
1323 bh 1606 Add very basic postgis database support and the corresponding test
1324     cases. The test cases require a PostgreSQL + postgis installation
1325     but no existing database. The database will be created
1326     automatically by the test cases
1327    
1328     * test/README: Add note about skipped tests and the requirements
1329     of the postgis tests.
1330    
1331     * Thuban/Model/postgisdb.py: New. Basic postgis database support.
1332    
1333     * test/test_postgis_db.py: New. Test cases for the postgis
1334     support.
1335    
1336     * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
1337     format
1338    
1339     * test/test_wellknowntext.py: New. Test cases for the
1340     wellknowntext parser
1341    
1342     * test/postgissupport.py: New. Support module for tests involving
1343     a postgis database.
1344    
1345     * test/support.py (execute_as_testsuite): Shut down the postmaster
1346     if it's still running after the tests
1347    
1348     * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
1349     well known text format
1350    
1351 jan 1604 2003-08-19 Jan-Oliver Wagner <[email protected]>
1352    
1353     * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
1354     message dialog.
1355    
1356 bh 1600 2003-08-18 Bernhard Herzog <[email protected]>
1357    
1358 bh 1602 * test/support.py (ThubanTestResult.printErrors): Indent the
1359     reason for the skips in the output to make it a bit more readable.
1360     (execute_as_testsuite): New helper function to run a test suite
1361     and print some more information.
1362     (run_tests): Use execute_as_testsuite to run the tests
1363    
1364     * test/runtests.py (main): Use execute_as_testsuite to run the
1365     tests
1366    
1367     2003-08-18 Bernhard Herzog <[email protected]>
1368    
1369 bh 1600 Fix some bugs in Thuban and the test suite that were uncovered by
1370     changes introduced in Python 2.3:
1371    
1372     * Thuban/Model/table.py (DBFTable.__init__): Make sure the
1373     filename is an absolute name
1374    
1375     * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
1376     filename is an absolute name
1377    
1378     * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
1379     unique filename to save to and use the correct relative filename
1380     in the expected output.
1381     (SaveSessionTest.test_dbf_table): Use the correct relative
1382     filename in the expected output.
1383    
1384     * test/test_layer.py (TestLayer.test_raster_layer): Update the
1385     test to check whether the filename is absolute.
1386    
1387 jan 1596 2003-08-18 Jan-Oliver Wagner <[email protected]>
1388    
1389     * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
1390    
1391 bh 1586 2003-08-15 Bernhard Herzog <[email protected]>
1392    
1393 bh 1594 Change the way shapes are returned by a shape store. The
1394     ShapesInRegion method returns an iterator over actual shape
1395     objects instead of a list of shape ids.
1396    
1397     * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
1398     id.
1399     (ShapefileStore.ShapesInRegion): Return an iterator over the
1400     shapes which yields shape objects instead of returning a list of
1401     shape ids
1402     (ShapefileStore.AllShapes): New. Return an iterator over all
1403     shapes in the shape store
1404     (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
1405    
1406     * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
1407     doc-string.
1408    
1409     * Thuban/UI/baserenderer.py
1410     (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
1411     layer_shapes and make it return an iterator containg shapes
1412     instead of a list of ids.
1413     (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
1414     layer_shapes() change
1415    
1416     * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
1417     (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
1418    
1419     * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
1420     changes in the ShapesInRegion return value.
1421     (ViewPort._get_hit_tester): Remove commented out code
1422    
1423     * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
1424     new return value.
1425     (SimpleShapeStore.AllShapes): New. Implement this method too.
1426    
1427     * test/test_layer.py (TestLayer.test_arc_layer)
1428     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
1429     (TestLayer.test_point_layer_with_projection)
1430     (TestLayer.test_derived_store): Adapt to changes in the
1431     ShapesInRegion return value.
1432    
1433     * test/test_shapefilestore.py
1434     (TestShapefileStoreArc.test_shapes_in_region)
1435     (TestShapefileStorePolygon.test_shapes_in_region)
1436     (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
1437     in the ShapesInRegion return value.
1438     (TestShapefileStorePoint.test_all_shapes)
1439     (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
1440     methods
1441    
1442     * test/test_derivedshapestore.py
1443     (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
1444     the ShapesInRegion return value.
1445     (TestDerivedShapeStore.test_all_shapes)
1446     (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
1447     methods
1448    
1449     2003-08-15 Bernhard Herzog <[email protected]>
1450    
1451 bh 1592 Make the renderers deal correctly with raw vs. python level
1452     representation of shape geometries
1453    
1454     * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
1455     Return a flag useraw in addition to the callable and the parameter
1456     to indicate whether the callable can deal with the raw shape data
1457     or uses the higher level python lists of coordinates. The callable
1458     now should accept either the raw data or the return value of the
1459     shape's Points() method.
1460     (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
1461     change
1462     (BaseRenderer.projected_points): Instead of the shape id use the
1463     points list as parameter.
1464     (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
1465     (BaseRenderer.draw_point_shape): Adapt to projected_points()
1466     change and accept the points list as parameter instead of the
1467     shape id.
1468    
1469     * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
1470     the useraw flag as required by the BaseRenderer
1471     (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
1472     changes.
1473    
1474     * test/test_baserenderer.py
1475     (TestBaseRenderer.test_point_with_classification): New test for
1476     rendering a map with classifications.
1477    
1478     2003-08-15 Bernhard Herzog <[email protected]>
1479    
1480 bh 1590 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
1481     (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
1482     (ViewPort._get_hit_tester, ViewPort.projected_points)
1483     (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
1484     (ViewPort._find_label_at): Split the find_shape_at method into
1485     several new methods and use the functions in the hit-test module.
1486    
1487     * Thuban/UI/hittest.py: New module with Python-level hit-testing
1488     functions
1489    
1490     * test/test_hittest.py: New. Test for the new hittest module
1491    
1492     2003-08-15 Bernhard Herzog <[email protected]>
1493    
1494 bh 1588 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
1495     projection to all corners of the bounding box to get a better
1496     approximation of the projected bounding box
1497    
1498     * test/test_layer.py (TestLayer.test_point_layer_with_projection):
1499     New. Test coordinate handling of a layer with a projection.
1500     Catches the bug fixed in Layer.ShapesInRegion
1501    
1502     2003-08-15 Bernhard Herzog <[email protected]>
1503    
1504 bh 1586 Move some of the mock objects in test_baserenderer into their own
1505     module so they can easily be used from other tests
1506    
1507     * test/mockgeo.py: New test helper module with some mock objects
1508     for geometry related things like shapes, shapestores and
1509     projections.
1510    
1511     * test/test_mockgeo.py: New. Tests for the new helper module
1512    
1513     * test/test_baserenderer.py: Some of the mock-objects are in
1514     mockgeo now.
1515    
1516 jan 1584 2003-08-12 Jan-Oliver Wagner <[email protected]>
1517    
1518     * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
1519    
1520 bh 1580 2003-08-12 Bernhard Herzog <[email protected]>
1521    
1522 bh 1582 * po/de.po: New. German translations by Bjoern Broscheit
1523    
1524     2003-08-12 Bernhard Herzog <[email protected]>
1525    
1526 bh 1580 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
1527     strings have to be one string literal.
1528    
1529 bh 1573 2003-08-11 Bernhard Herzog <[email protected]>
1530    
1531 bh 1578 * test/support.py (FloatComparisonMixin.assertPointListEquals):
1532     New. This method was used in various derived classes, but it's
1533     better to have it here.
1534    
1535     * test/test_shapefilestore.py
1536     (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
1537     FloatComparisonMixin
1538    
1539     * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
1540     It's now in FloatComparisonMixin
1541    
1542     * test/test_derivedshapestore.py
1543     (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
1544     in FloatComparisonMixin
1545    
1546     2003-08-11 Bernhard Herzog <[email protected]>
1547    
1548 bh 1573 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
1549     error message
1550    
1551 jan 1569 2003-08-08 Jan-Oliver Wagner <[email protected]>
1552    
1553 jan 1571 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
1554     with version number.
1555     Changed title to reflect version number of Thuban.
1556    
1557     2003-08-08 Jan-Oliver Wagner <[email protected]>
1558    
1559 jan 1569 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
1560     the list corresponds to the "About" web page.
1561    
1562 bh 1567 2003-08-08 Bernhard Herzog <[email protected]>
1563    
1564     * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
1565     Make sure translated strings are recognized as one string literal.
1566    
1567     * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
1568     Make sure translated strings are recognized as one string literal.
1569    
1570     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
1571     translated strings are recognized as one string literal.
1572    
1573     * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
1574     sure translated strings are recognized as one string literal.
1575    
1576 bh 1556 2003-08-07 Bernhard Herzog <[email protected]>
1577    
1578 bh 1565 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
1579     Simply delegates to the original shapestore.
1580    
1581     * test/test_derivedshapestore.py
1582     (TestDerivedShapeStore.test_raw_format): New. Test case for
1583     DerivedShapeStore.RawShapeFormat
1584    
1585     2003-08-07 Bernhard Herzog <[email protected]>
1586    
1587 bh 1561 Add raw data interface to shape objects.
1588    
1589     * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
1590     class to ShapefileShape which now holds shapefile specific
1591     information.
1592     (ShapefileShape.compute_bbox): Simplified to not cache any
1593     information. The way this method is used that shouldn't matter
1594     performance wise.
1595     (ShapefileShape.RawData): New. Return the shapeid which is the raw
1596     data format for shapes from shapefiles.
1597     (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
1598     in the shape objects returned by a shapestore. For a
1599     ShapefileStore this is always RAW_SHAPEFILE.
1600     (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
1601     method.
1602    
1603     * test/test_shapefilestore.py
1604     (TestShapefileStore.test_raw_format): New test to test the raw
1605     format feature of shapes.
1606    
1607 bh 1560 * Thuban/Model/layer.py: Remove the unused import of Shape from
1608     data. It was only there for interface compatibility but it's not
1609 bh 1561 used inside of Thuban and the generic Shape class has gone away.
1610 bh 1560
1611 bh 1563 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
1612     the raw data format and only use an optimized version of its a
1613     shapefile.
1614    
1615 bh 1561 2003-08-07 Bernhard Herzog <[email protected]>
1616    
1617 bh 1559 * test/test_baserenderer.py (SimpleShape): Shape class for the
1618     tests.
1619     (SimpleShapeStore.Shape): Use SimpleShape instead of
1620     Thuban.Model.data.Shape to make the tests independed of the coming
1621     changes.
1622    
1623     2003-08-07 Bernhard Herzog <[email protected]>
1624    
1625 bh 1556 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
1626     (ThubanTestProgram): New classes that extend the respective
1627     classes from unittest. These new version support skipping tests
1628     under certain expected conditions. In the Thuban test suite we
1629     uses this for tests that require the optional gdal support.
1630     (run_tests): Use ThubanTestProgram instead of the unittest.main()
1631    
1632     * test/runtests.py (main): Use the new ThubanTestRunner instead of
1633     the normal one from unittest
1634    
1635     * test/test_layer.py (TestLayer.test_raster_layer): If this test
1636     is not run because gdal support isn't available report this to the
1637     runner.
1638    
1639     * test/test_baserenderer.py
1640     (TestBaseRenderer.test_raster_no_projection): Do not run this test
1641     if gdal support isn't available and report this to the runner.
1642    
1643 bh 1553 2003-08-06 Bernhard Herzog <[email protected]>
1644    
1645     Rearrange the renderers a bit, partly in preparation for changes
1646     required for the postgis merge, partly to make it more testable.
1647     Also make the representation of coordinates in Shapes more
1648     consistent.
1649    
1650     * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
1651     this class is now in BaseRenderer. This class is now practically
1652     only a specialization of BaseRenderer for rendering to an actual
1653     wx DC.
1654     (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
1655     to get the shapetype specific rendering functions.
1656    
1657     * Thuban/UI/baserenderer.py: New file with the basic rendering
1658     logic. The code in this file is completely independend of wx.
1659     (BaseRenderer): Class with the basic rendering logic
1660    
1661     * test/test_baserenderer.py: New. Test cases for BaseRenderer
1662    
1663     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
1664     error_on_redraw to guard agains endless loops and stack overflows
1665     when there's a bug in the rendering code that raises exceptions.
1666     (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
1667     rendering into a separate method _do_redraw so that error handling
1668     is a bit easier. When an exception occurs, set error_on_redraw to
1669     true. When it's true on entry to OnIdle do nothing and return
1670     immediately.
1671    
1672     * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
1673     Shape object will always have the coordinates as a list of list of
1674     coordinate pairs (tuples).
1675     (Shape.compute_bbox): Adapt to new representation.
1676    
1677     * Thuban/UI/viewport.py (ViewPort.find_shape_at)
1678     (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
1679     Shape objects.
1680    
1681     * test/test_shapefilestore.py
1682     (ShapefileStoreTests.assertFloatTuplesEqual)
1683     (ShapefileStoreTests.assertPointListEquals): Rename to
1684     assertPointListEquals and change purpose to checking equality of
1685     the lists returned by Shape.Points().
1686     (TestShapefileStoreArc.test_shape)
1687     (TestShapefileStorePolygon.test_shape)
1688     (TestShapefileStorePoint.test_shape): Use the new
1689     assertPointListEquals instead of assertFloatTuplesEqual
1690    
1691     * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
1692     (TestLayer.assertPointListEquals): Rename to assertPointListEquals
1693     and change purpose to checking equality of the lists returned by
1694     Shape.Points().
1695     (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
1696     (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
1697     (TestLayer.test_derived_store): Use the new assertPointListEquals
1698     instead of assertFloatTuplesEqual
1699    
1700     * test/test_derivedshapestore.py
1701     (TestDerivedShapeStore.assertFloatTuplesEqual)
1702     (TestDerivedShapeStore.assertPointListEquals): Rename to
1703     assertPointListEquals and change purpose to checking equality of
1704     the lists returned by Shape.Points().
1705     (TestDerivedShapeStore.test_shape): Use the new
1706     assertPointListEquals instead of assertFloatTuplesEqual
1707    
1708 jan 1550 2003-08-06 Jan-Oliver Wagner <[email protected]>
1709    
1710     * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
1711     a bounding box. A dialog is raised in case, no bounding box
1712     is found. This fixes bug #2043:
1713     https://intevation.de/rt/webrt?serial_num=2043
1714    
1715 bh 1548 2003-08-05 Bernhard Herzog <[email protected]>
1716    
1717     * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
1718     object look like a Color instantiation. Formerly it looked like a
1719     tuple.
1720    
1721     * test/test_color.py (TestColor.test_repr)
1722     (TestColor.test_equality, TestColor.test_inequality): New. test
1723     some more apects of the Color class
1724     (TestTransparent.test_repr, TestTransparent.test_hex)
1725     (TestTransparent.test_equality): New. Test cases for the
1726     Transparent object.
1727    
1728 jan 1545 2003-08-04 Jan-Oliver Wagner <[email protected]>
1729    
1730     * Doc/manual/thuban-manual.xml: a number of small improvements.
1731     The resulting file is the version submitted for GREAT-ER II.
1732    
1733 bh 1540 2003-08-01 Bernhard Herzog <[email protected]>
1734    
1735 bh 1543 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
1736     Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
1737     Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
1738    
1739     * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
1740     (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
1741     (ThubanEndBusyCursor): Add doc-strings
1742    
1743     2003-08-01 Bernhard Herzog <[email protected]>
1744    
1745 bh 1540 First step towards PostGIS integration. More abstraction by movin
1746     more code from the layer to the shapestore. More methods of the
1747     layer are now simply delegated to the equivalent method of the
1748     shapestore. The SHAPETYPE_* constants are now in data not in
1749     layer.
1750    
1751     * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
1752     (SHAPETYPE_POINT, Shape): Move these constants and classes from
1753     layer.py to data.py
1754     (ShapefileStore.__init__): More Initialization for the new methods
1755     and functionality.
1756     (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
1757     (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
1758     (ShapefileStore.Shape): New methods that were formerly implemented
1759     in the layer.
1760     (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
1761     (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
1762     (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
1763     equivalents of the new shape methods. These versions are simply
1764     delegated to the original shapstore.
1765    
1766     * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
1767     (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
1768     (Layer.SetShapeStore): Removed the initializatin of instance
1769     variables that were needed for the stuff that's now in
1770     ShapefileStore
1771     (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
1772     (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
1773     shapestore.
1774    
1775     * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
1776     Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
1777     instead of layer.
1778    
1779     * test/test_shapefilestore.py: New. Tests for ShapefileStore.
1780    
1781     * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
1782    
1783     * test/test_layer.py: Import the SHAPETYPE_* constants from data
1784     instead of layer.
1785     (TestLayer.test_derived_store): Remove the test for the exception
1786     when instantiating the DerivedShapeStore with an incompatible
1787     table which is now in test_derivedshapestore.py. Add some more
1788     tests of the layer methods to determine whether they work for a
1789     DerivedShapeStore as well.
1790    
1791 jonathan 1534 2003-07-31 Jonathan Coles <[email protected]>
1792    
1793     * Doc/manual/thuban-manual.xml: Fix the list of required packages
1794     by just listing the name and where they can be found.
1795    
1796 frank 1532 2003-07-31 Frank Koormann <[email protected]>
1797    
1798     * Doc/manual/thuban-manual.xml:
1799     Changed the screenshot elements to figure.
1800     Changed some variablelist elements to itemizedlist.
1801     Added section on GDAL formats.
1802    
1803 jonathan 1531 2003-07-31 Jonathan Coles <[email protected]>
1804    
1805     * Doc/manual/thuban-manual.xml: Added a few sentences about
1806     the Fix Border Color option when generating classes.
1807    
1808 jonathan 1529 2003-07-30 Jonathan Coles <[email protected]>
1809    
1810     * Thuban/Model/classgen.py: Add docstrings. Rename specific
1811     Ramp instances to use lower_case_style.
1812    
1813     * Thuban/UI/classgen.py: Use renamed Ramp instances.
1814    
1815     * Thuban/UI/classifier.py: Add docstrings.
1816    
1817     * Thuban/UI/dock.py: Add docstrings.
1818    
1819     * test/test_classgen.py: Use renamed Ramp instances.
1820    
1821 bh 1522 2003-07-30 Bernhard Herzog <[email protected]>
1822    
1823 bh 1524 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
1824     was never used in Thuban.
1825    
1826     2003-07-30 Bernhard Herzog <[email protected]>
1827    
1828 bh 1522 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
1829     method directly instead of going through the transient_table
1830     method. This faster because transient_table may force the copy of
1831     a DBF file into the transient database and setting a table's title
1832     doesnm't affect the title of the associated transient table, so
1833     this fixes RT #2042
1834    
1835     * Thuban/UI/main.py (__version__): Don't import the already
1836     removed show_exception_dialog.
1837    
1838 jonathan 1517 2003-07-29 Jonathan Coles <[email protected]>
1839    
1840 jonathan 1519 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1841     Put back this method and remove the equivalent function since we
1842     are setting the exception hook from within this class (OnInit).
1843    
1844     2003-07-29 Jonathan Coles <[email protected]>
1845    
1846 jonathan 1517 * Doc/manual/images/5_2_custom_ramp.png,
1847     Doc/manual/images/5_2_quantiles.png,
1848     Doc/manual/images/5_2_uniform_dist.png,
1849     Doc/manual/images/5_2_unique_values.png,
1850     Doc/manual/images/8_int_error.png: New screen shots.
1851    
1852     * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
1853     some points, and added more screen shots.
1854    
1855 bh 1512 2003-07-29 Bernhard Herzog <[email protected]>
1856    
1857 bh 1516 * Thuban/Model/data.py: Remove the now unused import of warnings
1858    
1859     2003-07-29 Bernhard Herzog <[email protected]>
1860    
1861 bh 1514 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
1862     deprecated since before the 0.8 release and isn't used in Thuban
1863     itself anymore.
1864    
1865 bh 1512 * Thuban/Model/transientdb.py: Remove some unnecessary imports
1866    
1867 jonathan 1503 2003-07-29 Jonathan Coles <[email protected]>
1868 jonathan 1506
1869     * Thuban/UI/application.py (ThubanApplication.OnInit): set the
1870     python exception hook here so that we are sure to catch any
1871     Thuban exception that happen during initialization.
1872    
1873     * Thuban/UI/main.py (main): Don't set the exception hook here,
1874     it will get set in ThubanApplication.OnInit.
1875    
1876     2003-07-29 Jonathan Coles <[email protected]>
1877 jonathan 1503
1878     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1879     Removed and called it show_exception_dialog() so that the exception
1880     handler can be set before the class is created.
1881    
1882     * Thuban/UI/main.py (main): Install the exception handler before
1883     a ThubanApplication is created.
1884    
1885 bh 1500 2003-07-29 Bernhard Herzog <[email protected]>
1886    
1887     * po/it.po: New. Italian translation by Maurizio Napolitano
1888    
1889     * po/ru.po: New. Russian translation by Alex Shevlakov
1890    
1891 frank 1497 2003-07-29 Frank Koormann <[email protected]>
1892    
1893 frank 1508 * Doc/manual/thuban-manual.xml: Extended section on supported
1894     projections.
1895    
1896     2003-07-29 Frank Koormann <[email protected]>
1897    
1898 frank 1497 * Doc/manual/thuban-manual.xml: gaspell-checked.
1899    
1900 jonathan 1493 2003-07-29 Jonathan Coles <[email protected]>
1901    
1902 jonathan 1495 * Doc/manual/images/3_5_legend.png: Added border to improve look
1903     on white background.
1904    
1905     2003-07-29 Jonathan Coles <[email protected]>
1906    
1907 jonathan 1493 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
1908     descriptions for the legend toolbar.
1909    
1910     * Doc/manual/images/4_2_raster_layer_properties.png: Removed
1911     cursor from dialog box.
1912    
1913     2003-07-28 Jonathan Coles <[email protected]>
1914    
1915     * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
1916    
1917     * Doc/manual/images/2_4_session_tree.png,
1918     Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
1919     Doc/manual/images/4_2_layer_properties.png,
1920     Doc/manual/images/4_2_raster_layer_properties.png,
1921     Doc/manual/images/5_3_genclass.png,
1922     Doc/manual/images/5_classification.png,
1923     Doc/manual/images/6_projection.png,
1924     Doc/manual/images/7_1_table_view.png,
1925     Doc/manual/images/7_2_5_join.png: New screenshots.
1926    
1927     2003-07-24 Jonathan Coles <[email protected]>
1928    
1929     * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
1930    
1931     2003-07-24 Jonathan Coles <[email protected]>
1932    
1933     * Doc/manual/thuban-manual.xml: Added EPS images and wrote
1934     chapter on Layer Management.
1935    
1936     * Doc/manual/Makefile: New. Makefile to generate all formats for the
1937     manual and images.
1938    
1939 bh 1483 2003-07-24 Bernhard Herzog <[email protected]>
1940    
1941     * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
1942     it annoys lintian which warns about these files not being
1943 jan 1767 executable. The #! isn't necessary here since if you absolutely
1944 bh 1483 must execute them you can always say "python <filename>".
1945    
1946     * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
1947     superfluous code to set brush and pen for point shapes
1948    
1949     * Thuban/UI/viewport.py: Remove commented out code that wouldn't
1950     belong in viewport anyway
1951    
1952 frank 1479 2003-07-24 Frank Koormann <[email protected]>
1953    
1954     * Doc/manual/thuban-manual.xml: Added section on table management.
1955    
1956 bh 1477 2003-07-24 Bernhard Herzog <[email protected]>
1957    
1958     * test/runtests.py (main): Recognize the long "verbose" option
1959     correctly.
1960    
1961 jonathan 1470 2003-07-22 Jonathan Coles <[email protected]>
1962    
1963     * Doc/manual/thuban-manual.xml: Continue to write first revision
1964     of the manual.
1965    
1966     * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
1967     with Begin/EndDrawing() calls to ensure we aren't doing to
1968     many updates to the dc during rendering.
1969     (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
1970     a pen and brush argument so they need to be passed to the function.
1971    
1972     * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
1973     Calculates the minimum and maximum scale values. Factored out
1974     of set_view_transform so that it could be used to zoom all the
1975     way into a single point.
1976     (ViewPort.set_view_transform): Call calc_min_max_scales().
1977     (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
1978     if only a single point is selected.
1979    
1980     * Doc/manual/images/1_2_legend_close.png,
1981     Doc/manual/images/1_2_legend_dock.png,
1982     Doc/manual/images/1_2_mainwindow.png,
1983     Doc/manual/images/1_2_mainwindow.ps,
1984     Doc/manual/images/1_2_mainwindow.sk,
1985     Doc/manual/images/3_2_fullextent.png,
1986     Doc/manual/images/3_2_fulllayerextent.png,
1987     Doc/manual/images/3_2_fullshapeextent.png,
1988     Doc/manual/images/3_2_pan.png,
1989     Doc/manual/images/3_2_zoomin.png,
1990     Doc/manual/images/3_2_zoomout.png,
1991     Doc/manual/images/3_3_identify.png,
1992     Doc/manual/images/3_3_label.png,
1993     Doc/manual/images/3_5_invisible.png,
1994     Doc/manual/images/3_5_movedown.png,
1995     Doc/manual/images/3_5_moveup.png,
1996     Doc/manual/images/3_5_props.png,
1997     Doc/manual/images/3_5_tobottom.png,
1998     Doc/manual/images/3_5_totop.png,
1999     Doc/manual/images/3_5_visible.png: New. Images for the documentation.
2000    
2001 bh 1451 2003-07-18 Bernhard Herzog <[email protected]>
2002    
2003 bh 1465 * Thuban/UI/messages.py (MAP_REPLACED): New message.
2004    
2005     * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
2006     after the new map has been assigned
2007    
2008     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
2009     Delegate MAP_REPLACED to the canvas too
2010     (MainWindow.prepare_new_session): Removed. Thanks to the new
2011     MAP_REPLACED message it's no longer needed
2012     (MainWindow.OpenSession, MainWindow.NewSession):
2013     prepare_new_session has been removed.
2014    
2015     * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
2016     MAP_REPLACED so that we can close the dialog if a new map is set.
2017     (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
2018     (Classifier.map_replaced): Handle MAP_REPLACED by closing the
2019     dialog
2020    
2021     * test/test_viewport.py (SimpleViewPortTest)
2022     (SimpleViewPortTest.test_default_size): Add doc-strings
2023     (ViewPortTest.setUp): Bind map to self.map so we can use it in
2024     tests. Subscribe to MAP_REPLACED messages too.
2025     (ViewPortTest.tearDown): No need to explicitly unsubscribe
2026     (ViewPortTest.test_set_map): New test for the SetMap method.
2027    
2028     2003-07-18 Bernhard Herzog <[email protected]>
2029    
2030 bh 1463 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
2031     Move this test from ViewPortTest.setUp to this new separate test
2032     case. setUp is not the place for the actual tests.
2033     (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
2034     more of the test from setUp to the new test test_inital_settings.
2035     (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
2036     (ViewPortTest.test_proj_conv): Split test_proj_conv into
2037     test_win_to_proj and test_proj_to_win and make the tests easier to
2038     understand
2039     (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
2040     (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
2041     (ViewPortTest.test_unprojected_rect_around_point)
2042     (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
2043     Reformat to increase readability.
2044    
2045     2003-07-18 Bernhard Herzog <[email protected]>
2046    
2047 bh 1461 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
2048    
2049     2003-07-18 Bernhard Herzog <[email protected]>
2050    
2051 bh 1459 * test/runtests.py: The test suite can now be run without an X
2052     connection. To make sure this remains true, remove the DISPLAY
2053     environment variable so that an error occurs if the wxGTK is
2054     imported accidentally
2055    
2056     2003-07-18 Bernhard Herzog <[email protected]>
2057    
2058 bh 1457 * Thuban/UI/viewport.py: Remove unused imports
2059    
2060     * Thuban/UI/view.py: Remove unused imports
2061    
2062     2003-07-18 Bernhard Herzog <[email protected]>
2063    
2064 bh 1455 * test/test_export.py Remove unused imports. The OutputTransform
2065     function is now in viewport.py and is called output_transform
2066     (TestScalebar.test_output_transform)
2067     (TestScalebar.test_OutputTransform): Renamed to
2068     test_output_transform and updated to use output_transform instead
2069     of OutputTransform
2070    
2071     * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
2072     renamed.
2073     (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
2074     renamed to output_transform
2075    
2076     * Thuban/UI/viewport.py (OutputTransform, output_transform):
2077     Rename to output_transform
2078    
2079     2003-07-18 Bernhard Herzog <[email protected]>
2080    
2081 bh 1453 * Thuban/Model/layer.py (Layer.__init__): Rename
2082     classificationField to classificatin_column and init it here so
2083     that it can be used in SetClassificationColumn
2084     (Layer.GetClassificationColumn, Layer.GetClassificationField):
2085     Rename to GetClassificationColumn.
2086     (Layer.SetClassificationColumn, Layer.SetClassificationField):
2087     Rename to SetClassificationColumn and issue a LAYER_CHANGED
2088     message if the column changes.
2089     (Layer._classification_changed, Layer.ClassChanged): Rename to
2090     _classification_changed. Update the callers.
2091     (Layer.SetShapeStore): Further field->column renames.
2092    
2093     * Thuban/Model/load.py (SessionLoader.start_classification)
2094     (SessionLoader.start_clpoint): Updates because of
2095     field->column method name changes in the Layer class
2096    
2097     * Thuban/Model/save.py (SessionSaver.write_classification): Updates
2098     because of field->column method name changes in the Layer class
2099    
2100     * Thuban/UI/classifier.py (Classifier.__init__)
2101     (Classifier._OnTry, Classifier._OnRevert): Updates because of
2102     field->column method name changes in the Layer class
2103    
2104     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
2105     because of field->column method name changes in the Layer class
2106    
2107     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
2108     of field->column method name changes in the Layer class
2109    
2110     * test/test_save.py (SaveSessionTest.testClassifiedLayer)
2111     (SaveSessionTest.testClassifiedLayer): Update because of
2112     field->column method name changes in the Layer class
2113    
2114     * test/test_layer.py (SetShapeStoreTests.setUp)
2115     (SetShapeStoreTests.test_sanity): Update because of field->column
2116     method name changes in the Layer class
2117     (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
2118     (TestLayerModification.test_sanity)
2119     (TestLayerModification.test_initial_settings): remove unsued code
2120     and rename to test_sanity.
2121     (TestLayerModification.test_set_classification): New test for
2122     SetClassification and SetClassificationField.
2123    
2124     2003-07-18 Bernhard Herzog <[email protected]>
2125    
2126 bh 1451 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
2127     the non-fixed values as well. The old test would have accepted a
2128     fixed ramp that only returnes the fixed properties
2129    
2130 jonathan 1449 2003-07-17 Jonathan Coles <[email protected]>
2131    
2132     * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
2133     shots for the manual. The XCF file is the source image and
2134     has additional layers to support changes.
2135    
2136     * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
2137    
2138     * Thuban/UI/classifier.py (Classifier.__BuildClassification):
2139     Return both the new class and the field name.
2140    
2141     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
2142     fit the map to the window as this changes any zoom level that
2143     the user may have set.
2144    
2145 jonathan 1442 2003-07-16 Jonathan Coles <[email protected]>
2146    
2147     * Thuban/Model/classgen.py (generate_singletons,
2148     generate_uniform_distribution, generate_quantiles): Remove
2149     fixes parameter, but maintain the same functionality by having
2150     the calling function pass a FixedRamp object for the ramp.
2151     (FixedRamp): New. Adapts a ramp to have fixed property values.
2152    
2153     * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
2154     (Classification): Inherit from Publisher.
2155     (Classification.__init__): Remove the layer parameter.
2156     Classifications no longer need to have a parent layer.
2157     (Classification.GetField, Classification.GetFieldType,
2158     Classification.SetFieldInfo): Removed. The field name is stored
2159     in the layer, and the type can be retreived by calling
2160     Layer.GetFieldType().
2161     (Classification._set_layer, Classification.GetLayer): Removed.
2162     Classifications no longer have a parent layer.
2163    
2164     * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
2165     classification.
2166     (Layer.SetShapeStore): Reset the classification first while
2167     we still have the old shape store to work with.
2168     (Layer.GetClassificationField, Layer.SetClassificationField):
2169     New. Method for getting/setting the field to classify on.
2170     (Layer.SetClassification): Simplified now that the layer
2171     simply has to hold a reference to the classification and not
2172     tell the classification who owns it.
2173     Fixes RTbug #2023.
2174    
2175     * Thuban/Model/load.py (SessionLoader.start_classification):
2176     Set the field name on the layer, not the classification.
2177    
2178     * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
2179     classification is modified.
2180    
2181     * Thuban/Model/save.py (SessionSaver.write_classification):
2182     Get the field name and type from the layer.
2183    
2184     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
2185     parameter records to rows and add docstring. Fixes RTbug #1997.
2186    
2187     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
2188     ramp when we need to fix certain values of a ramp rather than
2189     using the old fixes parameter. Fixes RTbug #2024.
2190    
2191     * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
2192     parameter.
2193     (ClassTable.Reset): Add fieldType parameter and use it, rather
2194     than asking the classification.
2195     (Classifier.__init__): Remember the original class's field
2196     and ask the layer for the field type, rather than the classification.
2197     (Classifier.__SetGridTable): Retrieve the field and field type
2198     for the table because they are not in the classification.
2199     (Classifier._OnTry, Classifier._OnRevert): Set the classification
2200     field on the layer in addition to the classification itself.
2201    
2202     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
2203     classification field from layer.
2204    
2205     * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
2206     classification field from layer. Split up tests and remove
2207     *-imports. Fixes RTbug #1992.
2208    
2209     * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
2210    
2211     * test/test_classification.py
2212     (TestClassification.test_classification): Remove tests for methods
2213     that no longer exist.
2214    
2215     * test/test_layer.py (SetShapeStoreTests.setUp): Classification
2216     __init__ no longer has a field parameter, use SetClassificationField.
2217     (SetShapeStoreTests.test_sanity): Use layer object to get class
2218     field info.
2219    
2220     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
2221     SetClassificationField on layer to set class field info.
2222    
2223     * test/test_viewport.py: Renamed from test/test_view.py.
2224    
2225 jan 1424 2003-07-16 Jan-Oliver Wagner <[email protected]>
2226    
2227     * Doc/manual/thuban-manual.xml: Added authors and an initial
2228     coarse structure.
2229    
2230 bh 1418 2003-07-15 Bernhard Herzog <[email protected]>
2231    
2232 bh 1422 * test/support.py (FloatComparisonMixin): This is a mix-in class
2233     and therefore should not be derived from any other class.
2234    
2235     * test/test_range.py (RangeTest): FloatComparisonMixin is a
2236     mix-in, so derive from TestCase as well.
2237    
2238     2003-07-15 Bernhard Herzog <[email protected]>
2239    
2240 bh 1420 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
2241     draw_func handling a bit to remove one layer of indirection. This
2242     makes the renderer about 10% faster in the non-classifying case
2243     and the code a bit cleaner
2244     (MapRenderer.draw_point_shape): Add the pen and brush parameters
2245     and set them in the dc. Now the draw_point_shape method and
2246     wxproj's draw_polygon_shape function have basically the same
2247     signature so that both can be directly used as draw_func
2248    
2249     2003-07-15 Bernhard Herzog <[email protected]>
2250    
2251 bh 1418 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
2252     string values (in addition to the labels) as UTF 8
2253    
2254     * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
2255     values if the field type is string
2256    
2257     * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
2258     saving a session with non-ascii string classification values.
2259    
2260     * test/test_load.py (TestClassification.file_contents)
2261     (TestClassification.test): Check for non-ascii values in string
2262     classifications
2263    
2264 jonathan 1416 2003-07-14 Jonathan Coles <[email protected]>
2265    
2266     * test/test_view.py: New. Tests for ViewPort.
2267    
2268 frank 1409 2003-07-14 Frank Koormann <[email protected]>
2269    
2270     * Thuban/Model/load.py (SessionLoader.start_map): Encode map
2271     title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
2272    
2273 frank 1411 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
2274     unicode strings from session file: session title, map title and
2275     projection name.
2276    
2277 jonathan 1403 2003-07-10 Jonathan Coles <[email protected]>
2278    
2279 jonathan 1406 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
2280     drag_stop, not drag_move when the mouse is released.
2281    
2282     2003-07-10 Jonathan Coles <[email protected]>
2283    
2284 jonathan 1403 The most important part of this is the seperation of view.py into
2285     two pieces. viewport.py now has a class called ViewPort which
2286     contains all the non-wx parts of view.py and can therefore be
2287     tested. view.py contains only the wx-specific parts and is fairly
2288     simple.
2289    
2290     * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
2291     RTTbug #1992.
2292     * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
2293     RTTbug #1992.
2294    
2295     * Thuban/Model/classgen.py (generate_singletons,
2296     generate_uniform_distribution, generate_quantiles):
2297     Added 'fixes' parameter so that property attributes can
2298     be held constant over the generated classification groups.
2299     (CustomRamp.GetProperties): Remove unused variables.
2300    
2301     * Thuban/Model/map.py (Map.SetProjection): Send the old
2302     projection as an argument to listeners of the MAP_PROJECTION_CHANGED
2303     event.
2304    
2305     * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
2306     parameter which is a list of records that restricts which
2307     records are saved. Fixes RTbug #1997.
2308    
2309     * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2310     Port exception dialog from GREAT-ER. Fixes RTbug #1993.
2311    
2312     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
2313     to allow the user to fix line color/width on generated groups.
2314     (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
2315     functions to optionally fix group properties.
2316    
2317     * Thuban/UI/main.py (main): Set exception hook to the
2318     ShowExceptionDialog. Fixes RTbug #1993.
2319    
2320     * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
2321     the table window when it is selectd to be shown.
2322    
2323     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
2324     Export Selection button and move the export buttons underneath
2325     the table.
2326     (QueryTableFrame.UpdateStatusText): Added event argument so
2327     that it can respond to grid selection events. The status text
2328     is now updated even when the table is not associated with a
2329     layer as was previously assumed.
2330     (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
2331     UpdateStatusText responds to these events.
2332     (QueryTableFrame.OnSaveAs): Renamed to doExport.
2333     (QueryTableFrame.doExport): Helper function that saves the
2334     entire table, or selected rows, to a file.
2335     (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
2336     Respond to export button events and call doExport.
2337    
2338     * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
2339     the function doesn't return NULL without first setting a Python
2340     Error.
2341    
2342     * test/runtests.py (main): Only print "Unknown option" for
2343     unsupported options.
2344    
2345     * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
2346     optional epsilon argument to specify floating point accuracy.
2347     (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
2348     for each item test.
2349    
2350     * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
2351     tests for saving selected records.
2352    
2353     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
2354     tests for saving selected records.
2355    
2356     * test/test_map.py (TestMapWithContents.test_set_projection):
2357     MAP_PROJECTION_CHANGED events send the old projection.
2358    
2359     * test/test_session.py
2360     (TestSessionWithContent.test_forward_map_projection):
2361     MAP_PROJECTION_CHANGED events send the old projection.
2362    
2363     * test/test_table.py (TableTest): Update tests to use non-deprecated
2364     functions.
2365    
2366 bh 1376 2003-07-08 Bernhard Herzog <[email protected]>
2367    
2368 bh 1382 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
2369     constants in the column objects are the standard ones defined in
2370     the table module.
2371    
2372     * test/test_transientdb.py
2373     (TestTransientTable.test_transienttable_to_dbf): New. Test whether
2374     exporting transient tables as DBF works. This should catch the bug
2375     just fixed in TransientTableBase.Width.
2376    
2377     2003-07-08 Bernhard Herzog <[email protected]>
2378    
2379 bh 1380 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
2380     interpolated colors correctly.
2381    
2382     * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
2383     New. Test case for the fix in classgen.py
2384    
2385     2003-07-08 Bernhard Herzog <[email protected]>
2386    
2387 bh 1378 * test/runtests.py (main): Make the default output less verbose
2388     and add a verbosity option (-v) to get the old output
2389    
2390     2003-07-08 Bernhard Herzog <[email protected]>
2391    
2392 bh 1376 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
2393     0.9.
2394    
2395     * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
2396     New. Return the join type
2397    
2398     * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
2399     DTD
2400     (SessionSaver.write_data_containers): Save the join type for
2401     joined tables
2402    
2403     * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
2404     namespace
2405     (SessionLoader.start_jointable): Handle the jointype attribute
2406    
2407     * test/test_load_0_8.py: New. Effectively a copy of test_load.py
2408     as of Thuban 0.8. These are now tests to determine whether Thuban
2409     can still read files generated by Thuban 0.8
2410    
2411     * test/test_load.py (LoadSessionTest.dtd)
2412     (TestSingleLayer.file_contents)
2413     (TestLayerVisibility.file_contents, TestLabels.file_contents)
2414     (TestLayerProjection.file_contents)
2415     (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
2416     (TestJoinedTable.file_contents)
2417     (TestLoadError.file_contents): Update for new DTD
2418     (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
2419     for new join type attribute
2420    
2421     * test/test_save.py (SaveSessionTest.dtd)
2422     (SaveSessionTest.testEmptySession)
2423     (SaveSessionTest.testSingleLayer)
2424     (SaveSessionTest.testLayerProjection)
2425     (SaveSessionTest.testRasterLayer)
2426     (SaveSessionTest.testClassifiedLayer)
2427     (SaveSessionTest.test_dbf_table)
2428     (SaveSessionTest.test_joined_table): Update for new DTD
2429     (SaveSessionTest.test_joined_table): Add test for new join type
2430     attribute
2431    
2432 bh 1372 2003-07-04 Bernhard Herzog <[email protected]>
2433    
2434     * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
2435     function for table_to_dbf
2436     (table_to_dbf): Deal with names longer than the 10 character limit
2437    
2438     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
2439     doc-string
2440     (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
2441     long column names
2442    
2443 bh 1365 2003-07-03 Bernhard Herzog <[email protected]>
2444    
2445 bh 1370 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
2446    
2447     2003-07-03 Bernhard Herzog <[email protected]>
2448    
2449 bh 1368 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
2450     for the Thuban manual and README with some basic information about
2451     the manual
2452    
2453     2003-07-03 Bernhard Herzog <[email protected]>
2454    
2455 bh 1365 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
2456     Update doc-string
2457     (TransientJoinedTable.create): Do not modify the column objects of
2458     the input tables in place and copy all columns of the input tables
2459     into the joined table after all.
2460    
2461     * test/test_transientdb.py
2462     (TestTransientTable.test_transient_joined_table_same_column_name):
2463     Update to reflect the new behavior
2464     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
2465     Update to reflect the new behavior
2466     (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
2467     New test case for a bug which modified the column objects in place
2468    
2469 jonathan 1360 2003-07-02 Jonathan Coles <[email protected]>
2470 jonathan 1349
2471 jonathan 1360 * Thuban/Model/classgen.py (generate_singletons,
2472     generate_uniform_distribution, generate_quantiles,
2473 jonathan 1363 GenQuantiles0): Make sure maxValue isn't less than
2474     one, otherwise we could divide by zero.
2475    
2476     * test/test_classgen.py (ClassGenTest.doClassRangeTest,
2477     ClassGenTest.doClassSingleTest): Call doBoundsTest to
2478     check the end classification groups against the
2479     proper property values.
2480     (ClassGenTest.doBoundsTest): New. Checks the first and
2481     last classification groups to make sure their properties
2482     are the correct upper and lower bounds for a color ramp.
2483    
2484     2003-07-02 Jonathan Coles <[email protected]>
2485    
2486     * Thuban/Model/classgen.py (generate_singletons,
2487     generate_uniform_distribution, generate_quantiles,
2488 jonathan 1360 GenQuantiles0): The denominator was one to high when
2489     calculating the index for the ramp causing the index
2490     to never to reach one.
2491    
2492     2003-07-02 Jonathan Coles <[email protected]>
2493    
2494 jonathan 1358 Changed the singature of ClassGroupRange.__init__ and
2495     ClassGroupRange.SetRange() so that the min/max values are
2496     passed as a tuple. This makes a better calling scheme for
2497     when a Range object is passed instead.
2498    
2499     * Thuban/Model/classgen.py: Fixed parameters to
2500     ClassGroupRange constructor.
2501    
2502     * Thuban/Model/classification.py (ClassGroupRange.__init__):
2503     Consolidate the min/max parameters into a single _range which
2504     can either be a tuple or a Range object.
2505     (ClassGroupRange.SetRange): Consolidate the min/max parameters
2506     into a single _range which can either be a tuple or a Range object.
2507    
2508     * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
2509     call to ClassGroupRange constructor to use a tuple.
2510    
2511     * Thuban/Model/layer.py (Layer.SetClassification): Switch
2512     the classification instance variable to the new class
2513     before calling _set_layer otherwise subscribers to a
2514     LAYER_CHANGED event will not see any difference.
2515    
2516     * test/test_classification.py: Fix tests of ClassGroupRange
2517     so that they use the new signature.
2518    
2519     * test/test_load.py: Fix use of ClassGroupRange so that it
2520     uses the new signature.
2521    
2522     * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
2523     uses the new signature.
2524    
2525     * test/test_save.py: Fix use of ClassGroupRange so that it
2526     uses the new signature.
2527    
2528    
2529     2003-07-01 Jonathan Coles <[email protected]>
2530    
2531 jonathan 1349 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
2532     Import used objects/class from color.
2533     (generate_singletons): We don't
2534     need the numGroups parameter anymore because we are using
2535     the new ramps with GetProperties().
2536     (generate_uniform_distribution): Use new ramp method
2537     GetProperties().
2538     (generate_quantiles, GenQuantiles0): Use new ramp method
2539     GetProperties().
2540     (CustomRamp.SetNumGroups): Removed. The ramps now map
2541     a value from 0 to 1 to class properties so the number
2542     of groups is not needed ahead of time.
2543     (CustomRamp.next): Removed. CustomRamp does not support
2544     interation anymore.
2545     (CustomRamp.GetProperties): Returns a ClassGroupProperties
2546     object based on the index value from 0 to 1 that is
2547     passed to it.
2548     (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
2549     Made into instances of Monochromatic class instread of
2550     deriving from it.
2551     (HotToCold.SetNumGroups): Removed. See CustomRamp.
2552     (HotToCold.next): Removed. See CustomRamp.
2553    
2554     * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
2555     (Classification.SetField, Classification.SetFieldType):
2556     Replaced with SetFieldInfo.
2557     (Classification.SetFieldInfo): New. Does a better job of
2558     what SetField and SetFieldType used to do by combining
2559     their function since they should really always be done
2560     at the same time.
2561     (Classification.SetLayer): Renamed to _set_layer.
2562     (Classification._set_layer): Should only be called from
2563     Layer's SetClassification. This does not cause a recursive
2564     call as SetLayer did because we know that Layer knows about
2565     the classification.
2566    
2567     * Thuban/Model/color.py: Fixes RTbug #1971.
2568     (_Transparent): Renamed from Transparent so it doesn't
2569     conflict with the module variable.
2570     (Transparent, Black): Renamed from Color.Transparent,
2571     Color.Black so they are not class variables.
2572    
2573     * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
2574     (Layer.Destroy): We don't need to call SetClassification
2575     anymore to clear out the back reference in the classifcation
2576     to the layer. It's better to set it to None using _set_layer,
2577     and we won't be creating another clas object too.
2578     (Layer.SetClassification): Classification._set_layer is not
2579     recursive so remove all the locking variables. Also clean
2580     up the code so that it remains unchanged if something fails.
2581    
2582     * Thuban/Model/load.py: Fixes RTbug #1971.
2583     (SessionLoader.start_classification): Call
2584     Classification.SetFieldInfo().
2585    
2586     * Thuban/Model/save.py: Removed import of Color which wasn't
2587     being used.
2588    
2589     * Thuban/UI/classgen.py: Fixes RTbug #1972.
2590     (ClassGenDialog.__init__): Color ramps are now instances
2591     already so we don't need to create any new objects.
2592     (ClassGenDialog.OnOK): Check for numGroups is no longer
2593     necessary because we never use it.
2594    
2595     * Thuban/UI/classifier.py: Fixes RTbug #1971.
2596     (Classifier.__BuildClassification, Classifier.__SetGridTable):
2597     Call Classification.SetFieldInfo() instead of SetFieldType.
2598    
2599     * Thuban/UI/renderer.py: Fixes RTbug #1971.
2600    
2601     * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
2602     (MapCanvas.__init__): Subscribe to the idle time event. Set
2603     background color to white.
2604     (MapCanvas.OnPaint): Set a flag indicating that we should
2605     render the map during idle time. If we already have a bitmap
2606     just draw it now.
2607     (MapCanvas.OnIdle): New. Render the map only during idle time.
2608     This also fixes a problem with the busy cursor under gtk.
2609    
2610     * test/test_classgen.py (ClassGenTest.test_generate_singletons):
2611     Fix calls to generate_singletons because the signature changed.
2612    
2613     * test/test_classification.py: Fix color references and
2614     change calls to Classification.[SetField|SetFieldType] to
2615     SetFieldInfo.
2616    
2617     * test/test_load.py: Fix color references.
2618    
2619     * test/test_load_0_2.py: Fix color references.
2620    
2621     * test/test_save.py (SaveSessionTest.testClassifiedLayer):
2622     Change calls to Classification.[SetField|SetFieldType] to
2623     SetFieldInfo.
2624    
2625 frank 1334 2003-07-01 Frank Koormann <[email protected]>
2626    
2627     MERGE from the greater-ms3 branch.
2628    
2629     * test/test_transientdb.py
2630     (TestTransientTable.test_transient_joined_table_with_equal_column_names):
2631     New. Test join of two tables with partly equal column names.
2632    
2633     * Thuban/Model/transientdb.py (TransientJoinedTable.create):
2634     If duplicates in left and right tables column names are found,
2635     append '_' (underscores) to the name until it is unique.
2636     Create always new internal names for the resulting table and reference
2637     columns in the join statement with <table>.<column>
2638    
2639 bh 1329 2003-07-01 Bernhard Herzog <[email protected]>
2640    
2641     * test/test_transientdb.py
2642     (TestTransientTable.test_transient_joined_table_same_column_name):
2643     New. Test whether joining on columns with the same names in both
2644     tables works.
2645 frank 1334
2646 bh 1329 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
2647     sure to use the right internal names even when joining on field
2648     with the same names in both tables. Also, detect duplicate names
2649     in the joined table correctly.
2650    
2651 frank 1325 2003-07-01 Frank Koormann <[email protected]>
2652    
2653     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
2654     Reverse List of layers to render in same order as in desktop legend.
2655    
2656 jonathan 1318 2003-06-30 Jonathan Coles <[email protected]>
2657    
2658 jonathan 1349 * Thuban/version.py (make_tuple): Takes a version string
2659     and splits it into a tuple of at most three integers.
2660     Used make_tuple() to make tuple versions of the version
2661     numbers.
2662    
2663     * Thuban/UI/about.py: Add Thuban email addresses.
2664    
2665     2003-06-30 Jonathan Coles <[email protected]>
2666    
2667 jonathan 1320 * Thuban/version.py: SQLite/PySQLite version dependencies
2668     were too high.
2669    
2670     2003-06-30 Jonathan Coles <[email protected]>
2671    
2672 jonathan 1318 * Thuban/version.py: Update version to 0.8.1
2673    
2674     * MANIFEST.in: Added Projections so that default.proj is
2675     included.
2676    
2677 jonathan 1312 2003-06-26 Jonathan Coles <[email protected]>
2678    
2679     New About box with lots more information including library
2680     versions and credits. More/better version checking before
2681     Thuban starts.
2682    
2683     * Thuban/UI/about.py: New. New About box that displays
2684     library version information and credits.
2685    
2686     * Thuban/version.py: Added new 'versions' dictionary which
2687     contains the verions of various libraries which are checked
2688     when the module loads.
2689     (verify_versions): Check all version numbers and returns
2690     a list of errors.
2691    
2692     * Thuban/UI/classifier.py (Classifier.__EnableButtons):
2693     Reset the status of the buttons as the situation warrants,
2694     but in a better more reliable way by not relying on the
2695     current status to determine what needs to change.
2696    
2697     * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
2698     (verify_versions): Remove most of the code since it is
2699     now in Thuban.version.verify_versions.o
2700    
2701     * Thuban/UI/mainwindow.py (MainWindow.About): Call new
2702     About box in Thuban.UI.about.
2703    
2704     * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
2705     Returns the version of gdal library being used as a string.
2706    
2707     * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
2708     Removed.
2709     (get_proj_version): Return the version of PROJ that the file
2710     was compiled with.
2711     (get_gtk_version): Return th version of GTK that the file
2712     was compiled with.
2713    
2714 jonathan 1304 2003-06-25 Jonathan Coles <[email protected]>
2715    
2716     * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
2717     of the SelectPropertiesDialog should be self so the window
2718     appears on top.
2719     (ClassGroupPropertiesCtrl.DoEdit): The parent
2720     of the SelectPropertiesDialog should be self so the window
2721     appears on top.
2722    
2723     * Thuban/UI/resource.py: Cleaned up how we determine file
2724     extensions.
2725     (GetImageResource): Return an wxImage from our Resources.
2726    
2727 jonathan 1299 2003-06-24 Jonathan Coles <[email protected]>
2728    
2729     * Thuban/UI/renderer.py (ExportRenderer.render_legend):
2730     Check that a layer has a classification before trying
2731     to get it. Raster layers don't have classifications.
2732    
2733 jonathan 1286 2003-06-23 Jonathan Coles <[email protected]>
2734 jonathan 1297
2735     * setup.py: Add Resources/XML to resource list.
2736    
2737     2003-06-23 Jonathan Coles <[email protected]>
2738 jonathan 1286
2739 jonathan 1297 * setup.cfg: Fix copyright dates
2740    
2741     2003-06-23 Jonathan Coles <[email protected]>
2742    
2743 jonathan 1294 * MANIFEST.in: Update with Resources/XML
2744    
2745     * setup.py: Don't include Locale resources yet as we don't
2746     have any and it causes problems building the distribution
2747     for Windows. Update version to 0.8.0.
2748    
2749     * Doc/thuban.dtd: Removed since it is now in Resources/XML.
2750    
2751     * Thuban/UI/mainwindow.py: Add blank line at the end because
2752     file was not being read correctly building the Windows
2753     distribution.
2754    
2755     2003-06-23 Jonathan Coles <[email protected]>
2756    
2757 jonathan 1289 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
2758    
2759     * Thuban/version.py: Temporarily update longversion for
2760     the 0.8 release so that it doesn't have the cvs revision.
2761    
2762     2003-06-23 Jonathan Coles <[email protected]>
2763    
2764 jonathan 1286 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
2765     to make sure that we don't create reentrant possibilities with
2766     wxYield.
2767    
2768     * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
2769     directly to avoid the wxSafeYield() call which generates an
2770     OnPaint event causing infinite recursion. Don't try to catch
2771     exception anymore. This was for before there were limits on map
2772     scaling.
2773    
2774 bh 1283 2003-06-23 Bernhard Herzog <[email protected]>
2775    
2776     Bug fix for RT #1961:
2777    
2778     * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
2779     Register DerivedShapestores with the session
2780    
2781     * Thuban/Model/session.py (Session.Tables): Make sure each table
2782     is only listed once.
2783    
2784     * test/test_load.py (TestJoinedTable.test): Add check_format call.
2785     Update file contents to match the one written out.
2786    
2787 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
2788    
2789     * test/xmlsupport.py (SaxEventLister.startElementNS)
2790     (SaxEventLister.endElementNS): Do not include the qname. Python
2791     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
2792     is (presumably incorrectly) None, whereas it's a string with the
2793     element name in the later versions.
2794    
2795     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
2796     (TestEventList.test_even_list_namespace): Update tests to reflect
2797     the new behaviour
2798     (TestEventList.test_even_list_id_normalization): Fix doc-string
2799    
2800 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
2801    
2802 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
2803     by deriving classes to determine if that layer supports shapes.
2804     (Layer): Override HasShapes and return true.
2805    
2806     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
2807     instead of a direct call to wx[Begin|End]CusyCursor().
2808     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
2809     table data.
2810    
2811     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
2812     New. Wrappers around the wxWindows functions that allow us to
2813     make additional calls such as wxYield which gives the native
2814     system a chance to update the cursor correctly.
2815    
2816     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
2817     instead of a direct call to wx[Begin|End]CusyCursor().
2818    
2819     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
2820     instead of a direct call to wx[Begin|End]CusyCursor().
2821     (MapCanvas.find_shape_at): Check if the current search layer
2822     support shapes, otherwise go on to the next layer.
2823    
2824     * test/test_layer.py: Add tests in each type of layer for
2825     HasClassification() and HasShapes()
2826    
2827     2003-06-20 Jonathan Coles <[email protected]>
2828    
2829 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
2830     turning on the busy cursor to allow the system to change the
2831     cursor before we begin painting. This fixes a problem that
2832     was occuring only under GTK. Fixes RTbug #1840.
2833    
2834 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
2835    
2836     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
2837     version.
2838    
2839     * Thuban/Model/save.py (sort_data_stores): New. Make topological
2840     sort of the data sources so they can be written with sources that
2841     data sources that depend on other data sources come after the
2842     sources they depend on.
2843     (SessionSaver.__init__): Add idmap instance variable to map from
2844     objects to the ids used in the file.
2845     (SessionSaver.get_id, SessionSaver.define_id)
2846     (SessionSaver.has_id): New. Methods to manage the idmap
2847     (SessionSaver.write): Use thuban-0.8.dtd
2848     (SessionSaver.write_session): Add a namespace on the session and
2849     write out the data sources before the maps.
2850     (SessionSaver.write_data_containers): New. Write the data
2851     containers.
2852     (SessionSaver.write_layer): Layer elements now refer to a
2853     shapestore and don't contain filenames anymore.
2854    
2855     * Thuban/Model/load.py (LoadError): Exception class to raise when
2856     errors in the files are discovered
2857     (SessionLoader.__init__): Define dispatchers for elements with a
2858     thuban-0.8 namespace too.
2859     (SessionLoader.check_attrs): New helper method to check and
2860     convert attributes
2861     (AttrDesc): New. Helper class for SessionLoader.check_attrs
2862     (SessionLoader.start_fileshapesource)
2863     (SessionLoader.start_derivedshapesource)
2864     (SessionLoader.start_filetable, SessionLoader.start_jointable):
2865     Handlers for the new elements in the new fileformat
2866     (SessionLoader.start_layer): Handle the shapestore attribute in
2867     addition to filename.
2868     (SessionLoader.start_table, SessionLoader.end_table): Removed.
2869     They were never used in the old formats and aren't needed for the
2870     new.
2871    
2872     * Thuban/Model/session.py (Session.DataContainers): New method to
2873     return all "data containers", i.e. shapestores and tables
2874    
2875     * test/xmlsupport.py (SaxEventLister.__init__)
2876     (SaxEventLister.startElementNS, sax_eventlist): Add support to
2877     normalize IDs.
2878    
2879     * test/test_xmlsupport.py
2880     (TestEventList.test_even_list_id_normalization): New test case for
2881     id normalization
2882    
2883     * test/test_load.py (LoadSessionTest.check_format): Use ID
2884     normalization
2885     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
2886     class atrributes used for ID normalization
2887     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
2888     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
2889     file format
2890     (TestJoinedTable): New test for loading sessions with joined
2891     tables.
2892     (TestLoadError): New. Test whether missing required attributes
2893     cause a LoadError.
2894    
2895     * test/test_save.py (SaveSessionTest.thubanids)
2896     (SaveSessionTest.thubanidrefs): New class attributes for ID
2897     normalization in .thuban files.
2898     (SaveSessionTest.compare_xml): Use id-normalization.
2899     (SaveSessionTest.testEmptySession)
2900     (SaveSessionTest.testLayerProjection)
2901     (SaveSessionTest.testRasterLayer)
2902     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
2903     (SaveSessionTest.testLayerProjection): The filename used was the
2904     same as for testSingleLayer. Use a different one.
2905     (SaveSessionTest.test_dbf_table)
2906     (SaveSessionTest.test_joined_table): New test cases for saving the
2907     new data sources structures.
2908     (TestStoreSort, MockDataStore): Classes to test the sorting of the
2909     data stores for writing.
2910    
2911     * test/runtests.py: Add CVS keywords
2912    
2913 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
2914    
2915 jonathan 1267 * test/test_session.py
2916     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
2917     Use the cultural_landmark-point.dbf file for the store so that
2918     the table rows and shape count match.
2919    
2920     2003-06-20 Jonathan Coles <[email protected]>
2921    
2922 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
2923     an exception if the number of shapes is different from the
2924     number of rows in the table. Address RTbug #1933.
2925    
2926     * test/test_layer.py (TestLayer.test_derived_store): Add
2927     a test for the new exception in DerivedShapeStore.__init__.
2928    
2929     * test/support.py (FloatTestCase): Removed since there is
2930     already FloatComparisonMixin. Fixes RTbug #1954.
2931     (FloatComparisonMixin.assertFloatEqual): Include test for
2932     infinity that was part of FloatTestCase.
2933    
2934     * test/test_range.py (RangeTest): Inherit from
2935     support.FloatComparisonMixin now that we don't have
2936     support.FloatTestCase.
2937    
2938 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
2939    
2940 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
2941     the implementation in xmlsupport instead.
2942     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
2943    
2944     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
2945     of test_save
2946    
2947     2003-06-20 Bernhard Herzog <[email protected]>
2948    
2949 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
2950     method to make sure the test files we load might have been written
2951     by the current thuban version.
2952     (ClassificationTest.TestLayers, TestSingleLayer.test)
2953     (TestLayerVisibility.test, TestClassification.test)
2954     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
2955     Add check_format() calls and fix the thuban data to match the data
2956     that would be written by saving the session loaded from it.
2957    
2958     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
2959     the same class and function in test_save.
2960    
2961     * test/test_xmlsupport.py (TestEventList): New. test cases for
2962     sax_eventlist
2963    
2964     2003-06-20 Bernhard Herzog <[email protected]>
2965    
2966 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
2967     Thuban are covered by this DTD
2968     (map): Fix content model for layers and raster layers. There can
2969     be any number or layers and raster layers in any order.
2970    
2971 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
2972    
2973 jonathan 1265 This is mainly about fixing RTbug #1949.
2974    
2975 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
2976     import statement since python 2.2 is the earliest supported
2977     version.
2978    
2979     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
2980     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
2981     depending on the units this projection *forwards* into.
2982    
2983     * Thuban/Model/save.py (SessionSaver.write_classification):
2984     Remove unnecessary use of lambdas and nested functions.
2985    
2986     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
2987     adjustment here if the map projection uses degrees.
2988    
2989     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
2990     scale adjust code since it is now done before calling
2991     this method. Don't do anything if the map projection
2992     is None.
2993    
2994 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
2995    
2996 bh 1248 Move version specific load tests to their own file.
2997    
2998     * test/test_load.py: Expand the doc-string to explain a bit how to
2999     handle file format changes.
3000     (TestClassification.test): Update the docstring as this test is
3001     not about Thuban 0.2 anymore.
3002    
3003     * test/test_load_0_2.py: New file with the load tests for thuban
3004     files created with Thuban 0.2 and earlier.
3005    
3006     2003-06-19 Bernhard Herzog <[email protected]>
3007    
3008 bh 1246 Add XML validation to some of the tests. Validation will only be
3009     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
3010     To make the DTD available to the test cases it's moved into
3011     Resources/XML
3012    
3013     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
3014     for versions up to and including 0.2. Two slight changes: added an
3015     encoding specification and fixed the comment which refered to
3016     GRASS, not Thuban
3017    
3018     * test/xmlsupport.py: New support module for tests involving XML.
3019     Currently there's a mix-in class for XML validation.
3020    
3021     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
3022    
3023     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
3024     so that we can validate the
3025     (SaveSessionTest.testEmptySession)
3026     (SaveSessionTest.testSingleLayer)
3027     (SaveSessionTest.testSingleLayer)
3028     (SaveSessionTest.testLayerProjection)
3029     (SaveSessionTest.testRasterLayer)
3030     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
3031    
3032     * test/runtests.py (main): Call print_additional_summary instead
3033     of print_garbage_information
3034    
3035     * test/support.py (resource_dir): New function to return the
3036     "Resource" subdirectory
3037     (print_additional_summary): New function to combine several
3038     summary functions
3039     (run_tests): Use print_additional_summary instead of calling
3040     print_garbage_information directly
3041    
3042     2003-06-19 Bernhard Herzog <[email protected]>
3043    
3044 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
3045     the classification element.
3046     (projection): Add the "name" attribute
3047    
3048 frank 1242 2003-06-19 Frank Koormann <[email protected]>
3049    
3050     MERGE from the greater-ms3 branch.
3051    
3052     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
3053     scale if projection is latlong to get better estimate.
3054    
3055     Fix problem of hidden properties dialog under windows after double
3056     click on layer tree:
3057     The tree control always gets an Expanded / Collapsed event after
3058     the ItemActivated on double click, which raises the main window again. We add a second ItemActivated event to the queue, which simply
3059     raises the already displayed window.
3060    
3061     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
3062     raiseProperties initialized to prevent endless loops
3063     (LegendTree._OnItemActivated): Depending on self.raiseProperties
3064     simply raise the properties or open the dialog and issue a second
3065     event.
3066    
3067 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
3068    
3069 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
3070    
3071     2003-06-18 Jonathan Coles <[email protected]>
3072    
3073 jonathan 1235 When Thuban loaded the map was redrawn twice because the
3074     legend was being opened after the mainwindow was created
3075     and not during its creation. This meant the map was drawn
3076     initially and then had to be redrawn when the legend
3077     caused the display to change. Now the legend is opened
3078     in the mainwindow constructor which resolves this issue.
3079    
3080     Also, although we were checking for the existence of
3081     gdal and gdalwarp modules, the gdalwarp extension was
3082     still being compiled (which may fail if the system doesn't
3083     have gdal installed). the build_ext command to setup.py
3084     now accepts the flags --with-gdal and --without-gdal.
3085     If --without-gdal is specified setup.py will try to
3086     use the gdal parameters specified by gdal-config. Under
3087     windows, those parameters have to be set in setup.py
3088     as with proj4 an wxWindows.
3089    
3090     * setup.py: Use a list instead of seperate variables for
3091     extension parameters so we can create a generic function
3092     that runs an appropriate *-config script.
3093     (run_cs_script): Renamed from run_wx_script and modified
3094     to accept a second argument which is a list of lists to
3095     be filled in by the values returned from running the command.
3096     (thuban_build_ext): New. Extends the build_ext command and
3097     provides the options --with-gdal/--without-gdal which then
3098     optionally includes the gdalwarp extension.
3099    
3100     * Thuban/Model/resource.py: First check if we can import
3101     the gdalwarp Thuban extension before checking for gdal.
3102     Also added some comments.
3103    
3104     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
3105     the map is None which may be the case if none has been loaded
3106     yet.
3107    
3108     * Thuban/UI/main.py (main): Remove call to ShowLegend.
3109    
3110     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
3111    
3112     * Thuban/UI/renderer.py: Check for gdal support before importing
3113     gdalwarp.
3114     (MapRenderer.render_map): Only try to optimize if we have gdal
3115     support otherwise nothing will get drawn.
3116    
3117 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
3118     during startup before a map has been created. Check if map is None
3119     before using it and do nothing if it is.
3120    
3121 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
3122    
3123     Fix the problem with raster layers under Windows that caused
3124     Thuban to crash. The view should respond to layer projection
3125     changed events to update the display. Changes to a projection
3126     should not cause the map to be set to full extent.
3127    
3128     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
3129     current_map_proj to remember the current map projection so that
3130     when the projection changes we know what the previous projection
3131     was.
3132     (MapCanvas.SetMap): Unsubscribe and subscribe to
3133     LAYER_PROJECTION_CHANGED events.
3134     (MapCanvas.projection_changed): Split into two methods that respond
3135     to map and layer projection changes.
3136     (MapCanvas.map_projection_changed): New. Takes the current view and
3137     projects it using the new projection. This does not cause the
3138     map to be redrawn at full extent.
3139     (MapCanvas.layer_projection_changed): New. Cause a redraw which
3140     will draw each layer in its new projection.
3141    
3142     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
3143     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
3144     under Windows.
3145    
3146     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
3147     to twice sizeof(void*) because there are two digits for each
3148     hex byte.
3149    
3150 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
3151    
3152     Update to the layer interface: Direct access to the table,
3153     shapetable, shapefile and filename attributes is now actively
3154     deprecated by issuing deprecation warnings for all places where
3155     this happens.
3156    
3157     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
3158     to the instance variables table, shapetable, shapefile and
3159     filename via __getattr__ so that we can issue a deprecation
3160     warning.
3161     (Layer.SetShapeStore): Don't set the deprecated instance variables
3162     any more
3163     (Layer.SetShapeStore): Don't use deprecated layer instance
3164     variables
3165     (Layer.Destroy): No need to explicitly remove the instance
3166     variables any more
3167     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
3168     instance variables
3169    
3170     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
3171     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
3172     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
3173     use deprecated layer instance variables
3174    
3175     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
3176     deprecated layer instance variables
3177    
3178     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
3179     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
3180     instance variables
3181    
3182     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
3183     deprecated layer instance variables
3184    
3185     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
3186     deprecated layer instance variables
3187    
3188     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
3189     deprecated layer instance variables
3190    
3191     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
3192     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
3193     variables
3194    
3195     * test/runtests.py (main): Turn Thuban's deprecation warnings into
3196     errors so that they're cought by the tests
3197    
3198     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
3199     layer instance variables
3200    
3201 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
3202    
3203     Fix a problem under Windows whereby if the user double-clicks on a
3204     layer in the legend that tree item will expand or collapse as well
3205     as open the layer properties dialog. The state of the tree item
3206     should not be affected.
3207    
3208     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
3209     preventExpandCollapse and subscribe to expanding and collapsing
3210     events.
3211     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
3212     collapsing events and will veto the event if it has been triggered
3213     by the user double clicking on a layer.
3214     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
3215     that an expanding/collapsing event should be vetoed.
3216    
3217 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
3218    
3219     * Thuban/UI/classifier.py (Classifier.OnClose)
3220     (Classifier.map_layers_removed)
3221     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
3222     in OnClose and not in map_layers_removed or
3223     layer_shapestore_replaced to make sure it always happens when the
3224     dialog is closed
3225    
3226 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
3227    
3228 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
3229     the background of the table view appears correctly.
3230    
3231     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
3232     object that can be used by derived classes to place any
3233     controls (including the grid) onto.
3234     (QueryTableFrame.__init__): Use the panel as the parent window
3235     for all the controls. Reparent the grid so that the panel is
3236     the parent. Call UpdateStatusText() to correctly initialize
3237     the status bar.
3238    
3239     2003-06-13 Jonathan Coles <[email protected]>
3240    
3241 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
3242     from wxFrame (as opposed to wxDialog like the other classes)
3243     but otherwise behaves like the other classes. This is needed
3244     for the TableView which isn't really a dialog and needs to
3245     have a status bar and control buttons.
3246    
3247     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
3248     instance variable to keep track of how many rows are selected.
3249     Subscribe once to the the events we are interested in.
3250     (ThubanGrid.OnRangeSelect): Only handle event if event handling
3251     hasn't been turned off.
3252     (ThubanGrid.OnSelectCell): Only handle event if event handling
3253     hasn't been turned off.
3254     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
3255     as an event listener (which changes the event handler stack)
3256     simply set an instance variable to False. This is checked in
3257     the event handlers.
3258     (ThubanGrid.GetNumberSelected): Return the number of currently
3259     selected rows.
3260     (TableFrame): Inherit from ThubanFrame so we can have a
3261     status bar and control buttons.
3262     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
3263     Explicitly set which items are selected in the operator choice and
3264     action choice so there is always a valid selection. Fixes RTbug #1941.
3265     Subscribe to grid cell selection events so we can update the
3266     status bar.
3267     (QueryTableFrame.UpdateStatusText): Update the status bar with
3268     how many rows are in the grid, how many columns, and how many
3269     rows are selected.
3270     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
3271     Call UpdateStatusText when cells are (de)selected.
3272     (QueryTableFrame.OnQuery): Use the string value in the value
3273     combo if either the selected item index is 0 or if the string
3274     cannot be found in the predefined list (this happens if the
3275     user changes the text). Fixes RTbug #1940.
3276     Only turn off the grid event listeners if there a query comes
3277     back with a none empty list of ids. in the case that the list
3278     is empty this causes a grid.ClearSelection() call to actually
3279     clear the grid selection which causes the selected items in
3280     the map to be deselected. Fixes RTbug #1939.
3281    
3282     * test/test_save.py (XMLWriterTest.Encode): Check return values.
3283     Fixes RTbug #1851.
3284    
3285 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
3286    
3287     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
3288     self.selected_shape with the current selection to make sure the
3289     contents of the dialog are up to date when it's shown for the
3290     first time.
3291     The dialog used to work without this by luck. The recent fix to
3292     the connector module 'broke' a 'feature' the identify view was
3293     relying on, i.e that subscribing to a message in response to
3294     receiving a message of that type would mean that the new
3295     subscriber would also be called for the same message.
3296    
3297 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
3298 jonathan 1175
3299 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
3300     the image is rendered. Fixes RTbug #1937.
3301    
3302     2003-06-12 Jonathan Coles <[email protected]>
3303    
3304 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
3305 jonathan 1193 user directory if it doesn't exist on a posix system.
3306     Fixes RTbug #1815.
3307 jonathan 1191
3308     * Thuban/Model/resource.py (get_user_proj_files): Moved the
3309     called to get_application_dir here, so that the directory
3310     will only be called if this method is invoked.
3311    
3312     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
3313     the projfilepath if no projection is selected.
3314    
3315     2003-06-12 Jonathan Coles <[email protected]>
3316    
3317 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
3318     the scalebar if the current map has no projection set.
3319    
3320     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
3321     projfilepath label to just the basename of the projection file
3322     rather than include the entire path.
3323    
3324     * Thuban/Model/resource.py: Fix missed proj functions that
3325     needed to be renamed.
3326    
3327     2003-06-12 Jonathan Coles <[email protected]>
3328    
3329 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
3330     tested if the variable was an instance of Color.
3331    
3332     * Thuban/Model/color.py (Color): Remove commented code that isn't
3333     used.
3334     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
3335     Fixes RTbug #1835.
3336     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
3337     Needed now that the class doesn't inherit from Color.
3338    
3339     2003-06-12 Jonathan Coles <[email protected]>
3340    
3341 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
3342     check unicode strings.
3343    
3344     * test/test_layer.py: Check for existence of gdal.
3345    
3346     2003-06-12 Jonathan Coles <[email protected]>
3347 jonathan 1172
3348     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
3349     that was in load.py
3350 jonathan 1169
3351 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
3352     that was in save.py
3353    
3354     2003-06-12 Jonathan Coles <[email protected]>
3355    
3356 jonathan 1169 This is largely a collection of bug fixes. We also handle the
3357     case where gdal is not on the system. The XMLReader and XMLWriter
3358     classes were moved into there own files to resolve some circular
3359     import references and because they shouldn't really be in the
3360     file that is dediciated to reading/writing session files since
3361     they are also used elsewhere.
3362    
3363     * Thuban/Model/classgen.py: Renamed functions to follow the
3364     function_names_with_underscores style. Fixes RTbug #1903.
3365     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
3366    
3367     * Thuban/Model/layer.py: Import gdal only if it available.
3368     (RasterLayer): Handle the case where the gdal library is unavailable.
3369     Addresses RTbug #1877.
3370    
3371     * Thuban/Model/load.py (XMLReader): Moved into seperate file
3372     xmlreader.py.
3373    
3374 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
3375    
3376     This is largely a collection of bug fixes. We also handle the
3377     case where gdal is not on the system. The XMLReader and XMLWriter
3378     classes were moved into there own files to resolve some circular
3379     import references and because they shouldn't really be in the
3380     file that is dediciated to reading/writing session files since
3381     they are also used elsewhere.
3382    
3383     * Thuban/Model/classgen.py: Renamed functions to follow the
3384     function_names_with_underscores style. Fixes RTbug #1903.
3385     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
3386    
3387     * Thuban/Model/layer.py: Import gdal only if it available.
3388     (RasterLayer): Handle the case where the gdal library is unavailable.
3389     Addresses RTbug #1877.
3390    
3391     * Thuban/Model/load.py (XMLReader): Moved into seperate file
3392     xmlreader.py.
3393    
3394 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
3395     file xmlwriter.py.
3396    
3397     * Thuban/Model/resource.py: Renamed functions to following the
3398     function_names_with_underscores style.
3399     (has_gdal_support): New function that returns true if the gdal
3400     library is available. Addresses RTbug #1877.
3401    
3402     * Thuban/UI/application.py (ThubanApplication.OpenSession):
3403     Display a message box if the gdal library is not available, but
3404     only if there are any layers that would use it. Addresses RTbug #1877.
3405    
3406     * Thuban/UI/classgen.py: Use renamed projection resource functions.
3407     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
3408     when using integers versus floats.
3409    
3410     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
3411     determine if the "Add Image Layer" menu option should be
3412     greyed out or not. Addresses RTbug #1877.
3413    
3414     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
3415    
3416     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
3417     optimize if a raster layer is visible. Fixes RTbug #1931.
3418     Only draw the raster layer if the gdal library is available.
3419     Addresses RTbug #1877.
3420    
3421     * test/test_classgen.py: Add tests for generate_singletons,
3422     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
3423     (test_calculate_quantiles): Fix some tests to catch the new
3424     ValueError that is raised.
3425    
3426     * test/test_proj.py: Use renamed projection resource functions.
3427    
3428     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
3429     test for saving classified layers. Fixes RTbug #1902.
3430     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
3431    
3432 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
3433    
3434     Fix for http://intevation.de/rt/webrt?serial_num=1900.
3435    
3436     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
3437    
3438     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
3439     multiplechoicedialog.py rather than from the wxPython library.
3440    
3441 frank 1151 2003-06-11 Frank Koormann <[email protected]>
3442    
3443 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
3444     update.
3445    
3446     2003-06-11 Frank Koormann <[email protected]>
3447    
3448 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
3449     determine the absolute .thuban/thuban directory under
3450     "posix" (os.expanduser) and "nt" (read AppData registry key).
3451    
3452     * Thuban/Model/resource.py: Use get_application_dir
3453    
3454     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
3455     Use get_application_dir.
3456    
3457 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
3458    
3459 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
3460     the messages MAP_LAYERS_REMOVED messages
3461     (LayerTableFrame.OnClose): Unsubscribe from it.
3462     (LayerTableFrame.map_layers_removed): New. Receiver for
3463     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
3464     dialog is showing is removed.
3465    
3466     2003-06-10 Bernhard Herzog <[email protected]>
3467    
3468 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
3469     of the receivers list so that unsubscribing in a receiver doesn't
3470     modify it while iterating over it.
3471    
3472     * test/test_connector.py
3473     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
3474     unsubscribing in a receiver works correctly. See docstring for
3475     details
3476    
3477     2003-06-10 Bernhard Herzog <[email protected]>
3478    
3479 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
3480     message.
3481    
3482     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
3483     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
3484     LAYER_CHANGED will still be sent if the classification changes.
3485    
3486     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
3487     parameter so we can subscribe to some of its messages
3488     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
3489     and the layer's LAYER_SHAPESTORE_REPLACED
3490     (Classifier.unsubscribe_messages): New. Unsubscribe from message
3491     subscribed to in __init__
3492     (Classifier.map_layers_removed)
3493     (Classifier.layer_shapestore_replaced): receivers for the messages
3494     subscribed to in __init__. Unsubscribe and close the dialog
3495    
3496     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
3497     the map to the Classifier dialog
3498    
3499     * test/test_layer.py (SetShapeStoreTests): Derive from
3500     SubscriberMixin as well so we can test messages
3501     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
3502     messages
3503     (SetShapeStoreTests.tearDown): Clear the messages again
3504     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
3505     for the modified flag too
3506     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
3507     to check whether SetShapeStore sets the modified flag
3508     (SetShapeStoreTests.test_set_shape_store_different_field_name)
3509     (SetShapeStoreTests.test_set_shape_store_same_field)
3510     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
3511     Add tests for the messages. This checks both the new
3512     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
3513    
3514 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
3515    
3516     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
3517     the menu items.
3518    
3519 frank 1134 2003-06-05 Frank Koormann <[email protected]>
3520    
3521 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
3522     Layout reimplemented without panel. Make life easier to fit the list
3523     in the dialog.
3524    
3525     2003-06-05 Frank Koormann <[email protected]>
3526    
3527 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
3528     once on initialisation (Former implementation resulted in multiple
3529     entries for each projection).
3530     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
3531     if set, select the projection found under the specified name. This
3532     overwrites any other selection estimate.
3533     Removed projchoice filling from this method.
3534     (ProjFrame._OnSave, ProjFrame._OnAddToList):
3535     Updated call of ProjFrame.__FillAvailList
3536     (LCCPanel._DoLayout): Moved parameter controls in more common order.
3537    
3538     * Resources/Projections/defaults.proj: Extended defaults representing
3539     various common European projections.
3540    
3541     2003-06-05 Frank Koormann <[email protected]>
3542    
3543 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
3544     Use ListCtrl instead of GridCtrl
3545    
3546     * Thuban/Model/resource.py:
3547     Guess location of .thuban directory from tempdir parent directory.
3548    
3549     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
3550     Guess location of .thuban directory from tempdir parent directory.
3551    
3552 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
3553    
3554     Do not cache the values returned by the tree widget's
3555     GetFirstChild and GetNextChild methods because it led to lots of
3556     segfaults. The new way requires more brute force but is more
3557     reliable.
3558    
3559     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
3560     variable layer2id
3561     (LegendTree.find_layer): New method to do with brute force what
3562     layer2id tried to accomplish
3563     (LegendTree._OnMsgLayerChanged)
3564     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
3565     Use find_layer instead of layer2id
3566     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
3567     update layer2id anymore
3568     (LegendTree._OnMsgMapLayersRemoved)
3569     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
3570    
3571 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
3572    
3573     * Thuban/Model/classgen.py (GenQuantiles0): New function.
3574    
3575 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
3576    
3577 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
3578     New commands.
3579     (main_menu): Add the new commands.
3580     (MainWindow.TableRename): New. Implementation of the table_rename
3581     command.
3582     (MainWindow.RenameLayer): New. Implementation of the layer_rename
3583     command.
3584    
3585     * Thuban/Model/session.py (Session.AddTable): call self.changed to
3586     set the modified flag
3587    
3588     * test/test_session.py (TestSessionSimple.test_add_table): Test
3589     whether the modified flag is set properly
3590    
3591     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
3592     instead of issue so that the modified flags get updated.
3593    
3594     * test/test_base.py (SomeTitledObject): Derive from Modifiable
3595     instead of Publisher to reflect reality better and to accomodate
3596     the fact that SetTitle now calls changed instead of issue
3597    
3598     2003-06-02 Bernhard Herzog <[email protected]>
3599    
3600     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
3601     acquisition has to happen before the try in a try-finally.
3602    
3603     2003-06-02 Bernhard Herzog <[email protected]>
3604    
3605 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
3606     possible that a layer is removed that is not currently selected in
3607     the legend so don't check for this.
3608    
3609 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
3610    
3611 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
3612     variables to None that have direct or indirect references to
3613     shapefiles or dbf files to make sure that they do go away and the
3614     files are closed.
3615    
3616     2003-05-30 Bernhard Herzog <[email protected]>
3617    
3618 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
3619     availImgListIndices when a new image list is created
3620    
3621     2003-05-30 Bernhard Herzog <[email protected]>
3622    
3623 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
3624     changing_selection to indicate whether the LegendTree code itself
3625     is currently changing the selection
3626     (LegendTree.normalize_selection): New method to normalize the
3627     selection by selecting the layer item even if the user clicked on
3628     the classification.
3629     (LegendTree._OnSelChanged): normalize the selection. This works
3630     around a bug in wx which doesn't keep track of the selection
3631     properly when subtrees are deleted.
3632    
3633     2003-05-30 Bernhard Herzog <[email protected]>
3634    
3635 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
3636     maximum and minimum scale factors.
3637    
3638     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
3639     changes in classgen.py
3640    
3641 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
3642    
3643     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
3644     all the methods functions. Fixes RTBug #1903.
3645    
3646     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
3647     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
3648     RTBug #1907.
3649    
3650     * Thuban/UI/classgen.py: Use classgen functions that were part
3651     of the ClassGenerator class. Put try/finally blocks around
3652     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
3653     RTBug #1904.
3654    
3655     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
3656    
3657     * Thuban/UI/legend.py: The legend was cleared and repopulated any
3658     time something changed which caused some state to be lost such
3659     as which children were expanded or collapsed. Fixes RTBug #1901.
3660     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
3661     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
3662     the legend but not in the map.
3663     (LegendTree.__FillTree): Move main functionality out into smaller
3664     methods that can be used by other methods.
3665     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
3666     if they are available.
3667     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
3668     that we override the wxTreeCtrl method. Iterate over children
3669     and call __RemoveLayer.
3670     (LegendTree.__AddLayer): New. Add a new layer to the legend.
3671     (LegendTree.__RemoveLayer): Remove a layer from the legend.
3672     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
3673     Should only be called with the id of a layer branch.
3674     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
3675     Returns the root item or creates one if necessary.
3676    
3677     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
3678     ProjectRasterFile with tuple arguments instead of strings.
3679    
3680     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
3681     with try/finally. Fixes RTBug #1904.
3682    
3683     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
3684     with try/finally. Fixes RTBug #1904.
3685     (MapCanvas.FitSelectedToWindow): If a single point is selected
3686     simply center it on the display. Fixes RTBug #1849.
3687    
3688     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
3689     to be compiled as a standalone app. Now the code can only be
3690     called from Python which simplifies the parameter passing.
3691     (ProjectRasterFile): Handle Python arguments. Remove code that
3692     checks for a destination dataset. Add more clean up code.
3693    
3694     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
3695     TestMapWithContents.test_lower_layer_bottom):
3696     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
3697     Fixes RTBug #1907.
3698    
3699     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
3700     extent to the map when the legend is toggled. Fixes RTBug #1881.
3701    
3702 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
3703    
3704     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
3705     unsubscribes all that is subcribed in __init__.
3706    
3707 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
3708    
3709 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
3710     (MainWindow.CanDuplicateLayer): New methods to implement the
3711     Layer/Duplicate command.
3712     (layer_duplicate command): New.
3713     (main_menu): Add layer_duplicate to the Layer menu.
3714    
3715     2003-05-28 Bernhard Herzog <[email protected]>
3716    
3717 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
3718     renderer so that NULL/None values get displayed differently (by a
3719     gray rectangle).
3720     (TableGrid.__init__): Override the default renderers
3721    
3722     2003-05-28 Bernhard Herzog <[email protected]>
3723    
3724 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
3725     classification to "None" if the type of the field has changed.
3726    
3727     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
3728     test for the Layer.SetShapeStore method
3729    
3730 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
3731 jan 1085
3732 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
3733     does not necessarily have a filename).
3734    
3735     2003-05-28 Jan-Oliver Wagner <[email protected]>
3736    
3737 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
3738     sort the selection list for the dialog.
3739    
3740 frank 1083 2003-05-28 Frank Koormann <[email protected]>
3741    
3742     * extensions/thuban/wxproj.cpp
3743     (project_point): Removed cast to int for projected point coordinates.
3744     (shape_centroid): Return last point if all polygon vertices fall
3745     to one point.
3746    
3747 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
3748    
3749 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
3750     with layers that don't have shapestores, i.e. raster layers.
3751    
3752     2003-05-28 Bernhard Herzog <[email protected]>
3753    
3754 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
3755     when determining the title from the filename.
3756    
3757     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
3758     reflect changes in the way the title is derived from the filename
3759    
3760 frank 1077 2003-05-28 Frank Koormann <[email protected]>
3761    
3762     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
3763     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
3764    
3765 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
3766    
3767 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
3768     delegate SelectedLayer.
3769     (MainWindow.LayerUnjoinTable): Implement.
3770     (_can_unjoin): New. Helper function for the sensitivity of the
3771     layer/unjoin command.
3772    
3773     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
3774     (DerivedShapeStore.OrigShapeStore): New. Return the original
3775     shapestore. Used to figure out how to unjoin.
3776     (DerivedShapeStore.Shapefile): Fix a typo.
3777    
3778     2003-05-27 Bernhard Herzog <[email protected]>
3779    
3780 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
3781     well
3782     (JoinDialog.__init__): Use the layer parameter and only build the
3783     left choice when a layer is given
3784     (JoinDialog.OnJoin): Handle layer joins as well
3785     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
3786     that the user selects the "Select..." item. The sensitivitly
3787     updating is now in update_sensitivity
3788     (JoinDialog.y): New method to refactor the sensitivity update of
3789     the join button into its own method.
3790    
3791     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
3792    
3793     2003-05-27 Bernhard Herzog <[email protected]>
3794    
3795 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
3796     iff there are unreferenced tables in the session
3797    
3798     2003-05-27 Bernhard Herzog <[email protected]>
3799    
3800 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
3801    
3802     * Thuban/Model/session.py (Session.UnreferencedTables): New method
3803     to return tables that are not referenced by other tables or shape
3804     stores and can be removed.
3805     (Session.RemoveTable): Issue a TABLE_REMOVED message after
3806     removing the table
3807    
3808     * Thuban/UI/mainwindow.py: Remove unused imports
3809     (MainWindow.TableClose): Implement.
3810    
3811     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
3812     messages so that the frame will be automatically closed when a new
3813     session is opened or the table is removed.
3814     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
3815     __init__
3816     (TableFrame.close_on_session_replaced)
3817     (TableFrame.close_on_table_removed): New. Subscribers that close
3818     the window
3819    
3820     * test/test_session.py (TestSessionMessages.test_remove_table)
3821     (TestSessionSimple.test_remove_table): Move the test to
3822     TestSessionSimple and add test for the TABLE_REMOVED message
3823     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
3824     (TestSessionSimple.test_unreferenced_tables) New. Test for the
3825     UnreferencedTables method.
3826     (UnreferencedTablesTests): New. Class with some more sophisticated
3827     tests for UnreferencedTables.
3828    
3829 frank 1065 2003-05-27 Frank Koormann <[email protected]>
3830    
3831 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
3832     display has some unwanted side effects. Removed again.
3833    
3834     2003-05-27 Frank Koormann <[email protected]>
3835    
3836 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
3837    
3838     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
3839    
3840 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
3841    
3842 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
3843     Menu.RemoveItem().
3844 jan 1062
3845 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
3846     the menu.
3847 jan 1062
3848 frank 1059 2003-05-27 Frank Koormann <[email protected]>
3849    
3850     Nonmodal dialogs without parent (i.e. they can fall behind the main
3851     window)
3852    
3853     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
3854     all dialogs in the dialogs dictionary and the canvas.
3855    
3856     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
3857     parent, i.e. can fall behind other windows.
3858     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
3859     dictionary before removing it.
3860    
3861     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
3862    
3863     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
3864     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
3865     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
3866    
3867 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
3868    
3869 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
3870     tableview dialog
3871     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
3872     Also, don't use the table's titles as the dialog names. The titles
3873     aren't guaranteed to be unique.
3874     (MainWindow.TableOpen): Open a table view dialog after opening the
3875     table
3876    
3877     2003-05-27 Bernhard Herzog <[email protected]>
3878    
3879 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
3880     effect can be achieved by simply closing the window showing the
3881     table.
3882     (MainWindow.TableHide): Removed.
3883     (main_menu): Removed "table_hide"
3884    
3885 frank 1051 2003-05-27 Frank Koormann <[email protected]>
3886    
3887     Fix legend tree display problems under Win32
3888    
3889     * Thuban/UI/legend.py: BMP_SIZE_W = 15
3890     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
3891     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
3892    
3893     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
3894    
3895 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
3896    
3897     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
3898     'after' now allows to insert separators almost anywhere in the menu.
3899    
3900 frank 1046 2003-05-27 Frank Koormann <[email protected]>
3901    
3902     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
3903     "S" of selection box label to hint on hot key (Alt-S). Works under
3904     Win32 but is ignored under GTK.
3905    
3906     2003-05-26 Frank Koormann <[email protected]>
3907    
3908     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
3909     Center Choices.
3910    
3911 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
3912    
3913 bh 1044 Remove the Precision methods again. They're too DBF specific to be
3914     part of the table interface and they're only used in table_to_dbf
3915     anyway.
3916    
3917     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
3918     fixed precision of 12 for doubles.
3919     (TransientTableBase.Precision): Removed
3920     (AutoTransientTable.Width): Delegate to self.table.
3921    
3922     * Thuban/Model/table.py (DBFTable.Precision)
3923     (MemoryTable.Precision): Removed.
3924     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
3925     (table_to_dbf): Use a fixed precision of 12 for floats unless the
3926     column object specifies something else.
3927    
3928     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
3929     test for table_to_dbf
3930    
3931     2003-05-26 Bernhard Herzog <[email protected]>
3932    
3933     * test/test_transientdb.py
3934     (TestTransientTable.run_iceland_political_tests): Fix a comment.
3935    
3936     2003-05-26 Bernhard Herzog <[email protected]>
3937    
3938 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
3939     implementation. Mark parts of the file format strings for
3940     localization.
3941    
3942     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
3943     file and add the table to the tables managed by the session
3944    
3945 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
3946     New. test case for OpenTableFile
3947    
3948 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
3949    
3950 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
3951     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
3952     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
3953     Replace the true/false of wxWindows by True/False of Python 2.2.1.
3954    
3955     2003-05-26 Jan-Oliver Wagner <[email protected]>
3956    
3957 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
3958     already a selection present, update the grid accordingly.
3959 jan 1033
3960     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
3961     resizeable and increase its initial size.
3962    
3963 frank 1030 2003-05-26 Frank Koormann <[email protected]>
3964    
3965     Table export functionality
3966    
3967     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
3968     Return width (in characters) for a column.
3969     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
3970     (table_to_dbf): Write table to dbf file.
3971     (table_to_csv): Write table to csv file.
3972    
3973     * Thuban/Model/transientdb.py (TransientTableBase.Width,
3974     TransientTableBase.Precision): Return column width and precision.
3975    
3976     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
3977     or table_to_csv depending on file selection.
3978    
3979     * test/test_dbf_table.py:
3980     Test table_to_dbf (extension of former part of test).
3981    
3982     * test/test_csv_table.py:
3983     Test table_to_csv.
3984    
3985 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
3986    
3987 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
3988     Use QueryTableFrame instead of TableFrame.
3989 jan 1021
3990 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
3991     table window with 'Layer Table:' instead of 'Table:'.
3992    
3993     2003-05-23 Jan-Oliver Wagner <[email protected]>
3994    
3995     Give all tables a title via mix-in TitledObject.LayerShowTable
3996    
3997 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
3998     only if it exists.
3999    
4000     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
4001     and call its init-method with a default title. Remove Title() method.
4002    
4003     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
4004     AutoTransientTable): mix-in TitledObject and call its init-method with
4005     a default title. Remove Title() method.
4006    
4007 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
4008    
4009     * Thuban/Model/session.py (Session.AddShapeStore): Define
4010     AddShapeStore analogously to AddTable.
4011    
4012     * test/test_session.py (TestSessionSimple.test_add_shapestore):
4013     New. Test for AddShapeStore
4014    
4015 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
4016    
4017     Introducing QueryTableFrame and a very coarse ShowTable implementation.
4018    
4019     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
4020     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
4021     The latter implements the selection GUI without dependency on a layer.
4022     LayerTableFrame now is derived from QueryTableFrame and connects
4023     to a layer.
4024    
4025     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
4026     implementation that still needs work.
4027    
4028     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
4029    
4030 frank 1011 2003-05-22 Frank Koormann <[email protected]>
4031    
4032     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
4033     Added "outer_join = False" as optional parameter.
4034     (TransientJoinedTable.create): If outer join is true, perform a
4035     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
4036     the left table. Records not matching are filled with 0 / None.
4037    
4038     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
4039     (JoinDialog.OnJoin): Consider outer join check box.
4040    
4041 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
4042    
4043 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
4044     somewhat safer way. Storing the traceback in a local variable can
4045     lead to memory leaks
4046    
4047     2003-05-22 Bernhard Herzog <[email protected]>
4048    
4049 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
4050     the wxMessageDialog's Destroy() method.
4051    
4052 frank 1004 2003-05-22 Frank Koormann <[email protected]>
4053    
4054     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
4055     TransientTable.Title()
4056    
4057     2003-05-22 Frank Koormann <[email protected]>
4058    
4059     Join Dialog, initial version.
4060    
4061     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
4062    
4063     * Thuban/UI/join.py (JoinDialog): Functional implementation of
4064     former framework. Renamed Table1/Table2 to LeftTable/RightTable
4065     in all occurences.
4066    
4067     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
4068     Typo fixed.
4069    
4070 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
4071    
4072 bh 999 Give the tables titles so that the GUI can display more meaningful
4073     names. For now the titles are fixed but depend on e.g. filenames
4074     or the titles of the joined tables.
4075    
4076     * Thuban/Model/transientdb.py (TransientTable.Title)
4077     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
4078    
4079     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
4080    
4081     * test/test_transientdb.py
4082     (TestTransientTable.test_auto_transient_table_title): New. Test
4083     for the Title method
4084     (TestTransientTable.test_transient_joined_table)
4085     (TestTransientTable.test_transient_table): Add test for the Title
4086     methods
4087    
4088     * test/test_memory_table.py (TestMemoryTable.test_title): New.
4089     Test for the Title method
4090    
4091     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
4092     the Title method
4093    
4094     2003-05-22 Bernhard Herzog <[email protected]>
4095    
4096 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
4097     Provide a better way to destroy the layers
4098     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
4099     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
4100     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
4101     the new way to destroy the layers.
4102     (TestLayer.test_derived_store): New. Test for using a layer with a
4103     DerivedShapeStore
4104    
4105     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
4106     filename if the shape store actually has one.
4107    
4108     2003-05-22 Bernhard Herzog <[email protected]>
4109    
4110 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
4111     for the filename
4112    
4113     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
4114     for the FileName method
4115     (TestDBFTableWriting.test_write): Fix spelling of filename
4116    
4117 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
4118    
4119     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
4120     from SciParam that now really is immutable.
4121    
4122 frank 992 2003-05-22 Frank Koormann <[email protected]>
4123    
4124     Layer Top/Bottom placement added to legend.
4125    
4126     * Thuban/UI/legend.py
4127     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
4128     bound to tool events.
4129     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
4130     New, methods binding the event methods with the map methods.
4131    
4132     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
4133     layer at top/bottom of layer stack.
4134    
4135     * Resources/Bitmaps/top_layer.xpm: New button icon.
4136    
4137     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
4138    
4139 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
4140    
4141     * Thuban/Model/session.py (Session.RemoveTable): New method to
4142     remove tables
4143    
4144     * test/test_session.py (TestSessionSimple.test_remove_table): New.
4145     Test for RemoveTable
4146    
4147 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
4148    
4149     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
4150     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
4151    
4152 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
4153    
4154 bh 985 Implement a way to discover dependencies between tables and
4155     shapestores.
4156    
4157     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
4158     (TransientJoinedTable.Dependencies)
4159     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
4160     interface
4161     (TransientJoinedTable.__init__): Keep tack of the original table
4162     objects in addition to the corresponding transient tables.
4163    
4164     * Thuban/Model/table.py (DBFTable.Dependencies)
4165     (MemoryTable.Dependencies): New. Implement the dependencies
4166     interface
4167    
4168     * Thuban/Model/data.py (ShapeTable): New. Helper class for
4169     ShapefileStore
4170     (ShapefileStore.__init__): Use ShapeTable instead of
4171     AutoTransientTable
4172     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
4173     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
4174     methods for filename and type
4175     (ShapefileStore.Dependencies): New. Implement the dependencies
4176     interface
4177     (DerivedShapeStore): New class to replace SimpleStore. The main
4178     difference to SimpleStore is that it depends not on a shapefile
4179     but another shapestore which expresses the dependencies a bit
4180     better
4181     (SimpleStore.__init__): Add deprecation warning.
4182    
4183     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
4184     Test for the Dependencies method.
4185    
4186     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
4187     New. Test for the Dependencies method.
4188    
4189     * test/test_transientdb.py
4190     (TestTransientTable.test_auto_transient_table_dependencies): New.
4191     Test for the Dependencies method.
4192     (TestTransientTable.test_transient_joined_table): Add test for the
4193     Dependencies method.
4194    
4195     * test/test_session.py (TestSessionSimple.setUp)
4196     (TestSessionSimple.tearDown): New. Implement a better way to
4197     destroy the sessions.
4198     (TestSessionSimple.test_initial_state)
4199     (TestSessionSimple.test_add_table): Bind session to self.session
4200     so that it's destroyed by tearDown
4201     (TestSessionSimple.test_open_shapefile): New. Test for
4202     OpenShapefile and the object it returns
4203    
4204     2003-05-22 Bernhard Herzog <[email protected]>
4205    
4206 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
4207     register tables with the session.
4208     (Session.Tables): Return the tables registered with AddTable too.
4209    
4210     * test/test_session.py (TestSessionSimple.test_add_table): New.
4211     Test case for the AddTable method
4212    
4213 frank 981 2003-05-22 Frank Koormann <[email protected]>
4214    
4215     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
4216     lower right corner, center labels for selections, initialize controls
4217     in reasonable order for keyboard navigation.
4218    
4219     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
4220     (ProjFrame.__DoOnProjAvail): Determine position of current projection
4221     using the wxListBox.FindString() method. Still a problem (#1886)
4222    
4223     * Thuban/UI/classifier.py
4224     (Classifier.__init__, SelectPropertiesDialog.__init__)
4225    
4226     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
4227     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
4228     different classification types from here to __init__.
4229     (GenUniquePanel.__init__): Set the column width of the first field
4230     in the Field ListCtrl to the full width.
4231    
4232     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
4233     Button to 'Export'. Center Buttons in Selection Box, set Focus to
4234     Grid.
4235     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
4236     changes focus to the Selection when pressing "Alt-S".
4237    
4238     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
4239     the text if not visible. The italic font sometimes exceeds the
4240     rendering area.
4241    
4242 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
4243 jonathan 971
4244 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
4245     to OnClose so that Thuban closes correctly.
4246    
4247     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
4248     DockFrame.OnClose, not DockFrame._OnClose.
4249    
4250     2003-05-21 Jonathan Coles <[email protected]>
4251    
4252 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
4253     references to 'inf' and use new Range __init__ to pass floats
4254     directly rather than converting them to strings first.
4255     Fixes RTBug #1876.
4256    
4257     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
4258     Use new Range ___init__ to pass floats.
4259    
4260     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
4261     filename is a valid image file. Throw IOError otherwise.
4262    
4263     * Thuban/Model/range.py: Brought over new Range from SciParam that
4264     is immutable and has an __init__ which can accept floats.
4265    
4266     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
4267     into try block. AddLayer doesn't throw any exceptions anymore.
4268     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
4269     try block.
4270    
4271     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
4272     the first item in choices. Fixes RTBug #1882.
4273    
4274     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
4275     has gone to 0 which is a serious problem. abort.
4276     (MapRenderer.draw_raster_layer): Catch IOError seperately and
4277     print the error from GDAL.
4278    
4279     * Thuban/UI/tableview.py (TableGrid.__init__): Call
4280     ToggleEventListeners to turn on listening.
4281     (TableGrid.ToggleEventListeners): New. Turns event listening on
4282     and off so as to prevent excessive messages.
4283     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
4284     to suppress excessive messages when selecting many rows.
4285     Fixes RTBug #1880.
4286    
4287     * Thuban/UI/view.py: Added checks against if scale == 0. This
4288     is a serious problem that can occur when an image without
4289     geo data is loading and causes the map projection bounds to
4290     go to infinity. Right now, the solution is to simply try
4291     to recover.
4292    
4293     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
4294     to set the MFILEReceiver attributes even if the data is NULL.
4295    
4296     * extensions/thuban/gdalwarp.cpp: Improved the error handling
4297     and passed GDAL messages back up to the Python layer. Also
4298     tried to fix some memory leaks that were present in the original
4299     utility but didn't matter because the program aborted.
4300    
4301     * test/test_range.py: Copied over tests from SciParam. Removed
4302     tests against importing. Fixes RTBug #1867.
4303    
4304 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
4305    
4306     * test/test_load.py: Remove unused imports and restructure the
4307     test code
4308     (LoadSessionTest): Split into one class for each test and turn
4309     LoadSessionTest itself into the base class for all such session
4310     tests.
4311     (ClassificationTest): New base class for load tests that test
4312     classifications
4313     (TestSingleLayer, TestLayerVisibility, TestClassification)
4314     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
4315     for the individual tests
4316    
4317     * test/support.py (FileLoadTestCase.filename): New base class for
4318     file loading tests
4319    
4320 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
4321    
4322     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
4323     Mercator' to 'UTM Zone 32' as a more convenient example.
4324     Added 'Gauss Krueger Zone 6'.
4325    
4326     * Data/iceland_sample_raster.thuban: political polygon now
4327     filled transparent to have the raster image visible at once.
4328    
4329 frank 952 2003-05-21 Frank Koormann <[email protected]>
4330    
4331     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
4332     OnClose() to keep in sync with extensions. Internally Thuban
4333     still uses "underscored" names.
4334    
4335 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
4336    
4337     This puts back Raster layer support. These layers support projections
4338     through the GDAL library. Currently, the CVS version is being used.
4339     There are no Debian packages available although this may change soon.
4340     A GDAL driver was extended to support writing to memory rather to
4341     files.
4342    
4343     There is still some work that needs to be done, such as some error
4344     handling when loading invalid images or when there is a problem
4345     projecting the image. This putback simply checks in the majority
4346     of the work.
4347    
4348     * setup.py: Add gdalwarp library extension.
4349    
4350     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
4351     Defaults to False, but can be overridden by subclasses if they
4352     support classification.
4353     (RasterLayer): New. Defines a new layer that represents an
4354     image.
4355    
4356     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
4357     tag handler.
4358     (SessionLoader.start_layer): Encode the filename.
4359     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
4360     New. Supports reading a rasterlayer tag.
4361    
4362     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
4363    
4364     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
4365     get a string in Latin1. If we get such as string convert it to
4366     unicode first, otherwise leave if alone before encoding.
4367     (SessionSaver.write_layer): Add support for writing both Layers
4368     and RasterLayers.
4369    
4370     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
4371     The right argument may not be a string, it could also be a Column.
4372    
4373     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
4374     Make initial window size 600x400. Fixes RTBug #1872.
4375    
4376     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
4377     the dialog is constructed so that we can support layers that
4378     do not have classifications.
4379     (Classifier._OnTry): Only build a classification if the layer
4380     supports one.
4381    
4382     * Thuban/UI/legend.py: Change all checks that a layer is an
4383     instance of Layer into checks against BaseLayer.
4384     (LegendTree.__FillTreeLayer): Only add children to a branch if
4385     the layer supports classification.
4386    
4387     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
4388     MainWindow.OpenSession): Don't proceed with an action if the
4389     user chooses Cancel when they are asked to save changes.
4390     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
4391     user to select an image file. Create a new RasterLayer and add
4392     it to the map.
4393    
4394     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
4395     for rendering RasterLayer layers.
4396     (MapRenderer.draw_raster_layer): Actually method that calls
4397     the GDALWarp python wrapper and constructs an image from the
4398     data returned.
4399    
4400     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
4401     Choices symbols to match those used in the table query method.
4402     Replace deprecated method calls on table with new method names.
4403    
4404     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
4405     how small the scale can get. This still needs more testing.
4406    
4407     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
4408     Provides a driver to output in .bmp format.
4409    
4410     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
4411     New. Provides IO routines which write to memory, rather than a file.
4412    
4413     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
4414     of the gdalwarp utility provided in GDAL. Added function calls
4415     that can be accessed from python.
4416    
4417     * Data/iceland_sample_raster.thuban: New. Sample file that uses
4418     a raster layer.
4419    
4420     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
4421     layer image data.
4422    
4423     * Doc/thuban.dtd: Added rasterlayer attribute definition.
4424    
4425     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
4426     tests associated with the raster layer code.
4427    
4428     * test/test_transientdb.py
4429     (TestTransientTable.test_auto_transient_table_query): Added a test
4430     for using a Column object as the "right" parameter to a query.
4431    
4432 frank 924 2003-05-19 Frank Koormann <[email protected]>
4433    
4434 frank 927 * Thuban/version.py (get_changelog_date):
4435     Catch exceptions if ChangeLog does not exist.
4436    
4437     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
4438    
4439     2003-05-19 Frank Koormann <[email protected]>
4440    
4441 frank 924 Extended version information for Thuban
4442    
4443     * Thuban/version.py: New, version information for Thuban: Last
4444     modification date and last ChangeLog entry date.
4445    
4446     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
4447     information: Display Thuban, wxPython and Python version.
4448    
4449 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
4450    
4451 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
4452     __future__ import for nested_scopes as Thuban relies on Python 2.2
4453     now.
4454     (XMLWriter.encode): Remove the special case for a None argument.
4455     In the saver encode is always called with a string argument.
4456    
4457     2003-05-16 Bernhard Herzog <[email protected]>
4458    
4459 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
4460     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
4461     of the bug was that e.g. float("1.2") would fail. Thuban now
4462     requires 2.4.x.
4463    
4464 frank 917 2003-05-16 Frank Koormann <[email protected]>
4465    
4466     Printing enhancement and WMF export (under Win32)
4467    
4468     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
4469     ScreenRenderer. Renders Map, Legend and Scalebar for export.
4470     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
4471     PrintRender.
4472    
4473     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
4474     to fullfil information needed for PrinterRenderer.
4475     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
4476     (MapCanvas.Print): Adapted to new MapPrintout.
4477     (OutputTransform): General calculations to transform from canvas
4478     coordinates to export/printing devices.
4479    
4480     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
4481     new method_command to call ExportMap, with platform dependency (only
4482     __WXMSW__)
4483    
4484     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
4485     of scalebar drawing area as new parameters.
4486    
4487     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
4488    
4489     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
4490     Update to extended scalebar.DrawScalebar header.
4491    
4492     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
4493    
4494     * test/test_scalebar.py: Made test executable as standalone.
4495    
4496 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
4497    
4498     * Thuban/Model/table.py (Table): Remove this compatibility alias
4499     for DBFTable.
4500    
4501     * test/test_table.py: Import DBFTable as Table because that alias
4502     doesn't exist anymore.
4503    
4504     * Thuban/UI/classgen.py: Remove some unused imports
4505    
4506 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
4507    
4508     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
4509     Fix docstring.
4510     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
4511     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
4512     values of the supplied range to determine the beginning and end
4513     bounds of the generated classes.
4514    
4515     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
4516     do not have a leading 0 (.5 is now accepted as well as 0.5).
4517    
4518     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
4519     call to ClassGenerator.GenUniformDistribution.
4520    
4521     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
4522     layout bug with the 'Projection' label.
4523    
4524     * test/support.py (FloatTestCase): New. Needed for the Range tests.
4525    
4526     * test/test_range.py: New. Imported from SciParam.
4527    
4528 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
4529    
4530 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
4531     to table.UniqueValues() with calls that retrieve all the values
4532     from the table. This will need to be replaced by a method on table
4533     which can simply return the list (perhaps more efficiently).
4534    
4535     2003-05-12 Jonathan Coles <[email protected]>
4536    
4537 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
4538     Refer to the documentation for details.
4539    
4540     * test/test_classgen.py: Modified Quantile tests to use the
4541     new return values.
4542    
4543     * Thuban/Model/classgen.py
4544     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
4545     use new return values from CalculateQuantiles to produce the correct
4546     range bounds in the Classification.
4547     (ClassGenerator.CalculateQuantiles): Add more comments describing
4548     the return values and parameters. Make minor adjustments to improve
4549     the legibility of the code. Fix problem with adjusted not being set
4550     in most cases.
4551    
4552 frank 893 2003-05-12 Frank Koormann <[email protected]>
4553    
4554     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
4555     and latin1. Fixes #1851 finally.
4556    
4557 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
4558    
4559 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
4560    
4561     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
4562     Clean up debugging statement, add comments, fix a small bug in the
4563     returned adjusted percentiles.
4564    
4565     2003-05-09 Jonathan Coles <[email protected]>
4566    
4567 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
4568     and such ranges can now be saved and loaded from disk.
4569    
4570     Quantiles are now available in the Classification Generator.
4571    
4572     Initial support for building Queries on a table. Doesn't do anything
4573     but run some tests.
4574    
4575     * Thuban/Model/classification.py: Explicit imports.
4576     (ClassGroupRange): Use the Range class to store the underlying
4577     range information. The interface remains the same, except for
4578     GetRange(), and you can also supply a Range object as the min
4579     parameter to SetRange or __init__.
4580    
4581     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
4582     string appropriately for use in Thuban. Fixes RTbug #1851.
4583     (SessionLoader.end_projection): Handle the context of the
4584     projection tag a bit better by looking at what objects are not
4585     None. There was an assumption that a projection tag for a map
4586     could occur before any layers.
4587     (SessionLoader.start_clrange): Provide backward compatibility for
4588     reading min/max values as well as the new range parameter.
4589    
4590     * Thuban/Model/map.py: Explicit imports.
4591    
4592     * Thuban/Model/resource.py: Import _.
4593     (ProjFileSaver.write): write header using projfile.dtd.
4594    
4595     * Thuban/Model/save.py: Explicit imports.
4596     (XMLWriter.encode): New. Encode the given string from a format
4597     used by Thuban into UTF-8. Fixes RTbug #1851.
4598    
4599     * Thuban/UI/classgen.py: Explicit imports.
4600     (ClassGenDialog.__init__): Clean up the code and add support
4601     for Quantiles.
4602     (ClassGenDialog.OnOK): Add support for Quantiles.
4603     (GenQuantilesPanel): New. Input panel for Quantiles.
4604     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
4605     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
4606    
4607     * Thuban/Model/classgen.py: New. Contains all the classes named above.
4608    
4609     * Thuban/UI/classifier.py: Explicit imports.
4610     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
4611     ClassTable.SetValueAsCustom): Reworked to use new Range class.
4612    
4613     * Thuban/UI/legend.py: Explicit imports.
4614    
4615     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
4616     a Table menu and associated method calls.
4617     (MainWindow.choose_color): Removed. No longer needed.
4618    
4619     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
4620     should be disabled if no projection is selected in the available
4621     list.
4622    
4623     * Thuban/UI/renderer.py: Explicit imports.
4624    
4625     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
4626     with correctly selecting the rows and issuing the right events.
4627     Be sure to call Skip() to allow the grid to do some of its own
4628     handling which allows the rows to actually be selected.
4629     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
4630     selecting multiple shapes.
4631     (LayerTableFrame): Support for building Queries.
4632     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
4633    
4634     * Thuban/UI/tree.py: Explicit imports.
4635    
4636     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
4637     table view can call it.
4638    
4639     * test/test_classification.py: Explicit imports.
4640     (TestClassification.test_ClassGroupRange): Fix test for new
4641     Range class.
4642    
4643     * Doc/thuban.dtd: Add range parameter for clrange.
4644    
4645     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
4646     object in ClassGroupRange, and also uesd for inputting ranges in
4647     the classifer table and elsewhere.
4648    
4649     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
4650     yet.
4651    
4652 frank 872 2003-05-09 Frank Koormann <[email protected]>
4653    
4654     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
4655    
4656 frank 860 2003-05-08 Frank Koormann <[email protected]>
4657    
4658 frank 870 Coding style updates
4659    
4660     * test/test_scalebar.py: Replaced tab indentation by spaces.
4661    
4662     * Thuban/UI/scalebar.py: Explicit imports.
4663    
4664     2003-05-08 Frank Koormann <[email protected]>
4665    
4666 frank 867 * Thuban/UI/scalebar.py
4667     (ScaleBar.DrawScalebar): Format string bug fixed.
4668    
4669     2003-05-08 Frank Koormann <[email protected]>
4670    
4671 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
4672    
4673     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
4674     (deriveInterval):
4675     Calculate scalebar interval and unit which fits in width for scale.
4676     (roundInterval): Round float.
4677    
4678     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
4679    
4680     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
4681    
4682     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
4683    
4684     2003-05-08 Frank Koormann <[email protected]>
4685    
4686 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
4687     Initialize ScaleBar with canvas.map
4688    
4689     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
4690     round intervals to display smarter lengths
4691     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
4692     layer. If the maps has no projection applied grey the scalebar.
4693    
4694 frank 857 2003-05-07 Frank Koormann <[email protected]>
4695    
4696     Basic Scalebar features added.
4697    
4698     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
4699    
4700     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
4701     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
4702     and the renderer.
4703    
4704     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
4705    
4706     * Thuban/UI/messages.py: SCALE_CHANGED added.
4707    
4708 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
4709    
4710 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
4711     variable shapestores to hold a list of all open shapestore objects
4712     (Session.ShapeStores): New. Accessor method for the shapestores
4713     list.
4714     (Session._add_shapestore, Session._clean_weak_store_refs): New.
4715     Internal methods to maintain the shapestores list.
4716     (Session.Tables): New. Return all tables open in the session.
4717     (Session.OpenShapefile): Insert the new ShapeStore into the
4718     shapestores list.
4719    
4720     * test/test_session.py (TestSessionSimple.test_initial_state): Add
4721     tests for ShapeStores and Tables
4722     (TestSessionWithContent.test_shape_stores)
4723     (TestSessionWithContent.test_tables): New. Test cases for
4724     ShapeStores and Tables
4725    
4726     2003-05-07 Bernhard Herzog <[email protected]>
4727    
4728 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
4729     Add comments about the optimizations used.
4730     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
4731     Implement the ReadValue table interface method.
4732    
4733     * test/test_transientdb.py
4734     (TestTransientTable.run_iceland_political_tests)
4735     (TestTransientTable.test_transient_joined_table): Add tests for
4736     ReadValue
4737    
4738 frank 848 2003-05-07 Frank Koormann <[email protected]>
4739    
4740     * Resources/Bitmaps/fulllayerextent.xpm,
4741     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
4742     new icons.
4743    
4744 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
4745    
4746 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
4747     New. Simply delegate to the transient table's version.
4748    
4749     * test/test_transientdb.py
4750     (TestTransientTable.test_auto_transient_table_query): New. Test
4751     case for AutoTransientTable's SimpleQuery
4752    
4753     2003-05-06 Bernhard Herzog <[email protected]>
4754    
4755 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
4756     Implement a simple query method for the query dialog
4757     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
4758     the row index or shapeid.
4759     (TransientTable.create): Insert the right value of the row index
4760     (TransientJoinedTable.create): Copy the row index of the left
4761     table to the joined result table
4762    
4763     * test/test_transientdb.py
4764     (TestTransientTable.test_transient_table_read_twice): Fix
4765     doc-string
4766     (TestTransientTable.test_transient_table_query): New. Test for the
4767     SimpleQuery method
4768    
4769     2003-05-06 Bernhard Herzog <[email protected]>
4770    
4771 bh 840 Convert all table users to use the new table interface. This only
4772     covers Thuban itself, not GREAT-ER or other applications built on
4773     Thuban yet, so the compatibility interface stays in place for the
4774     time being but it now issues DeprecationWarnings.
4775    
4776     Finally, the new Table interface has a new method, HasColumn.
4777    
4778     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
4779     issue deprecation warnings when they're. The warnings refer to the
4780     caller of the method.
4781     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
4782     for the deprecation warnings
4783    
4784     * test/test_table.py: Ignore the deprecation warnings for the old
4785     table in the tests in this module. The purpose of the tests is to
4786     test the old interface, after all.
4787    
4788     * test/test_transientdb.py
4789     (TestTransientTable.run_iceland_political_tests): Use the
4790     constants for the types. Add a test for HasColumn
4791     (TestTransientTable.test_transient_joined_table): Adapt to new
4792     table interface. Add a test for HasColumn
4793     (TestTransientTable.test_transient_table_read_twice): Adapt to new
4794     table interface
4795    
4796     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
4797     Adapt to new table interface
4798    
4799     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
4800     new table interface
4801    
4802     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
4803     (RecordTable.SetTable): Adapt to new table interface
4804    
4805     * Thuban/UI/classifier.py (Classifier.__init__)
4806     (Classifier.__init__): Adapt to new table interface
4807    
4808     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
4809     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
4810     to new table interface
4811    
4812     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
4813     (AutoTransientTable.HasColumn): Implement the new table interface
4814     method
4815     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
4816     (AutoTransientTable.UniqueValues): Adapt to new table interface
4817    
4818     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
4819     Adapt to new table interface
4820    
4821     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
4822     simplify opening shapefiles a bit easier.
4823     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
4824     (TestLayer.test_point_layer): Use the new helper method
4825     (TestLayer.test_get_field_type): New. Test for the GetFieldType
4826     method
4827    
4828     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
4829     the new table method
4830    
4831     * test/test_memory_table.py (TestMemoryTable.test_has_column):
4832     Test for the new table method HasColumn
4833    
4834 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
4835    
4836     Addresses the "Selection Extent" wish of RTbug #1787.
4837    
4838     * Resources/Bitmaps/fulllayerextent.xpm,
4839     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
4840     extent. These are just place holders for the real bitmaps.
4841    
4842     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
4843     calculate the bounding box once (the first time compute_bbox() is
4844     called).
4845     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
4846     the bounding box for the shapes in lat/long coordinates.
4847    
4848     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
4849     option.
4850     (MainWindow.has_selected_shapes): New. Returns true if there are
4851     any selected shapes.
4852     (MainWindow.FullSelectionExtent): New. Calls
4853     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
4854     (_has_selected_shapes): New. Returns true if there are any
4855     selected shapes.
4856    
4857     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
4858     true if there are any selected shapes.
4859    
4860     * Thuban/UI/view.py (MapCanvas): Added delegated method
4861     HasSelectedShapes.
4862     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
4863     shapes on the canvas using the map projection (if any).
4864    
4865     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
4866     for Layer.ShapesBoundingBox().
4867    
4868 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
4869    
4870     * Resources/Projections/defaults.proj: Fix spelling of Mercator
4871    
4872 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
4873    
4874     Addresses the "Full Layer Extent" wish of RTbug #1787.
4875    
4876     * Resources/Projections/defaults.proj: Added UK National Grid.
4877    
4878     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
4879     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
4880     when the user selects the menu option.
4881    
4882     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
4883     scales the given layer on the canvas using the map projection.
4884    
4885 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
4886    
4887     Convert the table implementations to a new table interface. All
4888     tables use a common mixin class to provide backwards compatibility
4889     until all table users have been updated.
4890    
4891     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
4892     provide backwards compatibility for table classes implementing the
4893     new interface
4894     (DBFTable, MemoryTable): Implement the new table interface. Use
4895     OldTableInterfaceMixin as base for compatibility
4896     (DBFColumn, MemoryColumn): New. Column description for DBFTable
4897     and MemoryTable resp.
4898    
4899     * test/test_dbf_table.py: New. Test cases for the DBFTable with
4900     the new table interface.
4901    
4902     * test/test_memory_table.py: New. Test cases for the MemoryTable
4903     with the new table interface.
4904    
4905     * test/test_table.py: Document the all tests in this file as only
4906     for backwards compatibility. The equivalent tests for the new
4907     interface are in test_memory_table.py and test_dbf_table.py
4908     (MemoryTableTest.test_read): field_info should be returning tuples
4909     with four items
4910     (MemoryTableTest.test_write): Make doc-string a more precise.
4911    
4912     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
4913     table interface. Derive from from OldTableInterfaceMixin for
4914     compatibility.
4915     (TransientTableBase.create): New intance variable column_map to
4916     map from names and indices to column objects
4917     (TransientTable.create): Use the new table interface of the input
4918     table
4919     (AutoTransientTable): Convert to new table interface. Derive from
4920     from OldTableInterfaceMixin for compatibility.
4921     (AutoTransientTable.write_record): Removed. It's not implemented
4922     yet and we still have to decide how to handle writing with the new
4923     table and data framework.
4924    
4925     * test/test_transientdb.py
4926     (TestTransientTable.run_iceland_political_tests)
4927     (TestTransientTable.test_transient_joined_table): Use the new
4928     table interface
4929    
4930 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
4931    
4932     This is namely a collection of UI updates to improve user interactivity.
4933     Tabbing between controls now exists and you can use ESC to close dialog
4934     boxes; ENTER will active the default button.
4935    
4936     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
4937     order that the controls are created so that tabbing works correctly.
4938     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
4939     wxDialog can handle the default button correctly.
4940     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
4941     same reasons as for OnOK.
4942     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
4943     when we ask the table for the maximum/minimum values of a field
4944     which could take a very long time.
4945    
4946     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
4947     order that the controls are created so that tabbing works correctly.
4948     (SelectPropertiesDialog.__init__): Rearrange the order that the
4949     controls are created so that tabbing works correctly.
4950    
4951     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
4952     to derive from a wxDialog but behave like the original implementation
4953     which was derived from a wxFrame. wxDialog provides useful key
4954     handling functionality like ESC calling OnCancel and ENTER calling
4955     OnOK which is lost with wxFrame.
4956    
4957     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
4958     new dialogs.
4959    
4960     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
4961     order that the controls are created so that tabbing works correctly.
4962     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
4963     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
4964     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
4965     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
4966     can provide the "UK National Grid" as a default projection.
4967     (UTMPanel.__init__): Rearrange the order that the controls are
4968     created so that tabbing works correctly.
4969    
4970 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
4971    
4972 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
4973     (project_point): If a map projection but no layer projection is
4974     given, convert degrees to radians before applying the map
4975     projection.
4976    
4977 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
4978     (TableGrid.allow_messages): New methods to make it possible to
4979     inhibit message sending.
4980     (TableGrid.issue): Only send the message if not inhibited.
4981     (LayerTableGrid.select_shape): Use the new methods to make sure
4982     that no ROW_SELECTED message is sent while we're updating the
4983     selected rows to match the selected shapes.
4984    
4985 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
4986    
4987     Implementation of MemoryTable.
4988    
4989     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
4990     implementation that operates on a list of tuples. All of the data
4991     are kept in the memory.
4992    
4993     * test/test_table.py (MemoryTableTest): New.
4994    
4995     * test/test_transientdb.py (SimpleTable): Removed.
4996     (TestTransientTable.test_transient_joined_table,
4997     (TestTransientTable.test_transient_table_read_twice): Replaced
4998     SimpleTable by MemoryTable.
4999    
5000 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
5001    
5002 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
5003     for each of the layers.
5004    
5005     * Resources/Projections/defaults.proj: Geographic projection
5006     contains unit conversion parameter.
5007    
5008     2003-04-30 Jonathan Coles <[email protected]>
5009    
5010 jonathan 793 The most important part of this putback is the projection changes.
5011     It should now be possible to specify the projection that a layer
5012     is in and then specify a different projection for the map. The
5013     projection dialog has an extra parameter for a geographic projection
5014     which lets the user select if the input is in degrees or radians.
5015    
5016     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
5017     to say that the parameter is a tuple of unprojected
5018     points (which is what the callers to this method were assuming).
5019     Also, since the points are unprojected we need to projected them.
5020    
5021     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
5022     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
5023     groups are selected, move the layer up/down. Fixes RTbug #1833.
5024    
5025     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
5026    
5027     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
5028     parameter in call to SetClientData.
5029     (GeoPanel): Add support for selecting the units that the
5030     source data is in (Radians or Degrees).
5031    
5032     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
5033     the rendering loop by reducing the number of if's, removing the
5034     unnecessary try/except block, and checking if the old group
5035     is the same as the new one (which happens a lot if there is
5036     no classification, or lots of shapes are in the same group).
5037    
5038     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
5039     around the redraw routine to try to catch problems that the user
5040     may create by selecting invalid projections for the data set and
5041     map. Clears the display if there are any problems and prints the
5042     error.
5043     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
5044     rectangle.
5045    
5046     * extensions/thuban/wxproj.cpp (project_point): First invert the
5047     supplied point (which should be in projected coordinates) using
5048     the layer's projection and then project the point using the
5049     map's projection.
5050     (project_points): Use project_point() to project each point.
5051    
5052 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
5053    
5054     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
5055     don't set the Classification to None if the classfication field
5056     is None (ie only a DEFAULT).
5057    
5058 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
5059    
5060 bh 790 * Thuban/UI/view.py: Fix some typos.
5061    
5062 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
5063     not pop up the dialog if the selection becomes empty (this could
5064     happen if e.g. a new selection is opened while the identify tool
5065     is active and dialog had been closed)
5066    
5067     2003-04-30 Bernhard Herzog <[email protected]>
5068    
5069 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
5070     instance variable read_record_last_result
5071     (TransientTableBase.read_record): Make sure reading the same
5072     record twice works. The implementation uses the new instance
5073     variable read_record_last_result
5074    
5075     * test/test_transientdb.py
5076     (TestTransientTable.test_transient_table_read_twice): New test
5077     case for the above bug-fix.
5078    
5079 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
5080    
5081     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
5082    
5083     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
5084    
5085     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
5086     (ClassTable.SetValueAsCustom): Rename keyword argument in
5087     ClassGroup* constructors to match argument name.
5088    
5089 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
5090    
5091     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
5092     transient DB if it exists to make sure it doesn't leave a journal
5093     file in the temp directory.
5094    
5095     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
5096     self.conn to None after closing the connection to make sure it's
5097     not closed twice
5098    
5099 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
5100    
5101 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
5102     "true". If anything other than "false" is specified we also assume
5103 jonathan 776 "true". Addresses RTbug #1025.
5104 jonathan 769
5105     * Doc/thuban.dtd: Add visible parameter to a layer.
5106    
5107     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
5108     of visible from 1 to True.
5109     (Layer.__init__): Change default value of visible from 1 to True.
5110    
5111     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
5112     parameter.
5113    
5114     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
5115     parameter.
5116    
5117     * test/test_load.py: Add new test data contents_test_visible.
5118     (LoadSessionTest.setUp): save test data.
5119     (LoadSessionTest.testLayerVisibility): Test if the visible flag
5120     is loaded correctly.
5121    
5122     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
5123     for saving an invisible layer.
5124    
5125     2003-04-29 Jonathan Coles <[email protected]>
5126    
5127 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
5128     legend dialog box and tell it to change its map to the one
5129     supplied to SetMap(). Fixes RTbug #1770.
5130    
5131 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
5132    
5133 bh 766 Next step of table implementation. Introduce a transient database
5134     using SQLite that some of the data is copied to on demand. This
5135     allows us to do joins and other operations that require an index
5136     for good performance with reasonable efficiency. Thuban now needs
5137     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
5138     haven't tested that.
5139    
5140     * Thuban/Model/transientdb.py: New. Transient database
5141     implementation.
5142    
5143     * test/test_transientdb.py: New. Tests for the transient DB
5144     classes.
5145    
5146     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
5147     classes to help automatically remove temporary files and
5148     directories.
5149     (Session.__init__): New instance variables temp_dir for the
5150     temporary directory and transient_db for the SQLite database
5151     (Session.temp_directory): New. Create a temporary directory if not
5152     yet done and return its name. Use AutoRemoveDir to have it
5153     automatically deleted
5154     (Session.TransientDB): Instantiate the transient database if not
5155     done yet and return it.
5156    
5157     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
5158     AutoTransientTable so that data is copied to the transient DB on
5159     demand.
5160     (SimpleStore): New class that simply combines a table and a
5161     shapefile
5162    
5163     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
5164     DBFTable and update its doc-string to reflect the fact that this
5165     is only the table interface to a DBF file. Table is now an alias
5166     for DBFTable for temporary backwards compatibility.
5167    
5168     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
5169     the last reference to the session goes away so that the temporary
5170     files are removed properly.
5171    
5172     * test/test_load.py (LoadSessionTest.tearDown): Remove the
5173     reference to the session to make sure the temporary files are
5174     removed.
5175    
5176     2003-04-29 Bernhard Herzog <[email protected]>
5177    
5178 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
5179     the __parser instance variable into a normal local variable in
5180     read. It's only used there and read will never be called more than
5181     once. Plus it introduces a reference cycle that keeps can keep the
5182     session object alive for a long time.
5183    
5184 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
5185 jonathan 735
5186 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
5187     Projection an immutable item. Fixes RTbug #1825.
5188     (Projection.__init__): Initialize instance variables here.
5189     (ProjFile.Replace): New. Replace the given projection object with
5190     the new projection object. This solves the problem of needing the
5191     mutator Projection.SetProjection() in the ProjFrame class and
5192     allows a projection to change parameters without changing its
5193     location in the file.
5194    
5195     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
5196     be of type wxSAVE and should verify overwriting a file.
5197    
5198     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
5199     ProjFile.Replace() method instead of the mutator
5200     Projection.SetProjection(). Also requires that we reassign the
5201     client data to the new projection.
5202    
5203     * test/test_proj.py (TestProjection.test): Test GetName() and
5204     GetAllParameters()
5205     (TestProjFile.test): Remove tests for Set*() methods. Add tests
5206     for Replace().
5207    
5208     2003-04-25 Jonathan Coles <[email protected]>
5209    
5210 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
5211     to save the name of the projection.
5212    
5213     * test/test_save.py (SaveSessionTest.testLayerProjection): New
5214     test to verify layer projections are saved correctly.
5215    
5216     2003-04-25 Jonathan Coles <[email protected]>
5217    
5218 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
5219     to "Unknown" if name is None.
5220     (Projection.SetAllParameters): New. Set the projection's
5221     parameter list to the one supplied.
5222     (Projection.SetProjection): New. Set the projection's
5223     properties to those of the supplied Projection.
5224    
5225     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
5226     the dialog title to include the map's title.
5227     (MainWindow.LayerProjection): Set the dialog title to include
5228     the layer's title.
5229    
5230     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
5231     error dialogs into a single method call.
5232     (ProjFrame.__VerifyButtons): Add more states to check.
5233     (ProjFrame.__GetProjection): Return the current state of an
5234     edited projection or None.
5235     (ProjFrame.__FillAvailList): Remove checks for states that
5236     shouldn't exist.
5237     (ProjFrame._OnNew): Clear all selected items and supply
5238     a projection panel if necessary.
5239    
5240     * test/test_proj.py (TestProjFile.test): Add tests for
5241     ProjFile.SetAllParameters, ProjFile.SetProjection,
5242     ProjFile.SetName.
5243    
5244     2003-04-25 Jonathan Coles <[email protected]>
5245    
5246 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
5247     takes an optional argument to select the current projection.
5248     This does not guarantee that the item is visible due to
5249     limited wxWindows functionality. Fixes RTBug #1821.
5250    
5251     2003-04-25 Jonathan Coles <[email protected]>
5252    
5253 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
5254     the projection name and use it when constructing the Projection
5255     object.
5256    
5257     * Thuban/Model/proj.py (Projection.__init__): Change the default
5258     value for 'name' to None and then test if name is equal to None
5259     in the body of the constructor. This way the caller doesn't have to
5260     know what the default value should be. Namely, useful in load.py
5261     where we have to pick a default value if the 'name' parameter
5262     doesn't exist in the XML file.
5263    
5264     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
5265     Tests a file where a layer has a projection.
5266    
5267     2003-04-25 Jonathan Coles <[email protected]>
5268    
5269 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
5270     tree for projection information.
5271    
5272     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
5273     XMLReader.GetFileName.
5274     (SessionLoader): Added support for loading projection tags that
5275     appear inside a layer.
5276    
5277     * Thuban/Model/proj.py (ProjFile): Document the class. Move
5278     back to using a list because the order of the projections in
5279     the file is important to maintain. Fixes RTbug #1817.
5280    
5281     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
5282     to ProjFile.GetFilename.
5283    
5284     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
5285     information.
5286    
5287     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
5288     ProjFrame._OnSaveAs. Removed old dead code from previous
5289     implementation.
5290     (ProjFrame._OnExport): Add support for exporting more than one
5291     projection to a single file.
5292     (ProjFrame.__FillAvailList): use string formatting (% operator)
5293     to build strings that are (partly) translated. Fixes RTbug #1818.
5294    
5295     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
5296     class.
5297    
5298 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
5299    
5300     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
5301    
5302     * po/fr.po: New. French translation by Daniel Calvelo Aros
5303    
5304     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
5305     empty strings.
5306    
5307 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
5308 jonathan 724
5309     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
5310     implement the interface that the ProjFrame dialog expects.
5311    
5312     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
5313     name of the projection to be changed.
5314     (ProjFile): Use a dictionary instead of a list so that removing
5315     projections is easier and we are sure about uniqueness.
5316     (ProjFile.Remove): Remove the given projection object.
5317    
5318     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
5319     Return a list with only one projection file instead of searching for
5320     any projection file. This simplifies many things if the user can
5321     only have one system file and one user file.
5322    
5323     * Thuban/UI/classgen.py: Change all references to
5324     genCombo to genChoice.
5325    
5326     * Thuban/UI/mainwindow.py: Add a Projection option under the
5327     layer menu.
5328     (MainWindow.LayerProjection): New. Open up a projection window
5329     for a layer.
5330    
5331     * Thuban/UI/projdialog.py: Large changes to how the dialog is
5332     laid out. Use three panels instead of one. One for the list of
5333     projections, one for the edit controls, and one for the buttons.
5334     Fixed resizing problems so that the dialog resizes correctly
5335     when the projection panel changes. Added import/export, save, and
5336     new buttons/functionality.
5337    
5338 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
5339    
5340     First step towards table management. Introduce a simple data
5341     abstraction so that we replace the data a layer uses more easily
5342     in the next step.
5343    
5344     * Thuban/Model/data.py: New file with a simple data abstraction
5345     that bundles shapefile and dbffile into one object.
5346    
5347     * Thuban/Model/session.py (Session.OpenShapefile): New method to
5348     open shapefiles and return a shape store object
5349    
5350     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
5351     object instead of a shapefile filename. This introduces a new
5352     instance variable store holding the datastore. For intermediate
5353     backwards compatibility keep the old instance variables.
5354     (open_shapefile): Removed. No longer needed with the shape store.
5355     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
5356     get the shape store used by a layer.
5357     (Layer.Destroy): No need to explicitly destroy the shapefile or
5358     table anymore.
5359    
5360     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
5361     (MainWindow.AddLayer): Use the session's OpenShapefile method to
5362     open shapefiles
5363    
5364     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
5365     session's OpenShapefile method to open shapefiles
5366    
5367     * test/test_classification.py
5368     (TestClassification.test_classification): Use the session's
5369     OpenShapefile method to open shapefiles and build the filename in
5370     a more platform independed way
5371    
5372     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
5373     Implement to have a session to use in the tests
5374     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
5375     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
5376     session's OpenShapefile method to open shapefiles
5377     (TestLayerLegend.setUp): Instantiate a session so that we can use
5378     it to open shapefiles.
5379     (TestLayerLegend.tearDown): Make sure that all references to
5380     layers and session are removed otherwise we may get a resource
5381     leak
5382    
5383     * test/test_map.py (TestMapAddLayer.test_add_layer)
5384     (TestMapWithContents.setUp): Instantiate a session so that we can
5385     use it to open shapefiles.
5386     (TestMapWithContents.tearDown): Make sure that all references to
5387     layers, maps and sessions are removed otherwise we may get a
5388     resource leak
5389     ("__main__"): use support.run_tests() so that more info about
5390     uncollected garbage is printed
5391    
5392     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
5393     session's OpenShapefile method to open shapefiles
5394     ("__main__"): use support.run_tests() so that more info about
5395     uncollected garbage is printed
5396    
5397     * test/test_selection.py (TestSelection.tearDown): Make sure that
5398     all references to the session and the selection are removed
5399     otherwise we may get a resource leak
5400     (TestSelection.get_layer): Instantiate a session so that we can
5401     use it to open shapefiles.
5402     ("__main__"): use support.run_tests() so that more info about
5403     uncollected garbage is printed
5404    
5405     * test/test_session.py (TestSessionBase.tearDown)
5406     (TestSessionWithContent.tearDown): Make sure that all references
5407     to the session and layers are removed otherwise we may get a
5408     resource leak
5409     (TestSessionWithContent.setUp): Use the session's OpenShapefile
5410     method to open shapefiles
5411    
5412 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
5413    
5414     * Thuban/Model/load.py (XMLReader.read): Should have been checking
5415     if the file_or_filename object had the 'read' attribute.
5416    
5417 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
5418    
5419 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
5420     (ReadProjFile): Add documentation about which exceptions are raised.
5421     Always pass the exceptions up to the caller.
5422     (GetProjFiles): If the directory can't be read return an empty list.
5423     If any of the proj files can't be read skip that file and go
5424     on to the next one.
5425    
5426     * test/test_proj.py: Added test cases to handle nonexistent files,
5427     unreadable files, and files that don't parse correctly.
5428    
5429     2003-04-23 Jonathan Coles <[email protected]>
5430    
5431 jonathan 716 Projection dialog. Allows the user to select from a list
5432     of projection templates and optionally edit them and save new ones.
5433    
5434     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
5435     (ProjPanel): Base class for projection specific panels.
5436     (TMPanel): Projection panel for Transverse Mercartor.
5437     (UTMPanel): Projection panel for Universal Transverse Mercartor.
5438     (LCCPanel): Projection panel for Lambert Conic Conformal.
5439     (GeoPanel): Projetion panel for Geographic Projection.
5440    
5441     2003-04-23 Jonathan Coles <[email protected]>
5442    
5443 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
5444     promote symmetry. There now exists XMLReader and XMLWriter.
5445     (XMLReader.read): New. Call to read the given file descriptor or
5446     filename.
5447     (XMLReader.close): New. Make sure the file is closed.
5448     (XMLReader.GetFileName): New. Return just the file name that is being
5449     read from.
5450     (XMLReader.GetDirectory): New. Return just the directory of the file
5451     that is being read.
5452     (XMLReader.AddDispatchers): New. Take a dictionary which contains
5453     the names of functions to call as the XML tree is parsed.
5454     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
5455     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
5456     (SessionLoader): Removed class variables start_dispatcher and
5457     end_dispatcher since this functionality is now part of a class
5458     instance. Fixes RTbug #1808.
5459     (SessionLoader.__init__): Add dispatcher functions.
5460     (load_xmlfile): Code was moved into the XMLReader.read().
5461     (load_session): Use modified SessionLoader.
5462    
5463     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
5464     map's projection.
5465    
5466     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
5467     GetAllParameters.
5468     (Projection.GetParameter): Returns the value for the given parameter.
5469    
5470     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
5471     (GetProjFiles): Renamed from GetProjections. Now returns a list
5472     of ProjFile objects.
5473     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
5474     a list of ProjFile objects whose files are not user defined.
5475     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
5476     list of ProjFile objects whose files are user defined.
5477     (ProjFileReader): Extend new XMLReader.
5478    
5479     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
5480     promote symmetry.
5481    
5482     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
5483     control instead of a wxComboBox. wxChoice controls do not generate
5484     events as the uses highlights possible choices which fixes problems
5485     with resizing the dialog when the use selects an option.
5486    
5487     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
5488     control instead of a wxComboBox.
5489    
5490     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
5491     dialog.
5492    
5493     * test/test_proj.py (TestProjection.test): New tests for GetParameter
5494     method.
5495    
5496 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
5497    
5498 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
5499     constants
5500    
5501 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
5502     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
5503    
5504 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
5505    
5506 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
5507     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
5508     anymore.
5509     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
5510     (Layer.ShapeType, Layer.Shape): No need to call
5511     self.open_shapefile since it's always called in __init__
5512    
5513 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
5514     In wxPython 2.4 there's no need to extend MainLoop anymore since
5515     wxPython itself makes sure OnExit is called.
5516    
5517 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
5518    
5519 jonathan 693 Initial putback of projection management code. Includes new
5520     classes to read and write projection files. The current load
5521     and save classes were abstracted a bit so they could be reused.
5522     The Projection class was extended to provide new methods and
5523     have a name.
5524    
5525     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
5526     general XML reading methods that were part of ProcessSession.
5527    
5528     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
5529     name.
5530     (ProjFile): New. Represents a file that contains projection
5531     information.
5532    
5533     * Thuban/Model/resource.py: New. Contains general utilities
5534     for read and writing projection files.
5535    
5536     * Thuban/Model/save.py (XMLSaver): New. Contains all the
5537     general XML writing methods that were part of SessionSaver.
5538     (SessionSaver): Renamed from Saver.
5539    
5540     * test/test_proj.py: New test cases for the projection
5541     file read and write functions.
5542    
5543     2003-04-16 Jonathan Coles <[email protected]>
5544    
5545 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
5546     in the ClassGroup*.__repr__() methods so it is clearer when
5547     a value is a string and when it is a number.
5548    
5549     * test/test_load.py: Rework the classification test to test
5550     that we can load old files.
5551     (testLabels): Test a file where the groups have labels.
5552    
5553 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
5554    
5555     Safer implementation of the performance enhancements of the
5556     low-level renderer:
5557    
5558     * extensions/thuban/wxproj.cpp (extract_projection)
5559     (extract_pointer): Rename extract_projection to extract_pointer
5560     and redefine its purpose to return the pointer stored in a CObject
5561     returned by the object's cobject method. Update all callers.
5562     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
5563     handling of these low-level parameters so that each s_draw_info
5564     instance is handled as a CObject at python level that also
5565     contains real references to the actual python objects which
5566     contain the values in the struct. Add free_draw_info as the
5567     destructor.
5568     (draw_polygon_shape): Add the py_draw_info parameter which must a
5569     cobject containing an s_draw_info pointer.
5570    
5571     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
5572     method to instantiat the low-level render parameter
5573     (MapRenderer.draw_shape_layer): Use the new method. Remove some
5574     commented out code.
5575     (MapRenderer.draw_polygon_shape): Make the first parameter not the
5576     layer but the low-level render parameter
5577     (ScreenRenderer.draw_shape_layer): Use the low-level render
5578     parameter.
5579    
5580 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
5581    
5582 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
5583     the ClassGroup* classes to make debugging a bit easier.
5584     (ClassGroup.SetLabel): Check that the string is an instance
5585     of StringTypes not StringType. Accounts for Unicode strings.
5586    
5587     * Thuban/Model/color.py: Implemented __repr__ to make
5588     debugging a bit easier.
5589    
5590     * Thuban/Model/save.py (Saver.write_classification): Need to
5591     save the group label.
5592    
5593     * test/test_load.py (testClassification): New. Loads the
5594     iceland_sample_test.thuban file and checks if it was loaded
5595     correctly.
5596    
5597     2003-04-15 Jonathan Coles <[email protected]>
5598    
5599 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
5600     to improve rendering performance by initializing the variables
5601     that are not change each time draw_polygon_shape() is called.
5602     The values are stored in a global struct draw_info.
5603     (draw_polygon_shape): Removed initialization code that is
5604     now in draw_polygon_init().
5605    
5606     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
5607 jonathan 674 drawing initialization call to draw_polygon_init()
5608     (MapRenderer.draw_polygon_shape): Use new signature of
5609     draw_polygon_shape.
5610 jonathan 673
5611 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
5612     weirdness by setting the range to (1, maxint).
5613 jonathan 673
5614 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
5615     instance variables private and optimize comparison operator
5616     by first checking if the color references are the same.
5617     (ClassGroupSingleton): Make instance variables private.
5618     (ClassGroupRange): Make instance variables private.
5619 jonathan 673
5620 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
5621    
5622 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
5623    
5624     First stab at internationalized messages:
5625    
5626     * Thuban/__init__.py (_): Implement the translation function for
5627     real using the python gettext module.
5628    
5629     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
5630     translate empty strings.
5631    
5632     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
5633     Add a missing space to a warning message
5634    
5635     * po/README: New. Notes about the management of the translation
5636     files.
5637    
5638     * po/Makefile: New. Makefile to help manage the translation files.
5639    
5640     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
5641    
5642     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
5643     translations and support files in po/
5644    
5645     * setup.py (data_files): Add the *.mo files to the data_files too
5646    
5647     * README: Add note about the translations when building from CVS
5648    
5649 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
5650    
5651     * Thuban/UI/dock.py: Fixes some window resizing problems most
5652     noticable under windows. Always assume the button bitmaps will
5653     be there. Code clean up.
5654     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
5655     images for the dock/undock button to the same images.
5656     Work around for RTbug #1801.
5657    
5658     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
5659     be allowed to grow within the sizer. Fixes a bug under Windows
5660     where the toolbar wasn't being drawn.
5661    
5662 frank 664 2003-04-14 Frank Koormann <[email protected]>
5663    
5664     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
5665     Updated design to try to make the button functionality more
5666     transparent.
5667    
5668 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
5669    
5670     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
5671     finalize the intialization of the panel.
5672    
5673     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
5674     creation of the panel. Should be the last thing called in the
5675     initializer of a subclass.
5676    
5677     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
5678     set the current selections in the combo boxes. This is needed
5679     under Windows.
5680    
5681     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
5682     level panel to the dialog so that the background colors are
5683     consistent under Windows.
5684    
5685 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
5686    
5687 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
5688     not black.
5689    
5690     * Thuban/UI/legend.py: Enable/disable the legend buttons when
5691     the legend changes. Fixes RTbug #1793.
5692    
5693     * test/test_classification.py: Added test for copying of
5694     classifications.
5695    
5696     2003-04-11 Jonathan Coles <[email protected]>
5697    
5698 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
5699     such as bitmaps.
5700    
5701     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
5702     added images to the move buttons, added 'reverse' button.
5703     (CustomRampPanel.__init__): Added images to the move buttons.
5704     (GreyRamp): New. Generates a ramp from white to black.
5705     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
5706    
5707     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
5708     ID_PROPERTY_*.
5709     (Classifier.__init__): Minor changes to the layout.
5710     (Classifier._OnTitleChanged): Listen for when the user edits the
5711     title and update the dialog's title and the layer's title.
5712    
5713     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
5714    
5715     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
5716     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
5717     if the layer's title changes.
5718    
5719     * Thuban/UI/mainwindow.py: Added new menu item and associated code
5720     to open a dialog to rename the map.
5721     (MainWindow): Use new resource class to import bitmaps.
5722    
5723     2003-04-11 Jonathan Coles <[email protected]>
5724    
5725 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
5726 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
5727     Resources/Bitmaps/group_use_none.xpm,
5728     Resources/Bitmaps/group_use_not.xpm,
5729     Resources/Bitmaps/hide_layer.xpm,
5730     Resources/Bitmaps/layer_properties.xpm,
5731     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
5732     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
5733     New.
5734 jonathan 646
5735 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
5736    
5737 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
5738     Should pass group to ClassGroup constructor.
5739    
5740     2003-04-10 Jonathan Coles <[email protected]>
5741    
5742 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
5743     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
5744     here. Implement SetVisible(), IsVisible().
5745     (ClassGroup.__init__): Add group parameter which acts as a copy
5746     constructor.
5747    
5748     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
5749     "Visible" check boxes.
5750     (Classifier): Rename the buttons and refactor the code to match
5751     the new labels.
5752    
5753     * Thuban/UI/legend.py: Classify button is now called "Properties".
5754     Refactored the code to change variable names.
5755     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
5756    
5757     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
5758     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
5759     renamed to MainWindow.LayerEditProperties.
5760     (MainWindow.ToggleLegend): Don't include map name in legend title.
5761     (MainWindow.SetMap): Added the map name to the window title.
5762     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
5763     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
5764     Functionality is found in the layer properties dialog.
5765    
5766     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
5767     draw visible groups.
5768    
5769 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
5770    
5771 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
5772     addition and selection of new color schemes.
5773     (MonochromaticRamp): New. Generates a ramp between two colors.
5774     (RedRamp): New. Generates a ramp of all red.
5775     (GreenRamp): New. Generates a ramp of all green.
5776     (BlueRamp): New. Generates a ramp of all blue.
5777    
5778     2003-04-09 Jonathan Coles <[email protected]>
5779    
5780 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
5781     Need to copy over field and fieldType attributes.
5782    
5783     * Thuban/Model/table.py (Table.field_range): New. Retrive the
5784     maximum and minimum values over the entire table for a given
5785     field.
5786     (Table.GetUniqueValues): New. Retrieve all the unique values
5787     in the table for a given field.
5788    
5789     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
5790     (GenUniquePanel): New. Controls to allow the user to select
5791     which unique field values they would like in the classification.
5792     (CustomRampPanel): Code that was in ClassGenDialog that allows
5793     the user to select the properties for a custom ramp.
5794     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
5795    
5796     * Thuban/UI/classifier.py: Removed a lot of debugging code.
5797     (Classifier._SetClassification): Callback method so that the
5798     class generator can set the classification in the grid.
5799     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
5800     editing of a group properties class into a wxWindows control.
5801    
5802     * Thuban/UI/dock.py: It was decided that if the user closes
5803     a dockable window the window should simply hide itself. That
5804     way if the user wants to show the dock again it appears in the
5805     same place as it was when it was closed.
5806     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
5807     (DockableWindow._OnButtonClose): Hide the window instead of
5808     destroying it.
5809     (DockableWindow._OnClose): Hide the window instead of
5810     destroying it.
5811    
5812     * Thuban/UI/legend.py (LegendTree): Use a private method to
5813     consistently set the font and style of the text. Fixes RTbug #1786.
5814    
5815     * Thuban/UI/mainwindow.py: Import just the Classifier class.
5816    
5817 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
5818    
5819 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
5820     to the map module
5821    
5822     2003-04-07 Bernhard Herzog <[email protected]>
5823    
5824 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
5825     favor of ToggleSessionTree
5826     (MainWindow.ToggleSessionTree): New method to toggle visibility of
5827     the session tree.
5828     (MainWindow.SessionTreeShown): New method to return whether the
5829     session tree is currently shown.
5830     (MainWindow.ToggleLegend): New method to toggle visibility of the
5831     legend
5832     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
5833     LegendShown
5834     (MainWindow.LegendShown): New method to return whether the legend
5835     is currently shown.
5836     (_method_command): Add checked parameter so we can define check
5837     menu items
5838     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
5839     mainwindow methods.
5840     (show_session_tree, show_legend commands): Removed.
5841     (toggle_session_tree, toggle_legend commands): New commands to
5842     toggle the visibility of the dialogs
5843    
5844 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
5845    
5846 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
5847    
5848     * Thuban/UI/dock.py: Fix Windows problem.
5849    
5850     * Thuban/UI/mainwindow.py: Use False instead of false.
5851     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
5852    
5853     2003-04-07 Jonathan Coles <[email protected]>
5854    
5855 jonathan 612 Since we now say that the order of the groups in a classification
5856     matters, it makes sense to be able to manipulate that order. Most
5857     of the changes to Thuban/Model/classification.py are to that end.
5858    
5859     * Thuban/Model/classification.py (Classification.AppendGroup,
5860     Classification.InsertGroup, Classification.ReplaceGroup,
5861     Classification.RemoveGroup, Classification.GetGroup): Do as the
5862     names imply.
5863     (Classification.FindGroup): This was called GetGroup, but GetGroup
5864     takes an index, while FindGroup takes a value.
5865     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
5866     REFERENCE. Currently there is a cyclic reference between the layer
5867     and its classification. If the classification doesn't need to know
5868     its owning layer we can change this, since it may make sense to be
5869     able to use the same classification with different layers.
5870    
5871     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
5872    
5873     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
5874     not AddGroup()
5875    
5876     * Thuban/UI/classifier.py: Now that we can depend on the order in
5877     a Classification and have methods to manipulate that order we don't
5878     need to use our own data structures in the grid. We can simply make
5879     the grid/table access the information they need from a copy of
5880     the classification object.
5881     (Classifier._OnCloseBtn): Event handler for when the user clicks
5882     'Close'. This is needed so if the user applies changes and then
5883     continues to change the table the user has the option of discarding
5884     the most recent changes and keeping what they applied.
5885    
5886     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
5887     into the same group.
5888    
5889     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
5890     with a really old version of proj, PJ_VERSION won't even be defined.
5891     If it isn't defined then just compile so that the function always
5892     returns Py_False.
5893    
5894     * test/test_classification.py: Fix tests to use the renamed methods.
5895     Still need to write tests for the new methods.
5896    
5897 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
5898 jonathan 608
5899 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
5900     call to SetSelection out of the method and before the call
5901     to __SelectField in __init__. This prevents a recursion of events
5902     when _OnFieldSelect is triggered by the user.
5903    
5904     2003-04-04 Jonathan Coles <[email protected]>
5905    
5906 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
5907     Color.Transparent.
5908     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
5909     Don't bother copying the color, since Colors are immutable.
5910    
5911     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
5912     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
5913     Thuban/UI/renderer.py, Thuban/UI/view.py:
5914     Rename Color.None to Color.Transparent.
5915    
5916     * test/test_classification.py, test/test_load.py: Rename Color.None
5917     to Color.Transparent.
5918    
5919     2003-04-04 Jonathan Coles <[email protected]>
5920 jonathan 603
5921     * Thuban/Model/classification.py: Fix assert calls.
5922     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
5923     Copy the color parameter rather than hold onto a reference.
5924 jonathan 601
5925 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
5926     the color object.
5927     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
5928     are sure there exists only one refernce to Color.None in the system.
5929     This allows us to use 'is' rather than the comparision functions.
5930    
5931     * Thuban/Model/save.py: Fix assert calls.
5932    
5933     * Thuban/UI/classifier.py: Fix assert calls.
5934     (ClassGrid._OnCellDClick): Call up to the classifier to open the
5935     dialog to edit the groups properties.
5936     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
5937     correctly if a cell is resized.
5938     (ClassTable.SetClassification): New. Changes the classification
5939     that is in the table.
5940     (ClassTable.__SetRow): Allow groups to be prepended.
5941     (Classifier): New code for opening the EditProperties and
5942     GenerateRanges dialogs.
5943     (SelectPropertiesDialog.__GetColor): Only set the color in the
5944     color dialog if the current color is not None.
5945    
5946     * Thuban/UI/dock.py: Fix assert calls.
5947    
5948     * Thuban/UI/legend.py: Fix assert calls.
5949    
5950     * Thuban/UI/renderer.py: Fix assert calls.
5951    
5952     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
5953     classifications.
5954     (GenRangePanel): Panel specific to range generation.
5955     (GenSingletonPanel): Panel specific to singleton generation.
5956     (ClassGenerator): Class responsible for actually generating
5957     the classification from the data gathered in the dialog box.
5958     (PropertyRamp): Generates properties whose values range from
5959     a starting property to an ending property.
5960 jonathan 601
5961 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
5962    
5963     * test/support.py (print_garbage_information): New function that
5964     prints information about still connected messages and memory
5965     leaks.
5966     (run_suite): Removed.
5967     (run_tests): New function for use as a replacement of
5968     unittest.main in the test_* files. This one calls
5969     print_garbage_information at the end.
5970    
5971     * test/runtests.py (main): Use support.print_garbage_information
5972    
5973     * test/test_layer.py: Use support.run_tests instead of
5974     unittest.main so we get memory leak information
5975     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
5976     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
5977     (TestLayerLegend.test_visibility): Call the layer's Destroy method
5978     to fix a memory leak.
5979    
5980     * test/test_classification.py: Use support.run_tests instead of
5981     unittest.main so we get memory leak information
5982     (TestClassification.test_classification): Call the layer's Destroy
5983     method to fix a memory leak.
5984    
5985 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
5986    
5987 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
5988     Handle the reference counts of the return value and errors in
5989     PyArg_ParseTuple correctly.
5990    
5991 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
5992     sure the filename is absolute to avoid problems when saving the
5993     session again
5994    
5995 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
5996    
5997 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
5998    
5999 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
6000 jonathan 587 that there actually are points in the returned list of points
6001     before trying to index into the list. The list may be empty if
6002     the shape is a Null Shape.
6003    
6004 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
6005    
6006     * test/test_map.py: Don't use from <module> import *
6007    
6008 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
6009    
6010     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
6011     LAYER_LEGEND_CHANGED
6012    
6013     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
6014     self.Destroy() to close the window after yesterday's changes.
6015    
6016     * test/test_map.py, test/test_session.py: Fix messages that
6017     are sent from maps and layers.
6018    
6019 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
6020    
6021     * Thuban/UI/classifier.py: Commented out some debugging statements.
6022     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
6023     RTbug #1769.
6024    
6025     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
6026     position (although position doesn't work yet under GTK).
6027     (DockableWindow.Destroy): New. Called when the window must be
6028     closed. Namely needed when the DockFrame closes and must close
6029     its children.
6030     (DockFrame): Listen for EVT_CLOSE and destroy all children.
6031    
6032     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
6033     when then window is told to close.
6034     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
6035     comment in source for more info.
6036    
6037     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
6038    
6039     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
6040     symmetry with other such methods.
6041     (MainWindow.ShowLegend): Show the legend docked by default.
6042    
6043 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
6044    
6045     * Thuban/UI/classifier.py: Support for highlighting a specific
6046     group within the grid when the classification dialog is opened.
6047     Also contains a lot of debugging printouts which will later
6048     be removed.
6049    
6050     * Thuban/UI/dock.py: Complete rework on the dock code so that
6051     that it is fairly removed from the rest of the Thuban application.
6052     It is easy to add new docks which the rest of the program having
6053     to be aware of them.
6054    
6055     * Thuban/UI/legend.py: Modifications to support selecting a
6056     specific group in the classification dialog. Changed how layers
6057     are drawn when the layer is visible/invisible.
6058    
6059     * Thuban/UI/mainwindow.py: Removed legend specific code and
6060     replaced it with calls to the new dock code.
6061    
6062     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
6063     to check if scale > 0. Trying to track down a divide by zero.
6064    
6065 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
6066    
6067 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
6068     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
6069     now part of DockableWindow.
6070     (LegendPanel.DoOnSelChanged): Select the current layer in the
6071     map.
6072     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
6073     with the selected layer and/or group.
6074    
6075     2003-03-26 Jonathan Coles <[email protected]>
6076    
6077 jonathan 557 This putback contains the code for dockable windows. There is
6078     no support in wxWindows as of this date for windows that can
6079     attach themselves to other windows.
6080    
6081     The current model contains a DockableWindow which has a parent
6082     window for when it is detached and a dock window that it puts
6083     its contents in when it is docked. The contents of a DockableWindow
6084     must be a DockPanel. DockPanel itself derives from wxPanel.
6085    
6086     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
6087     message, not a LAYER_LEGEND_CHANGED message.
6088    
6089     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
6090    
6091     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
6092     as one of the style properties for the fieldTypeText item to
6093     be sure that its size is correct when the text changes.
6094    
6095     * Thuban/UI/dock.py: New. Classes for the DockPanel and
6096     DockableWindow.
6097    
6098     * Thuban/UI/legend.py: Added some more buttons and made the
6099     LegendPanel a DockPanel.
6100    
6101     * Thuban/UI/mainwindow.py: Added sash windows to the main window
6102     and supporting functions for manipulating the sashes.
6103     (MainWindow.ShowLegend): Create a DockableWindow with the
6104     LegendPanel as the contents.
6105    
6106     * Thuban/UI/messages.py: Added DOCKABLE_* messages
6107    
6108     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
6109     not LAYER_LEGEND_CHANGED, messages.
6110    
6111 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
6112    
6113     * setup.py: Added custom script bdist_rpm_build_script so that
6114     when the rpm is built the path to wx-config is correct.
6115    
6116     * setup.cfg: Added line saying to use the custom build script
6117    
6118 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
6119    
6120     Initial implementation of the Legend.
6121    
6122     * Thuban/UI/legend.py: New. Creates a window that shows the map's
6123     Legend information and allows the user to add/modify classifications
6124     and how the layers are drawn on the map.
6125    
6126     * setup.py: New command 'build_docs' which currently uses
6127     happydoc to generate html documentation for Thuban.
6128    
6129     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
6130     Returns a string which is appropriately describes the group.
6131    
6132     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
6133     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
6134    
6135     * Thuban/Model/map.py (Map): Rename messages and use new, more
6136     specific, messages.
6137    
6138     * Thuban/Model/messages.py: New message to indicate that a layer's
6139     data has changed (LAYER_CHANGED). New map messages to indicate
6140     when layers have been added/removed/changed or if the stacking order
6141     of the layers has changed.
6142    
6143     * Thuban/Model/session.py: Rename and use new messages.
6144    
6145     * Thuban/UI/classifier.py: Remember if any changes have actually
6146     been applied so that if the dialog is cancelled without an application
6147     of changes we don't have to set a new classification.
6148     (ClassDataPreviewer): Pulled out the window specific code and put it
6149     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
6150     symbols on any DC.
6151    
6152     * Thuban/UI/mainwindow.py: New code to open the legend.
6153    
6154     * Thuban/UI/view.py: Use new message names.
6155    
6156 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
6157    
6158     * Thuban/UI/main.py (verify_versions): New. Checks the versions
6159     of Python, wxPython, and some other libraries.
6160    
6161     * extensions/thuban/wxproj.cpp (check_version): Checks the given
6162     version against what wxproj was compiled with.
6163     (check_version_gtk): If wxproj was compiled with gtk then check
6164     the given version against the version of the gtk library
6165     currently being used.
6166    
6167 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
6168    
6169     * test/test_command.py: Run the tests when the module is run as a
6170     script
6171    
6172     2003-03-14 Bernhard Herzog <[email protected]>
6173    
6174     Implement selection of multiple selected shapes in the same layer:
6175    
6176     - Introduce a new class to hold the selection. This basically
6177     replaces the interactor which was nothing more than the
6178     selection anyway. A major difference is of course that the new
6179     selection class supports multiple selected shapes in one layer
6180    
6181     - Move the object that represents the selection from the
6182     application to the canvas. The canvas is a better place than the
6183     application because the selection represents which shapes and
6184     layer of the map displayed by the canvas are selected and
6185     affects how the map is drawn.
6186    
6187     - Make the selection and its messages publicly available through
6188     the mainwindow.
6189    
6190     - The non-modal dialogs do not get a reference to the interactor
6191     anymore as they can simply refer to their parent, the
6192     mainwindow, for the what the interactor had to offer.
6193    
6194     * Thuban/UI/selection.py: New module with a class to represent the
6195     selection.
6196    
6197     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
6198     these unused messages
6199    
6200     * Thuban/UI/application.py (ThubanApplication.OnInit)
6201     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
6202     interactor is gone now.
6203     (ThubanApplication.CreateMainWindow): There is no interactor
6204     anymore so we pass None as the interactor argument for now for
6205     compatibility.
6206    
6207     * Thuban/UI/view.py (MapCanvas.delegated_messages)
6208     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
6209     Unsubscribe, delegate messages according to the delegated_messages
6210     class variable.
6211     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
6212     attributes from instance variables as described with the
6213     delegated_methods class variable.
6214     (MapCanvas.__init__): New instance variable selection holding the
6215     current selection
6216     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
6217     pass them on to the renderer
6218     (MapCanvas.SetMap): Clear the selection when a different map is
6219     selected.
6220     (MapCanvas.shape_selected): Simple force a complete redraw. The
6221     selection class now takes care of only issueing SHAPES_SELECTED
6222     messages when the set of selected shapes actually does change.
6223     (MapCanvas.SelectShapeAt): The selection is now managed in
6224     self.selection
6225    
6226     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
6227     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
6228     Unsubscribe, delegate messages according to the delegated_messages
6229     class variable.
6230     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
6231     attributes from instance variables as described with the
6232     delegated_methods class variable.
6233     (MainWindow.__init__): The interactor as ivar is gone. The
6234     parameter is still there for compatibility. The selection messages
6235     now come from the canvas.
6236     (MainWindow.current_layer, MainWindow.has_selected_layer):
6237     Delegate to the the canvas.
6238     (MainWindow.LayerShowTable, MainWindow.Classify)
6239     (MainWindow.identify_view_on_demand): The dialogs don't need the
6240     interactor parameter anymore.
6241    
6242     * Thuban/UI/tableview.py (TableFrame.__init__)
6243     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
6244     (LayerTableFrame.row_selected): The interactor is gone. It's job
6245     from the dialog's point of view is now done by the mainwindow,
6246     i.e. the parent. Subscribe to SHAPES_SELECTED instead
6247     of SELECTED_SHAPE
6248    
6249     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
6250     is gone. It's job from the dialog's point of view is now done by
6251     the mainwindow, i.e. the parent.
6252    
6253     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
6254     gone. It's job from the dialog's point of view is now done by the
6255     mainwindow, i.e. the parent.
6256    
6257     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
6258     gone. It's job from the dialog's point of view is now done by the
6259     mainwindow, i.e. the parent.
6260     (SessionTreeCtrl.__init__): New parameter mainwindow which is
6261     stored as self.mainwindow. The mainwindow is need so that the tree
6262     can still subscribe to the selection messages.
6263     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
6264     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
6265     selection is now accessible through the mainwindow. Subscribe to
6266     SHAPES_SELECTED instead of SELECTED_SHAPE
6267    
6268     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
6269     SHAPES_SELECTED message now.
6270     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
6271     so deal with multiple shapes
6272     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
6273     gone. It's job from the dialog's point of view is now done by the
6274     mainwindow, i.e. the parent.
6275    
6276     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
6277     parameter is now a list of shape ids.
6278     (RecordTable.SetTable): The second parameter is now a list of
6279     indices.
6280    
6281     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
6282     selected_shape parameter and ivar to selected_shapes. It's now a
6283     list of shape ids.
6284     (MapRenderer.draw_label_layer): Deal with multiple selected
6285     shapes. Rearrange the code a bit so that the setup and shape type
6286     distinctions are only executed once.
6287    
6288     * test/test_selection.py: Test cases for the selection class
6289    
6290 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
6291    
6292     * Thuban/Model/load.py: Temporary fix so that the xml reader
6293     doesn't cause Thuban to crash.
6294    
6295     * Thuban/Model/layer.py: Handle the cyclic references between
6296     a layer and its classification better, and be sure to disconnect
6297     the classification from the layer when the layer is destroyed
6298     so that we don't maintain a cyclic reference that may not be
6299     garbage collected.
6300    
6301     * Thuban/Model/classification.py: See comment for layer.py.
6302    
6303 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
6304    
6305     * HOWTO-Release: New. Information on the steps for releasing
6306     a new version of Thuban.
6307    
6308 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
6309    
6310     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
6311     Use True instead of true.
6312     (Classifier): Should have a single panel in which all the controls lie.
6313    
6314     * Thuban/UI/proj4dialog.py: Add normal border.
6315    
6316     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
6317    
6318     * Thuban/UI/mainwindow.py: Use True instead of true.
6319    
6320     * setup.py: Update some definitions to use wxWindows2.4 files
6321    
6322     * Data/iceland_sample_class.thuban: Fixed file so that the
6323     field_type information is present.
6324    
6325 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
6326    
6327 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
6328     field type label grow so that when the text changes the
6329     size is updated correctly. This may be a wxWindows bug.
6330    
6331     2003-03-10 Jonathan Coles <[email protected]>
6332    
6333 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
6334     SESSION_REPLACED.
6335    
6336     * Thuban/UI/classifier.py: Wrap text with _().
6337     (ClassGrid.CreateTable): Set dimensions and size hints here,
6338     instead of in Reset, so we only set the size once.
6339    
6340     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
6341    
6342     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
6343     Call Close() instead of Shutdown().
6344    
6345     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
6346    
6347     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
6348     Go back to using OnClose() instead of Shutdown().
6349    
6350     2003-03-10 Jonathan Coles <[email protected]>
6351    
6352 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
6353     to know the old field index as well as the new one.
6354    
6355     2003-03-10 Jonathan Coles <[email protected]>
6356    
6357 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
6358     to correctly set the table information and call this from
6359     __init__ and from _OnFieldSelect so that all the information
6360     is up to date when the dialog opens and when a field is changed.
6361    
6362     2003-03-10 Jonathan Coles <[email protected]>
6363    
6364 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
6365     layer's message function directly, use the ClassChanged() method
6366     when then classification changes. SetField/SetFieldType/SetLayer
6367     must keep the information about field name and field type in
6368     sync when an owning layer is set or removed.
6369    
6370     * Thuban/Model/layer.py: Added ClassChanged() so that the
6371     classification can tell the layer when its data has changed.
6372     (Layer.SetClassification): Accepts None as an arguement to
6373     remove the current classification and correctly handles
6374     adding a new classification.
6375    
6376     * Thuban/Model/load.py: Comment out print statement
6377    
6378     * test/test_classification.py, test/test_save.py: New and
6379     improved tests.
6380    
6381 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
6382    
6383     * Thuban/Model/classification.py: Implemented __copy__ and
6384     __deepcopy__ for ClassGroup* and ClassGroupProperites so
6385     they can easily be copied by the classifier dialog.
6386     (ClassGroupProperites.__init__): The default line color should
6387     have been Color.Black.
6388    
6389     * Thuban/UI/classifier.py: Setting and Getting table values now
6390     uses a consistent set of functions.
6391     (Classifier): Now non-modal. Has field type label which changes
6392     as the field changes. Keep track of buttons in a list so that
6393     we can enable/disable the buttons when the None field is selected.
6394     (SelectPropertiesDialog): Add buttons to make the colors transparent.
6395    
6396     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
6397     does what OnClose did, but can be called by the application to
6398     close a window. Needed when a session changes, and we have to
6399     close the classifier windows.
6400    
6401     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
6402     Shuts down open dialogs. Used when a new session is created
6403     or a session is opened.
6404     (MainWindow.SaveSession): Should only call application.SaveSession()
6405     if we don't call SaveSessionAs first.
6406     (MainWindow.Classify): Allow different classifier dialogs for
6407     different layers.
6408    
6409     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
6410     the parent class handle it. Add Shutdown() to unsubscibe from
6411     event notification and call the parent Shutdown(). This was
6412     necessary so the application can close the tree window.
6413    
6414 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
6415    
6416     * Thuban/Model/classification.py: Minor documentation changes,
6417     Addition of __eq__ and __ne__ methods.
6418     (Classification.SetLayer): prevent recursion between this method
6419     and Layer.SetClassification().
6420    
6421     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
6422    
6423     * Thuban/Model/layer.py (SetClassification): prevent recursion
6424     between this method and Classification.SetLayer().
6425    
6426     * test/test_classification.py, test/test_load.py,
6427     test/test_session.py: Fixed and added tests for the classification
6428     classes.
6429    
6430 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
6431    
6432     * Thuban/UI/classifier.py (ClassGrid.__init__)
6433     (ClassGrid.CreateTable): Move the SetSelectionMode call to
6434     CreateTable because otherwise it triggers an assertion in
6435     wxPython/wxGTK 2.4.
6436    
6437 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
6438    
6439 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
6440 jonathan 471
6441 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
6442 jonathan 471
6443 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
6444 jonathan 471
6445 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
6446 jonathan 471
6447     2003-03-05 Jonathan Coles <[email protected]>
6448    
6449 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
6450     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
6451     Store just the groups in the table and generate the other
6452     column information when it is requested. Add "None" field
6453     to pull-down to select no classification.
6454    
6455     * Thuban/common.py: Moved FIELDTYPE constants from table.py
6456     (Str2Num): Only catch ValueError exceptions.
6457    
6458     * Thuban/Model/classification.py: Class documentation. Renaming
6459     of methods with Stroke to Line. Groups are stored in a single
6460     list with the default as the first element. Groups are searched
6461     in the order they appear in the list.
6462    
6463     * Thuban/Model/color.py: Documentation.
6464    
6465     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
6466     the kind of data represented by a field.
6467    
6468     * Thuban/Model/load.py (ProcessSession): Use proper string
6469     conversion function; fixes RTbug #1713.
6470    
6471     * Thuban/Model/save.py (Saver): Store field type information.
6472    
6473     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
6474     (Table): Add field_info_by_name() to retrieve field information
6475     by specifying the field name, not the number.
6476    
6477     * Thuban/UI/mainwindow.py: Function name changes.
6478    
6479     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
6480     get the layer classification once. Don't try to classify
6481     values when the field is None: just use the default properties.
6482    
6483     * Thuban/UI/view.py: Function name changes.
6484    
6485     * Doc/thuban.dtd: Add field_type attribute to a classification.
6486    
6487 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
6488    
6489 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
6490     the fill and stroke layer attributes optional with suitable
6491     default values. Add the stroke_width layer attribute. Use correct
6492     syntax for empty elements. Make the attribute list for labels
6493     refer to the label element.
6494    
6495     2003-03-04 Bernhard Herzog <[email protected]>
6496    
6497 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
6498     Python 2.3 containing some of the functionality we implement in
6499     setup.py ourselves.
6500    
6501     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
6502     before the selection mode. Doing it the other way round triggers
6503     an assertion in wxWindows.
6504    
6505     * Thuban/Model/save.py (escape): Fix typo in doc-string
6506    
6507     * Thuban/Model/classification.py: Remove unnecessary wxPython
6508     import
6509    
6510 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
6511    
6512     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
6513     Parameter 'value' should default to None.
6514    
6515     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
6516     the class attribute __classification is now private.
6517    
6518     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
6519     Classifier to ClassGrid. Added support for removing selected rows,
6520     which including code for keeping track of when cells are selected,
6521     and deselected.
6522     (ClassTable): Support for added/removing rows. Fixed a problem
6523     with __ParseInput whereby it would not allow strings (only numbers)
6524     to be entered.
6525     (Classifier): Added button and supporting code for removing
6526     selected rows.
6527    
6528 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
6529 jonathan 434
6530     * Thuban/common.py: Moved color conversion functions into
6531     Thuban/UI/common.py.
6532     (Str2Num): Now converts the float (not the string) to a long/int
6533     so that an exception isn't thrown.
6534    
6535     * Thuban/UI/common.py: Common functions used in several UI modules
6536    
6537     * Thuban/Model/classification.py: Changed the class hierarchy
6538     so that a Classification consists of Groups which return
6539     Properties when a value matches a Group.
6540    
6541     * Thuban/Model/layer.py: Fixed name resolution problem.
6542    
6543     * Thuban/Model/load.py: Use new Classification and Group functions.
6544    
6545     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
6546     failure.
6547     (Saver.write_classification): Use new Classification and Group
6548     functions.
6549    
6550     * Thuban/UI/classifier.py: Changes to use new Classification and Group
6551 jonathan 445 functions. Fix to create a tuple with a single value instead of
6552     simply returning the value.
6553 jonathan 434
6554     * Thuban/UI/renderer.py: Use new Classification and Group functions.
6555     Use common.py functions.
6556    
6557 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
6558 jonathan 447
6559     * test/test_classification.py: Use new Classification and Group
6560     classes.
6561 jonathan 434
6562 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
6563    
6564     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
6565     functions from Thuban color objects to wxWindow colour objects.
6566    
6567     * Thuban/Model/classification.py (Classification): Renamed
6568     GetProperties() to GetClassData(). Used the new iterator
6569     in TreeInfo().
6570     (ClassIterator): Iterator implementation to iterate over the
6571     ClassData objects in a classification object.
6572    
6573     * Thuban/Model/save.py (Saver.write_classificaton): Uses
6574     the new iterator to save the classification information.
6575    
6576     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
6577     for changing the stroke and fill colors and previewing the
6578     changes.
6579    
6580     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
6581     MainWindow.SaveSessionAs): Text string changes so the dialogs
6582     have more meaningful titles.
6583    
6584     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
6585     Classification method name from GetProperties to GetClassData.
6586    
6587     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
6588     instead of accessing now non-existent class variables.
6589    
6590 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
6591    
6592     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
6593     unneeded Shape() call. Rendering is substantially faster without
6594     it and it avoids some problems with broken shape files.
6595    
6596 frank 423 2003-02-20 Frank Koormann <[email protected]>
6597    
6598     Force minimal size of identify and label dialogs. The autosizing
6599     looked too ugly.
6600    
6601     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
6602     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
6603     Set size of listctrl.
6604     * Thuban/UI/identifyview.py (IdentifyView.__init__):
6605     Set size of dialog.
6606    
6607 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
6608    
6609     * test/test_classification.py, test/test_layer.py,
6610     test/test_load.py, test/test_map.py, test/test_session.py:
6611     Updated the tests to use the new functions that are in the
6612     respective classes.
6613    
6614     * Thuban/Model/classification.py (Classification):
6615     Uses the new ClassData* classes. Modification messages are
6616     passed up to the parent layer (if it exists).
6617     (ClassData): New class to encapsulate the common data in each
6618     classification property.
6619     (ClassDataDefault): Represents the Default class. data.
6620     (ClassDataPoint): Represents a single class. data point
6621     (ClassDataRange): Represents a class. range
6622     (ClassDataMap): Represents a class. map (unused).
6623    
6624     * Thuban/Model/color.py: Added Color.None to represent something
6625     with no color. Color.Black represents the color black.
6626     (NoColor): Helper class derived from Color to represent something
6627     with no color.
6628    
6629     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
6630     stroke_width attributes. Made the 'classification' attribute private.
6631     New methods for setting/getting the classification.
6632    
6633     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
6634     to get the classifcation and use the new ClassData* classes to
6635     hold the classification data. Use Str2Num to convert numbers
6636     properly.
6637    
6638     * Thuban/Model/save.py (Saver): Use new Color and Classification
6639     methods
6640    
6641     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
6642     custom grid.
6643     (ClassTable): Support for editing Values and Labels and for
6644     changing what type (point or range) of data is stored in each
6645     property based on how the user enters the data.
6646     (Classifier): Support for saving the new classifications and
6647     launching the dialog to edit a property.
6648     (SelectPropertiesDialog): New class for editing the visual
6649     properties of a classification (stroke color, width, and fill color)
6650     (ClassPreviewer): Took the Draw method from ClassRenderer and
6651     made most of it into this new class. Intend to use this class in
6652     the SelectPropertiesDialog for previewing changes.
6653    
6654     * Thuban/UI/renderer.py: Use new Color and Classification methods.
6655    
6656     * Thuban/UI/tree.py: Formatting changes.
6657    
6658     * Doc/thuban.dtd: Add 'label' element
6659    
6660     * Thuban/common.py: New. Contains common routines used throughout
6661     the code.
6662     (Str2Num): Takes a string and converts it to the "best" type of
6663     number.
6664    
6665 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
6666    
6667     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
6668     dragging flag is always set to 0 even when the tool implementation
6669     raises an exception
6670    
6671 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
6672    
6673     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
6674     method to create a splash screen.
6675     (ThubanApplication.ShowMainWindow): New. Show the main window.
6676     Needed so the splash screen can display the mainwindow
6677     (ThubanApplication.OnInit): Call the
6678     new splash_screen method to determine whether the application
6679     should display a splash screen. If it displays a splash screen do
6680     not immediately show the main window.
6681    
6682 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
6683    
6684     * Thuban/Model/classification.py: Added import line to fix
6685     feature conflicts between running on python2.2 and python2.1.
6686    
6687     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
6688     onto the clinfo parameter, so removed the deepcopy().
6689    
6690 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
6691    
6692 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
6693 jonathan 396 Added element_open variable to track opening and closing of tags
6694     so that tags that don't span more than one line are closed with
6695     /> instead of </tag_name>. Use the GetDefault*() methods of
6696     the Classification class.
6697    
6698     * Thuban/Model/classification.py (Classificaton): Added set and
6699     get methods for the default data. The class also takes a layer
6700     reference so that modification messages can be sent. Fixed the
6701     methods to use the new ClassData class.
6702     (ClassData): New class to encapsulate the classification data
6703    
6704     * Thuban/Model/layer.py (Layer): Remove the
6705 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
6706 jonathan 396 SetDefault*() methods on the layer's classification object.
6707 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
6708 jonathan 396 Classification class.
6709    
6710     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
6711     object instead of a dictionary.
6712    
6713 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
6714 jonathan 396 draw the classifications in the dialog box's table.
6715     (Classifier): Modified to use the ClassRenderer class.
6716    
6717 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
6718     methods of the Classification class.
6719 jonathan 396
6720     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
6721     of the ClassData class.
6722    
6723     * test/test_classification.py, test/test_layer.py,
6724     test/test_map.py, test/test_session.py: Fix the tests to work
6725     with the above code changes.
6726    
6727 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
6728    
6729     * Thuban/Model/classification.py (Classification): Added getNull()
6730     to return the NullData reference
6731    
6732     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
6733     Layer.SetStrokeWidth): Modified these functions to change the
6734     null data in the classification rather than keep these values
6735     directly in the Layer class. Menu options to change these values
6736     work again.
6737    
6738 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
6739    
6740 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
6741 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
6742 jonathan 380 classification data.
6743    
6744 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
6745     Colors in the tree view.
6746    
6747     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
6748     the tree info for classifications. Commented out unnecessary lines.
6749    
6750     * Thuban/Model/classification.py (Classification.TreeInfo): New
6751     function to add information about the classification into the
6752     tree view.
6753    
6754 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
6755 jan 375
6756 tkoester 403 * Thuban/__init__.py (_): New.
6757 jan 375
6758     * Thuban/Model/classification.py, Thuban/Model/extension.py,
6759     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
6760 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
6761     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
6762     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
6763     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
6764     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
6765     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
6766 jan 375
6767 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
6768    
6769 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
6770 jonathan 370
6771 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
6772     a layer classification. Supports specific data points and
6773     ranges.
6774 jonathan 370
6775 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
6776     information.
6777 jonathan 370
6778 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
6779     information.
6780 jonathan 370
6781 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
6782     specifying classification information.
6783 jonathan 370
6784 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
6785     dialog.
6786 jonathan 370
6787 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
6788     classification information.
6789 jonathan 370
6790 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
6791     classification data.
6792 jonathan 370
6793 tkoester 403 * test/test_classification: Tests for the Classification class.
6794 jonathan 370
6795 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
6796    
6797 bh 361 * test/test_command.py: New. Tests for the command classes.
6798    
6799 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
6800     (Command.IsTool): New method to distinguish between command
6801     switching tools and other commands.
6802    
6803     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
6804     the tool to avoid direct assignments to instance variables
6805     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
6806     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
6807     change the tool
6808    
6809     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
6810     active tool's command turns insensitive, disable the tool.
6811     (_tool_command): Use the new ToolCommand class
6812    
6813     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
6814     SelectTool method to change the tool
6815     (iconfile): Use the ToolCommand class
6816    
6817 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
6818    
6819     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
6820     the case of selected items that are not children of Layers or Maps
6821     properly. Previously this bug would trigger an assertion in
6822     wxWindows.
6823    
6824 frank 352 2002-11-06 Frank Koormann <[email protected]>
6825    
6826 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
6827     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
6828     Full Extent).
6829 tkoester 403
6830 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
6831    
6832     * setup.py (setup call): version now 0.1.3
6833    
6834     * MANIFEST.in: Add the files in test/
6835    
6836     * test/README: Add note about tests requiring the iceland data
6837    
6838     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
6839     copyright notice.
6840    
6841 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
6842    
6843     * test/test_map.py
6844     (TestMapWithContents.test_projected_bounding_box): Use an explicit
6845     epsilon.
6846    
6847     * test/support.py (FloatComparisonMixin.assertFloatEqual)
6848     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
6849     message if the assertion fails and don't return the return value
6850     of self.assert_. In assertFloatSeqEqual the return meant that not
6851     all items of the sequence were compared.
6852    
6853 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
6854    
6855 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
6856    
6857     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
6858    
6859 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
6860     the string with the bounding box on the fly because of platform
6861     differences in the way %g is handled.
6862    
6863     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
6864     DBFfile too because Thuban layers can't yet cope missing DBF
6865     files.
6866    
6867     2002-09-20 Bernhard Herzog <[email protected]>
6868    
6869 bh 326 * test/test_menu.py: Use initthuban instead of
6870     add_thuban_dir_to_path to initialize Thuban.
6871    
6872     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
6873     Mixin class for float comparisons
6874     (SubscriberMixin): New. Mixin class to test messages sent through
6875     the Connector class
6876    
6877     * test/README: Fix a typo and add the -v flag to the command for
6878     individual tests
6879    
6880 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
6881    
6882     * test/test_proj.py: New. Test cases for Thuban.Model.proj
6883    
6884     * test/test_map.py: New. Test cases for Thuban.Model.map
6885    
6886     * test/test_layer.py: New. Test cases for Thuban.Model.layer
6887    
6888     * test/test_label.py: New. Test cases for Thuban.Model.label
6889    
6890     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
6891    
6892     * test/test_color.py: New. Test cases for Thuban.Model.color
6893    
6894     * test/test_base.py: New. Test cases for Thuban.Model.base
6895    
6896 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
6897    
6898     * Thuban/Model/session.py (Session.forwarded_channels): Forward
6899     the CHANGED channel too.
6900    
6901     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
6902     CHANGED channel too.
6903     (Map.__init__): Call the Modifiable constructor as well.
6904    
6905     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
6906     event if the modified flag changes.
6907     (Modifiable.changed): Tweak the doc-string.
6908    
6909     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
6910     (MainWindow.set_position_text): Put the code that puts the text
6911     with the mouse position into the status bar into the new method
6912     set_position_text so that it can overwritten in derived classes.
6913    
6914 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
6915    
6916     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
6917     message box on the main window.
6918    
6919 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
6920    
6921     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
6922     the 'E' because it's less likely to interfere with other menu
6923     entries.
6924 bh 315 (MainWindow.build_menu): remove an incorrect comment.
6925 bh 313
6926 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
6927    
6928     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
6929     (_tool_command): Add sensitive parameter
6930     (_has_visible_map): Sensitivity callback to tools and other
6931     commands that require a visible map. Use it in map_zoom_in_tool,
6932     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
6933     and map_full_extent
6934    
6935 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
6936    
6937     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
6938     VIEW_POSITION
6939    
6940 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
6941 frank 306
6942     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
6943    
6944 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
6945    
6946 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
6947     wxWindows already and our implementation doesn't work correctly
6948     with wxGTK 2.3:
6949     (MapCanvas.__init__): Remove the instance variable
6950     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
6951     be drawin
6952     (MapCanvas.OnIdle): Removed.
6953    
6954 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
6955     a parameter to determine the size of the rectangle.
6956     (MapCanvas.find_shape_at): Create the box around the point on a
6957     layer by layer basis and make the size depend on the shape type.
6958     This solves a problem with the selection of point shapes at the
6959     border of the layer's bounding box
6960    
6961 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
6962    
6963 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
6964     for the sensitivity of remove layer.
6965     (_can_remove_layer): New. Sensitivity callback for remove layer
6966     (Command layer_remove): Use _can_remove_layer
6967    
6968     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
6969     determine whether a given layer can be deleted.
6970    
6971 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
6972     (MapCanvas.do_redraw): Get rid of the unused update_region
6973     instance variable
6974    
6975 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
6976    
6977 bh 292 * test/: new subdirectory with a bunch of unit tests.
6978    
6979     * test/README, test/test_table.py, test/test_save.py,
6980     test/test_menu.py, test/test_load.py: Initial set of tests and
6981     brief instructions on how to run them
6982    
6983 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
6984    
6985 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
6986     arcs with multiple parts.
6987    
6988 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
6989     Handle degenrate rectangles.
6990    
6991 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
6992     (Table.__init__): Keep track of whether the DBF is open for
6993     writing
6994     (Table.write_record): Open the DBF file for writing when necessary
6995    
6996 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
6997    
6998     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
6999     dbf files only for reading by default. Use a new writable dbf
7000     object for writing.
7001    
7002 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
7003    
7004 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
7005     (MainWindow.Context): New method to return a context
7006     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
7007     new method
7008    
7009 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
7010     layer table specific code from TableGrid into LayerTableGrid
7011     (TableFrame, LayerTableFrame): Split the layer table specific code
7012     from TableFrame into LayerTableFrame
7013 bh 280 (LayerTableGrid.select_shape): Remove a debug print
7014 bh 278
7015     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
7016     LayerTableFrame
7017    
7018 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
7019    
7020     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
7021     absolute filename.
7022    
7023 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
7024    
7025 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
7026     records.
7027 tkoester 403 (Table.__init__): Open the DBF file for writing too.
7028 bh 275
7029     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
7030     into the underlying table.
7031    
7032     * extensions/shapelib/shapefil.h (DBFCommit),
7033     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
7034     commit any changes made to the DBF file.
7035    
7036 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
7037     (_tool_command): Put the code that generates the "checked"
7038     callback into a separate function so that we can reuse it
7039     elsewhere
7040    
7041 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
7042     session into an XML file. The main reason to introduce a class is
7043     that applications built on Thuban can derive from it so that they
7044     can save additional information in a session file.
7045     (save_session): Delegate almost all the work to the Saver class.
7046     Rename the filename argument to file because it may be a file like
7047     object now.
7048    
7049     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
7050     code. Remove the little test code which would be executed when the
7051     module is run as a script which didn't work anymore since it can't
7052     import the other Thuban modules.
7053     (ProcessSession, load_session): Refactor the ProcessSession to
7054     have one method for each element start and end tag so that derived
7055     classes can easily override the processing of individual tags.
7056     Also, always parse with namespaces enabled because applications
7057     built on top of Thuban will likely use namespaces if they extend
7058     the session file format.
7059    
7060 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
7061    
7062     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
7063     because thubaninit_contents will do it for us.
7064    
7065 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
7066 jan 265
7067     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
7068     tree window already open
7069    
7070 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
7071    
7072 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
7073     with self.
7074    
7075     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
7076     when we have actually captured it.
7077    
7078 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
7079     shapefile and destroy the table.
7080    
7081     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
7082    
7083 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
7084    
7085 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
7086     instance variable columns
7087     (RecordTable.GetTypeName): row and col may be negative in some
7088     cases.
7089    
7090 bh 254 * setup.py (InstallLocal.initialize_options)
7091     (InstallLocal.finalize_options, InstallLocal.user_options): New
7092     option create-init-file to build a thubaninit.py when running
7093     install_local
7094     (InstallLocal.run): Create the thubaninit.py module when requested
7095     (thubaninit_contents): Split the template into several parts and
7096     create a new function thubaninit_contents that creates the
7097     contents of a thubaninit module.
7098     (ThubanInstall.run): Use the new function to create the thubaninit
7099     module.
7100    
7101 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
7102    
7103     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
7104     cleanup.
7105     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
7106    
7107     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
7108     direct base class' Destroy method.
7109    
7110     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
7111     layers.
7112     (Map.Destroy): Destroy the label_layer as well and call the
7113     inherited Desatroymethod first so that no more messages are
7114     issued.
7115     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
7116     message if the stacking order actually has changed. Add
7117     doc-strings.
7118     (Map.BoundingBox): Correct the doc-string.
7119     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
7120     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
7121    
7122     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
7123     all labels.
7124    
7125 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
7126    
7127     * Thuban/Model/map.py (Map.subscribe_layer_channels)
7128     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
7129     to a layer's channels into separate methods.
7130     (Map.RemoveLayer, Map.AddLayer): Call the new methods
7131     (Map.Destroy): Unsubscribe from a layer's channels before
7132     destroying it.
7133    
7134     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
7135     selected_layer parameter to searched_layer which is the layer to
7136     search in.
7137     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
7138     search to that layer. Return the selected layer and shape.
7139    
7140     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
7141     typo
7142    
7143 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
7144    
7145 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
7146     Extend the doc string.
7147     (ThubanApplication.subscribe_session)
7148     (ThubanApplication.unsubscribe_session): New methods to
7149     subscribe/unsubscribe to/from session channels.
7150     (ThubanApplication.SetSession): Call the new methods here.
7151     (ThubanApplication.maps_changed, ThubanApplication.set_map):
7152     Renamed set_map to maps_changed. Its now a subscriber for
7153     MAPS_CHANGED.
7154    
7155     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
7156     x-coordinate in case of simple clicks
7157    
7158     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
7159     don't pass it as a parameter
7160    
7161     * Thuban/Model/session.py (Session.RemoveMap): New
7162    
7163 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
7164     window size into a parameter.
7165    
7166 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
7167    
7168 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
7169     just commands.
7170    
7171 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
7172     parameter list a bit to allow setting the window title and the
7173     initial message in the status bar. Update the callers.
7174    
7175     * Thuban/UI/application.py (ThubanApplication.OnInit)
7176     (ThubanApplication.CreateMainWindow): Put the mainwindow
7177     instantiation into a separate method so that it can be overridden
7178     by a subclass.
7179    
7180 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
7181    
7182 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
7183     another changed message is issued to make it easier to get
7184     notified of changes.
7185     (Session): Update the doc string
7186     (Session.forward): Issue changed-events as CHANGED as well.
7187     (Session.changed): Overwrite the inherited version to issue
7188     CHANGED events as well.
7189    
7190     * Thuban/UI/tree.py: We can now simply subscribe to the session's
7191     CHANGED channel to be informed of changes.
7192     (SessionTreeCtrl.session_channels): Not needed any longer.
7193 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
7194 bh 234 Only have to (un)subscribe CHANGED
7195    
7196     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
7197    
7198 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
7199     for the wxPython locale bug to __init__.py so that it's
7200     automatically executed by anybody using UI code from Thuban.
7201    
7202 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
7203    
7204 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
7205    
7206     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
7207     as parameter and store it in an instance variable
7208     (MainWindow.invoke_command, MainWindow.update_command_ui)
7209     (MainWindow.save_modified_session, MainWindow.NewSession)
7210     (MainWindow.OpenSession, MainWindow.SaveSession)
7211     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
7212     application object.
7213    
7214     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
7215     the main window with self.
7216    
7217 bh 225 * Thuban/UI/context.py: New module with the context class
7218    
7219     * Thuban/UI/command.py (Command): Update doc string.
7220    
7221     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
7222     MainWindow.update_command_ui): Pass an instance of the context
7223     class to the command's methods
7224     (check_current_tool, call_method): Handle the new context
7225     implementation
7226    
7227     * Examples/simple_extensions/simple_tool.py (simple_tool,
7228     check_simple_tool): Handle the new context implementation
7229    
7230     * Examples/simple_extensions/simple_command.py (simple_command):
7231     Handle the new context implementation. Update the comments about
7232     the context.
7233    
7234     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
7235     doc-string
7236     (ThubanApplication.Session): New method to return the session
7237     object
7238    
7239     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
7240     interactor's selected_layer may not be a layer of the current
7241     session when the tree is updated while a new session is being set.
7242    
7243 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
7244    
7245     * Thuban/UI/tree.py (color_string): Removed. No longer used.
7246     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
7247     update_tree into update_tree and add_items. The tree now uses a
7248     more generic way to display the contents of the tree.
7249     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
7250    
7251     * Thuban/Model/layer.py (Layer.TreeInfo),
7252     Thuban/Model/extension.py (Extension.TreeInfo),
7253     Thuban/Model/map.py (Map.TreeInfo),
7254 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
7255 bh 217 Add TreeInfo methods to implement the new tree view update scheme
7256    
7257 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
7258    
7259     * Thuban/UI/application.py: Don't use "import from" for the
7260     MainWindow. It can't always be resolved.
7261     (ThubanApplication.OnInit): change reference to MainWindow
7262     accordingly.
7263    
7264     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
7265     completely
7266    
7267 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
7268    
7269     * setup.py (create_init_module): New configurable variable whose
7270     default depends on the platform we're running on.
7271     (ThubanInstall.initialize_options): Initialize
7272     self.create_init_module from the global create_init_module
7273     (ThubanInstall.user_options): indictate that the options
7274     create-init-module and init-module-dir have arguments.
7275    
7276     * setup.py: In the setup call change the version number to include
7277     cvs.
7278    
7279     * MANIFEST.in: Add the files in Examples
7280    
7281 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
7282    
7283 bh 210 * setup.py: In the setup call, use the thuban homepage as the
7284     value of the url parameter.
7285    
7286 bh 208 * Examples: New subdirectory for examples.
7287    
7288     * Examples/simple_extensions/simple_tool.xpm,
7289     Examples/simple_extensions/simple_tool.py,
7290     Examples/simple_extensions/simple_command.py,
7291     Examples/simple_extensions/README: Simple examples showing how to
7292     add new commands and tools.
7293    
7294 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
7295     bdist_rpm that we also have an install script.
7296     (bdist_inno): Add 2002 to the copyright notice.
7297    
7298 bh 205 * setup.py: Create a file in python's site-packages directory to
7299     make installation of Thuban as a library easier.
7300     (ThubanInstall.user_options): Add two new options,
7301     create-init-module and init-module-dir
7302     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
7303     filenames for installation in the default directories.
7304     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
7305     the inherited methods to capture some filenames before they're
7306     transformed too much by distutils.
7307     (ThubanInstall.run): Create the init module if requested.
7308     (ThubanInstall.thuban_init_filename): New method to return the
7309     full name of the init module.
7310     (ThubanInstall.get_outputs): Append the filename of the init
7311     module.
7312    
7313 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
7314    
7315 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
7316     handle the prefix properly which means that the default for the
7317     installation prefix should be /usr for RPMs and /usr/local when
7318     doing a normal source install.
7319     (bdist_rpm_install_script): Script to override the default install
7320     commands in the specfile generated by the bdist_rpm command.
7321     (thuban_bdist_rpm.user_options): Add a prefix option
7322     (thuban_bdist_rpm.initialize_options): Init the prefix option.
7323     Create the script files for the spec files as empty files here
7324     (thuban_bdist_rpm._make_spec_file): Override the inherited method
7325     to fill the script files with content.
7326    
7327 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
7328     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
7329     argument. save_session now automatically uses this version,
7330     solving a problem when saving to a relative filename.
7331    
7332     * setup.py: In the setup call, make sure that the library
7333     directories are under $prefix/lib not directly under $prefix.
7334    
7335 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
7336 jan 199
7337     * Thuban/Model/extension.py: new module to handle extension objects.
7338     * Thuban/Model/messages.py: new messages for extensions.
7339     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
7340     Session.AddExtension): new for handling extensions.
7341     Also some other minor changes to round up extension handling.
7342     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
7343     of Extension titles and title and names of its objects.
7344    
7345 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
7346    
7347     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
7348 bh 202 the events for a command.
7349 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
7350     Call bind_command_events to bind the events. add_toolbar_command
7351     can now bind events too so that it's possible to have commands
7352     that are only available through the toolbar.
7353     (MainWindow.init_ids): New instance variable events_bound to keep
7354     track of for which commands events have been bound.
7355    
7356 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
7357    
7358     * Thuban/UI/menu.py: New module to build and manage menus.
7359    
7360     * Thuban/UI/mainwindow.py: Remove some unused imports.
7361     (MainWindow.__init__, main_menu): move the definition of the main
7362     menu from __init__ to the Menu instance main_menu.
7363     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
7364     build the menu bar and sub-menus from a menu description.
7365    
7366     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
7367     startup file
7368     (ThubanApplication.read_startup_files): New method to run
7369     ~/.thuban/thubanstart.py
7370    
7371 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
7372     Move the toolbar definition to the Menu instance main_toolbar.
7373     (MainWindow.build_toolbar): New method to build the toolbar
7374     similar to the build_menu methods
7375    
7376 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
7377    
7378 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
7379     layer_outline_color. Fix it in the definition of the command too.
7380    
7381 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
7382    
7383 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
7384    
7385     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
7386     in the docstring
7387    
7388 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
7389    
7390 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
7391     when the shapefile is empty.
7392     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
7393     now return None for empty shapefiles. Update doc-strings.
7394    
7395     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
7396     the layer's bbox being None.
7397    
7398     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
7399     layer's bbox being None.
7400    
7401 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
7402     necessary.
7403     (MapCanvas.__init__): New instance variables, last_selected_layer
7404     and last_selected_shape to determine how the selection has
7405     changed.
7406    
7407     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
7408     AutoSizeColumns because it will cause a traversal of the entire
7409     table which for large .dbf files will take a very long time.
7410    
7411 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
7412    
7413     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
7414     maximum depth for the tree than shapelib does by default.
7415    
7416 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
7417    
7418     * setup.py (py_modules): The shptree modules doesn't have a
7419     wrapper, so don't include it in the py_modules
7420    
7421 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
7422    
7423     * extensions/shapelib/shptree.c (compare_ints): Make arguments
7424     const void * as in the qsort prototype
7425     (SHPTreeFindLikelyShapes): Remove some unused variables.
7426    
7427     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
7428     maintains to redraw the window during a drag.
7429     (MapCanvas.unprojected_rect_around_point): New method to determine
7430     a small region around a point for hit-testing.
7431     (MapCanvas.find_shape_at): Only test the shapes in a small region
7432     around the point.
7433    
7434     * setup.py: Increment the version to 0.1.2
7435    
7436     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
7437     debug print and set session to None after unsubscribing
7438    
7439 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
7440    
7441 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
7442     the file to have a .thuban extension.
7443    
7444 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
7445     all the session channels to subscribe to to update the tree
7446     (SessionTreeCtrl.session_changed): Remember the session so that we
7447     can unsubscribe properly. Use the new class constant to
7448     unsubscribe from the old session and subscribe to the new one.
7449     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
7450     subscriptions of the SessionTreeCtrl.
7451     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
7452    
7453     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
7454     Session Tree" command to the file menu.
7455    
7456     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
7457     as update_region to the renderer.
7458    
7459     * Thuban/UI/renderer.py
7460     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
7461     update box is now directly a tuple, not a wxRect anymore.
7462    
7463     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
7464     prints.
7465    
7466     2002-05-07 Bernhard Herzog <[email protected]>
7467    
7468 bh 146 * setup.py: Add the shptree extension module. See
7469     extensions/pyshapelib/ChangeLog for more details.
7470    
7471     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
7472     extensions/shapelib/dbfopen.c: Really update to the versions of
7473     shapelib 1.2.9. For some reason it wasn't really done on
7474     2002-04-11.
7475    
7476     * extensions/shapelib/shptree.c: Modified version of shptree.c of
7477     shapelib 1.2.9. The only real difference is the use of qsort
7478     instead of a bubble sort implementation
7479    
7480     * Thuban/Model/layer.py (Layer.__init__): New instance variable
7481     shapetree to hold the shapelib quadtree for the shapefile
7482     (Layer.open_shapefile): Create the quad tree.
7483     (Layer.ShapesInRegion): New method to return the ids of shapes in
7484     a given region using the quad tree.
7485    
7486     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
7487     comment
7488     (draw_polygon_shape): Accept both arcs and polygons.
7489     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
7490     the api.
7491    
7492     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
7493     return the shape ids to be rendered in a given layer.
7494     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
7495     ids. Use draw_polygon_shape to draw arc shapes as well.
7496     (ScreenRenderer.RenderMap): New parameter for the rectangle that
7497     has to be updated
7498     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
7499     calling it's ShapesInRegion method.
7500    
7501     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
7502     update_region for the update region.
7503     (MapCanvas.OnPaint): Maintain the update region
7504     (MapCanvas.do_redraw): Pass the bounding box of the update_region
7505     to the renderer when drawing the bitmap. Reset the update_region.
7506    
7507 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
7508    
7509 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
7510     MainWindow.OpenSession): Change the file extension of the session
7511     files to .thuban
7512    
7513 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
7514     Move the map channels to be forwarded by the session into the
7515 bh 146 class constant with forwarded_channels. Also add
7516     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
7517     forwarded_channels
7518 bh 129
7519     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
7520     typo and some rewording).
7521    
7522 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
7523    
7524     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
7525     around to speed up most redraws:
7526     (MapCanvas.__init__): New instance variable bitmap which holds the
7527     bitmap
7528     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
7529     self.bitmap to draw.
7530     (MapCanvas.full_redraw): New method to force a full redraw
7531     including the bitmap
7532     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
7533     make sure the bitmap is redrawn.
7534     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
7535     MapCanvas.shape_selected): Call full_redraw instead of readraw to
7536     make sure the bitmap is redrawn.
7537     (MapCanvas.OnSize): New method to handle size events so that the
7538     bitmap can be redrawn.
7539    
7540 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
7541    
7542     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
7543     canvas' VIEW_POSITION event
7544     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
7545     Update the text in the status-bar accordingly.
7546    
7547     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
7548     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
7549     called.
7550     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
7551     current_position
7552     (MapCanvas.set_current_position): New method to set
7553     current_position. Issue a VIEW_POSITION event
7554     (MapCanvas.CurrentPosition): New public method to return the value
7555     of current_position. Should be called when the VIEW_POSITION event
7556     is processed.
7557     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
7558     Update the position.
7559     (MapCanvas.OnLeaveWindow): Set the position to None.
7560    
7561     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
7562     position in the statusbar
7563    
7564 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
7565 frank 120
7566     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
7567    
7568 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
7569    
7570 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
7571    
7572     * Resources/Bitmaps/fullextent.xpm: new
7573 jan 116
7574 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
7575 jan 116
7576 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
7577     box
7578 jan 114
7579 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
7580    
7581 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
7582    
7583     * Thuban/UI/tree.py (update_tree): added added map extent
7584    
7585     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
7586 tkoester 403 icon; added map_full_extend as tool
7587 jan 114
7588 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
7589 jan 107
7590     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
7591     saving _new_ sessions
7592    
7593     * Thuban/Model/session.py (create_empty_session): new session
7594     don't have a filename (set to None)
7595    
7596     * Thuban/UI/tree.py (update_tree): added filename and modified flag
7597    
7598     * Thuban/Model/load.py (ProcessSession): convert projection
7599     parameters from unicode to regular string
7600    
7601     * Data/iceland_sample.session: Added UTM Zone 26 projection.
7602    
7603 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
7604    
7605     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
7606     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
7607     1.2.9
7608    
7609     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
7610     the pyshapelib directoy into the list of include dirs, so that
7611     pyshapelib_api.h can be found.
7612    
7613     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
7614     holds the pyshapelib C-API
7615     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
7616     pyshapelib_api to access the shapelib functions.
7617     (initwxproj): Import the c_api from the shapelib module and
7618     initialize pyshapelib_api.
7619    
7620 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
7621    
7622 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
7623     initialize_options to create the scripts for the rpm.
7624    
7625 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
7626    
7627 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
7628    
7629 bh 87 * setup.py: Increment version to 0.1.1
7630    
7631 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
7632     Layer" and "Remove Layer" commands from the layer menu to the map
7633     menu
7634    
7635 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
7636    
7637     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
7638     argument (python <= 1.5.2 erroneously accepted multiuple
7639     arguments)
7640    
7641 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
7642    
7643     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
7644     RecordGrid in the identifyview.
7645     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
7646     IdentifyListCtrl. The grid allows editing of the values.
7647    
7648     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
7649     implementing a grid for a single row of a thuban table.
7650    
7651     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
7652     layers by default. Easier to use than the previous default of only
7653     searching through the select layer which meant that if no layer
7654     was selected, you couldn't select a shape.
7655    
7656     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
7657    
7658     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
7659     stroke_width attribute
7660    
7661     * Thuban/Model/save.py (save_session): Write the new stroke_width
7662     attribute
7663    
7664     * Thuban/Model/load.py (ProcessSession.startElement): Read the
7665     stroke_width attribute
7666    
7667     * Thuban/Model/layer.py (Layer.__init__): New parameter and
7668     instance variable stroke_width
7669     (Layer.SetStrokeWidth): Set the stroke_width.
7670    
7671 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
7672    
7673     * extensions/thuban/wxproj.cpp (project_points): Fix two
7674     off-by-one errors in the last loop that joins the various parts
7675     together.
7676    
7677 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
7678    
7679     * setup.py (data_dist.make_distribution): Fix some typos
7680    
7681 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
7682    
7683     * README: Slight tweaking in preparation for the 0.1 release
7684    
7685     * setup.cfg: Add section for sdist to create both tgz and zip
7686     archives
7687    
7688     * setup.py: increase version number to 0.1
7689     (data_dist): New command class for data distribution
7690    
7691 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
7692    
7693 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
7694     Handle the case of no layer (i.e. layer is None) properly.
7695    
7696 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
7697 bh 70 Set the initial selection of the combo boxes to reflect the
7698     projection we're starting with in a way that works on windows,
7699     too.
7700    
7701 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
7702     puiblisher's ids in hex to make it easier to compare them to the
7703     standard repr of python methods
7704    
7705     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
7706     messages
7707    
7708 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
7709    
7710 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
7711     deselect the layer if no layer is selected
7712    
7713 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
7714     idle time when there actually is something to draw. If there's
7715     nothing to draw simply clear the window
7716     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
7717     (MapCanvas.SetMap): force a redraw in all cases because
7718     FitMapToWindow doesn't always do it.
7719     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
7720     specify the point to move into the center of the window
7721     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
7722     dragged, zoon in/out by a factor of 2
7723 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
7724     index, i.e. reversed drawing order) so that objects appearing to
7725     be in from of others are selected first. This is probably mostly
7726     relevant for point shapes where the symbols used may overlap
7727 bh 59
7728     * Thuban/Model/session.py (create_empty_session): Unset the
7729     modified bit before returning it
7730    
7731     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
7732     create_empty_session session to create the new, empty session.
7733    
7734     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
7735     the tool bitmaps.
7736     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
7737     the code that asks whether the session should be saved into the
7738     new method save_modified_session.
7739     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
7740     method to save modified session here too.
7741    
7742 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
7743    
7744     * setup.py (InnoIconItem): fix typo
7745    
7746     (thuban_bdist_inno.run):
7747     (bdist_inno.run): Move the decision not to create symlinks on
7748     non-nt platforms to thuban_bdist_inno and do it unconditinally
7749     since we never want to create the symlinks here
7750    
7751 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
7752    
7753 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
7754     identify view immediately
7755    
7756     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
7757     and SelectableRecordListCtrl that implement the code shared by the
7758     identify view and the label dialog
7759    
7760     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
7761     new class RecordListCtrl
7762    
7763     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
7764     return value of GetValue is None instead of using it as a boolean
7765     directly so that Zero numbers are handled properly.
7766     (LabelListCtrl): Derive from the new class
7767     SelectableRecordListCtrl
7768    
7769 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
7770     (Proj4Dialog.dialogLayout): Make the window resizable and set the
7771     size of the text control explicitly to make the sizers work on
7772     both Windows and X.
7773    
7774 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
7775    
7776     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
7777     that can limit the search to the currently selected layer.
7778     (MapCanvas.SelectShapeAt): Make sure that the currently selected
7779     layer stays selected even when no shape is found
7780 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
7781     height do nothing (avoids zero division errors)
7782 bh 44
7783 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
7784    
7785 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
7786     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
7787     convenient :-)
7788     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
7789     a new instvar layer_to_item to map layers to tree items
7790     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
7791     to match the current selection in the interactor
7792    
7793 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
7794     (Interactor.HasSelectedLayer): New methods to query the current
7795     selection
7796    
7797     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
7798     (MainWindow.has_selected_layer): Simply call the appropriate
7799     interactor method
7800    
7801     * Thuban/UI/mainwindow.py (MainWindow.__init__):
7802     (MainWindow.LayerShowTable):
7803     (MainWindow.identify_view_on_demand): Store the interactor in an
7804     instvar and use that reference instead of going through main.app
7805    
7806 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
7807     * Thuban/UI/application.py (ThubanApplication.OnInit):
7808 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
7809     with the new mainwindow method ShowSessionTree and not directly
7810     the application's OnInit method
7811    
7812     * Thuban/UI/tree.py (myTreeCtrlPanel):
7813     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
7814     TreeCtrl isntead of a panel. This affects most method since we now
7815     refer to self instead of self.tree
7816     (SessionTreeView): New class implementing a non-modal dialog
7817     showing the session tree.
7818    
7819 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
7820     layer to the tableview dialog.
7821    
7822     * Thuban/UI/tableview.py: Add some doc-strings
7823 tkoester 403 (TableGrid):
7824 bh 35 (TableGrid.OnRangeSelect):
7825     (TableGrid.OnSelectCell):
7826     (TableFrame.__init__):
7827     (TableFrame.row_selected):
7828     Selecting rows in the grid view now updates the selected shapes
7829     through the TableFrame. To achieve this we derive TableGrid from
7830     Publisher and introduce the message type ROW_SELECTED which the
7831     TableFrame subscribes to and which is issued by OnRangeSelect and
7832     OnSelectCell
7833    
7834     (DataTable.SelectRow): Removed because it's no longer needed in
7835     the row/shape selection scheme
7836    
7837 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
7838     dialogs
7839    
7840     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
7841     the SELECTED_SHAPE message anymore. This is now handled by the
7842     parent.
7843     (TableGrid.select_shape): Only update the selection if the shape
7844     is not None.
7845     (TableFrame): Inherit from the new NonModalDialog class.
7846     (TableFrame.__init__, TableFrame.select_shape): Handle the
7847     SELECT_SHAPE message.
7848     (TableFrame.OnClose): Extend the inherited method to unsubscribe
7849     SELECT_SHAPE
7850    
7851     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
7852     (MainWindow.add_dialog):
7853     (MainWindow.dialog_open):
7854     (MainWindow.remove_dialog):
7855     (MainWindow.get_open_dialog): New methods to maintain a dictionary
7856     of opened non-modal dialogs.
7857    
7858     (MainWindow.__init__): Initialize the new non-modal dictionary
7859     management code
7860     (MainWindow.LayerShowTable): maintain separate dialogs for each
7861     table using the non-modal dialog management code to only open a
7862     view once for each table.
7863    
7864     (MainWindow.IdentifyTool):
7865     (MainWindow.__init__):
7866     (MainWindow.identify_view_on_demand): Don't open the identify view
7867     in IdentifyTool anymore. This will be done automatically by the
7868     new method identify_view_on_demand which handles the
7869     SELECTED_SHAPE message so that the identify view will be opened on
7870     demand
7871    
7872     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
7873     the interactor argument. The SELECTED_SHAPE message is now handled
7874     by the parent.
7875     (IdentifyView.__init__): Add the interactor argument so that we
7876     can handle the SELECTED_SHAPE message here
7877     (IdentifyView.selected_shape): New method to handle the
7878     SELECTED_SHAPE messages
7879    
7880     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
7881     NonModalDialog class
7882     (IdentifyView.OnClose): Extend the inherited version to
7883     unsubscribe SELECT_SHAPE
7884    
7885     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
7886    
7887 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
7888    
7889     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
7890 tkoester 403
7891 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
7892     interactor to pass through to the MapCanvas
7893 tkoester 403
7894 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
7895     argument to the MainWindow constructor to get rid of the ugly hack
7896     that made main.app available early just so that the mapcanvas
7897     could access the interactor object.
7898    
7899 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
7900    
7901 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
7902     that runs a modal message box
7903     (MainWindow.OnClose): Use the new method
7904     (MainWindow.RemoveLayer): Just do nothing in case no layer is
7905     selected. The command should be grayed out anyway, so there's no
7906     need to pop up a message box.
7907     (MainWindow.AddLayer): Pop up a message box with an error message
7908     if the shape file can't be opened
7909    
7910     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
7911     immediately. This will cause an exception in case the file can't
7912     be opened and we can display an appropriate message.
7913    
7914 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
7915    
7916     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
7917     specific bdist_rpm command.
7918    
7919     * Thuban/UI/main.py: Catch ImportError exceptions when importing
7920     the locale module because it may not be available on some
7921     installations.
7922    
7923     * extensions/pyprojection/LICENSE: Copy of the license text in
7924     Projection.i. Having it in a separate file makes it easier to
7925     refer to license text in e.g. RPMs
7926    
7927 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
7928    
7929 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
7930     more generic
7931    
7932     * setup.py (ThubanInstall.get_outputs): Add the symlink in
7933     <prefix>/bin to the outputs
7934     (ThubanInstall.link_file): New method to link files. We need this
7935     because the standard copy_files refuses to link non-existing
7936     files.
7937     (ThubanInstall.run): Remove the leading install root from the
7938     script filename if an install root was specified and use the new
7939     link_file method
7940 tkoester 403
7941 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
7942     the window when the first layer is added to the map.
7943    
7944     * setup.py (ThubanInstall.run): Honor the build root (self.root)
7945     when linking thuban.py to <prefix>/bin
7946    
7947 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
7948    
7949     * setup.py: In the setup call, the install parameters shouldn't
7950     have trailing slashes because distutils on non-posix platforms
7951     doesn't like that. The same applies to other directories like
7952     "Resources/Bitmaps"
7953    
7954     In the configuration section for nt, move the wxWindows directory
7955     optins into the part clearly marked as editable.
7956    
7957     (InstallLocal.initialize_options):
7958     (InstallLocal.user_options): remove the currently unused debug
7959     flag
7960     (thuban_build_py.find_all_modules): Add this method so that it
7961     works for our case of having packages and modules in one
7962     distribution as well.
7963     (ThubanInstall.initialize_options):
7964     (ThubanInstall.finalize_options):
7965     (ThubanInstall.user_options):
7966     (ThubanInstall.boolean_options): Add new options, do-symlink and
7967     extra files. Since these are the first ThubanInstall specific
7968     options, override user_options and boolean_options
7969     (ThubanInstall.run): Honor the new do-symlink and extra-files
7970     options.
7971     (ThubanInstall.get_outputs): Add to override the base-class's
7972     version and add the extra-files to the outputs
7973     (bdist_inno): New class for windows distributions with Inno Setup
7974     (InnoIconItem): Helper class for bdist_inno
7975     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
7976     this together with the appropriate parameters, to the setup call.
7977 tkoester 403
7978 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
7979     installer
7980    
7981     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
7982     changing_selection to avoid recursive selection events when
7983     modifying the selection in response to a selection event.
7984     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
7985     changing the tree's selection.
7986     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
7987     we're not being called indirectly from normalize_selection.
7988    
7989     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
7990     event.Check only if the command is actuall checkable.
7991     (MainWindow.__init__): Call the toolbar's Realize method to make
7992     sure that the items are actually shown
7993    
7994 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
7995    
7996 bh 9 * setup.py: Fix some doc strings
7997    
7998 bh 7 * ChangeLog: started
7999    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26