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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1281 - (hide annotations)
Fri Jun 20 18:29:26 2003 UTC (21 years, 8 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 202194 byte(s)
update ChangeLog

1 bh 1281 2003-06-20 Bernhard Herzog <[email protected]>
2    
3     * test/xmlsupport.py (SaxEventLister.startElementNS)
4     (SaxEventLister.endElementNS): Do not include the qname. Python
5     2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
6     is (presumably incorrectly) None, whereas it's a string with the
7     element name in the later versions.
8    
9     * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
10     (TestEventList.test_even_list_namespace): Update tests to reflect
11     the new behaviour
12     (TestEventList.test_even_list_id_normalization): Fix doc-string
13    
14 jonathan 1272 2003-06-20 Jonathan Coles <[email protected]>
15    
16 jonathan 1279 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
17     by deriving classes to determine if that layer supports shapes.
18     (Layer): Override HasShapes and return true.
19    
20     * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
21     instead of a direct call to wx[Begin|End]CusyCursor().
22     (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
23     table data.
24    
25     * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
26     New. Wrappers around the wxWindows functions that allow us to
27     make additional calls such as wxYield which gives the native
28     system a chance to update the cursor correctly.
29    
30     * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
31     instead of a direct call to wx[Begin|End]CusyCursor().
32    
33     * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
34     instead of a direct call to wx[Begin|End]CusyCursor().
35     (MapCanvas.find_shape_at): Check if the current search layer
36     support shapes, otherwise go on to the next layer.
37    
38     * test/test_layer.py: Add tests in each type of layer for
39     HasClassification() and HasShapes()
40    
41     2003-06-20 Jonathan Coles <[email protected]>
42    
43 jonathan 1272 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
44     turning on the busy cursor to allow the system to change the
45     cursor before we begin painting. This fixes a problem that
46     was occuring only under GTK. Fixes RTbug #1840.
47    
48 bh 1270 2003-06-20 Bernhard Herzog <[email protected]>
49    
50     * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
51     version.
52    
53     * Thuban/Model/save.py (sort_data_stores): New. Make topological
54     sort of the data sources so they can be written with sources that
55     data sources that depend on other data sources come after the
56     sources they depend on.
57     (SessionSaver.__init__): Add idmap instance variable to map from
58     objects to the ids used in the file.
59     (SessionSaver.get_id, SessionSaver.define_id)
60     (SessionSaver.has_id): New. Methods to manage the idmap
61     (SessionSaver.write): Use thuban-0.8.dtd
62     (SessionSaver.write_session): Add a namespace on the session and
63     write out the data sources before the maps.
64     (SessionSaver.write_data_containers): New. Write the data
65     containers.
66     (SessionSaver.write_layer): Layer elements now refer to a
67     shapestore and don't contain filenames anymore.
68    
69     * Thuban/Model/load.py (LoadError): Exception class to raise when
70     errors in the files are discovered
71     (SessionLoader.__init__): Define dispatchers for elements with a
72     thuban-0.8 namespace too.
73     (SessionLoader.check_attrs): New helper method to check and
74     convert attributes
75     (AttrDesc): New. Helper class for SessionLoader.check_attrs
76     (SessionLoader.start_fileshapesource)
77     (SessionLoader.start_derivedshapesource)
78     (SessionLoader.start_filetable, SessionLoader.start_jointable):
79     Handlers for the new elements in the new fileformat
80     (SessionLoader.start_layer): Handle the shapestore attribute in
81     addition to filename.
82     (SessionLoader.start_table, SessionLoader.end_table): Removed.
83     They were never used in the old formats and aren't needed for the
84     new.
85    
86     * Thuban/Model/session.py (Session.DataContainers): New method to
87     return all "data containers", i.e. shapestores and tables
88    
89     * test/xmlsupport.py (SaxEventLister.__init__)
90     (SaxEventLister.startElementNS, sax_eventlist): Add support to
91     normalize IDs.
92    
93     * test/test_xmlsupport.py
94     (TestEventList.test_even_list_id_normalization): New test case for
95     id normalization
96    
97     * test/test_load.py (LoadSessionTest.check_format): Use ID
98     normalization
99     (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
100     class atrributes used for ID normalization
101     (TestSingleLayer, TestLayerVisibility, TestLabels.test)
102     (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
103     file format
104     (TestJoinedTable): New test for loading sessions with joined
105     tables.
106     (TestLoadError): New. Test whether missing required attributes
107     cause a LoadError.
108    
109     * test/test_save.py (SaveSessionTest.thubanids)
110     (SaveSessionTest.thubanidrefs): New class attributes for ID
111     normalization in .thuban files.
112     (SaveSessionTest.compare_xml): Use id-normalization.
113     (SaveSessionTest.testEmptySession)
114     (SaveSessionTest.testLayerProjection)
115     (SaveSessionTest.testRasterLayer)
116     (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
117     (SaveSessionTest.testLayerProjection): The filename used was the
118     same as for testSingleLayer. Use a different one.
119     (SaveSessionTest.test_dbf_table)
120     (SaveSessionTest.test_joined_table): New test cases for saving the
121     new data sources structures.
122     (TestStoreSort, MockDataStore): Classes to test the sorting of the
123     data stores for writing.
124    
125     * test/runtests.py: Add CVS keywords
126    
127 jonathan 1265 2003-06-20 Jonathan Coles <[email protected]>
128    
129 jonathan 1267 * test/test_session.py
130     (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
131     Use the cultural_landmark-point.dbf file for the store so that
132     the table rows and shape count match.
133    
134     2003-06-20 Jonathan Coles <[email protected]>
135    
136 jonathan 1265 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
137     an exception if the number of shapes is different from the
138     number of rows in the table. Address RTbug #1933.
139    
140     * test/test_layer.py (TestLayer.test_derived_store): Add
141     a test for the new exception in DerivedShapeStore.__init__.
142    
143     * test/support.py (FloatTestCase): Removed since there is
144     already FloatComparisonMixin. Fixes RTbug #1954.
145     (FloatComparisonMixin.assertFloatEqual): Include test for
146     infinity that was part of FloatTestCase.
147    
148     * test/test_range.py (RangeTest): Inherit from
149     support.FloatComparisonMixin now that we don't have
150     support.FloatTestCase.
151    
152 bh 1256 2003-06-20 Bernhard Herzog <[email protected]>
153    
154 bh 1260 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
155     the implementation in xmlsupport instead.
156     (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
157    
158     * test/test_proj.py: Import sax_eventlist from xmlsupport instead
159     of test_save
160    
161     2003-06-20 Bernhard Herzog <[email protected]>
162    
163 bh 1258 * test/test_load.py (LoadSessionTest.check_format): New helper
164     method to make sure the test files we load might have been written
165     by the current thuban version.
166     (ClassificationTest.TestLayers, TestSingleLayer.test)
167     (TestLayerVisibility.test, TestClassification.test)
168     (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
169     Add check_format() calls and fix the thuban data to match the data
170     that would be written by saving the session loaded from it.
171    
172     * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
173     the same class and function in test_save.
174    
175     * test/test_xmlsupport.py (TestEventList): New. test cases for
176     sax_eventlist
177    
178     2003-06-20 Bernhard Herzog <[email protected]>
179    
180 bh 1256 * Resources/XML/thuban.dtd: Add comment about which versions of
181     Thuban are covered by this DTD
182     (map): Fix content model for layers and raster layers. There can
183     be any number or layers and raster layers in any order.
184    
185 jonathan 1254 2003-06-20 Jonathan Coles <[email protected]>
186    
187 jonathan 1265 This is mainly about fixing RTbug #1949.
188    
189 jonathan 1254 * Thuban/Model/classification.py: Remove "from __future__"
190     import statement since python 2.2 is the earliest supported
191     version.
192    
193     * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
194     Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
195     depending on the units this projection *forwards* into.
196    
197     * Thuban/Model/save.py (SessionSaver.write_classification):
198     Remove unnecessary use of lambdas and nested functions.
199    
200     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
201     adjustment here if the map projection uses degrees.
202    
203     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
204     scale adjust code since it is now done before calling
205     this method. Don't do anything if the map projection
206     is None.
207    
208 bh 1244 2003-06-19 Bernhard Herzog <[email protected]>
209    
210 bh 1248 Move version specific load tests to their own file.
211    
212     * test/test_load.py: Expand the doc-string to explain a bit how to
213     handle file format changes.
214     (TestClassification.test): Update the docstring as this test is
215     not about Thuban 0.2 anymore.
216    
217     * test/test_load_0_2.py: New file with the load tests for thuban
218     files created with Thuban 0.2 and earlier.
219    
220     2003-06-19 Bernhard Herzog <[email protected]>
221    
222 bh 1246 Add XML validation to some of the tests. Validation will only be
223     done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
224     To make the DTD available to the test cases it's moved into
225     Resources/XML
226    
227     * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
228     for versions up to and including 0.2. Two slight changes: added an
229     encoding specification and fixed the comment which refered to
230     GRASS, not Thuban
231    
232     * test/xmlsupport.py: New support module for tests involving XML.
233     Currently there's a mix-in class for XML validation.
234    
235     * test/test_xmlsupport.py: New. Tests for the xmlsupport module
236    
237     * test/test_save.py (SaveSessionTest): Derive from ValidationTest
238     so that we can validate the
239     (SaveSessionTest.testEmptySession)
240     (SaveSessionTest.testSingleLayer)
241     (SaveSessionTest.testSingleLayer)
242     (SaveSessionTest.testLayerProjection)
243     (SaveSessionTest.testRasterLayer)
244     (SaveSessionTest.testClassifiedLayer): Validate the generated XML
245    
246     * test/runtests.py (main): Call print_additional_summary instead
247     of print_garbage_information
248    
249     * test/support.py (resource_dir): New function to return the
250     "Resource" subdirectory
251     (print_additional_summary): New function to combine several
252     summary functions
253     (run_tests): Use print_additional_summary instead of calling
254     print_garbage_information directly
255    
256     2003-06-19 Bernhard Herzog <[email protected]>
257    
258 bh 1244 * Doc/thuban.dtd (classification): Correct the content model of
259     the classification element.
260     (projection): Add the "name" attribute
261    
262 frank 1242 2003-06-19 Frank Koormann <[email protected]>
263    
264     MERGE from the greater-ms3 branch.
265    
266     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
267     scale if projection is latlong to get better estimate.
268    
269     Fix problem of hidden properties dialog under windows after double
270     click on layer tree:
271     The tree control always gets an Expanded / Collapsed event after
272     the ItemActivated on double click, which raises the main window again. We add a second ItemActivated event to the queue, which simply
273     raises the already displayed window.
274    
275     * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
276     raiseProperties initialized to prevent endless loops
277     (LegendTree._OnItemActivated): Depending on self.raiseProperties
278     simply raise the properties or open the dialog and issue a second
279     event.
280    
281 jonathan 1235 2003-06-18 Jonathan Coles <[email protected]>
282    
283 jonathan 1239 * setup.py: Fix a few problems that occured under Windows.
284    
285     2003-06-18 Jonathan Coles <[email protected]>
286    
287 jonathan 1235 When Thuban loaded the map was redrawn twice because the
288     legend was being opened after the mainwindow was created
289     and not during its creation. This meant the map was drawn
290     initially and then had to be redrawn when the legend
291     caused the display to change. Now the legend is opened
292     in the mainwindow constructor which resolves this issue.
293    
294     Also, although we were checking for the existence of
295     gdal and gdalwarp modules, the gdalwarp extension was
296     still being compiled (which may fail if the system doesn't
297     have gdal installed). the build_ext command to setup.py
298     now accepts the flags --with-gdal and --without-gdal.
299     If --without-gdal is specified setup.py will try to
300     use the gdal parameters specified by gdal-config. Under
301     windows, those parameters have to be set in setup.py
302     as with proj4 an wxWindows.
303    
304     * setup.py: Use a list instead of seperate variables for
305     extension parameters so we can create a generic function
306     that runs an appropriate *-config script.
307     (run_cs_script): Renamed from run_wx_script and modified
308     to accept a second argument which is a list of lists to
309     be filled in by the values returned from running the command.
310     (thuban_build_ext): New. Extends the build_ext command and
311     provides the options --with-gdal/--without-gdal which then
312     optionally includes the gdalwarp extension.
313    
314     * Thuban/Model/resource.py: First check if we can import
315     the gdalwarp Thuban extension before checking for gdal.
316     Also added some comments.
317    
318     * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
319     the map is None which may be the case if none has been loaded
320     yet.
321    
322     * Thuban/UI/main.py (main): Remove call to ShowLegend.
323    
324     * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
325    
326     * Thuban/UI/renderer.py: Check for gdal support before importing
327     gdalwarp.
328     (MapRenderer.render_map): Only try to optimize if we have gdal
329     support otherwise nothing will get drawn.
330    
331 jonathan 1237 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
332     during startup before a map has been created. Check if map is None
333     before using it and do nothing if it is.
334    
335 jonathan 1224 2003-06-17 Jonathan Coles <[email protected]>
336    
337     Fix the problem with raster layers under Windows that caused
338     Thuban to crash. The view should respond to layer projection
339     changed events to update the display. Changes to a projection
340     should not cause the map to be set to full extent.
341    
342     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
343     current_map_proj to remember the current map projection so that
344     when the projection changes we know what the previous projection
345     was.
346     (MapCanvas.SetMap): Unsubscribe and subscribe to
347     LAYER_PROJECTION_CHANGED events.
348     (MapCanvas.projection_changed): Split into two methods that respond
349     to map and layer projection changes.
350     (MapCanvas.map_projection_changed): New. Takes the current view and
351     projects it using the new projection. This does not cause the
352     map to be redrawn at full extent.
353     (MapCanvas.layer_projection_changed): New. Cause a redraw which
354     will draw each layer in its new projection.
355    
356     * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
357     VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
358     under Windows.
359    
360     * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
361     to twice sizeof(void*) because there are two digits for each
362     hex byte.
363    
364 bh 1220 2003-06-16 Bernhard Herzog <[email protected]>
365    
366     Update to the layer interface: Direct access to the table,
367     shapetable, shapefile and filename attributes is now actively
368     deprecated by issuing deprecation warnings for all places where
369     this happens.
370    
371     * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
372     to the instance variables table, shapetable, shapefile and
373     filename via __getattr__ so that we can issue a deprecation
374     warning.
375     (Layer.SetShapeStore): Don't set the deprecated instance variables
376     any more
377     (Layer.SetShapeStore): Don't use deprecated layer instance
378     variables
379     (Layer.Destroy): No need to explicitly remove the instance
380     variables any more
381     (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
382     instance variables
383    
384     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
385     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
386     (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
387     use deprecated layer instance variables
388    
389     * Thuban/UI/classifier.py (Classifier.__init__): Don't use
390     deprecated layer instance variables
391    
392     * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
393     (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
394     instance variables
395    
396     * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
397     deprecated layer instance variables
398    
399     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
400     deprecated layer instance variables
401    
402     * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
403     deprecated layer instance variables
404    
405     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
406     (MapRenderer.polygon_render_param): Don't use deprecated layer instance
407     variables
408    
409     * test/runtests.py (main): Turn Thuban's deprecation warnings into
410     errors so that they're cought by the tests
411    
412     * test/test_load.py (TestSingleLayer.test): Don't use deprecated
413     layer instance variables
414    
415 jonathan 1212 2003-06-16 Jonathan Coles <[email protected]>
416    
417     Fix a problem under Windows whereby if the user double-clicks on a
418     layer in the legend that tree item will expand or collapse as well
419     as open the layer properties dialog. The state of the tree item
420     should not be affected.
421    
422     * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
423     preventExpandCollapse and subscribe to expanding and collapsing
424     events.
425     (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
426     collapsing events and will veto the event if it has been triggered
427     by the user double clicking on a layer.
428     (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
429     that an expanding/collapsing event should be vetoed.
430    
431 bh 1208 2003-06-13 Bernhard Herzog <[email protected]>
432    
433     * Thuban/UI/classifier.py (Classifier.OnClose)
434     (Classifier.map_layers_removed)
435     (Classifier.layer_shapestore_replaced): Unsubscribe the messages
436     in OnClose and not in map_layers_removed or
437     layer_shapestore_replaced to make sure it always happens when the
438     dialog is closed
439    
440 jonathan 1201 2003-06-13 Jonathan Coles <[email protected]>
441    
442 jonathan 1203 This puts back a fix for Windows where a panel is needed so that
443     the background of the table view appears correctly.
444    
445     * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
446     object that can be used by derived classes to place any
447     controls (including the grid) onto.
448     (QueryTableFrame.__init__): Use the panel as the parent window
449     for all the controls. Reparent the grid so that the panel is
450     the parent. Call UpdateStatusText() to correctly initialize
451     the status bar.
452    
453     2003-06-13 Jonathan Coles <[email protected]>
454    
455 jonathan 1201 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
456     from wxFrame (as opposed to wxDialog like the other classes)
457     but otherwise behaves like the other classes. This is needed
458     for the TableView which isn't really a dialog and needs to
459     have a status bar and control buttons.
460    
461     * Thuban/UI/tableview.py (TableGrid.__init__): Create an
462     instance variable to keep track of how many rows are selected.
463     Subscribe once to the the events we are interested in.
464     (ThubanGrid.OnRangeSelect): Only handle event if event handling
465     hasn't been turned off.
466     (ThubanGrid.OnSelectCell): Only handle event if event handling
467     hasn't been turned off.
468     (ThubanGrid.ToggleEventListeners): Rather than subscribe None
469     as an event listener (which changes the event handler stack)
470     simply set an instance variable to False. This is checked in
471     the event handlers.
472     (ThubanGrid.GetNumberSelected): Return the number of currently
473     selected rows.
474     (TableFrame): Inherit from ThubanFrame so we can have a
475     status bar and control buttons.
476     (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
477     Explicitly set which items are selected in the operator choice and
478     action choice so there is always a valid selection. Fixes RTbug #1941.
479     Subscribe to grid cell selection events so we can update the
480     status bar.
481     (QueryTableFrame.UpdateStatusText): Update the status bar with
482     how many rows are in the grid, how many columns, and how many
483     rows are selected.
484     (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
485     Call UpdateStatusText when cells are (de)selected.
486     (QueryTableFrame.OnQuery): Use the string value in the value
487     combo if either the selected item index is 0 or if the string
488     cannot be found in the predefined list (this happens if the
489     user changes the text). Fixes RTbug #1940.
490     Only turn off the grid event listeners if there a query comes
491     back with a none empty list of ids. in the case that the list
492     is empty this causes a grid.ClearSelection() call to actually
493     clear the grid selection which causes the selected items in
494     the map to be deselected. Fixes RTbug #1939.
495    
496     * test/test_save.py (XMLWriterTest.Encode): Check return values.
497     Fixes RTbug #1851.
498    
499 bh 1195 2003-06-13 Bernhard Herzog <[email protected]>
500    
501     * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
502     self.selected_shape with the current selection to make sure the
503     contents of the dialog are up to date when it's shown for the
504     first time.
505     The dialog used to work without this by luck. The recent fix to
506     the connector module 'broke' a 'feature' the identify view was
507     relying on, i.e that subscribing to a message in response to
508     receiving a message of that type would mean that the new
509     subscriber would also be called for the same message.
510    
511 jonathan 1169 2003-06-12 Jonathan Coles <[email protected]>
512 jonathan 1175
513 jonathan 1193 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
514     the image is rendered. Fixes RTbug #1937.
515    
516     2003-06-12 Jonathan Coles <[email protected]>
517    
518 jonathan 1191 * Thuban/Lib/fileutil.py: As is done under Windows, create the
519 jonathan 1193 user directory if it doesn't exist on a posix system.
520     Fixes RTbug #1815.
521 jonathan 1191
522     * Thuban/Model/resource.py (get_user_proj_files): Moved the
523     called to get_application_dir here, so that the directory
524     will only be called if this method is invoked.
525    
526     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
527     the projfilepath if no projection is selected.
528    
529     2003-06-12 Jonathan Coles <[email protected]>
530    
531 jonathan 1182 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
532     the scalebar if the current map has no projection set.
533    
534     * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
535     projfilepath label to just the basename of the projection file
536     rather than include the entire path.
537    
538     * Thuban/Model/resource.py: Fix missed proj functions that
539     needed to be renamed.
540    
541     2003-06-12 Jonathan Coles <[email protected]>
542    
543 jonathan 1178 * Thuban/Model/classification.py: Removed assert statements that
544     tested if the variable was an instance of Color.
545    
546     * Thuban/Model/color.py (Color): Remove commented code that isn't
547     used.
548     (Transparent): Renamed from NoColor. Doesn't inherit from Color.
549     Fixes RTbug #1835.
550     (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
551     Needed now that the class doesn't inherit from Color.
552    
553     2003-06-12 Jonathan Coles <[email protected]>
554    
555 jonathan 1175 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
556     check unicode strings.
557    
558     * test/test_layer.py: Check for existence of gdal.
559    
560     2003-06-12 Jonathan Coles <[email protected]>
561 jonathan 1172
562     * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
563     that was in load.py
564 jonathan 1169
565 jonathan 1172 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
566     that was in save.py
567    
568     2003-06-12 Jonathan Coles <[email protected]>
569    
570 jonathan 1169 This is largely a collection of bug fixes. We also handle the
571     case where gdal is not on the system. The XMLReader and XMLWriter
572     classes were moved into there own files to resolve some circular
573     import references and because they shouldn't really be in the
574     file that is dediciated to reading/writing session files since
575     they are also used elsewhere.
576    
577     * Thuban/Model/classgen.py: Renamed functions to follow the
578     function_names_with_underscores style. Fixes RTbug #1903.
579     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
580    
581     * Thuban/Model/layer.py: Import gdal only if it available.
582     (RasterLayer): Handle the case where the gdal library is unavailable.
583     Addresses RTbug #1877.
584    
585     * Thuban/Model/load.py (XMLReader): Moved into seperate file
586     xmlreader.py.
587    
588 jonathan 1172 2003-06-12 Jonathan Coles <[email protected]>
589    
590     This is largely a collection of bug fixes. We also handle the
591     case where gdal is not on the system. The XMLReader and XMLWriter
592     classes were moved into there own files to resolve some circular
593     import references and because they shouldn't really be in the
594     file that is dediciated to reading/writing session files since
595     they are also used elsewhere.
596    
597     * Thuban/Model/classgen.py: Renamed functions to follow the
598     function_names_with_underscores style. Fixes RTbug #1903.
599     (calculate_quantiles): Raise ValueError if 'percents' is invalid.
600    
601     * Thuban/Model/layer.py: Import gdal only if it available.
602     (RasterLayer): Handle the case where the gdal library is unavailable.
603     Addresses RTbug #1877.
604    
605     * Thuban/Model/load.py (XMLReader): Moved into seperate file
606     xmlreader.py.
607    
608 jonathan 1169 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
609     file xmlwriter.py.
610    
611     * Thuban/Model/resource.py: Renamed functions to following the
612     function_names_with_underscores style.
613     (has_gdal_support): New function that returns true if the gdal
614     library is available. Addresses RTbug #1877.
615    
616     * Thuban/UI/application.py (ThubanApplication.OpenSession):
617     Display a message box if the gdal library is not available, but
618     only if there are any layers that would use it. Addresses RTbug #1877.
619    
620     * Thuban/UI/classgen.py: Use renamed projection resource functions.
621     (GenUniformPanel.__CalcStepping): Fix a slight discrepency
622     when using integers versus floats.
623    
624     * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
625     determine if the "Add Image Layer" menu option should be
626     greyed out or not. Addresses RTbug #1877.
627    
628     * Thuban/UI/projdialog.py: Use renamed projection resource functions.
629    
630     * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
631     optimize if a raster layer is visible. Fixes RTbug #1931.
632     Only draw the raster layer if the gdal library is available.
633     Addresses RTbug #1877.
634    
635     * test/test_classgen.py: Add tests for generate_singletons,
636     generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
637     (test_calculate_quantiles): Fix some tests to catch the new
638     ValueError that is raised.
639    
640     * test/test_proj.py: Use renamed projection resource functions.
641    
642     * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
643     test for saving classified layers. Fixes RTbug #1902.
644     (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
645    
646 jan 1156 2003-06-12 Jan-Oliver Wagner <[email protected]>
647    
648     Fix for http://intevation.de/rt/webrt?serial_num=1900.
649    
650     * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
651    
652     * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
653     multiplechoicedialog.py rather than from the wxPython library.
654    
655 frank 1151 2003-06-11 Frank Koormann <[email protected]>
656    
657 frank 1152 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
658     update.
659    
660     2003-06-11 Frank Koormann <[email protected]>
661    
662 frank 1151 * Thuban/Lib/fileutil.py (get_application_dir): New function to
663     determine the absolute .thuban/thuban directory under
664     "posix" (os.expanduser) and "nt" (read AppData registry key).
665    
666     * Thuban/Model/resource.py: Use get_application_dir
667    
668     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
669     Use get_application_dir.
670    
671 bh 1143 2003-06-10 Bernhard Herzog <[email protected]>
672    
673 bh 1147 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
674     the messages MAP_LAYERS_REMOVED messages
675     (LayerTableFrame.OnClose): Unsubscribe from it.
676     (LayerTableFrame.map_layers_removed): New. Receiver for
677     MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
678     dialog is showing is removed.
679    
680     2003-06-10 Bernhard Herzog <[email protected]>
681    
682 bh 1145 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
683     of the receivers list so that unsubscribing in a receiver doesn't
684     modify it while iterating over it.
685    
686     * test/test_connector.py
687     (ConnectorTest.test_disconnect_in_receiver): New. Test whether
688     unsubscribing in a receiver works correctly. See docstring for
689     details
690    
691     2003-06-10 Bernhard Herzog <[email protected]>
692    
693 bh 1143 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
694     message.
695    
696     * Thuban/Model/layer.py (Layer.SetShapeStore): Send
697     LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
698     LAYER_CHANGED will still be sent if the classification changes.
699    
700     * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
701     parameter so we can subscribe to some of its messages
702     (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
703     and the layer's LAYER_SHAPESTORE_REPLACED
704     (Classifier.unsubscribe_messages): New. Unsubscribe from message
705     subscribed to in __init__
706     (Classifier.map_layers_removed)
707     (Classifier.layer_shapestore_replaced): receivers for the messages
708     subscribed to in __init__. Unsubscribe and close the dialog
709    
710     * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
711     the map to the Classifier dialog
712    
713     * test/test_layer.py (SetShapeStoreTests): Derive from
714     SubscriberMixin as well so we can test messages
715     (SetShapeStoreTests.setUp): Subscribe to some of the layer's
716     messages
717     (SetShapeStoreTests.tearDown): Clear the messages again
718     (SetShapeStoreTests.test_sanity): Expand the doc-string and check
719     for the modified flag too
720     (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
721     to check whether SetShapeStore sets the modified flag
722     (SetShapeStoreTests.test_set_shape_store_different_field_name)
723     (SetShapeStoreTests.test_set_shape_store_same_field)
724     (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
725     Add tests for the messages. This checks both the new
726     LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
727    
728 jan 1141 2003-06-06 Jan-Oliver Wagner <[email protected]>
729    
730     * Thuban/UI/mainwindow.py: Improved and partly added help texts for
731     the menu items.
732    
733 frank 1134 2003-06-05 Frank Koormann <[email protected]>
734    
735 frank 1139 * Thuban/UI/identifyview.py (IdentifyView.__init__):
736     Layout reimplemented without panel. Make life easier to fit the list
737     in the dialog.
738    
739     2003-06-05 Frank Koormann <[email protected]>
740    
741 frank 1137 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
742     once on initialisation (Former implementation resulted in multiple
743     entries for each projection).
744     (ProjFrame.__FillAvailList): selectProj as second optional parameter,
745     if set, select the projection found under the specified name. This
746     overwrites any other selection estimate.
747     Removed projchoice filling from this method.
748     (ProjFrame._OnSave, ProjFrame._OnAddToList):
749     Updated call of ProjFrame.__FillAvailList
750     (LCCPanel._DoLayout): Moved parameter controls in more common order.
751    
752     * Resources/Projections/defaults.proj: Extended defaults representing
753     various common European projections.
754    
755     2003-06-05 Frank Koormann <[email protected]>
756    
757 frank 1134 * Thuban/UI/identifyview.py (IdentifyView.__init__):
758     Use ListCtrl instead of GridCtrl
759    
760     * Thuban/Model/resource.py:
761     Guess location of .thuban directory from tempdir parent directory.
762    
763     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
764     Guess location of .thuban directory from tempdir parent directory.
765    
766 bh 1130 2003-06-04 Bernhard Herzog <[email protected]>
767    
768     Do not cache the values returned by the tree widget's
769     GetFirstChild and GetNextChild methods because it led to lots of
770     segfaults. The new way requires more brute force but is more
771     reliable.
772    
773     * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
774     variable layer2id
775     (LegendTree.find_layer): New method to do with brute force what
776     layer2id tried to accomplish
777     (LegendTree._OnMsgLayerChanged)
778     (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
779     Use find_layer instead of layer2id
780     (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
781     update layer2id anymore
782     (LegendTree._OnMsgMapLayersRemoved)
783     (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
784    
785 tkoester 1128 2003-06-03 Thomas Koester <[email protected]>
786    
787     * Thuban/Model/classgen.py (GenQuantiles0): New function.
788    
789 bh 1120 2003-06-02 Bernhard Herzog <[email protected]>
790    
791 bh 1127 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
792     New commands.
793     (main_menu): Add the new commands.
794     (MainWindow.TableRename): New. Implementation of the table_rename
795     command.
796     (MainWindow.RenameLayer): New. Implementation of the layer_rename
797     command.
798    
799     * Thuban/Model/session.py (Session.AddTable): call self.changed to
800     set the modified flag
801    
802     * test/test_session.py (TestSessionSimple.test_add_table): Test
803     whether the modified flag is set properly
804    
805     * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
806     instead of issue so that the modified flags get updated.
807    
808     * test/test_base.py (SomeTitledObject): Derive from Modifiable
809     instead of Publisher to reflect reality better and to accomodate
810     the fact that SetTitle now calls changed instead of issue
811    
812     2003-06-02 Bernhard Herzog <[email protected]>
813    
814     * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
815     acquisition has to happen before the try in a try-finally.
816    
817     2003-06-02 Bernhard Herzog <[email protected]>
818    
819 bh 1120 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
820     possible that a layer is removed that is not currently selected in
821     the legend so don't check for this.
822    
823 bh 1112 2003-05-30 Bernhard Herzog <[email protected]>
824    
825 bh 1118 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
826     variables to None that have direct or indirect references to
827     shapefiles or dbf files to make sure that they do go away and the
828     files are closed.
829    
830     2003-05-30 Bernhard Herzog <[email protected]>
831    
832 bh 1116 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
833     availImgListIndices when a new image list is created
834    
835     2003-05-30 Bernhard Herzog <[email protected]>
836    
837 bh 1114 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
838     changing_selection to indicate whether the LegendTree code itself
839     is currently changing the selection
840     (LegendTree.normalize_selection): New method to normalize the
841     selection by selecting the layer item even if the user clicked on
842     the classification.
843     (LegendTree._OnSelChanged): normalize the selection. This works
844     around a bug in wx which doesn't keep track of the selection
845     properly when subtrees are deleted.
846    
847     2003-05-30 Bernhard Herzog <[email protected]>
848    
849 bh 1112 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
850     maximum and minimum scale factors.
851    
852     * test/test_classgen.py (ClassGenTest.test): Update to reflect the
853     changes in classgen.py
854    
855 jonathan 1109 2003-05-30 Jonathan Coles <[email protected]>
856    
857     * Thuban/Model/classgen.py: Remove ClassGenerator class but make
858     all the methods functions. Fixes RTBug #1903.
859    
860     * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
861     to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
862     RTBug #1907.
863    
864     * Thuban/UI/classgen.py: Use classgen functions that were part
865     of the ClassGenerator class. Put try/finally blocks around
866     code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
867     RTBug #1904.
868    
869     * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
870    
871     * Thuban/UI/legend.py: The legend was cleared and repopulated any
872     time something changed which caused some state to be lost such
873     as which children were expanded or collapsed. Fixes RTBug #1901.
874     (LegendTree._OnMsgMapLayersAdded): Add only new layers.
875     (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
876     the legend but not in the map.
877     (LegendTree.__FillTree): Move main functionality out into smaller
878     methods that can be used by other methods.
879     (LegendTree.__FillTreeLayer): Reuse old slots in the image list
880     if they are available.
881     (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
882     that we override the wxTreeCtrl method. Iterate over children
883     and call __RemoveLayer.
884     (LegendTree.__AddLayer): New. Add a new layer to the legend.
885     (LegendTree.__RemoveLayer): Remove a layer from the legend.
886     (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
887     Should only be called with the id of a layer branch.
888     (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
889     Returns the root item or creates one if necessary.
890    
891     * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
892     ProjectRasterFile with tuple arguments instead of strings.
893    
894     * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
895     with try/finally. Fixes RTBug #1904.
896    
897     * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
898     with try/finally. Fixes RTBug #1904.
899     (MapCanvas.FitSelectedToWindow): If a single point is selected
900     simply center it on the display. Fixes RTBug #1849.
901    
902     * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
903     to be compiled as a standalone app. Now the code can only be
904     called from Python which simplifies the parameter passing.
905     (ProjectRasterFile): Handle Python arguments. Remove code that
906     checks for a destination dataset. Add more clean up code.
907    
908     * test/test_map.py (TestMapWithContents.test_raise_layer_top,
909     TestMapWithContents.test_lower_layer_bottom):
910     Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
911     Fixes RTBug #1907.
912    
913     * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
914     extent to the map when the legend is toggled. Fixes RTBug #1881.
915    
916 jan 1097 2003-05-29 Jan-Oliver Wagner <[email protected]>
917    
918     * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
919     unsubscribes all that is subcribed in __init__.
920    
921 bh 1089 2003-05-28 Bernhard Herzog <[email protected]>
922    
923 bh 1095 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
924     (MainWindow.CanDuplicateLayer): New methods to implement the
925     Layer/Duplicate command.
926     (layer_duplicate command): New.
927     (main_menu): Add layer_duplicate to the Layer menu.
928    
929     2003-05-28 Bernhard Herzog <[email protected]>
930    
931 bh 1093 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
932     renderer so that NULL/None values get displayed differently (by a
933     gray rectangle).
934     (TableGrid.__init__): Override the default renderers
935    
936     2003-05-28 Bernhard Herzog <[email protected]>
937    
938 bh 1089 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
939     classification to "None" if the type of the field has changed.
940    
941     * test/test_layer.py (SetShapeStoreTests): New. Class with a few
942     test for the Layer.SetShapeStore method
943    
944 jan 1087 2003-05-28 Jan-Oliver Wagner <[email protected]>
945 jan 1085
946 jan 1087 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
947     does not necessarily have a filename).
948    
949     2003-05-28 Jan-Oliver Wagner <[email protected]>
950    
951 jan 1085 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
952     sort the selection list for the dialog.
953    
954 frank 1083 2003-05-28 Frank Koormann <[email protected]>
955    
956     * extensions/thuban/wxproj.cpp
957     (project_point): Removed cast to int for projected point coordinates.
958     (shape_centroid): Return last point if all polygon vertices fall
959     to one point.
960    
961 bh 1079 2003-05-28 Bernhard Herzog <[email protected]>
962    
963 bh 1081 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
964     with layers that don't have shapestores, i.e. raster layers.
965    
966     2003-05-28 Bernhard Herzog <[email protected]>
967    
968 bh 1079 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
969     when determining the title from the filename.
970    
971     * test/test_dbf_table.py (TestDBFTable.test_title): Update to
972     reflect changes in the way the title is derived from the filename
973    
974 frank 1077 2003-05-28 Frank Koormann <[email protected]>
975    
976     * Thuban/UI/mainwindow.py (MainWindow.TableShow):
977     Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
978    
979 bh 1069 2003-05-27 Bernhard Herzog <[email protected]>
980    
981 bh 1075 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
982     delegate SelectedLayer.
983     (MainWindow.LayerUnjoinTable): Implement.
984     (_can_unjoin): New. Helper function for the sensitivity of the
985     layer/unjoin command.
986    
987     * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
988     (DerivedShapeStore.OrigShapeStore): New. Return the original
989     shapestore. Used to figure out how to unjoin.
990     (DerivedShapeStore.Shapefile): Fix a typo.
991    
992     2003-05-27 Bernhard Herzog <[email protected]>
993    
994 bh 1073 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
995     well
996     (JoinDialog.__init__): Use the layer parameter and only build the
997     left choice when a layer is given
998     (JoinDialog.OnJoin): Handle layer joins as well
999     (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
1000     that the user selects the "Select..." item. The sensitivitly
1001     updating is now in update_sensitivity
1002     (JoinDialog.y): New method to refactor the sensitivity update of
1003     the join button into its own method.
1004    
1005     * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
1006    
1007     2003-05-27 Bernhard Herzog <[email protected]>
1008    
1009 bh 1071 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
1010     iff there are unreferenced tables in the session
1011    
1012     2003-05-27 Bernhard Herzog <[email protected]>
1013    
1014 bh 1069 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
1015    
1016     * Thuban/Model/session.py (Session.UnreferencedTables): New method
1017     to return tables that are not referenced by other tables or shape
1018     stores and can be removed.
1019     (Session.RemoveTable): Issue a TABLE_REMOVED message after
1020     removing the table
1021    
1022     * Thuban/UI/mainwindow.py: Remove unused imports
1023     (MainWindow.TableClose): Implement.
1024    
1025     * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
1026     messages so that the frame will be automatically closed when a new
1027     session is opened or the table is removed.
1028     (TableFrame.OnClose): Unsubscribe the Subscriptions made in
1029     __init__
1030     (TableFrame.close_on_session_replaced)
1031     (TableFrame.close_on_table_removed): New. Subscribers that close
1032     the window
1033    
1034     * test/test_session.py (TestSessionMessages.test_remove_table)
1035     (TestSessionSimple.test_remove_table): Move the test to
1036     TestSessionSimple and add test for the TABLE_REMOVED message
1037     (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
1038     (TestSessionSimple.test_unreferenced_tables) New. Test for the
1039     UnreferencedTables method.
1040     (UnreferencedTablesTests): New. Class with some more sophisticated
1041     tests for UnreferencedTables.
1042    
1043 frank 1065 2003-05-27 Frank Koormann <[email protected]>
1044    
1045 frank 1067 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
1046     display has some unwanted side effects. Removed again.
1047    
1048     2003-05-27 Frank Koormann <[email protected]>
1049    
1050 frank 1065 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
1051    
1052     * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
1053    
1054 jan 1062 2003-05-27 Jan-Oliver Wagner <[email protected]>
1055    
1056 bh 1069 * test/test_menu.py (MenuTest.test): Added test for
1057     Menu.RemoveItem().
1058 jan 1062
1059 bh 1069 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
1060     the menu.
1061 jan 1062
1062 frank 1059 2003-05-27 Frank Koormann <[email protected]>
1063    
1064     Nonmodal dialogs without parent (i.e. they can fall behind the main
1065     window)
1066    
1067     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
1068     all dialogs in the dialogs dictionary and the canvas.
1069    
1070     * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
1071     parent, i.e. can fall behind other windows.
1072     (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
1073     dictionary before removing it.
1074    
1075     * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
1076    
1077     * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
1078     * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
1079     * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
1080    
1081 bh 1053 2003-05-27 Bernhard Herzog <[email protected]>
1082    
1083 bh 1055 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
1084     tableview dialog
1085     (MainWindow.TableShow): Use ShowTableView to open the dialogs.
1086     Also, don't use the table's titles as the dialog names. The titles
1087     aren't guaranteed to be unique.
1088     (MainWindow.TableOpen): Open a table view dialog after opening the
1089     table
1090    
1091     2003-05-27 Bernhard Herzog <[email protected]>
1092    
1093 bh 1053 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
1094     effect can be achieved by simply closing the window showing the
1095     table.
1096     (MainWindow.TableHide): Removed.
1097     (main_menu): Removed "table_hide"
1098    
1099 frank 1051 2003-05-27 Frank Koormann <[email protected]>
1100    
1101     Fix legend tree display problems under Win32
1102    
1103     * Thuban/UI/legend.py: BMP_SIZE_W = 15
1104     (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
1105     (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
1106    
1107     * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
1108    
1109 jan 1048 2003-05-27 Jan-Oliver Wagner <[email protected]>
1110    
1111     * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
1112     'after' now allows to insert separators almost anywhere in the menu.
1113    
1114 frank 1046 2003-05-27 Frank Koormann <[email protected]>
1115    
1116     * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
1117     "S" of selection box label to hint on hot key (Alt-S). Works under
1118     Win32 but is ignored under GTK.
1119    
1120     2003-05-26 Frank Koormann <[email protected]>
1121    
1122     * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
1123     Center Choices.
1124    
1125 bh 1038 2003-05-26 Bernhard Herzog <[email protected]>
1126    
1127 bh 1044 Remove the Precision methods again. They're too DBF specific to be
1128     part of the table interface and they're only used in table_to_dbf
1129     anyway.
1130    
1131     * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
1132     fixed precision of 12 for doubles.
1133     (TransientTableBase.Precision): Removed
1134     (AutoTransientTable.Width): Delegate to self.table.
1135    
1136     * Thuban/Model/table.py (DBFTable.Precision)
1137     (MemoryTable.Precision): Removed.
1138     (MemoryTable.Width): Use a fixed precision of 12 for doubles.
1139     (table_to_dbf): Use a fixed precision of 12 for floats unless the
1140     column object specifies something else.
1141    
1142     * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
1143     test for table_to_dbf
1144    
1145     2003-05-26 Bernhard Herzog <[email protected]>
1146    
1147     * test/test_transientdb.py
1148     (TestTransientTable.run_iceland_political_tests): Fix a comment.
1149    
1150     2003-05-26 Bernhard Herzog <[email protected]>
1151    
1152 bh 1038 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
1153     implementation. Mark parts of the file format strings for
1154     localization.
1155    
1156     * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
1157     file and add the table to the tables managed by the session
1158    
1159 bh 1040 * test/test_session.py (TestSessionSimple.test_open_table_file):
1160     New. test case for OpenTableFile
1161    
1162 jan 1033 2003-05-26 Jan-Oliver Wagner <[email protected]>
1163    
1164 jan 1035 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
1165     Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
1166     Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
1167     Replace the true/false of wxWindows by True/False of Python 2.2.1.
1168    
1169     2003-05-26 Jan-Oliver Wagner <[email protected]>
1170    
1171 bh 1038 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
1172     already a selection present, update the grid accordingly.
1173 jan 1033
1174     * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
1175     resizeable and increase its initial size.
1176    
1177 frank 1030 2003-05-26 Frank Koormann <[email protected]>
1178    
1179     Table export functionality
1180    
1181     * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
1182     Return width (in characters) for a column.
1183     (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
1184     (table_to_dbf): Write table to dbf file.
1185     (table_to_csv): Write table to csv file.
1186    
1187     * Thuban/Model/transientdb.py (TransientTableBase.Width,
1188     TransientTableBase.Precision): Return column width and precision.
1189    
1190     * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
1191     or table_to_csv depending on file selection.
1192    
1193     * test/test_dbf_table.py:
1194     Test table_to_dbf (extension of former part of test).
1195    
1196     * test/test_csv_table.py:
1197     Test table_to_csv.
1198    
1199 jan 1021 2003-05-23 Jan-Oliver Wagner <[email protected]>
1200    
1201 jan 1024 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
1202     Use QueryTableFrame instead of TableFrame.
1203 jan 1021
1204 jan 1024 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
1205     table window with 'Layer Table:' instead of 'Table:'.
1206    
1207     2003-05-23 Jan-Oliver Wagner <[email protected]>
1208    
1209     Give all tables a title via mix-in TitledObject.LayerShowTable
1210    
1211 jan 1021 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
1212     only if it exists.
1213    
1214     * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
1215     and call its init-method with a default title. Remove Title() method.
1216    
1217     * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
1218     AutoTransientTable): mix-in TitledObject and call its init-method with
1219     a default title. Remove Title() method.
1220    
1221 bh 1017 2003-05-23 Bernhard Herzog <[email protected]>
1222    
1223     * Thuban/Model/session.py (Session.AddShapeStore): Define
1224     AddShapeStore analogously to AddTable.
1225    
1226     * test/test_session.py (TestSessionSimple.test_add_shapestore):
1227     New. Test for AddShapeStore
1228    
1229 jan 1015 2003-05-23 Jan-Oliver Wagner <[email protected]>
1230    
1231     Introducing QueryTableFrame and a very coarse ShowTable implementation.
1232    
1233     * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
1234     class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
1235     The latter implements the selection GUI without dependency on a layer.
1236     LayerTableFrame now is derived from QueryTableFrame and connects
1237     to a layer.
1238    
1239     * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
1240     implementation that still needs work.
1241    
1242     * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
1243    
1244 frank 1011 2003-05-22 Frank Koormann <[email protected]>
1245    
1246     * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
1247     Added "outer_join = False" as optional parameter.
1248     (TransientJoinedTable.create): If outer join is true, perform a
1249     "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
1250     the left table. Records not matching are filled with 0 / None.
1251    
1252     * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
1253     (JoinDialog.OnJoin): Consider outer join check box.
1254    
1255 bh 1006 2003-05-22 Bernhard Herzog <[email protected]>
1256    
1257 bh 1008 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
1258     somewhat safer way. Storing the traceback in a local variable can
1259     lead to memory leaks
1260    
1261     2003-05-22 Bernhard Herzog <[email protected]>
1262    
1263 bh 1006 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
1264     the wxMessageDialog's Destroy() method.
1265    
1266 frank 1004 2003-05-22 Frank Koormann <[email protected]>
1267    
1268     * Thuban/UI/join.py (JoinDialog.__init__): Make use of
1269     TransientTable.Title()
1270    
1271     2003-05-22 Frank Koormann <[email protected]>
1272    
1273     Join Dialog, initial version.
1274    
1275     * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
1276    
1277     * Thuban/UI/join.py (JoinDialog): Functional implementation of
1278     former framework. Renamed Table1/Table2 to LeftTable/RightTable
1279     in all occurences.
1280    
1281     * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
1282     Typo fixed.
1283    
1284 bh 995 2003-05-22 Bernhard Herzog <[email protected]>
1285    
1286 bh 999 Give the tables titles so that the GUI can display more meaningful
1287     names. For now the titles are fixed but depend on e.g. filenames
1288     or the titles of the joined tables.
1289    
1290     * Thuban/Model/transientdb.py (TransientTable.Title)
1291     (TransientJoinedTable.Title, AutoTransientTable.Title): New.
1292    
1293     * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
1294    
1295     * test/test_transientdb.py
1296     (TestTransientTable.test_auto_transient_table_title): New. Test
1297     for the Title method
1298     (TestTransientTable.test_transient_joined_table)
1299     (TestTransientTable.test_transient_table): Add test for the Title
1300     methods
1301    
1302     * test/test_memory_table.py (TestMemoryTable.test_title): New.
1303     Test for the Title method
1304    
1305     * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
1306     the Title method
1307    
1308     2003-05-22 Bernhard Herzog <[email protected]>
1309    
1310 bh 997 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
1311     Provide a better way to destroy the layers
1312     (TestLayer.test_base_layer, TestLayer.test_arc_layer)
1313     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
1314     (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
1315     the new way to destroy the layers.
1316     (TestLayer.test_derived_store): New. Test for using a layer with a
1317     DerivedShapeStore
1318    
1319     * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
1320     filename if the shape store actually has one.
1321    
1322     2003-05-22 Bernhard Herzog <[email protected]>
1323    
1324 bh 995 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
1325     for the filename
1326    
1327     * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
1328     for the FileName method
1329     (TestDBFTableWriting.test_write): Fix spelling of filename
1330    
1331 tkoester 993 2003-05-22 Thomas Koester <[email protected]>
1332    
1333     * Thuban/Model/range.py, test/test_range.py: Brought over new Range
1334     from SciParam that now really is immutable.
1335    
1336 frank 992 2003-05-22 Frank Koormann <[email protected]>
1337    
1338     Layer Top/Bottom placement added to legend.
1339    
1340     * Thuban/UI/legend.py
1341     (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
1342     bound to tool events.
1343     (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
1344     New, methods binding the event methods with the map methods.
1345    
1346     * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
1347     layer at top/bottom of layer stack.
1348    
1349     * Resources/Bitmaps/top_layer.xpm: New button icon.
1350    
1351     * Resources/Bitmaps/bottom_layer.xpm: New button icon.
1352    
1353 bh 988 2003-05-22 Bernhard Herzog <[email protected]>
1354    
1355     * Thuban/Model/session.py (Session.RemoveTable): New method to
1356     remove tables
1357    
1358     * test/test_session.py (TestSessionSimple.test_remove_table): New.
1359     Test for RemoveTable
1360    
1361 tkoester 986 2003-05-22 Thomas Koester <[email protected]>
1362    
1363     * Thuban/Model/classgen.py: Added short module doc string and CVS id.
1364     (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
1365    
1366 bh 983 2003-05-22 Bernhard Herzog <[email protected]>
1367    
1368 bh 985 Implement a way to discover dependencies between tables and
1369     shapestores.
1370    
1371     * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
1372     (TransientJoinedTable.Dependencies)
1373     (AutoTransientTable.SimpleQuery): New. Implement the dependencies
1374     interface
1375     (TransientJoinedTable.__init__): Keep tack of the original table
1376     objects in addition to the corresponding transient tables.
1377    
1378     * Thuban/Model/table.py (DBFTable.Dependencies)
1379     (MemoryTable.Dependencies): New. Implement the dependencies
1380     interface
1381    
1382     * Thuban/Model/data.py (ShapeTable): New. Helper class for
1383     ShapefileStore
1384     (ShapefileStore.__init__): Use ShapeTable instead of
1385     AutoTransientTable
1386     (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
1387     (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
1388     methods for filename and type
1389     (ShapefileStore.Dependencies): New. Implement the dependencies
1390     interface
1391     (DerivedShapeStore): New class to replace SimpleStore. The main
1392     difference to SimpleStore is that it depends not on a shapefile
1393     but another shapestore which expresses the dependencies a bit
1394     better
1395     (SimpleStore.__init__): Add deprecation warning.
1396    
1397     * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
1398     Test for the Dependencies method.
1399    
1400     * test/test_memory_table.py (TestMemoryTable.test_dependencies):
1401     New. Test for the Dependencies method.
1402    
1403     * test/test_transientdb.py
1404     (TestTransientTable.test_auto_transient_table_dependencies): New.
1405     Test for the Dependencies method.
1406     (TestTransientTable.test_transient_joined_table): Add test for the
1407     Dependencies method.
1408    
1409     * test/test_session.py (TestSessionSimple.setUp)
1410     (TestSessionSimple.tearDown): New. Implement a better way to
1411     destroy the sessions.
1412     (TestSessionSimple.test_initial_state)
1413     (TestSessionSimple.test_add_table): Bind session to self.session
1414     so that it's destroyed by tearDown
1415     (TestSessionSimple.test_open_shapefile): New. Test for
1416     OpenShapefile and the object it returns
1417    
1418     2003-05-22 Bernhard Herzog <[email protected]>
1419    
1420 bh 983 * Thuban/Model/session.py (Session.AddTable): New method to
1421     register tables with the session.
1422     (Session.Tables): Return the tables registered with AddTable too.
1423    
1424     * test/test_session.py (TestSessionSimple.test_add_table): New.
1425     Test case for the AddTable method
1426    
1427 frank 981 2003-05-22 Frank Koormann <[email protected]>
1428    
1429     UI polishing updates: Place main buttons (OK, Cancel, etc) in the
1430     lower right corner, center labels for selections, initialize controls
1431     in reasonable order for keyboard navigation.
1432    
1433     * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
1434     (ProjFrame.__DoOnProjAvail): Determine position of current projection
1435     using the wxListBox.FindString() method. Still a problem (#1886)
1436    
1437     * Thuban/UI/classifier.py
1438     (Classifier.__init__, SelectPropertiesDialog.__init__)
1439    
1440     * Thuban/UI/classgen.py (ClassGenDialog.__init__,
1441     (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
1442     different classification types from here to __init__.
1443     (GenUniquePanel.__init__): Set the column width of the first field
1444     in the Field ListCtrl to the full width.
1445    
1446     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
1447     Button to 'Export'. Center Buttons in Selection Box, set Focus to
1448     Grid.
1449     (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
1450     changes focus to the Selection when pressing "Alt-S".
1451    
1452     * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
1453     the text if not visible. The italic font sometimes exceeds the
1454     rendering area.
1455    
1456 jonathan 972 2003-05-21 Jonathan Coles <[email protected]>
1457 jonathan 971
1458 jonathan 975 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
1459     to OnClose so that Thuban closes correctly.
1460    
1461     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
1462     DockFrame.OnClose, not DockFrame._OnClose.
1463    
1464     2003-05-21 Jonathan Coles <[email protected]>
1465    
1466 jonathan 971 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
1467     references to 'inf' and use new Range __init__ to pass floats
1468     directly rather than converting them to strings first.
1469     Fixes RTBug #1876.
1470    
1471     * Thuban/Model/classification.py (ClassGroupRange.SetRange):
1472     Use new Range ___init__ to pass floats.
1473    
1474     * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
1475     filename is a valid image file. Throw IOError otherwise.
1476    
1477     * Thuban/Model/range.py: Brought over new Range from SciParam that
1478     is immutable and has an __init__ which can accept floats.
1479    
1480     * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
1481     into try block. AddLayer doesn't throw any exceptions anymore.
1482     (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
1483     try block.
1484    
1485     * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
1486     the first item in choices. Fixes RTBug #1882.
1487    
1488     * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
1489     has gone to 0 which is a serious problem. abort.
1490     (MapRenderer.draw_raster_layer): Catch IOError seperately and
1491     print the error from GDAL.
1492    
1493     * Thuban/UI/tableview.py (TableGrid.__init__): Call
1494     ToggleEventListeners to turn on listening.
1495     (TableGrid.ToggleEventListeners): New. Turns event listening on
1496     and off so as to prevent excessive messages.
1497     (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
1498     to suppress excessive messages when selecting many rows.
1499     Fixes RTBug #1880.
1500    
1501     * Thuban/UI/view.py: Added checks against if scale == 0. This
1502     is a serious problem that can occur when an image without
1503     geo data is loading and causes the map projection bounds to
1504     go to infinity. Right now, the solution is to simply try
1505     to recover.
1506    
1507     * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
1508     to set the MFILEReceiver attributes even if the data is NULL.
1509    
1510     * extensions/thuban/gdalwarp.cpp: Improved the error handling
1511     and passed GDAL messages back up to the Python layer. Also
1512     tried to fix some memory leaks that were present in the original
1513     utility but didn't matter because the program aborted.
1514    
1515     * test/test_range.py: Copied over tests from SciParam. Removed
1516     tests against importing. Fixes RTBug #1867.
1517    
1518 bh 958 2003-05-21 Bernhard Herzog <[email protected]>
1519    
1520     * test/test_load.py: Remove unused imports and restructure the
1521     test code
1522     (LoadSessionTest): Split into one class for each test and turn
1523     LoadSessionTest itself into the base class for all such session
1524     tests.
1525     (ClassificationTest): New base class for load tests that test
1526     classifications
1527     (TestSingleLayer, TestLayerVisibility, TestClassification)
1528     (TestLabels, TestLayerProjection, TestRasterLayer): New classes
1529     for the individual tests
1530    
1531     * test/support.py (FileLoadTestCase.filename): New base class for
1532     file loading tests
1533    
1534 jan 955 2003-05-21 Jan-Oliver Wagner <[email protected]>
1535    
1536     * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
1537     Mercator' to 'UTM Zone 32' as a more convenient example.
1538     Added 'Gauss Krueger Zone 6'.
1539    
1540     * Data/iceland_sample_raster.thuban: political polygon now
1541     filled transparent to have the raster image visible at once.
1542    
1543 frank 952 2003-05-21 Frank Koormann <[email protected]>
1544    
1545     * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
1546     OnClose() to keep in sync with extensions. Internally Thuban
1547     still uses "underscored" names.
1548    
1549 jonathan 949 2003-05-20 Jonathan Coles <[email protected]>
1550    
1551     This puts back Raster layer support. These layers support projections
1552     through the GDAL library. Currently, the CVS version is being used.
1553     There are no Debian packages available although this may change soon.
1554     A GDAL driver was extended to support writing to memory rather to
1555     files.
1556    
1557     There is still some work that needs to be done, such as some error
1558     handling when loading invalid images or when there is a problem
1559     projecting the image. This putback simply checks in the majority
1560     of the work.
1561    
1562     * setup.py: Add gdalwarp library extension.
1563    
1564     * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
1565     Defaults to False, but can be overridden by subclasses if they
1566     support classification.
1567     (RasterLayer): New. Defines a new layer that represents an
1568     image.
1569    
1570     * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
1571     tag handler.
1572     (SessionLoader.start_layer): Encode the filename.
1573     (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
1574     New. Supports reading a rasterlayer tag.
1575    
1576     * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
1577    
1578     * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
1579     get a string in Latin1. If we get such as string convert it to
1580     unicode first, otherwise leave if alone before encoding.
1581     (SessionSaver.write_layer): Add support for writing both Layers
1582     and RasterLayers.
1583    
1584     * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1585     The right argument may not be a string, it could also be a Column.
1586    
1587     * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
1588     Make initial window size 600x400. Fixes RTBug #1872.
1589    
1590     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
1591     the dialog is constructed so that we can support layers that
1592     do not have classifications.
1593     (Classifier._OnTry): Only build a classification if the layer
1594     supports one.
1595    
1596     * Thuban/UI/legend.py: Change all checks that a layer is an
1597     instance of Layer into checks against BaseLayer.
1598     (LegendTree.__FillTreeLayer): Only add children to a branch if
1599     the layer supports classification.
1600    
1601     * Thuban/UI/mainwindow.py (MainWindow.NewSession,
1602     MainWindow.OpenSession): Don't proceed with an action if the
1603     user chooses Cancel when they are asked to save changes.
1604     (MainWindow.AddRasterLayer): New. Open a dialog to allow the
1605     user to select an image file. Create a new RasterLayer and add
1606     it to the map.
1607    
1608     * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
1609     for rendering RasterLayer layers.
1610     (MapRenderer.draw_raster_layer): Actually method that calls
1611     the GDALWarp python wrapper and constructs an image from the
1612     data returned.
1613    
1614     * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
1615     Choices symbols to match those used in the table query method.
1616     Replace deprecated method calls on table with new method names.
1617    
1618     * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
1619     how small the scale can get. This still needs more testing.
1620    
1621     * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
1622     Provides a driver to output in .bmp format.
1623    
1624     * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
1625     New. Provides IO routines which write to memory, rather than a file.
1626    
1627     * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
1628     of the gdalwarp utility provided in GDAL. Added function calls
1629     that can be accessed from python.
1630    
1631     * Data/iceland_sample_raster.thuban: New. Sample file that uses
1632     a raster layer.
1633    
1634     * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
1635     layer image data.
1636    
1637     * Doc/thuban.dtd: Added rasterlayer attribute definition.
1638    
1639     * test/test_layer.py, test/test_load.py, test/test_save.py: Added
1640     tests associated with the raster layer code.
1641    
1642     * test/test_transientdb.py
1643     (TestTransientTable.test_auto_transient_table_query): Added a test
1644     for using a Column object as the "right" parameter to a query.
1645    
1646 frank 924 2003-05-19 Frank Koormann <[email protected]>
1647    
1648 frank 927 * Thuban/version.py (get_changelog_date):
1649     Catch exceptions if ChangeLog does not exist.
1650    
1651     * Thuban/UI/view.py (MapCanvas.Export): Bugfix
1652    
1653     2003-05-19 Frank Koormann <[email protected]>
1654    
1655 frank 924 Extended version information for Thuban
1656    
1657     * Thuban/version.py: New, version information for Thuban: Last
1658     modification date and last ChangeLog entry date.
1659    
1660     * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
1661     information: Display Thuban, wxPython and Python version.
1662    
1663 bh 919 2003-05-16 Bernhard Herzog <[email protected]>
1664    
1665 bh 921 * Thuban/Model/save.py: Remove some unused imports including the
1666     __future__ import for nested_scopes as Thuban relies on Python 2.2
1667     now.
1668     (XMLWriter.encode): Remove the special case for a None argument.
1669     In the saver encode is always called with a string argument.
1670    
1671     2003-05-16 Bernhard Herzog <[email protected]>
1672    
1673 bh 919 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
1674     in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
1675     of the bug was that e.g. float("1.2") would fail. Thuban now
1676     requires 2.4.x.
1677    
1678 frank 917 2003-05-16 Frank Koormann <[email protected]>
1679    
1680     Printing enhancement and WMF export (under Win32)
1681    
1682     * Thuban/UI/renderer.py (ExportRenderer): New, derived from
1683     ScreenRenderer. Renders Map, Legend and Scalebar for export.
1684     (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
1685     PrintRender.
1686    
1687     * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
1688     to fullfil information needed for PrinterRenderer.
1689     (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
1690     (MapCanvas.Print): Adapted to new MapPrintout.
1691     (OutputTransform): General calculations to transform from canvas
1692     coordinates to export/printing devices.
1693    
1694     * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
1695     new method_command to call ExportMap, with platform dependency (only
1696     __WXMSW__)
1697    
1698     * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
1699     of scalebar drawing area as new parameters.
1700    
1701     * Thuban/Model/scalebar.py (roundInterval): round long instead of int
1702    
1703     * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
1704     Update to extended scalebar.DrawScalebar header.
1705    
1706     * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
1707    
1708     * test/test_scalebar.py: Made test executable as standalone.
1709    
1710 bh 908 2003-05-16 Bernhard Herzog <[email protected]>
1711    
1712     * Thuban/Model/table.py (Table): Remove this compatibility alias
1713     for DBFTable.
1714    
1715     * test/test_table.py: Import DBFTable as Table because that alias
1716     doesn't exist anymore.
1717    
1718     * Thuban/UI/classgen.py: Remove some unused imports
1719    
1720 jonathan 906 2003-05-14 Jonathan Coles <[email protected]>
1721    
1722     * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
1723     Fix docstring.
1724     (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
1725     (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
1726     values of the supplied range to determine the beginning and end
1727     bounds of the generated classes.
1728    
1729     * Thuban/Model/range.py (Range.number_re): Now accepts floats that
1730     do not have a leading 0 (.5 is now accepted as well as 0.5).
1731    
1732     * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
1733     call to ClassGenerator.GenUniformDistribution.
1734    
1735     * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
1736     layout bug with the 'Projection' label.
1737    
1738     * test/support.py (FloatTestCase): New. Needed for the Range tests.
1739    
1740     * test/test_range.py: New. Imported from SciParam.
1741    
1742 jonathan 897 2003-05-12 Jonathan Coles <[email protected]>
1743    
1744 jonathan 899 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
1745     to table.UniqueValues() with calls that retrieve all the values
1746     from the table. This will need to be replaced by a method on table
1747     which can simply return the list (perhaps more efficiently).
1748    
1749     2003-05-12 Jonathan Coles <[email protected]>
1750    
1751 jonathan 897 The return value of ClassGenerator.CalculateQuantiles has changed.
1752     Refer to the documentation for details.
1753    
1754     * test/test_classgen.py: Modified Quantile tests to use the
1755     new return values.
1756    
1757     * Thuban/Model/classgen.py
1758     (ClassGenerator.GenQuantiles): Add comments describing the parameters,
1759     use new return values from CalculateQuantiles to produce the correct
1760     range bounds in the Classification.
1761     (ClassGenerator.CalculateQuantiles): Add more comments describing
1762     the return values and parameters. Make minor adjustments to improve
1763     the legibility of the code. Fix problem with adjusted not being set
1764     in most cases.
1765    
1766 frank 893 2003-05-12 Frank Koormann <[email protected]>
1767    
1768     * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
1769     and latin1. Fixes #1851 finally.
1770    
1771 jonathan 889 2003-05-09 Jonathan Coles <[email protected]>
1772    
1773 jonathan 897 * test/test_classgen.py: New. Tests the Quantile algorithm.
1774    
1775     * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
1776     Clean up debugging statement, add comments, fix a small bug in the
1777     returned adjusted percentiles.
1778    
1779     2003-05-09 Jonathan Coles <[email protected]>
1780    
1781 jonathan 889 Introduces Range class from SciParam into the ClassGroupRange class,
1782     and such ranges can now be saved and loaded from disk.
1783    
1784     Quantiles are now available in the Classification Generator.
1785    
1786     Initial support for building Queries on a table. Doesn't do anything
1787     but run some tests.
1788    
1789     * Thuban/Model/classification.py: Explicit imports.
1790     (ClassGroupRange): Use the Range class to store the underlying
1791     range information. The interface remains the same, except for
1792     GetRange(), and you can also supply a Range object as the min
1793     parameter to SetRange or __init__.
1794    
1795     * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
1796     string appropriately for use in Thuban. Fixes RTbug #1851.
1797     (SessionLoader.end_projection): Handle the context of the
1798     projection tag a bit better by looking at what objects are not
1799     None. There was an assumption that a projection tag for a map
1800     could occur before any layers.
1801     (SessionLoader.start_clrange): Provide backward compatibility for
1802     reading min/max values as well as the new range parameter.
1803    
1804     * Thuban/Model/map.py: Explicit imports.
1805    
1806     * Thuban/Model/resource.py: Import _.
1807     (ProjFileSaver.write): write header using projfile.dtd.
1808    
1809     * Thuban/Model/save.py: Explicit imports.
1810     (XMLWriter.encode): New. Encode the given string from a format
1811     used by Thuban into UTF-8. Fixes RTbug #1851.
1812    
1813     * Thuban/UI/classgen.py: Explicit imports.
1814     (ClassGenDialog.__init__): Clean up the code and add support
1815     for Quantiles.
1816     (ClassGenDialog.OnOK): Add support for Quantiles.
1817     (GenQuantilesPanel): New. Input panel for Quantiles.
1818     (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
1819     GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
1820    
1821     * Thuban/Model/classgen.py: New. Contains all the classes named above.
1822    
1823     * Thuban/UI/classifier.py: Explicit imports.
1824     (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
1825     ClassTable.SetValueAsCustom): Reworked to use new Range class.
1826    
1827     * Thuban/UI/legend.py: Explicit imports.
1828    
1829     * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
1830     a Table menu and associated method calls.
1831     (MainWindow.choose_color): Removed. No longer needed.
1832    
1833     * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
1834     should be disabled if no projection is selected in the available
1835     list.
1836    
1837     * Thuban/UI/renderer.py: Explicit imports.
1838    
1839     * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
1840     with correctly selecting the rows and issuing the right events.
1841     Be sure to call Skip() to allow the grid to do some of its own
1842     handling which allows the rows to actually be selected.
1843     (LayerTableGrid.select_shapes): Rename from select_shape. Supports
1844     selecting multiple shapes.
1845     (LayerTableFrame): Support for building Queries.
1846     (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
1847    
1848     * Thuban/UI/tree.py: Explicit imports.
1849    
1850     * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
1851     table view can call it.
1852    
1853     * test/test_classification.py: Explicit imports.
1854     (TestClassification.test_ClassGroupRange): Fix test for new
1855     Range class.
1856    
1857     * Doc/thuban.dtd: Add range parameter for clrange.
1858    
1859     * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
1860     object in ClassGroupRange, and also uesd for inputting ranges in
1861     the classifer table and elsewhere.
1862    
1863     * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
1864     yet.
1865    
1866 frank 872 2003-05-09 Frank Koormann <[email protected]>
1867    
1868     * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
1869    
1870 frank 860 2003-05-08 Frank Koormann <[email protected]>
1871    
1872 frank 870 Coding style updates
1873    
1874     * test/test_scalebar.py: Replaced tab indentation by spaces.
1875    
1876     * Thuban/UI/scalebar.py: Explicit imports.
1877    
1878     2003-05-08 Frank Koormann <[email protected]>
1879    
1880 frank 867 * Thuban/UI/scalebar.py
1881     (ScaleBar.DrawScalebar): Format string bug fixed.
1882    
1883     2003-05-08 Frank Koormann <[email protected]>
1884    
1885 frank 865 Reorganization of scalebar component (no wx in Thuban/Model)
1886    
1887     * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
1888     (deriveInterval):
1889     Calculate scalebar interval and unit which fits in width for scale.
1890     (roundInterval): Round float.
1891    
1892     * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
1893    
1894     * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
1895    
1896     * Thuban/UI/legend.py: Import Thuban.UI.scalebar
1897    
1898     2003-05-08 Frank Koormann <[email protected]>
1899    
1900 frank 860 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
1901     Initialize ScaleBar with canvas.map
1902    
1903     * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
1904     round intervals to display smarter lengths
1905     (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
1906     layer. If the maps has no projection applied grey the scalebar.
1907    
1908 frank 857 2003-05-07 Frank Koormann <[email protected]>
1909    
1910     Basic Scalebar features added.
1911    
1912     * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
1913    
1914     * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
1915     (ScaleBarBitmap): New, links the scalebar bitmap with view messages
1916     and the renderer.
1917    
1918     * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
1919    
1920     * Thuban/UI/messages.py: SCALE_CHANGED added.
1921    
1922 bh 850 2003-05-07 Bernhard Herzog <[email protected]>
1923    
1924 bh 852 * Thuban/Model/session.py (Session.__init__): New instance
1925     variable shapestores to hold a list of all open shapestore objects
1926     (Session.ShapeStores): New. Accessor method for the shapestores
1927     list.
1928     (Session._add_shapestore, Session._clean_weak_store_refs): New.
1929     Internal methods to maintain the shapestores list.
1930     (Session.Tables): New. Return all tables open in the session.
1931     (Session.OpenShapefile): Insert the new ShapeStore into the
1932     shapestores list.
1933    
1934     * test/test_session.py (TestSessionSimple.test_initial_state): Add
1935     tests for ShapeStores and Tables
1936     (TestSessionWithContent.test_shape_stores)
1937     (TestSessionWithContent.test_tables): New. Test cases for
1938     ShapeStores and Tables
1939    
1940     2003-05-07 Bernhard Herzog <[email protected]>
1941    
1942 bh 850 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
1943     Add comments about the optimizations used.
1944     (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
1945     Implement the ReadValue table interface method.
1946    
1947     * test/test_transientdb.py
1948     (TestTransientTable.run_iceland_political_tests)
1949     (TestTransientTable.test_transient_joined_table): Add tests for
1950     ReadValue
1951    
1952 frank 848 2003-05-07 Frank Koormann <[email protected]>
1953    
1954     * Resources/Bitmaps/fulllayerextent.xpm,
1955     Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
1956     new icons.
1957    
1958 bh 840 2003-05-06 Bernhard Herzog <[email protected]>
1959    
1960 bh 846 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1961     New. Simply delegate to the transient table's version.
1962    
1963     * test/test_transientdb.py
1964     (TestTransientTable.test_auto_transient_table_query): New. Test
1965     case for AutoTransientTable's SimpleQuery
1966    
1967     2003-05-06 Bernhard Herzog <[email protected]>
1968    
1969 bh 843 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
1970     Implement a simple query method for the query dialog
1971     (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
1972     the row index or shapeid.
1973     (TransientTable.create): Insert the right value of the row index
1974     (TransientJoinedTable.create): Copy the row index of the left
1975     table to the joined result table
1976    
1977     * test/test_transientdb.py
1978     (TestTransientTable.test_transient_table_read_twice): Fix
1979     doc-string
1980     (TestTransientTable.test_transient_table_query): New. Test for the
1981     SimpleQuery method
1982    
1983     2003-05-06 Bernhard Herzog <[email protected]>
1984    
1985 bh 840 Convert all table users to use the new table interface. This only
1986     covers Thuban itself, not GREAT-ER or other applications built on
1987     Thuban yet, so the compatibility interface stays in place for the
1988     time being but it now issues DeprecationWarnings.
1989    
1990     Finally, the new Table interface has a new method, HasColumn.
1991    
1992     * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
1993     issue deprecation warnings when they're. The warnings refer to the
1994     caller of the method.
1995     (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
1996     for the deprecation warnings
1997    
1998     * test/test_table.py: Ignore the deprecation warnings for the old
1999     table in the tests in this module. The purpose of the tests is to
2000     test the old interface, after all.
2001    
2002     * test/test_transientdb.py
2003     (TestTransientTable.run_iceland_political_tests): Use the
2004     constants for the types. Add a test for HasColumn
2005     (TestTransientTable.test_transient_joined_table): Adapt to new
2006     table interface. Add a test for HasColumn
2007     (TestTransientTable.test_transient_table_read_twice): Adapt to new
2008     table interface
2009    
2010     * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
2011     Adapt to new table interface
2012    
2013     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
2014     new table interface
2015    
2016     * Thuban/UI/controls.py (RecordListCtrl.fill_list)
2017     (RecordTable.SetTable): Adapt to new table interface
2018    
2019     * Thuban/UI/classifier.py (Classifier.__init__)
2020     (Classifier.__init__): Adapt to new table interface
2021    
2022     * Thuban/UI/classgen.py (ClassGenDialog.__init__)
2023     (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
2024     to new table interface
2025    
2026     * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
2027     (AutoTransientTable.HasColumn): Implement the new table interface
2028     method
2029     (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
2030     (AutoTransientTable.UniqueValues): Adapt to new table interface
2031    
2032     * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
2033     Adapt to new table interface
2034    
2035     * test/test_layer.py (TestLayer.open_shapefile): Helper method to
2036     simplify opening shapefiles a bit easier.
2037     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2038     (TestLayer.test_point_layer): Use the new helper method
2039     (TestLayer.test_get_field_type): New. Test for the GetFieldType
2040     method
2041    
2042     * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
2043     the new table method
2044    
2045     * test/test_memory_table.py (TestMemoryTable.test_has_column):
2046     Test for the new table method HasColumn
2047    
2048 jonathan 833 2003-05-06 Jonathan Coles <[email protected]>
2049    
2050     Addresses the "Selection Extent" wish of RTbug #1787.
2051    
2052     * Resources/Bitmaps/fulllayerextent.xpm,
2053     Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
2054     extent. These are just place holders for the real bitmaps.
2055    
2056     * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
2057     calculate the bounding box once (the first time compute_bbox() is
2058     called).
2059     (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
2060     the bounding box for the shapes in lat/long coordinates.
2061    
2062     * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
2063     option.
2064     (MainWindow.has_selected_shapes): New. Returns true if there are
2065     any selected shapes.
2066     (MainWindow.FullSelectionExtent): New. Calls
2067     MapCanvas.FitSelectedToWindow() when the user selects the menu option.
2068     (_has_selected_shapes): New. Returns true if there are any
2069     selected shapes.
2070    
2071     * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
2072     true if there are any selected shapes.
2073    
2074     * Thuban/UI/view.py (MapCanvas): Added delegated method
2075     HasSelectedShapes.
2076     (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
2077     shapes on the canvas using the map projection (if any).
2078    
2079     * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
2080     for Layer.ShapesBoundingBox().
2081    
2082 bh 826 2003-05-06 Bernhard Herzog <[email protected]>
2083    
2084     * Resources/Projections/defaults.proj: Fix spelling of Mercator
2085    
2086 jonathan 823 2003-05-05 Jonathan Coles <[email protected]>
2087    
2088     Addresses the "Full Layer Extent" wish of RTbug #1787.
2089    
2090     * Resources/Projections/defaults.proj: Added UK National Grid.
2091    
2092     * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
2093     (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
2094     when the user selects the menu option.
2095    
2096     * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
2097     scales the given layer on the canvas using the map projection.
2098    
2099 bh 819 2003-05-05 Bernhard Herzog <[email protected]>
2100    
2101     Convert the table implementations to a new table interface. All
2102     tables use a common mixin class to provide backwards compatibility
2103     until all table users have been updated.
2104    
2105     * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
2106     provide backwards compatibility for table classes implementing the
2107     new interface
2108     (DBFTable, MemoryTable): Implement the new table interface. Use
2109     OldTableInterfaceMixin as base for compatibility
2110     (DBFColumn, MemoryColumn): New. Column description for DBFTable
2111     and MemoryTable resp.
2112    
2113     * test/test_dbf_table.py: New. Test cases for the DBFTable with
2114     the new table interface.
2115    
2116     * test/test_memory_table.py: New. Test cases for the MemoryTable
2117     with the new table interface.
2118    
2119     * test/test_table.py: Document the all tests in this file as only
2120     for backwards compatibility. The equivalent tests for the new
2121     interface are in test_memory_table.py and test_dbf_table.py
2122     (MemoryTableTest.test_read): field_info should be returning tuples
2123     with four items
2124     (MemoryTableTest.test_write): Make doc-string a more precise.
2125    
2126     * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
2127     table interface. Derive from from OldTableInterfaceMixin for
2128     compatibility.
2129     (TransientTableBase.create): New intance variable column_map to
2130     map from names and indices to column objects
2131     (TransientTable.create): Use the new table interface of the input
2132     table
2133     (AutoTransientTable): Convert to new table interface. Derive from
2134     from OldTableInterfaceMixin for compatibility.
2135     (AutoTransientTable.write_record): Removed. It's not implemented
2136     yet and we still have to decide how to handle writing with the new
2137     table and data framework.
2138    
2139     * test/test_transientdb.py
2140     (TestTransientTable.run_iceland_political_tests)
2141     (TestTransientTable.test_transient_joined_table): Use the new
2142     table interface
2143    
2144 jonathan 817 2003-05-05 Jonathan Coles <[email protected]>
2145    
2146     This is namely a collection of UI updates to improve user interactivity.
2147     Tabbing between controls now exists and you can use ESC to close dialog
2148     boxes; ENTER will active the default button.
2149    
2150     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
2151     order that the controls are created so that tabbing works correctly.
2152     (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
2153     wxDialog can handle the default button correctly.
2154     (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
2155     same reasons as for OnOK.
2156     (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
2157     when we ask the table for the maximum/minimum values of a field
2158     which could take a very long time.
2159    
2160     * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
2161     order that the controls are created so that tabbing works correctly.
2162     (SelectPropertiesDialog.__init__): Rearrange the order that the
2163     controls are created so that tabbing works correctly.
2164    
2165     * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
2166     to derive from a wxDialog but behave like the original implementation
2167     which was derived from a wxFrame. wxDialog provides useful key
2168     handling functionality like ESC calling OnCancel and ENTER calling
2169     OnOK which is lost with wxFrame.
2170    
2171     * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
2172     new dialogs.
2173    
2174     * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
2175     order that the controls are created so that tabbing works correctly.
2176     (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
2177     (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
2178     (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
2179     (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
2180     can provide the "UK National Grid" as a default projection.
2181     (UTMPanel.__init__): Rearrange the order that the controls are
2182     created so that tabbing works correctly.
2183    
2184 bh 809 2003-05-05 Bernhard Herzog <[email protected]>
2185    
2186 bh 811 * extensions/thuban/wxproj.cpp: Fix some of the comments.
2187     (project_point): If a map projection but no layer projection is
2188     given, convert degrees to radians before applying the map
2189     projection.
2190    
2191 bh 809 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
2192     (TableGrid.allow_messages): New methods to make it possible to
2193     inhibit message sending.
2194     (TableGrid.issue): Only send the message if not inhibited.
2195     (LayerTableGrid.select_shape): Use the new methods to make sure
2196     that no ROW_SELECTED message is sent while we're updating the
2197     selected rows to match the selected shapes.
2198    
2199 jan 807 2003-05-02 Jan-Oliver Wagner <[email protected]>
2200    
2201     Implementation of MemoryTable.
2202    
2203     * Thuban/Model/table.py (MemoryTable): New. Quite simple table
2204     implementation that operates on a list of tuples. All of the data
2205     are kept in the memory.
2206    
2207     * test/test_table.py (MemoryTableTest): New.
2208    
2209     * test/test_transientdb.py (SimpleTable): Removed.
2210     (TestTransientTable.test_transient_joined_table,
2211     (TestTransientTable.test_transient_table_read_twice): Replaced
2212     SimpleTable by MemoryTable.
2213    
2214 jonathan 793 2003-04-30 Jonathan Coles <[email protected]>
2215    
2216 jonathan 803 * Data/iceland_sample.thuban: Now contains correct projections
2217     for each of the layers.
2218    
2219     * Resources/Projections/defaults.proj: Geographic projection
2220     contains unit conversion parameter.
2221    
2222     2003-04-30 Jonathan Coles <[email protected]>
2223    
2224 jonathan 793 The most important part of this putback is the projection changes.
2225     It should now be possible to specify the projection that a layer
2226     is in and then specify a different projection for the map. The
2227     projection dialog has an extra parameter for a geographic projection
2228     which lets the user select if the input is in degrees or radians.
2229    
2230     * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
2231     to say that the parameter is a tuple of unprojected
2232     points (which is what the callers to this method were assuming).
2233     Also, since the points are unprojected we need to projected them.
2234    
2235     * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
2236     LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
2237     groups are selected, move the layer up/down. Fixes RTbug #1833.
2238    
2239     * Thuban/UI/mainwindow.py: Move menu item map_rename up.
2240    
2241     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
2242     parameter in call to SetClientData.
2243     (GeoPanel): Add support for selecting the units that the
2244     source data is in (Radians or Degrees).
2245    
2246     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
2247     the rendering loop by reducing the number of if's, removing the
2248     unnecessary try/except block, and checking if the old group
2249     is the same as the new one (which happens a lot if there is
2250     no classification, or lots of shapes are in the same group).
2251    
2252     * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
2253     around the redraw routine to try to catch problems that the user
2254     may create by selecting invalid projections for the data set and
2255     map. Clears the display if there are any problems and prints the
2256     error.
2257     (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
2258     rectangle.
2259    
2260     * extensions/thuban/wxproj.cpp (project_point): First invert the
2261     supplied point (which should be in projected coordinates) using
2262     the layer's projection and then project the point using the
2263     map's projection.
2264     (project_points): Use project_point() to project each point.
2265    
2266 jan 792 2003-04-30 Jan-Oliver Wagner <[email protected]>
2267    
2268     * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
2269     don't set the Classification to None if the classfication field
2270     is None (ie only a DEFAULT).
2271    
2272 bh 786 2003-04-30 Bernhard Herzog <[email protected]>
2273    
2274 bh 790 * Thuban/UI/view.py: Fix some typos.
2275    
2276 bh 788 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
2277     not pop up the dialog if the selection becomes empty (this could
2278     happen if e.g. a new selection is opened while the identify tool
2279     is active and dialog had been closed)
2280    
2281     2003-04-30 Bernhard Herzog <[email protected]>
2282    
2283 bh 786 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
2284     instance variable read_record_last_result
2285     (TransientTableBase.read_record): Make sure reading the same
2286     record twice works. The implementation uses the new instance
2287     variable read_record_last_result
2288    
2289     * test/test_transientdb.py
2290     (TestTransientTable.test_transient_table_read_twice): New test
2291     case for the above bug-fix.
2292    
2293 jonathan 793 2003-04-29 Jonathan Coles <[email protected]>
2294    
2295     * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
2296    
2297     * Thuban/UI/classgen.py: Remove all uses of Str2Num.
2298    
2299     * Thuban/UI/classifier.py: Remove all uses of Str2Num.
2300     (ClassTable.SetValueAsCustom): Rename keyword argument in
2301     ClassGroup* constructors to match argument name.
2302    
2303 bh 779 2003-04-29 Bernhard Herzog <[email protected]>
2304    
2305     * Thuban/Model/session.py (Session.Destroy): Explicitly close the
2306     transient DB if it exists to make sure it doesn't leave a journal
2307     file in the temp directory.
2308    
2309     * Thuban/Model/transientdb.py (TransientDatabase.close): Set
2310     self.conn to None after closing the connection to make sure it's
2311     not closed twice
2312    
2313 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
2314    
2315 jonathan 769 Add a visible parameter in the layer XML tag. The default value is
2316     "true". If anything other than "false" is specified we also assume
2317 jonathan 776 "true". Addresses RTbug #1025.
2318 jonathan 769
2319     * Doc/thuban.dtd: Add visible parameter to a layer.
2320    
2321     * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
2322     of visible from 1 to True.
2323     (Layer.__init__): Change default value of visible from 1 to True.
2324    
2325     * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
2326     parameter.
2327    
2328     * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
2329     parameter.
2330    
2331     * test/test_load.py: Add new test data contents_test_visible.
2332     (LoadSessionTest.setUp): save test data.
2333     (LoadSessionTest.testLayerVisibility): Test if the visible flag
2334     is loaded correctly.
2335    
2336     * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
2337     for saving an invisible layer.
2338    
2339     2003-04-29 Jonathan Coles <[email protected]>
2340    
2341 jonathan 767 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
2342     legend dialog box and tell it to change its map to the one
2343     supplied to SetMap(). Fixes RTbug #1770.
2344    
2345 bh 764 2003-04-29 Bernhard Herzog <[email protected]>
2346    
2347 bh 766 Next step of table implementation. Introduce a transient database
2348     using SQLite that some of the data is copied to on demand. This
2349     allows us to do joins and other operations that require an index
2350     for good performance with reasonable efficiency. Thuban now needs
2351     SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
2352     haven't tested that.
2353    
2354     * Thuban/Model/transientdb.py: New. Transient database
2355     implementation.
2356    
2357     * test/test_transientdb.py: New. Tests for the transient DB
2358     classes.
2359    
2360     * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
2361     classes to help automatically remove temporary files and
2362     directories.
2363     (Session.__init__): New instance variables temp_dir for the
2364     temporary directory and transient_db for the SQLite database
2365     (Session.temp_directory): New. Create a temporary directory if not
2366     yet done and return its name. Use AutoRemoveDir to have it
2367     automatically deleted
2368     (Session.TransientDB): Instantiate the transient database if not
2369     done yet and return it.
2370    
2371     * Thuban/Model/data.py (ShapefileStore.__init__): Use an
2372     AutoTransientTable so that data is copied to the transient DB on
2373     demand.
2374     (SimpleStore): New class that simply combines a table and a
2375     shapefile
2376    
2377     * Thuban/Model/table.py (Table, DBFTable): Rename Table into
2378     DBFTable and update its doc-string to reflect the fact that this
2379     is only the table interface to a DBF file. Table is now an alias
2380     for DBFTable for temporary backwards compatibility.
2381    
2382     * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
2383     the last reference to the session goes away so that the temporary
2384     files are removed properly.
2385    
2386     * test/test_load.py (LoadSessionTest.tearDown): Remove the
2387     reference to the session to make sure the temporary files are
2388     removed.
2389    
2390     2003-04-29 Bernhard Herzog <[email protected]>
2391    
2392 bh 764 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
2393     the __parser instance variable into a normal local variable in
2394     read. It's only used there and read will never be called more than
2395     once. Plus it introduces a reference cycle that keeps can keep the
2396     session object alive for a long time.
2397    
2398 jonathan 767 2003-04-29 Jonathan Coles <[email protected]>
2399 jonathan 735
2400 jonathan 762 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
2401     Projection an immutable item. Fixes RTbug #1825.
2402     (Projection.__init__): Initialize instance variables here.
2403     (ProjFile.Replace): New. Replace the given projection object with
2404     the new projection object. This solves the problem of needing the
2405     mutator Projection.SetProjection() in the ProjFrame class and
2406     allows a projection to change parameters without changing its
2407     location in the file.
2408    
2409     * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
2410     be of type wxSAVE and should verify overwriting a file.
2411    
2412     * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
2413     ProjFile.Replace() method instead of the mutator
2414     Projection.SetProjection(). Also requires that we reassign the
2415     client data to the new projection.
2416    
2417     * test/test_proj.py (TestProjection.test): Test GetName() and
2418     GetAllParameters()
2419     (TestProjFile.test): Remove tests for Set*() methods. Add tests
2420     for Replace().
2421    
2422     2003-04-25 Jonathan Coles <[email protected]>
2423    
2424 jonathan 756 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
2425     to save the name of the projection.
2426    
2427     * test/test_save.py (SaveSessionTest.testLayerProjection): New
2428     test to verify layer projections are saved correctly.
2429    
2430     2003-04-25 Jonathan Coles <[email protected]>
2431    
2432 jonathan 753 * Thuban/Model/proj.py (Projection.SetName): Set the name
2433     to "Unknown" if name is None.
2434     (Projection.SetAllParameters): New. Set the projection's
2435     parameter list to the one supplied.
2436     (Projection.SetProjection): New. Set the projection's
2437     properties to those of the supplied Projection.
2438    
2439     * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
2440     the dialog title to include the map's title.
2441     (MainWindow.LayerProjection): Set the dialog title to include
2442     the layer's title.
2443    
2444     * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
2445     error dialogs into a single method call.
2446     (ProjFrame.__VerifyButtons): Add more states to check.
2447     (ProjFrame.__GetProjection): Return the current state of an
2448     edited projection or None.
2449     (ProjFrame.__FillAvailList): Remove checks for states that
2450     shouldn't exist.
2451     (ProjFrame._OnNew): Clear all selected items and supply
2452     a projection panel if necessary.
2453    
2454     * test/test_proj.py (TestProjFile.test): Add tests for
2455     ProjFile.SetAllParameters, ProjFile.SetProjection,
2456     ProjFile.SetName.
2457    
2458     2003-04-25 Jonathan Coles <[email protected]>
2459    
2460 jonathan 748 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
2461     takes an optional argument to select the current projection.
2462     This does not guarantee that the item is visible due to
2463     limited wxWindows functionality. Fixes RTBug #1821.
2464    
2465     2003-04-25 Jonathan Coles <[email protected]>
2466    
2467 jonathan 743 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
2468     the projection name and use it when constructing the Projection
2469     object.
2470    
2471     * Thuban/Model/proj.py (Projection.__init__): Change the default
2472     value for 'name' to None and then test if name is equal to None
2473     in the body of the constructor. This way the caller doesn't have to
2474     know what the default value should be. Namely, useful in load.py
2475     where we have to pick a default value if the 'name' parameter
2476     doesn't exist in the XML file.
2477    
2478     * test/test_load.py (LoadSessionTest.testLayerProjection): New.
2479     Tests a file where a layer has a projection.
2480    
2481     2003-04-25 Jonathan Coles <[email protected]>
2482    
2483 jonathan 735 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
2484     tree for projection information.
2485    
2486     * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
2487     XMLReader.GetFileName.
2488     (SessionLoader): Added support for loading projection tags that
2489     appear inside a layer.
2490    
2491     * Thuban/Model/proj.py (ProjFile): Document the class. Move
2492     back to using a list because the order of the projections in
2493     the file is important to maintain. Fixes RTbug #1817.
2494    
2495     * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
2496     to ProjFile.GetFilename.
2497    
2498     * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
2499     information.
2500    
2501     * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
2502     ProjFrame._OnSaveAs. Removed old dead code from previous
2503     implementation.
2504     (ProjFrame._OnExport): Add support for exporting more than one
2505     projection to a single file.
2506     (ProjFrame.__FillAvailList): use string formatting (% operator)
2507     to build strings that are (partly) translated. Fixes RTbug #1818.
2508    
2509     * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
2510     class.
2511    
2512 bh 734 2003-04-24 Bernhard Herzog <[email protected]>
2513    
2514     * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
2515    
2516     * po/fr.po: New. French translation by Daniel Calvelo Aros
2517    
2518     * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
2519     empty strings.
2520    
2521 jonathan 735 2003-04-24 Jonathan Coles <[email protected]>
2522 jonathan 724
2523     * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
2524     implement the interface that the ProjFrame dialog expects.
2525    
2526     * Thuban/Model/proj.py (Projection.SetName): New. Allows the
2527     name of the projection to be changed.
2528     (ProjFile): Use a dictionary instead of a list so that removing
2529     projections is easier and we are sure about uniqueness.
2530     (ProjFile.Remove): Remove the given projection object.
2531    
2532     * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
2533     Return a list with only one projection file instead of searching for
2534     any projection file. This simplifies many things if the user can
2535     only have one system file and one user file.
2536    
2537     * Thuban/UI/classgen.py: Change all references to
2538     genCombo to genChoice.
2539    
2540     * Thuban/UI/mainwindow.py: Add a Projection option under the
2541     layer menu.
2542     (MainWindow.LayerProjection): New. Open up a projection window
2543     for a layer.
2544    
2545     * Thuban/UI/projdialog.py: Large changes to how the dialog is
2546     laid out. Use three panels instead of one. One for the list of
2547     projections, one for the edit controls, and one for the buttons.
2548     Fixed resizing problems so that the dialog resizes correctly
2549     when the projection panel changes. Added import/export, save, and
2550     new buttons/functionality.
2551    
2552 bh 723 2003-04-24 Bernhard Herzog <[email protected]>
2553    
2554     First step towards table management. Introduce a simple data
2555     abstraction so that we replace the data a layer uses more easily
2556     in the next step.
2557    
2558     * Thuban/Model/data.py: New file with a simple data abstraction
2559     that bundles shapefile and dbffile into one object.
2560    
2561     * Thuban/Model/session.py (Session.OpenShapefile): New method to
2562     open shapefiles and return a shape store object
2563    
2564     * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
2565     object instead of a shapefile filename. This introduces a new
2566     instance variable store holding the datastore. For intermediate
2567     backwards compatibility keep the old instance variables.
2568     (open_shapefile): Removed. No longer needed with the shape store.
2569     (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
2570     get the shape store used by a layer.
2571     (Layer.Destroy): No need to explicitly destroy the shapefile or
2572     table anymore.
2573    
2574     * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
2575     (MainWindow.AddLayer): Use the session's OpenShapefile method to
2576     open shapefiles
2577    
2578     * Thuban/Model/load.py (ProcessSession.start_layer): Use the
2579     session's OpenShapefile method to open shapefiles
2580    
2581     * test/test_classification.py
2582     (TestClassification.test_classification): Use the session's
2583     OpenShapefile method to open shapefiles and build the filename in
2584     a more platform independed way
2585    
2586     * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2587     Implement to have a session to use in the tests
2588     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2589     (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
2590     session's OpenShapefile method to open shapefiles
2591     (TestLayerLegend.setUp): Instantiate a session so that we can use
2592     it to open shapefiles.
2593     (TestLayerLegend.tearDown): Make sure that all references to
2594     layers and session are removed otherwise we may get a resource
2595     leak
2596    
2597     * test/test_map.py (TestMapAddLayer.test_add_layer)
2598     (TestMapWithContents.setUp): Instantiate a session so that we can
2599     use it to open shapefiles.
2600     (TestMapWithContents.tearDown): Make sure that all references to
2601     layers, maps and sessions are removed otherwise we may get a
2602     resource leak
2603     ("__main__"): use support.run_tests() so that more info about
2604     uncollected garbage is printed
2605    
2606     * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
2607     session's OpenShapefile method to open shapefiles
2608     ("__main__"): use support.run_tests() so that more info about
2609     uncollected garbage is printed
2610    
2611     * test/test_selection.py (TestSelection.tearDown): Make sure that
2612     all references to the session and the selection are removed
2613     otherwise we may get a resource leak
2614     (TestSelection.get_layer): Instantiate a session so that we can
2615     use it to open shapefiles.
2616     ("__main__"): use support.run_tests() so that more info about
2617     uncollected garbage is printed
2618    
2619     * test/test_session.py (TestSessionBase.tearDown)
2620     (TestSessionWithContent.tearDown): Make sure that all references
2621     to the session and layers are removed otherwise we may get a
2622     resource leak
2623     (TestSessionWithContent.setUp): Use the session's OpenShapefile
2624     method to open shapefiles
2625    
2626 jonathan 721 2003-04-24 Jonathan Coles <[email protected]>
2627    
2628     * Thuban/Model/load.py (XMLReader.read): Should have been checking
2629     if the file_or_filename object had the 'read' attribute.
2630    
2631 jonathan 715 2003-04-23 Jonathan Coles <[email protected]>
2632    
2633 jonathan 720 * Thuban/Model/resource.py: Fixes RTbug #1813.
2634     (ReadProjFile): Add documentation about which exceptions are raised.
2635     Always pass the exceptions up to the caller.
2636     (GetProjFiles): If the directory can't be read return an empty list.
2637     If any of the proj files can't be read skip that file and go
2638     on to the next one.
2639    
2640     * test/test_proj.py: Added test cases to handle nonexistent files,
2641     unreadable files, and files that don't parse correctly.
2642    
2643     2003-04-23 Jonathan Coles <[email protected]>
2644    
2645 jonathan 716 Projection dialog. Allows the user to select from a list
2646     of projection templates and optionally edit them and save new ones.
2647    
2648     * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
2649     (ProjPanel): Base class for projection specific panels.
2650     (TMPanel): Projection panel for Transverse Mercartor.
2651     (UTMPanel): Projection panel for Universal Transverse Mercartor.
2652     (LCCPanel): Projection panel for Lambert Conic Conformal.
2653     (GeoPanel): Projetion panel for Geographic Projection.
2654    
2655     2003-04-23 Jonathan Coles <[email protected]>
2656    
2657 jonathan 715 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
2658     promote symmetry. There now exists XMLReader and XMLWriter.
2659     (XMLReader.read): New. Call to read the given file descriptor or
2660     filename.
2661     (XMLReader.close): New. Make sure the file is closed.
2662     (XMLReader.GetFileName): New. Return just the file name that is being
2663     read from.
2664     (XMLReader.GetDirectory): New. Return just the directory of the file
2665     that is being read.
2666     (XMLReader.AddDispatchers): New. Take a dictionary which contains
2667     the names of functions to call as the XML tree is parsed.
2668     (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
2669     (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
2670     (SessionLoader): Removed class variables start_dispatcher and
2671     end_dispatcher since this functionality is now part of a class
2672     instance. Fixes RTbug #1808.
2673     (SessionLoader.__init__): Add dispatcher functions.
2674     (load_xmlfile): Code was moved into the XMLReader.read().
2675     (load_session): Use modified SessionLoader.
2676    
2677     * Thuban/Model/map.py (Map.GetProjection): New. Returns the
2678     map's projection.
2679    
2680     * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
2681     GetAllParameters.
2682     (Projection.GetParameter): Returns the value for the given parameter.
2683    
2684     * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
2685     (GetProjFiles): Renamed from GetProjections. Now returns a list
2686     of ProjFile objects.
2687     (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
2688     a list of ProjFile objects whose files are not user defined.
2689     (GetUserProjFiles): Renamed from GetUserProjections. Returns a
2690     list of ProjFile objects whose files are user defined.
2691     (ProjFileReader): Extend new XMLReader.
2692    
2693     * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
2694     promote symmetry.
2695    
2696     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
2697     control instead of a wxComboBox. wxChoice controls do not generate
2698     events as the uses highlights possible choices which fixes problems
2699     with resizing the dialog when the use selects an option.
2700    
2701     * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
2702     control instead of a wxComboBox.
2703    
2704     * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
2705     dialog.
2706    
2707     * test/test_proj.py (TestProjection.test): New tests for GetParameter
2708     method.
2709    
2710 bh 703 2003-04-22 Bernhard Herzog <[email protected]>
2711    
2712 bh 705 * Thuban/UI/mainwindow.py: Remove some unused imports and global
2713     constants
2714    
2715 bh 703 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
2716     (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
2717    
2718 bh 700 2003-04-17 Bernhard Herzog <[email protected]>
2719    
2720 bh 701 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
2721     (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
2722     anymore.
2723     (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
2724     (Layer.ShapeType, Layer.Shape): No need to call
2725     self.open_shapefile since it's always called in __init__
2726    
2727 bh 700 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
2728     In wxPython 2.4 there's no need to extend MainLoop anymore since
2729     wxPython itself makes sure OnExit is called.
2730    
2731 jonathan 688 2003-04-16 Jonathan Coles <[email protected]>
2732    
2733 jonathan 693 Initial putback of projection management code. Includes new
2734     classes to read and write projection files. The current load
2735     and save classes were abstracted a bit so they could be reused.
2736     The Projection class was extended to provide new methods and
2737     have a name.
2738    
2739     * Thuban/Model/load.py (XMLProcessor): New. Contains all the
2740     general XML reading methods that were part of ProcessSession.
2741    
2742     * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
2743     name.
2744     (ProjFile): New. Represents a file that contains projection
2745     information.
2746    
2747     * Thuban/Model/resource.py: New. Contains general utilities
2748     for read and writing projection files.
2749    
2750     * Thuban/Model/save.py (XMLSaver): New. Contains all the
2751     general XML writing methods that were part of SessionSaver.
2752     (SessionSaver): Renamed from Saver.
2753    
2754     * test/test_proj.py: New test cases for the projection
2755     file read and write functions.
2756    
2757     2003-04-16 Jonathan Coles <[email protected]>
2758    
2759 jonathan 688 * Thuban/Model/classification.py: Use repr() around values
2760     in the ClassGroup*.__repr__() methods so it is clearer when
2761     a value is a string and when it is a number.
2762    
2763     * test/test_load.py: Rework the classification test to test
2764     that we can load old files.
2765     (testLabels): Test a file where the groups have labels.
2766    
2767 bh 687 2003-04-16 Bernhard Herzog <[email protected]>
2768    
2769     Safer implementation of the performance enhancements of the
2770     low-level renderer:
2771    
2772     * extensions/thuban/wxproj.cpp (extract_projection)
2773     (extract_pointer): Rename extract_projection to extract_pointer
2774     and redefine its purpose to return the pointer stored in a CObject
2775     returned by the object's cobject method. Update all callers.
2776     (s_draw_info, free_draw_info, draw_polygon_init): Implement the
2777     handling of these low-level parameters so that each s_draw_info
2778     instance is handled as a CObject at python level that also
2779     contains real references to the actual python objects which
2780     contain the values in the struct. Add free_draw_info as the
2781     destructor.
2782     (draw_polygon_shape): Add the py_draw_info parameter which must a
2783     cobject containing an s_draw_info pointer.
2784    
2785     * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
2786     method to instantiat the low-level render parameter
2787     (MapRenderer.draw_shape_layer): Use the new method. Remove some
2788     commented out code.
2789     (MapRenderer.draw_polygon_shape): Make the first parameter not the
2790     layer but the low-level render parameter
2791     (ScreenRenderer.draw_shape_layer): Use the low-level render
2792     parameter.
2793    
2794 jonathan 673 2003-04-15 Jonathan Coles <[email protected]>
2795    
2796 jonathan 680 * Thuban/Model/classification.py: Implemented __repr__ for
2797     the ClassGroup* classes to make debugging a bit easier.
2798     (ClassGroup.SetLabel): Check that the string is an instance
2799     of StringTypes not StringType. Accounts for Unicode strings.
2800    
2801     * Thuban/Model/color.py: Implemented __repr__ to make
2802     debugging a bit easier.
2803    
2804     * Thuban/Model/save.py (Saver.write_classification): Need to
2805     save the group label.
2806    
2807     * test/test_load.py (testClassification): New. Loads the
2808     iceland_sample_test.thuban file and checks if it was loaded
2809     correctly.
2810    
2811     2003-04-15 Jonathan Coles <[email protected]>
2812    
2813 jonathan 673 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
2814     to improve rendering performance by initializing the variables
2815     that are not change each time draw_polygon_shape() is called.
2816     The values are stored in a global struct draw_info.
2817     (draw_polygon_shape): Removed initialization code that is
2818     now in draw_polygon_init().
2819    
2820     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
2821 jonathan 674 drawing initialization call to draw_polygon_init()
2822     (MapRenderer.draw_polygon_shape): Use new signature of
2823     draw_polygon_shape.
2824 jonathan 673
2825 jonathan 674 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
2826     weirdness by setting the range to (1, maxint).
2827 jonathan 673
2828 jonathan 674 * Thuban/Model/classification.py (ClassGroupProperties): Make
2829     instance variables private and optimize comparison operator
2830     by first checking if the color references are the same.
2831     (ClassGroupSingleton): Make instance variables private.
2832     (ClassGroupRange): Make instance variables private.
2833 jonathan 673
2834 jonathan 674 * HOWTO-Release: Filled in missing steps for releasing packages.
2835    
2836 bh 672 2003-04-15 Bernhard Herzog <[email protected]>
2837    
2838     First stab at internationalized messages:
2839    
2840     * Thuban/__init__.py (_): Implement the translation function for
2841     real using the python gettext module.
2842    
2843     * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
2844     translate empty strings.
2845    
2846     * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2847     Add a missing space to a warning message
2848    
2849     * po/README: New. Notes about the management of the translation
2850     files.
2851    
2852     * po/Makefile: New. Makefile to help manage the translation files.
2853    
2854     * po/es.po: New. Spanish translation by Daniel Calvelo Aros
2855    
2856     * MANIFEST.in: Include the *.mo files in Resources/Locale and the
2857     translations and support files in po/
2858    
2859     * setup.py (data_files): Add the *.mo files to the data_files too
2860    
2861     * README: Add note about the translations when building from CVS
2862    
2863 jonathan 669 2003-04-14 Jonathan Coles <[email protected]>
2864    
2865     * Thuban/UI/dock.py: Fixes some window resizing problems most
2866     noticable under windows. Always assume the button bitmaps will
2867     be there. Code clean up.
2868     (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
2869     images for the dock/undock button to the same images.
2870     Work around for RTbug #1801.
2871    
2872     * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
2873     be allowed to grow within the sizer. Fixes a bug under Windows
2874     where the toolbar wasn't being drawn.
2875    
2876 frank 664 2003-04-14 Frank Koormann <[email protected]>
2877    
2878     * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
2879     Updated design to try to make the button functionality more
2880     transparent.
2881    
2882 jonathan 662 2003-04-14 Jonathan Coles <[email protected]>
2883    
2884     * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
2885     finalize the intialization of the panel.
2886    
2887     * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
2888     creation of the panel. Should be the last thing called in the
2889     initializer of a subclass.
2890    
2891     * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
2892     set the current selections in the combo boxes. This is needed
2893     under Windows.
2894    
2895     * Thuban/UI/classifier.py (Classifier.__init__): Add a top
2896     level panel to the dialog so that the background colors are
2897     consistent under Windows.
2898    
2899 jonathan 646 2003-04-11 Jonathan Coles <[email protected]>
2900    
2901 jonathan 662 * Thuban/UI/classgen.py: Change color ramps to start at white
2902     not black.
2903    
2904     * Thuban/UI/legend.py: Enable/disable the legend buttons when
2905     the legend changes. Fixes RTbug #1793.
2906    
2907     * test/test_classification.py: Added test for copying of
2908     classifications.
2909    
2910     2003-04-11 Jonathan Coles <[email protected]>
2911    
2912 jonathan 647 * Thuban/UI/resource.py: New. Centralize the loading of resources
2913     such as bitmaps.
2914    
2915     * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
2916     added images to the move buttons, added 'reverse' button.
2917     (CustomRampPanel.__init__): Added images to the move buttons.
2918     (GreyRamp): New. Generates a ramp from white to black.
2919     (HotToColdRamp): New. Generates a ramp from cold to hot colors.
2920    
2921     * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
2922     ID_PROPERTY_*.
2923     (Classifier.__init__): Minor changes to the layout.
2924     (Classifier._OnTitleChanged): Listen for when the user edits the
2925     title and update the dialog's title and the layer's title.
2926    
2927     * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
2928    
2929     * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
2930     (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
2931     if the layer's title changes.
2932    
2933     * Thuban/UI/mainwindow.py: Added new menu item and associated code
2934     to open a dialog to rename the map.
2935     (MainWindow): Use new resource class to import bitmaps.
2936    
2937     2003-04-11 Jonathan Coles <[email protected]>
2938    
2939 jonathan 646 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
2940 jonathan 647 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
2941     Resources/Bitmaps/group_use_none.xpm,
2942     Resources/Bitmaps/group_use_not.xpm,
2943     Resources/Bitmaps/hide_layer.xpm,
2944     Resources/Bitmaps/layer_properties.xpm,
2945     Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
2946     Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
2947     New.
2948 jonathan 646
2949 jonathan 636 2003-04-10 Jonathan Coles <[email protected]>
2950    
2951 jonathan 644 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
2952     Should pass group to ClassGroup constructor.
2953    
2954     2003-04-10 Jonathan Coles <[email protected]>
2955    
2956 jonathan 636 * Thuban/Model/classification.py: (ClassGroup): Move all the common
2957     methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
2958     here. Implement SetVisible(), IsVisible().
2959     (ClassGroup.__init__): Add group parameter which acts as a copy
2960     constructor.
2961    
2962     * Thuban/UI/classifier.py (ClassTable): Add a new column for the
2963     "Visible" check boxes.
2964     (Classifier): Rename the buttons and refactor the code to match
2965     the new labels.
2966    
2967     * Thuban/UI/legend.py: Classify button is now called "Properties".
2968     Refactored the code to change variable names.
2969     (LegendTree.__FillTreeLayer): Only list a group if it is visible.
2970    
2971     * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
2972     MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
2973     renamed to MainWindow.LayerEditProperties.
2974     (MainWindow.ToggleLegend): Don't include map name in legend title.
2975     (MainWindow.SetMap): Added the map name to the window title.
2976     (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
2977     MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
2978     Functionality is found in the layer properties dialog.
2979    
2980     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
2981     draw visible groups.
2982    
2983 jonathan 626 2003-04-09 Jonathan Coles <[email protected]>
2984    
2985 jonathan 634 * Thuban/UI/classgen.py: Modifications to allow simple
2986     addition and selection of new color schemes.
2987     (MonochromaticRamp): New. Generates a ramp between two colors.
2988     (RedRamp): New. Generates a ramp of all red.
2989     (GreenRamp): New. Generates a ramp of all green.
2990     (BlueRamp): New. Generates a ramp of all blue.
2991    
2992     2003-04-09 Jonathan Coles <[email protected]>
2993    
2994 jonathan 626 * Thuban/Model/classification.py (Classification.__deepcopy__):
2995     Need to copy over field and fieldType attributes.
2996    
2997     * Thuban/Model/table.py (Table.field_range): New. Retrive the
2998     maximum and minimum values over the entire table for a given
2999     field.
3000     (Table.GetUniqueValues): New. Retrieve all the unique values
3001     in the table for a given field.
3002    
3003     * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
3004     (GenUniquePanel): New. Controls to allow the user to select
3005     which unique field values they would like in the classification.
3006     (CustomRampPanel): Code that was in ClassGenDialog that allows
3007     the user to select the properties for a custom ramp.
3008     (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
3009    
3010     * Thuban/UI/classifier.py: Removed a lot of debugging code.
3011     (Classifier._SetClassification): Callback method so that the
3012     class generator can set the classification in the grid.
3013     (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
3014     editing of a group properties class into a wxWindows control.
3015    
3016     * Thuban/UI/dock.py: It was decided that if the user closes
3017     a dockable window the window should simply hide itself. That
3018     way if the user wants to show the dock again it appears in the
3019     same place as it was when it was closed.
3020     (DockableWindow.Destroy): Call renamed method OnDockDestroy().
3021     (DockableWindow._OnButtonClose): Hide the window instead of
3022     destroying it.
3023     (DockableWindow._OnClose): Hide the window instead of
3024     destroying it.
3025    
3026     * Thuban/UI/legend.py (LegendTree): Use a private method to
3027     consistently set the font and style of the text. Fixes RTbug #1786.
3028    
3029     * Thuban/UI/mainwindow.py: Import just the Classifier class.
3030    
3031 bh 623 2003-04-07 Bernhard Herzog <[email protected]>
3032    
3033 bh 625 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
3034     to the map module
3035    
3036     2003-04-07 Bernhard Herzog <[email protected]>
3037    
3038 bh 623 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
3039     favor of ToggleSessionTree
3040     (MainWindow.ToggleSessionTree): New method to toggle visibility of
3041     the session tree.
3042     (MainWindow.SessionTreeShown): New method to return whether the
3043     session tree is currently shown.
3044     (MainWindow.ToggleLegend): New method to toggle visibility of the
3045     legend
3046     (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
3047     LegendShown
3048     (MainWindow.LegendShown): New method to return whether the legend
3049     is currently shown.
3050     (_method_command): Add checked parameter so we can define check
3051     menu items
3052     (_has_tree_window_shown, _has_legend_shown): Use the appropriate
3053     mainwindow methods.
3054     (show_session_tree, show_legend commands): Removed.
3055     (toggle_session_tree, toggle_legend commands): New commands to
3056     toggle the visibility of the dialogs
3057    
3058 jonathan 612 2003-04-07 Jonathan Coles <[email protected]>
3059    
3060 jonathan 619 * Thuban/UI/classgen.py: Fix Windows problem.
3061    
3062     * Thuban/UI/dock.py: Fix Windows problem.
3063    
3064     * Thuban/UI/mainwindow.py: Use False instead of false.
3065     (MainWindow.ShowLegend): Remove unnecessary switch parameter.
3066    
3067     2003-04-07 Jonathan Coles <[email protected]>
3068    
3069 jonathan 612 Since we now say that the order of the groups in a classification
3070     matters, it makes sense to be able to manipulate that order. Most
3071     of the changes to Thuban/Model/classification.py are to that end.
3072    
3073     * Thuban/Model/classification.py (Classification.AppendGroup,
3074     Classification.InsertGroup, Classification.ReplaceGroup,
3075     Classification.RemoveGroup, Classification.GetGroup): Do as the
3076     names imply.
3077     (Classification.FindGroup): This was called GetGroup, but GetGroup
3078     takes an index, while FindGroup takes a value.
3079     (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
3080     REFERENCE. Currently there is a cyclic reference between the layer
3081     and its classification. If the classification doesn't need to know
3082     its owning layer we can change this, since it may make sense to be
3083     able to use the same classification with different layers.
3084    
3085     * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
3086    
3087     * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
3088     not AddGroup()
3089    
3090     * Thuban/UI/classifier.py: Now that we can depend on the order in
3091     a Classification and have methods to manipulate that order we don't
3092     need to use our own data structures in the grid. We can simply make
3093     the grid/table access the information they need from a copy of
3094     the classification object.
3095     (Classifier._OnCloseBtn): Event handler for when the user clicks
3096     'Close'. This is needed so if the user applies changes and then
3097     continues to change the table the user has the option of discarding
3098     the most recent changes and keeping what they applied.
3099    
3100     * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
3101     into the same group.
3102    
3103     * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
3104     with a really old version of proj, PJ_VERSION won't even be defined.
3105     If it isn't defined then just compile so that the function always
3106     returns Py_False.
3107    
3108     * test/test_classification.py: Fix tests to use the renamed methods.
3109     Still need to write tests for the new methods.
3110    
3111 jonathan 601 2003-04-04 Jonathan Coles <[email protected]>
3112 jonathan 608
3113 jonathan 612 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
3114     call to SetSelection out of the method and before the call
3115     to __SelectField in __init__. This prevents a recursion of events
3116     when _OnFieldSelect is triggered by the user.
3117    
3118     2003-04-04 Jonathan Coles <[email protected]>
3119    
3120 jonathan 608 * Thuban/Model/classification.py: Rename Color.None to
3121     Color.Transparent.
3122     (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
3123     Don't bother copying the color, since Colors are immutable.
3124    
3125     * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
3126     Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
3127     Thuban/UI/renderer.py, Thuban/UI/view.py:
3128     Rename Color.None to Color.Transparent.
3129    
3130     * test/test_classification.py, test/test_load.py: Rename Color.None
3131     to Color.Transparent.
3132    
3133     2003-04-04 Jonathan Coles <[email protected]>
3134 jonathan 603
3135     * Thuban/Model/classification.py: Fix assert calls.
3136     (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
3137     Copy the color parameter rather than hold onto a reference.
3138 jonathan 601
3139 jonathan 603 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
3140     the color object.
3141     (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
3142     are sure there exists only one refernce to Color.None in the system.
3143     This allows us to use 'is' rather than the comparision functions.
3144    
3145     * Thuban/Model/save.py: Fix assert calls.
3146    
3147     * Thuban/UI/classifier.py: Fix assert calls.
3148     (ClassGrid._OnCellDClick): Call up to the classifier to open the
3149     dialog to edit the groups properties.
3150     (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
3151     correctly if a cell is resized.
3152     (ClassTable.SetClassification): New. Changes the classification
3153     that is in the table.
3154     (ClassTable.__SetRow): Allow groups to be prepended.
3155     (Classifier): New code for opening the EditProperties and
3156     GenerateRanges dialogs.
3157     (SelectPropertiesDialog.__GetColor): Only set the color in the
3158     color dialog if the current color is not None.
3159    
3160     * Thuban/UI/dock.py: Fix assert calls.
3161    
3162     * Thuban/UI/legend.py: Fix assert calls.
3163    
3164     * Thuban/UI/renderer.py: Fix assert calls.
3165    
3166     * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
3167     classifications.
3168     (GenRangePanel): Panel specific to range generation.
3169     (GenSingletonPanel): Panel specific to singleton generation.
3170     (ClassGenerator): Class responsible for actually generating
3171     the classification from the data gathered in the dialog box.
3172     (PropertyRamp): Generates properties whose values range from
3173     a starting property to an ending property.
3174 jonathan 601
3175 bh 600 2003-04-03 Bernhard Herzog <[email protected]>
3176    
3177     * test/support.py (print_garbage_information): New function that
3178     prints information about still connected messages and memory
3179     leaks.
3180     (run_suite): Removed.
3181     (run_tests): New function for use as a replacement of
3182     unittest.main in the test_* files. This one calls
3183     print_garbage_information at the end.
3184    
3185     * test/runtests.py (main): Use support.print_garbage_information
3186    
3187     * test/test_layer.py: Use support.run_tests instead of
3188     unittest.main so we get memory leak information
3189     (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
3190     (TestLayer.test_point_layer, TestLayer.test_empty_layer)
3191     (TestLayerLegend.test_visibility): Call the layer's Destroy method
3192     to fix a memory leak.
3193    
3194     * test/test_classification.py: Use support.run_tests instead of
3195     unittest.main so we get memory leak information
3196     (TestClassification.test_classification): Call the layer's Destroy
3197     method to fix a memory leak.
3198    
3199 bh 591 2003-04-02 Bernhard Herzog <[email protected]>
3200    
3201 bh 595 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
3202     Handle the reference counts of the return value and errors in
3203     PyArg_ParseTuple correctly.
3204    
3205 bh 593 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
3206     sure the filename is absolute to avoid problems when saving the
3207     session again
3208    
3209 bh 591 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
3210    
3211 jonathan 587 2003-04-01 Jonathan Coles <[email protected]>
3212    
3213 jonathan 589 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
3214 jonathan 587 that there actually are points in the returned list of points
3215     before trying to index into the list. The list may be empty if
3216     the shape is a Null Shape.
3217    
3218 bh 586 2003-04-01 Bernhard Herzog <[email protected]>
3219    
3220     * test/test_map.py: Don't use from <module> import *
3221    
3222 jonathan 581 2003-04-01 Jonathan Coles <[email protected]>
3223    
3224     * Thuban/Model/session.py: Use LAYER_CHANGED instead of
3225     LAYER_LEGEND_CHANGED
3226    
3227     * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
3228     self.Destroy() to close the window after yesterday's changes.
3229    
3230     * test/test_map.py, test/test_session.py: Fix messages that
3231     are sent from maps and layers.
3232    
3233 jonathan 575 2003-03-31 Jonathan Coles <[email protected]>
3234    
3235     * Thuban/UI/classifier.py: Commented out some debugging statements.
3236     (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
3237     RTbug #1769.
3238    
3239     * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
3240     position (although position doesn't work yet under GTK).
3241     (DockableWindow.Destroy): New. Called when the window must be
3242     closed. Namely needed when the DockFrame closes and must close
3243     its children.
3244     (DockFrame): Listen for EVT_CLOSE and destroy all children.
3245    
3246     * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
3247     when then window is told to close.
3248     (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
3249     comment in source for more info.
3250    
3251     * Thuban/UI/main.py: Show the legend by default when Thuban starts.
3252    
3253     * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
3254     symmetry with other such methods.
3255     (MainWindow.ShowLegend): Show the legend docked by default.
3256    
3257 jonathan 569 2003-03-28 Jonathan Coles <[email protected]>
3258    
3259     * Thuban/UI/classifier.py: Support for highlighting a specific
3260     group within the grid when the classification dialog is opened.
3261     Also contains a lot of debugging printouts which will later
3262     be removed.
3263    
3264     * Thuban/UI/dock.py: Complete rework on the dock code so that
3265     that it is fairly removed from the rest of the Thuban application.
3266     It is easy to add new docks which the rest of the program having
3267     to be aware of them.
3268    
3269     * Thuban/UI/legend.py: Modifications to support selecting a
3270     specific group in the classification dialog. Changed how layers
3271     are drawn when the layer is visible/invisible.
3272    
3273     * Thuban/UI/mainwindow.py: Removed legend specific code and
3274     replaced it with calls to the new dock code.
3275    
3276     * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
3277     to check if scale > 0. Trying to track down a divide by zero.
3278    
3279 jonathan 557 2003-03-26 Jonathan Coles <[email protected]>
3280    
3281 jonathan 567 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
3282     (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
3283     now part of DockableWindow.
3284     (LegendPanel.DoOnSelChanged): Select the current layer in the
3285     map.
3286     (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
3287     with the selected layer and/or group.
3288    
3289     2003-03-26 Jonathan Coles <[email protected]>
3290    
3291 jonathan 557 This putback contains the code for dockable windows. There is
3292     no support in wxWindows as of this date for windows that can
3293     attach themselves to other windows.
3294    
3295     The current model contains a DockableWindow which has a parent
3296     window for when it is detached and a dock window that it puts
3297     its contents in when it is docked. The contents of a DockableWindow
3298     must be a DockPanel. DockPanel itself derives from wxPanel.
3299    
3300     * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
3301     message, not a LAYER_LEGEND_CHANGED message.
3302    
3303     * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
3304    
3305     * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
3306     as one of the style properties for the fieldTypeText item to
3307     be sure that its size is correct when the text changes.
3308    
3309     * Thuban/UI/dock.py: New. Classes for the DockPanel and
3310     DockableWindow.
3311    
3312     * Thuban/UI/legend.py: Added some more buttons and made the
3313     LegendPanel a DockPanel.
3314    
3315     * Thuban/UI/mainwindow.py: Added sash windows to the main window
3316     and supporting functions for manipulating the sashes.
3317     (MainWindow.ShowLegend): Create a DockableWindow with the
3318     LegendPanel as the contents.
3319    
3320     * Thuban/UI/messages.py: Added DOCKABLE_* messages
3321    
3322     * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
3323     not LAYER_LEGEND_CHANGED, messages.
3324    
3325 jonathan 554 2003-03-25 Jonathan Coles <[email protected]>
3326    
3327     * setup.py: Added custom script bdist_rpm_build_script so that
3328     when the rpm is built the path to wx-config is correct.
3329    
3330     * setup.cfg: Added line saying to use the custom build script
3331    
3332 jonathan 552 2003-03-20 Jonathan Coles <[email protected]>
3333    
3334     Initial implementation of the Legend.
3335    
3336     * Thuban/UI/legend.py: New. Creates a window that shows the map's
3337     Legend information and allows the user to add/modify classifications
3338     and how the layers are drawn on the map.
3339    
3340     * setup.py: New command 'build_docs' which currently uses
3341     happydoc to generate html documentation for Thuban.
3342    
3343     * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
3344     Returns a string which is appropriately describes the group.
3345    
3346     * Thuban/Model/layer.py (Layer.SetClassification): Generate a
3347     LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
3348    
3349     * Thuban/Model/map.py (Map): Rename messages and use new, more
3350     specific, messages.
3351    
3352     * Thuban/Model/messages.py: New message to indicate that a layer's
3353     data has changed (LAYER_CHANGED). New map messages to indicate
3354     when layers have been added/removed/changed or if the stacking order
3355     of the layers has changed.
3356    
3357     * Thuban/Model/session.py: Rename and use new messages.
3358    
3359     * Thuban/UI/classifier.py: Remember if any changes have actually
3360     been applied so that if the dialog is cancelled without an application
3361     of changes we don't have to set a new classification.
3362     (ClassDataPreviewer): Pulled out the window specific code and put it
3363     ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
3364     symbols on any DC.
3365    
3366     * Thuban/UI/mainwindow.py: New code to open the legend.
3367    
3368     * Thuban/UI/view.py: Use new message names.
3369    
3370 jonathan 541 2003-03-19 Jonathan Coles <[email protected]>
3371    
3372     * Thuban/UI/main.py (verify_versions): New. Checks the versions
3373     of Python, wxPython, and some other libraries.
3374    
3375     * extensions/thuban/wxproj.cpp (check_version): Checks the given
3376     version against what wxproj was compiled with.
3377     (check_version_gtk): If wxproj was compiled with gtk then check
3378     the given version against the version of the gtk library
3379     currently being used.
3380    
3381 bh 538 2003-03-14 Bernhard Herzog <[email protected]>
3382    
3383     * test/test_command.py: Run the tests when the module is run as a
3384     script
3385    
3386     2003-03-14 Bernhard Herzog <[email protected]>
3387    
3388     Implement selection of multiple selected shapes in the same layer:
3389    
3390     - Introduce a new class to hold the selection. This basically
3391     replaces the interactor which was nothing more than the
3392     selection anyway. A major difference is of course that the new
3393     selection class supports multiple selected shapes in one layer
3394    
3395     - Move the object that represents the selection from the
3396     application to the canvas. The canvas is a better place than the
3397     application because the selection represents which shapes and
3398     layer of the map displayed by the canvas are selected and
3399     affects how the map is drawn.
3400    
3401     - Make the selection and its messages publicly available through
3402     the mainwindow.
3403    
3404     - The non-modal dialogs do not get a reference to the interactor
3405     anymore as they can simply refer to their parent, the
3406     mainwindow, for the what the interactor had to offer.
3407    
3408     * Thuban/UI/selection.py: New module with a class to represent the
3409     selection.
3410    
3411     * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
3412     these unused messages
3413    
3414     * Thuban/UI/application.py (ThubanApplication.OnInit)
3415     (ThubanApplication.OnExit, ThubanApplication.SetSession): The
3416     interactor is gone now.
3417     (ThubanApplication.CreateMainWindow): There is no interactor
3418     anymore so we pass None as the interactor argument for now for
3419     compatibility.
3420    
3421     * Thuban/UI/view.py (MapCanvas.delegated_messages)
3422     (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
3423     Unsubscribe, delegate messages according to the delegated_messages
3424     class variable.
3425     (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
3426     attributes from instance variables as described with the
3427     delegated_methods class variable.
3428     (MapCanvas.__init__): New instance variable selection holding the
3429     current selection
3430     (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
3431     pass them on to the renderer
3432     (MapCanvas.SetMap): Clear the selection when a different map is
3433     selected.
3434     (MapCanvas.shape_selected): Simple force a complete redraw. The
3435     selection class now takes care of only issueing SHAPES_SELECTED
3436     messages when the set of selected shapes actually does change.
3437     (MapCanvas.SelectShapeAt): The selection is now managed in
3438     self.selection
3439    
3440     * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
3441     (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
3442     Unsubscribe, delegate messages according to the delegated_messages
3443     class variable.
3444     (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
3445     attributes from instance variables as described with the
3446     delegated_methods class variable.
3447     (MainWindow.__init__): The interactor as ivar is gone. The
3448     parameter is still there for compatibility. The selection messages
3449     now come from the canvas.
3450     (MainWindow.current_layer, MainWindow.has_selected_layer):
3451     Delegate to the the canvas.
3452     (MainWindow.LayerShowTable, MainWindow.Classify)
3453     (MainWindow.identify_view_on_demand): The dialogs don't need the
3454     interactor parameter anymore.
3455    
3456     * Thuban/UI/tableview.py (TableFrame.__init__)
3457     (LayerTableFrame.__init__, LayerTableFrame.OnClose)
3458     (LayerTableFrame.row_selected): The interactor is gone. It's job
3459     from the dialog's point of view is now done by the mainwindow,
3460     i.e. the parent. Subscribe to SHAPES_SELECTED instead
3461     of SELECTED_SHAPE
3462    
3463     * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
3464     is gone. It's job from the dialog's point of view is now done by
3465     the mainwindow, i.e. the parent.
3466    
3467     * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
3468     gone. It's job from the dialog's point of view is now done by the
3469     mainwindow, i.e. the parent.
3470    
3471     * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
3472     gone. It's job from the dialog's point of view is now done by the
3473     mainwindow, i.e. the parent.
3474     (SessionTreeCtrl.__init__): New parameter mainwindow which is
3475     stored as self.mainwindow. The mainwindow is need so that the tree
3476     can still subscribe to the selection messages.
3477     (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
3478     (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
3479     selection is now accessible through the mainwindow. Subscribe to
3480     SHAPES_SELECTED instead of SELECTED_SHAPE
3481    
3482     * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
3483     SHAPES_SELECTED message now.
3484     (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
3485     so deal with multiple shapes
3486     (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
3487     gone. It's job from the dialog's point of view is now done by the
3488     mainwindow, i.e. the parent.
3489    
3490     * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
3491     parameter is now a list of shape ids.
3492     (RecordTable.SetTable): The second parameter is now a list of
3493     indices.
3494    
3495     * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
3496     selected_shape parameter and ivar to selected_shapes. It's now a
3497     list of shape ids.
3498     (MapRenderer.draw_label_layer): Deal with multiple selected
3499     shapes. Rearrange the code a bit so that the setup and shape type
3500     distinctions are only executed once.
3501    
3502     * test/test_selection.py: Test cases for the selection class
3503    
3504 jonathan 527 2003-03-11 Jonathan Coles <[email protected]>
3505    
3506     * Thuban/Model/load.py: Temporary fix so that the xml reader
3507     doesn't cause Thuban to crash.
3508    
3509     * Thuban/Model/layer.py: Handle the cyclic references between
3510     a layer and its classification better, and be sure to disconnect
3511     the classification from the layer when the layer is destroyed
3512     so that we don't maintain a cyclic reference that may not be
3513     garbage collected.
3514    
3515     * Thuban/Model/classification.py: See comment for layer.py.
3516    
3517 jan 523 2003-03-12 Jan-Oliver Wagner <[email protected]>
3518    
3519     * HOWTO-Release: New. Information on the steps for releasing
3520     a new version of Thuban.
3521    
3522 jonathan 514 2003-03-11 Jonathan Coles <[email protected]>
3523    
3524     * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
3525     Use True instead of true.
3526     (Classifier): Should have a single panel in which all the controls lie.
3527    
3528     * Thuban/UI/proj4dialog.py: Add normal border.
3529    
3530     * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
3531    
3532     * Thuban/UI/mainwindow.py: Use True instead of true.
3533    
3534     * setup.py: Update some definitions to use wxWindows2.4 files
3535    
3536     * Data/iceland_sample_class.thuban: Fixed file so that the
3537     field_type information is present.
3538    
3539 jonathan 490 2003-03-10 Jonathan Coles <[email protected]>
3540    
3541 jonathan 505 * Thuban/UI/classifier.py (Classifier.__init__): Make the
3542     field type label grow so that when the text changes the
3543     size is updated correctly. This may be a wxWindows bug.
3544    
3545     2003-03-10 Jonathan Coles <[email protected]>
3546    
3547 jonathan 499 * Thuban/UI/application.py: Changed SESSION_CHANGED to
3548     SESSION_REPLACED.
3549    
3550     * Thuban/UI/classifier.py: Wrap text with _().
3551     (ClassGrid.CreateTable): Set dimensions and size hints here,
3552     instead of in Reset, so we only set the size once.
3553    
3554     * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
3555    
3556     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3557     Call Close() instead of Shutdown().
3558    
3559     * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3560    
3561     * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3562     Go back to using OnClose() instead of Shutdown().
3563    
3564     2003-03-10 Jonathan Coles <[email protected]>
3565    
3566 jonathan 497 * Thuban/UI/classifier.py (Classifier): SelectField() needed
3567     to know the old field index as well as the new one.
3568    
3569     2003-03-10 Jonathan Coles <[email protected]>
3570    
3571 jonathan 495 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
3572     to correctly set the table information and call this from
3573     __init__ and from _OnFieldSelect so that all the information
3574     is up to date when the dialog opens and when a field is changed.
3575    
3576     2003-03-10 Jonathan Coles <[email protected]>
3577    
3578 jonathan 490 * Thuban/Model/classification.py (Classification): Don't use
3579     layer's message function directly, use the ClassChanged() method
3580     when then classification changes. SetField/SetFieldType/SetLayer
3581     must keep the information about field name and field type in
3582     sync when an owning layer is set or removed.
3583    
3584     * Thuban/Model/layer.py: Added ClassChanged() so that the
3585     classification can tell the layer when its data has changed.
3586     (Layer.SetClassification): Accepts None as an arguement to
3587     remove the current classification and correctly handles
3588     adding a new classification.
3589    
3590     * Thuban/Model/load.py: Comment out print statement
3591    
3592     * test/test_classification.py, test/test_save.py: New and
3593     improved tests.
3594    
3595 jonathan 483 2003-03-07 Jonathan Coles <[email protected]>
3596    
3597     * Thuban/Model/classification.py: Implemented __copy__ and
3598     __deepcopy__ for ClassGroup* and ClassGroupProperites so
3599     they can easily be copied by the classifier dialog.
3600     (ClassGroupProperites.__init__): The default line color should
3601     have been Color.Black.
3602    
3603     * Thuban/UI/classifier.py: Setting and Getting table values now
3604     uses a consistent set of functions.
3605     (Classifier): Now non-modal. Has field type label which changes
3606     as the field changes. Keep track of buttons in a list so that
3607     we can enable/disable the buttons when the None field is selected.
3608     (SelectPropertiesDialog): Add buttons to make the colors transparent.
3609    
3610     * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
3611     does what OnClose did, but can be called by the application to
3612     close a window. Needed when a session changes, and we have to
3613     close the classifier windows.
3614    
3615     * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3616     Shuts down open dialogs. Used when a new session is created
3617     or a session is opened.
3618     (MainWindow.SaveSession): Should only call application.SaveSession()
3619     if we don't call SaveSessionAs first.
3620     (MainWindow.Classify): Allow different classifier dialogs for
3621     different layers.
3622    
3623     * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
3624     the parent class handle it. Add Shutdown() to unsubscibe from
3625     event notification and call the parent Shutdown(). This was
3626     necessary so the application can close the tree window.
3627    
3628 jonathan 478 2003-03-06 Jonathan Coles <[email protected]>
3629    
3630     * Thuban/Model/classification.py: Minor documentation changes,
3631     Addition of __eq__ and __ne__ methods.
3632     (Classification.SetLayer): prevent recursion between this method
3633     and Layer.SetClassification().
3634    
3635     * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
3636    
3637     * Thuban/Model/layer.py (SetClassification): prevent recursion
3638     between this method and Classification.SetLayer().
3639    
3640     * test/test_classification.py, test/test_load.py,
3641     test/test_session.py: Fixed and added tests for the classification
3642     classes.
3643    
3644 bh 477 2003-03-06 Bernhard Herzog <[email protected]>
3645    
3646     * Thuban/UI/classifier.py (ClassGrid.__init__)
3647     (ClassGrid.CreateTable): Move the SetSelectionMode call to
3648     CreateTable because otherwise it triggers an assertion in
3649     wxPython/wxGTK 2.4.
3650    
3651 jonathan 459 2003-03-05 Jonathan Coles <[email protected]>
3652    
3653 jonathan 475 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
3654 jonathan 471
3655 jonathan 475 * Thuban/Model/load.py: import FIELDTYPE constants from table.
3656 jonathan 471
3657 jonathan 475 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
3658 jonathan 471
3659 jonathan 475 * Thuban/Model/table.py: Put FIELDTYPE constants back.
3660 jonathan 471
3661     2003-03-05 Jonathan Coles <[email protected]>
3662    
3663 jonathan 459 * Thuban/UI/classifier.py: Added class documentation.
3664     Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
3665     Store just the groups in the table and generate the other
3666     column information when it is requested. Add "None" field
3667     to pull-down to select no classification.
3668    
3669     * Thuban/common.py: Moved FIELDTYPE constants from table.py
3670     (Str2Num): Only catch ValueError exceptions.
3671    
3672     * Thuban/Model/classification.py: Class documentation. Renaming
3673     of methods with Stroke to Line. Groups are stored in a single
3674     list with the default as the first element. Groups are searched
3675     in the order they appear in the list.
3676    
3677     * Thuban/Model/color.py: Documentation.
3678    
3679     * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
3680     the kind of data represented by a field.
3681    
3682     * Thuban/Model/load.py (ProcessSession): Use proper string
3683     conversion function; fixes RTbug #1713.
3684    
3685     * Thuban/Model/save.py (Saver): Store field type information.
3686    
3687     * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
3688     (Table): Add field_info_by_name() to retrieve field information
3689     by specifying the field name, not the number.
3690    
3691     * Thuban/UI/mainwindow.py: Function name changes.
3692    
3693     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
3694     get the layer classification once. Don't try to classify
3695     values when the field is None: just use the default properties.
3696    
3697     * Thuban/UI/view.py: Function name changes.
3698    
3699     * Doc/thuban.dtd: Add field_type attribute to a classification.
3700    
3701 bh 456 2003-03-04 Bernhard Herzog <[email protected]>
3702    
3703 bh 458 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
3704     the fill and stroke layer attributes optional with suitable
3705     default values. Add the stroke_width layer attribute. Use correct
3706     syntax for empty elements. Make the attribute list for labels
3707     refer to the label element.
3708    
3709     2003-03-04 Bernhard Herzog <[email protected]>
3710    
3711 bh 456 * setup.py (thuban_build_py.build): Add a comment about distutils in
3712     Python 2.3 containing some of the functionality we implement in
3713     setup.py ourselves.
3714    
3715     * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
3716     before the selection mode. Doing it the other way round triggers
3717     an assertion in wxWindows.
3718    
3719     * Thuban/Model/save.py (escape): Fix typo in doc-string
3720    
3721     * Thuban/Model/classification.py: Remove unnecessary wxPython
3722     import
3723    
3724 jonathan 448 2003-03-04 Jonathan Coles <[email protected]>
3725    
3726     * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
3727     Parameter 'value' should default to None.
3728    
3729     * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
3730     the class attribute __classification is now private.
3731    
3732     * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
3733     Classifier to ClassGrid. Added support for removing selected rows,
3734     which including code for keeping track of when cells are selected,
3735     and deselected.
3736     (ClassTable): Support for added/removing rows. Fixed a problem
3737     with __ParseInput whereby it would not allow strings (only numbers)
3738     to be entered.
3739     (Classifier): Added button and supporting code for removing
3740     selected rows.
3741    
3742 jonathan 445 2003-02-27 Jonathan Coles <[email protected]>
3743 jonathan 434
3744     * Thuban/common.py: Moved color conversion functions into
3745     Thuban/UI/common.py.
3746     (Str2Num): Now converts the float (not the string) to a long/int
3747     so that an exception isn't thrown.
3748    
3749     * Thuban/UI/common.py: Common functions used in several UI modules
3750    
3751     * Thuban/Model/classification.py: Changed the class hierarchy
3752     so that a Classification consists of Groups which return
3753     Properties when a value matches a Group.
3754    
3755     * Thuban/Model/layer.py: Fixed name resolution problem.
3756    
3757     * Thuban/Model/load.py: Use new Classification and Group functions.
3758    
3759     * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
3760     failure.
3761     (Saver.write_classification): Use new Classification and Group
3762     functions.
3763    
3764     * Thuban/UI/classifier.py: Changes to use new Classification and Group
3765 jonathan 445 functions. Fix to create a tuple with a single value instead of
3766     simply returning the value.
3767 jonathan 434
3768     * Thuban/UI/renderer.py: Use new Classification and Group functions.
3769     Use common.py functions.
3770    
3771 jonathan 445 * Thuban/UI/tree.py: Use common.py functions.
3772 jonathan 447
3773     * test/test_classification.py: Use new Classification and Group
3774     classes.
3775 jonathan 434
3776 jonathan 426 2003-02-24 Jonathan Coles <[email protected]>
3777    
3778     * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
3779     functions from Thuban color objects to wxWindow colour objects.
3780    
3781     * Thuban/Model/classification.py (Classification): Renamed
3782     GetProperties() to GetClassData(). Used the new iterator
3783     in TreeInfo().
3784     (ClassIterator): Iterator implementation to iterate over the
3785     ClassData objects in a classification object.
3786    
3787     * Thuban/Model/save.py (Saver.write_classificaton): Uses
3788     the new iterator to save the classification information.
3789    
3790     * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
3791     for changing the stroke and fill colors and previewing the
3792     changes.
3793    
3794     * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
3795     MainWindow.SaveSessionAs): Text string changes so the dialogs
3796     have more meaningful titles.
3797    
3798     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
3799     Classification method name from GetProperties to GetClassData.
3800    
3801     * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
3802     instead of accessing now non-existent class variables.
3803    
3804 bh 425 2003-02-24 Bernhard Herzog <[email protected]>
3805    
3806     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
3807     unneeded Shape() call. Rendering is substantially faster without
3808     it and it avoids some problems with broken shape files.
3809    
3810 frank 423 2003-02-20 Frank Koormann <[email protected]>
3811    
3812     Force minimal size of identify and label dialogs. The autosizing
3813     looked too ugly.
3814    
3815     * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
3816     * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
3817     Set size of listctrl.
3818     * Thuban/UI/identifyview.py (IdentifyView.__init__):
3819     Set size of dialog.
3820    
3821 jonathan 408 2003-02-19 Jonathan Coles <[email protected]>
3822    
3823     * test/test_classification.py, test/test_layer.py,
3824     test/test_load.py, test/test_map.py, test/test_session.py:
3825     Updated the tests to use the new functions that are in the
3826     respective classes.
3827    
3828     * Thuban/Model/classification.py (Classification):
3829     Uses the new ClassData* classes. Modification messages are
3830     passed up to the parent layer (if it exists).
3831     (ClassData): New class to encapsulate the common data in each
3832     classification property.
3833     (ClassDataDefault): Represents the Default class. data.
3834     (ClassDataPoint): Represents a single class. data point
3835     (ClassDataRange): Represents a class. range
3836     (ClassDataMap): Represents a class. map (unused).
3837    
3838     * Thuban/Model/color.py: Added Color.None to represent something
3839     with no color. Color.Black represents the color black.
3840     (NoColor): Helper class derived from Color to represent something
3841     with no color.
3842    
3843     * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
3844     stroke_width attributes. Made the 'classification' attribute private.
3845     New methods for setting/getting the classification.
3846    
3847     * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
3848     to get the classifcation and use the new ClassData* classes to
3849     hold the classification data. Use Str2Num to convert numbers
3850     properly.
3851    
3852     * Thuban/Model/save.py (Saver): Use new Color and Classification
3853     methods
3854    
3855     * Thuban/UI/classifier.py (ClassGrid): New class to represent a
3856     custom grid.
3857     (ClassTable): Support for editing Values and Labels and for
3858     changing what type (point or range) of data is stored in each
3859     property based on how the user enters the data.
3860     (Classifier): Support for saving the new classifications and
3861     launching the dialog to edit a property.
3862     (SelectPropertiesDialog): New class for editing the visual
3863     properties of a classification (stroke color, width, and fill color)
3864     (ClassPreviewer): Took the Draw method from ClassRenderer and
3865     made most of it into this new class. Intend to use this class in
3866     the SelectPropertiesDialog for previewing changes.
3867    
3868     * Thuban/UI/renderer.py: Use new Color and Classification methods.
3869    
3870     * Thuban/UI/tree.py: Formatting changes.
3871    
3872     * Doc/thuban.dtd: Add 'label' element
3873    
3874     * Thuban/common.py: New. Contains common routines used throughout
3875     the code.
3876     (Str2Num): Takes a string and converts it to the "best" type of
3877     number.
3878    
3879 bh 405 2003-02-14 Bernhard Herzog <[email protected]>
3880    
3881     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
3882     dragging flag is always set to 0 even when the tool implementation
3883     raises an exception
3884    
3885 bh 402 2003-02-11 Bernhard Herzog <[email protected]>
3886    
3887     * Thuban/UI/application.py (ThubanApplication.splash_screen): New
3888     method to create a splash screen.
3889     (ThubanApplication.ShowMainWindow): New. Show the main window.
3890     Needed so the splash screen can display the mainwindow
3891     (ThubanApplication.OnInit): Call the
3892     new splash_screen method to determine whether the application
3893     should display a splash screen. If it displays a splash screen do
3894     not immediately show the main window.
3895    
3896 jonathan 399 2003-02-11 Jonathan Coles <[email protected]>
3897    
3898     * Thuban/Model/classification.py: Added import line to fix
3899     feature conflicts between running on python2.2 and python2.1.
3900    
3901     * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
3902     onto the clinfo parameter, so removed the deepcopy().
3903    
3904 jonathan 396 2003-02-10 Jonathan Coles <[email protected]>
3905    
3906 tkoester 403 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
3907 jonathan 396 Added element_open variable to track opening and closing of tags
3908     so that tags that don't span more than one line are closed with
3909     /> instead of </tag_name>. Use the GetDefault*() methods of
3910     the Classification class.
3911    
3912     * Thuban/Model/classification.py (Classificaton): Added set and
3913     get methods for the default data. The class also takes a layer
3914     reference so that modification messages can be sent. Fixed the
3915     methods to use the new ClassData class.
3916     (ClassData): New class to encapsulate the classification data
3917    
3918     * Thuban/Model/layer.py (Layer): Remove the
3919 tkoester 403 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
3920 jonathan 396 SetDefault*() methods on the layer's classification object.
3921 tkoester 403 (Layer.__init__): Use the new SetDefault*() methods in the
3922 jonathan 396 Classification class.
3923    
3924     * Thuban/Model/load.py (ProcessSession): Use the new ClassData
3925     object instead of a dictionary.
3926    
3927 tkoester 403 * Thuban/UI/classifier.py (ClassRenderer): New class to
3928 jonathan 396 draw the classifications in the dialog box's table.
3929     (Classifier): Modified to use the ClassRenderer class.
3930    
3931 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
3932     methods of the Classification class.
3933 jonathan 396
3934     * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
3935     of the ClassData class.
3936    
3937     * test/test_classification.py, test/test_layer.py,
3938     test/test_map.py, test/test_session.py: Fix the tests to work
3939     with the above code changes.
3940    
3941 jonathan 387 2003-02-03 Jonathan Coles <[email protected]>
3942    
3943     * Thuban/Model/classification.py (Classification): Added getNull()
3944     to return the NullData reference
3945    
3946     * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
3947     Layer.SetStrokeWidth): Modified these functions to change the
3948     null data in the classification rather than keep these values
3949     directly in the Layer class. Menu options to change these values
3950     work again.
3951    
3952 jonathan 380 2003-01-28 Jonathan Coles <[email protected]>
3953    
3954 jonathan 384 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
3955 tkoester 403 Fixed crashing problem on some systems. Dialog box shows
3956 jonathan 380 classification data.
3957    
3958 jonathan 384 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
3959     Colors in the tree view.
3960    
3961     * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
3962     the tree info for classifications. Commented out unnecessary lines.
3963    
3964     * Thuban/Model/classification.py (Classification.TreeInfo): New
3965     function to add information about the classification into the
3966     tree view.
3967    
3968 tkoester 403 2003-01-27 Jan-Oliver Wagner <[email protected]>
3969 jan 375
3970 tkoester 403 * Thuban/__init__.py (_): New.
3971 jan 375
3972     * Thuban/Model/classification.py, Thuban/Model/extension.py,
3973     Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
3974 tkoester 403 Thuban/Model/session.py, Thuban/UI/application.py,
3975     Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
3976     Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
3977     Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
3978     Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
3979     Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
3980 jan 375
3981 jonathan 370 2003-01-27 Jonathan Coles <[email protected]>
3982    
3983 tkoester 403 * Thuban/Model/layer.py: Classification initialization calls.
3984 jonathan 370
3985 tkoester 403 * Thuban/Model/classification.py: Created class to encapsulate
3986     a layer classification. Supports specific data points and
3987     ranges.
3988 jonathan 370
3989 tkoester 403 * Thuban/Model/load.py: Added support for loading classification
3990     information.
3991 jonathan 370
3992 tkoester 403 * Thuban/Model/save.py: Added support for saving classification
3993     information.
3994 jonathan 370
3995 tkoester 403 * Thuban/UI/classifier.py: Initial class for a dialog box for
3996     specifying classification information.
3997 jonathan 370
3998 tkoester 403 * Thuban/UI/mainwindows.py: Support for opening the classifier
3999     dialog.
4000 jonathan 370
4001 tkoester 403 * Thuban/UI/renderer.py: Support for drawing a layer with the
4002     classification information.
4003 jonathan 370
4004 tkoester 403 * Data/iceland_sample_class.thuban: iceland_sample with
4005     classification data.
4006 jonathan 370
4007 tkoester 403 * test/test_classification: Tests for the Classification class.
4008 jonathan 370
4009 bh 359 2002-12-09 Bernhard Herzog <[email protected]>
4010    
4011 bh 361 * test/test_command.py: New. Tests for the command classes.
4012    
4013 bh 359 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
4014     (Command.IsTool): New method to distinguish between command
4015     switching tools and other commands.
4016    
4017     * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
4018     the tool to avoid direct assignments to instance variables
4019     (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
4020     (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
4021     change the tool
4022    
4023     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
4024     active tool's command turns insensitive, disable the tool.
4025     (_tool_command): Use the new ToolCommand class
4026    
4027     * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
4028     SelectTool method to change the tool
4029     (iconfile): Use the ToolCommand class
4030    
4031 bh 354 2002-12-03 Bernhard Herzog <[email protected]>
4032    
4033     * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
4034     the case of selected items that are not children of Layers or Maps
4035     properly. Previously this bug would trigger an assertion in
4036     wxWindows.
4037    
4038 frank 352 2002-11-06 Frank Koormann <[email protected]>
4039    
4040 bh 354 * Thuban/UI/mainwindow.py: Altered the order of tools in the
4041     toolbar: First now are all navigation tools (Zoom In/Out, Pan,
4042     Full Extent).
4043 tkoester 403
4044 bh 349 2002-10-23 Bernhard Herzog <[email protected]>
4045    
4046     * setup.py (setup call): version now 0.1.3
4047    
4048     * MANIFEST.in: Add the files in test/
4049    
4050     * test/README: Add note about tests requiring the iceland data
4051    
4052     * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
4053     copyright notice.
4054    
4055 bh 344 2002-10-18 Bernhard Herzog <[email protected]>
4056    
4057     * test/test_map.py
4058     (TestMapWithContents.test_projected_bounding_box): Use an explicit
4059     epsilon.
4060    
4061     * test/support.py (FloatComparisonMixin.assertFloatEqual)
4062     (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
4063     message if the assertion fails and don't return the return value
4064     of self.assert_. In assertFloatSeqEqual the return meant that not
4065     all items of the sequence were compared.
4066    
4067 bh 326 2002-09-20 Bernhard Herzog <[email protected]>
4068    
4069 bh 341 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
4070    
4071     * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
4072    
4073 bh 338 * test/test_map.py (TestMapWithContents.test_tree_info): Create
4074     the string with the bounding box on the fly because of platform
4075     differences in the way %g is handled.
4076    
4077     * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
4078     DBFfile too because Thuban layers can't yet cope missing DBF
4079     files.
4080    
4081     2002-09-20 Bernhard Herzog <[email protected]>
4082    
4083 bh 326 * test/test_menu.py: Use initthuban instead of
4084     add_thuban_dir_to_path to initialize Thuban.
4085    
4086     * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
4087     Mixin class for float comparisons
4088     (SubscriberMixin): New. Mixin class to test messages sent through
4089     the Connector class
4090    
4091     * test/README: Fix a typo and add the -v flag to the command for
4092     individual tests
4093    
4094 bh 335 * test/test_session.py: New. Test cases for Thuban.Model.session
4095    
4096     * test/test_proj.py: New. Test cases for Thuban.Model.proj
4097    
4098     * test/test_map.py: New. Test cases for Thuban.Model.map
4099    
4100     * test/test_layer.py: New. Test cases for Thuban.Model.layer
4101    
4102     * test/test_label.py: New. Test cases for Thuban.Model.label
4103    
4104     * test/test_connector.py: New. Test cases for Thuban.Lib.connector
4105    
4106     * test/test_color.py: New. Test cases for Thuban.Model.color
4107    
4108     * test/test_base.py: New. Test cases for Thuban.Model.base
4109    
4110 bh 322 2002-09-13 Bernhard Herzog <[email protected]>
4111    
4112     * Thuban/Model/session.py (Session.forwarded_channels): Forward
4113     the CHANGED channel too.
4114    
4115     * Thuban/Model/map.py (Map.forwarded_channels): Forward the
4116     CHANGED channel too.
4117     (Map.__init__): Call the Modifiable constructor as well.
4118    
4119     * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
4120     event if the modified flag changes.
4121     (Modifiable.changed): Tweak the doc-string.
4122    
4123     * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
4124     (MainWindow.set_position_text): Put the code that puts the text
4125     with the mouse position into the status bar into the new method
4126     set_position_text so that it can overwritten in derived classes.
4127    
4128 bh 317 2002-09-12 Bernhard Herzog <[email protected]>
4129    
4130     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
4131     message box on the main window.
4132    
4133 bh 313 2002-09-11 Bernhard Herzog <[email protected]>
4134    
4135     * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
4136     the 'E' because it's less likely to interfere with other menu
4137     entries.
4138 bh 315 (MainWindow.build_menu): remove an incorrect comment.
4139 bh 313
4140 bh 311 2002-09-10 Bernhard Herzog <[email protected]>
4141    
4142     * Thuban/UI/mainwindow.py (MainWindow.Map): New.
4143     (_tool_command): Add sensitive parameter
4144     (_has_visible_map): Sensitivity callback to tools and other
4145     commands that require a visible map. Use it in map_zoom_in_tool,
4146     map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
4147     and map_full_extent
4148    
4149 bh 308 2002-09-06 Bernhard Herzog <[email protected]>
4150    
4151     * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
4152     VIEW_POSITION
4153    
4154 tkoester 403 2002-09-04 Frank Koormann <[email protected]>
4155 frank 306
4156     * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
4157    
4158 bh 302 2002-09-02 Bernhard Herzog <[email protected]>
4159    
4160 bh 304 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
4161     wxWindows already and our implementation doesn't work correctly
4162     with wxGTK 2.3:
4163     (MapCanvas.__init__): Remove the instance variable
4164     (MapCanvas.OnPaint): Always call do_redraw when there's a map to
4165     be drawin
4166     (MapCanvas.OnIdle): Removed.
4167    
4168 bh 302 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
4169     a parameter to determine the size of the rectangle.
4170     (MapCanvas.find_shape_at): Create the box around the point on a
4171     layer by layer basis and make the size depend on the shape type.
4172     This solves a problem with the selection of point shapes at the
4173     border of the layer's bounding box
4174    
4175 bh 292 2002-08-30 Bernhard Herzog <[email protected]>
4176    
4177 bh 300 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
4178     for the sensitivity of remove layer.
4179     (_can_remove_layer): New. Sensitivity callback for remove layer
4180     (Command layer_remove): Use _can_remove_layer
4181    
4182     * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
4183     determine whether a given layer can be deleted.
4184    
4185 bh 297 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
4186     (MapCanvas.do_redraw): Get rid of the unused update_region
4187     instance variable
4188    
4189 bh 294 * Thuban/UI/view.py: Add/update some doc-strings.
4190    
4191 bh 292 * test/: new subdirectory with a bunch of unit tests.
4192    
4193     * test/README, test/test_table.py, test/test_save.py,
4194     test/test_menu.py, test/test_load.py: Initial set of tests and
4195     brief instructions on how to run them
4196    
4197 bh 287 2002-08-29 Bernhard Herzog <[email protected]>
4198    
4199 bh 291 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
4200     arcs with multiple parts.
4201    
4202 bh 289 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
4203     Handle degenrate rectangles.
4204    
4205 bh 287 * Thuban/Model/table.py: Make writing records work correctly:
4206     (Table.__init__): Keep track of whether the DBF is open for
4207     writing
4208     (Table.write_record): Open the DBF file for writing when necessary
4209    
4210 bh 285 2002-08-27 Bernhard Herzog <[email protected]>
4211    
4212     * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
4213     dbf files only for reading by default. Use a new writable dbf
4214     object for writing.
4215    
4216 bh 278 2002-08-26 Bernhard Herzog <[email protected]>
4217    
4218 bh 282 * Thuban/UI/mainwindow.py: Refactor the context creation:
4219     (MainWindow.Context): New method to return a context
4220     (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
4221     new method
4222    
4223 bh 278 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
4224     layer table specific code from TableGrid into LayerTableGrid
4225     (TableFrame, LayerTableFrame): Split the layer table specific code
4226     from TableFrame into LayerTableFrame
4227 bh 280 (LayerTableGrid.select_shape): Remove a debug print
4228 bh 278
4229     * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
4230     LayerTableFrame
4231    
4232 bh 277 2002-08-23 Bernhard Herzog <[email protected]>
4233    
4234     * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
4235     absolute filename.
4236    
4237 bh 269 2002-08-22 Bernhard Herzog <[email protected]>
4238    
4239 bh 275 * Thuban/Model/table.py (Table.write_record): New method to write
4240     records.
4241 tkoester 403 (Table.__init__): Open the DBF file for writing too.
4242 bh 275
4243     * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
4244     into the underlying table.
4245    
4246     * extensions/shapelib/shapefil.h (DBFCommit),
4247     extensions/shapelib/dbfopen.c (DBFCommit): New API function to
4248     commit any changes made to the DBF file.
4249    
4250 bh 271 * Thuban/UI/mainwindow.py (make_check_current_tool)
4251     (_tool_command): Put the code that generates the "checked"
4252     callback into a separate function so that we can reuse it
4253     elsewhere
4254    
4255 bh 269 * Thuban/Model/save.py (Saver): New class to handle serializing a
4256     session into an XML file. The main reason to introduce a class is
4257     that applications built on Thuban can derive from it so that they
4258     can save additional information in a session file.
4259     (save_session): Delegate almost all the work to the Saver class.
4260     Rename the filename argument to file because it may be a file like
4261     object now.
4262    
4263     * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
4264     code. Remove the little test code which would be executed when the
4265     module is run as a script which didn't work anymore since it can't
4266     import the other Thuban modules.
4267     (ProcessSession, load_session): Refactor the ProcessSession to
4268     have one method for each element start and end tag so that derived
4269     classes can easily override the processing of individual tags.
4270     Also, always parse with namespaces enabled because applications
4271     built on top of Thuban will likely use namespaces if they extend
4272     the session file format.
4273    
4274 bh 266 2002-08-21 Bernhard Herzog <[email protected]>
4275    
4276     * setup.py (ThubanInstall.run): Don't repr install_lib_orig
4277     because thubaninit_contents will do it for us.
4278    
4279 tkoester 403 2002-08-16 Jan-Oliver Wagner <[email protected]>
4280 jan 265
4281     * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
4282     tree window already open
4283    
4284 bh 259 2002-08-15 Bernhard Herzog <[email protected]>
4285    
4286 bh 263 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
4287     with self.
4288    
4289     * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
4290     when we have actually captured it.
4291    
4292 bh 259 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
4293     shapefile and destroy the table.
4294    
4295     * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
4296    
4297 bh 254 2002-08-14 Bernhard Herzog <[email protected]>
4298    
4299 bh 256 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
4300     instance variable columns
4301     (RecordTable.GetTypeName): row and col may be negative in some
4302     cases.
4303    
4304 bh 254 * setup.py (InstallLocal.initialize_options)
4305     (InstallLocal.finalize_options, InstallLocal.user_options): New
4306     option create-init-file to build a thubaninit.py when running
4307     install_local
4308     (InstallLocal.run): Create the thubaninit.py module when requested
4309     (thubaninit_contents): Split the template into several parts and
4310     create a new function thubaninit_contents that creates the
4311     contents of a thubaninit module.
4312     (ThubanInstall.run): Use the new function to create the thubaninit
4313     module.
4314    
4315 bh 252 2002-07-30 Bernhard Herzog <[email protected]>
4316    
4317     * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
4318     cleanup.
4319     (ThubanApplication.MainLoop): Extend to automatically call OnExit.
4320    
4321     * Thuban/Model/session.py (Session.Destroy): Don't bypass the
4322     direct base class' Destroy method.
4323    
4324     * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
4325     layers.
4326     (Map.Destroy): Destroy the label_layer as well and call the
4327     inherited Desatroymethod first so that no more messages are
4328     issued.
4329     (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
4330     message if the stacking order actually has changed. Add
4331     doc-strings.
4332     (Map.BoundingBox): Correct the doc-string.
4333     (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
4334     (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
4335    
4336     * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
4337     all labels.
4338    
4339 bh 247 2002-07-29 Bernhard Herzog <[email protected]>
4340    
4341     * Thuban/Model/map.py (Map.subscribe_layer_channels)
4342     (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
4343     to a layer's channels into separate methods.
4344     (Map.RemoveLayer, Map.AddLayer): Call the new methods
4345     (Map.Destroy): Unsubscribe from a layer's channels before
4346     destroying it.
4347    
4348     * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
4349     selected_layer parameter to searched_layer which is the layer to
4350     search in.
4351     (MapCanvas.SelectShapeAt): New parameter layer to restrict the
4352     search to that layer. Return the selected layer and shape.
4353    
4354     * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
4355     typo
4356    
4357 bh 238 2002-07-24 Bernhard Herzog <[email protected]>
4358    
4359 bh 243 * Thuban/UI/application.py (ThubanApplication.create_session):
4360     Extend the doc string.
4361     (ThubanApplication.subscribe_session)
4362     (ThubanApplication.unsubscribe_session): New methods to
4363     subscribe/unsubscribe to/from session channels.
4364     (ThubanApplication.SetSession): Call the new methods here.
4365     (ThubanApplication.maps_changed, ThubanApplication.set_map):
4366     Renamed set_map to maps_changed. Its now a subscriber for
4367     MAPS_CHANGED.
4368    
4369     * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
4370     x-coordinate in case of simple clicks
4371    
4372     * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
4373     don't pass it as a parameter
4374    
4375     * Thuban/Model/session.py (Session.RemoveMap): New
4376    
4377 bh 238 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
4378     window size into a parameter.
4379    
4380 bh 235 2002-07-23 Bernhard Herzog <[email protected]>
4381    
4382 bh 237 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
4383     just commands.
4384    
4385 bh 235 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
4386     parameter list a bit to allow setting the window title and the
4387     initial message in the status bar. Update the callers.
4388    
4389     * Thuban/UI/application.py (ThubanApplication.OnInit)
4390     (ThubanApplication.CreateMainWindow): Put the mainwindow
4391     instantiation into a separate method so that it can be overridden
4392     by a subclass.
4393    
4394 bh 230 2002-07-19 Bernhard Herzog <[email protected]>
4395    
4396 bh 234 * Thuban/Model/session.py: Issue a CHANGED message every time
4397     another changed message is issued to make it easier to get
4398     notified of changes.
4399     (Session): Update the doc string
4400     (Session.forward): Issue changed-events as CHANGED as well.
4401     (Session.changed): Overwrite the inherited version to issue
4402     CHANGED events as well.
4403    
4404     * Thuban/UI/tree.py: We can now simply subscribe to the session's
4405     CHANGED channel to be informed of changes.
4406     (SessionTreeCtrl.session_channels): Not needed any longer.
4407 tkoester 403 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
4408 bh 234 Only have to (un)subscribe CHANGED
4409    
4410     * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
4411    
4412 bh 230 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
4413     for the wxPython locale bug to __init__.py so that it's
4414     automatically executed by anybody using UI code from Thuban.
4415    
4416 bh 225 2002-07-18 Bernhard Herzog <[email protected]>
4417    
4418 bh 228 * Thuban/UI/main.py (main): app no longer needs to be global
4419    
4420     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
4421     as parameter and store it in an instance variable
4422     (MainWindow.invoke_command, MainWindow.update_command_ui)
4423     (MainWindow.save_modified_session, MainWindow.NewSession)
4424     (MainWindow.OpenSession, MainWindow.SaveSession)
4425     (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
4426     application object.
4427    
4428     * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
4429     the main window with self.
4430    
4431 bh 225 * Thuban/UI/context.py: New module with the context class
4432    
4433     * Thuban/UI/command.py (Command): Update doc string.
4434    
4435     * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
4436     MainWindow.update_command_ui): Pass an instance of the context
4437     class to the command's methods
4438     (check_current_tool, call_method): Handle the new context
4439     implementation
4440    
4441     * Examples/simple_extensions/simple_tool.py (simple_tool,
4442     check_simple_tool): Handle the new context implementation
4443    
4444     * Examples/simple_extensions/simple_command.py (simple_command):
4445     Handle the new context implementation. Update the comments about
4446     the context.
4447    
4448     * Thuban/UI/application.py (ThubanApplication.SetSession): Add
4449     doc-string
4450     (ThubanApplication.Session): New method to return the session
4451     object
4452    
4453     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
4454     interactor's selected_layer may not be a layer of the current
4455     session when the tree is updated while a new session is being set.
4456    
4457 bh 217 2002-07-17 Bernhard Herzog <[email protected]>
4458    
4459     * Thuban/UI/tree.py (color_string): Removed. No longer used.
4460     (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
4461     update_tree into update_tree and add_items. The tree now uses a
4462     more generic way to display the contents of the tree.
4463     (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
4464    
4465     * Thuban/Model/layer.py (Layer.TreeInfo),
4466     Thuban/Model/extension.py (Extension.TreeInfo),
4467     Thuban/Model/map.py (Map.TreeInfo),
4468 tkoester 403 Thuban/Model/session.py (Session.TreeInfo):
4469 bh 217 Add TreeInfo methods to implement the new tree view update scheme
4470    
4471 bh 216 2002-07-16 Bernhard Herzog <[email protected]>
4472    
4473     * Thuban/UI/application.py: Don't use "import from" for the
4474     MainWindow. It can't always be resolved.
4475     (ThubanApplication.OnInit): change reference to MainWindow
4476     accordingly.
4477    
4478     * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
4479     completely
4480    
4481 bh 213 2002-07-10 Bernhard Herzog <[email protected]>
4482    
4483     * setup.py (create_init_module): New configurable variable whose
4484     default depends on the platform we're running on.
4485     (ThubanInstall.initialize_options): Initialize
4486     self.create_init_module from the global create_init_module
4487     (ThubanInstall.user_options): indictate that the options
4488     create-init-module and init-module-dir have arguments.
4489    
4490     * setup.py: In the setup call change the version number to include
4491     cvs.
4492    
4493     * MANIFEST.in: Add the files in Examples
4494    
4495 bh 205 2002-07-09 Bernhard Herzog <[email protected]>
4496    
4497 bh 210 * setup.py: In the setup call, use the thuban homepage as the
4498     value of the url parameter.
4499    
4500 bh 208 * Examples: New subdirectory for examples.
4501    
4502     * Examples/simple_extensions/simple_tool.xpm,
4503     Examples/simple_extensions/simple_tool.py,
4504     Examples/simple_extensions/simple_command.py,
4505     Examples/simple_extensions/README: Simple examples showing how to
4506     add new commands and tools.
4507    
4508 bh 207 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
4509     bdist_rpm that we also have an install script.
4510     (bdist_inno): Add 2002 to the copyright notice.
4511    
4512 bh 205 * setup.py: Create a file in python's site-packages directory to
4513     make installation of Thuban as a library easier.
4514     (ThubanInstall.user_options): Add two new options,
4515     create-init-module and init-module-dir
4516     (ThubanInstall.expand_with_pure_python_dirs): New method to expand
4517     filenames for installation in the default directories.
4518     (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
4519     the inherited methods to capture some filenames before they're
4520     transformed too much by distutils.
4521     (ThubanInstall.run): Create the init module if requested.
4522     (ThubanInstall.thuban_init_filename): New method to return the
4523     full name of the init module.
4524     (ThubanInstall.get_outputs): Append the filename of the init
4525     module.
4526    
4527 bh 202 2002-07-08 Bernhard Herzog <[email protected]>
4528    
4529 bh 205 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
4530     handle the prefix properly which means that the default for the
4531     installation prefix should be /usr for RPMs and /usr/local when
4532     doing a normal source install.
4533     (bdist_rpm_install_script): Script to override the default install
4534     commands in the specfile generated by the bdist_rpm command.
4535     (thuban_bdist_rpm.user_options): Add a prefix option
4536     (thuban_bdist_rpm.initialize_options): Init the prefix option.
4537     Create the script files for the spec files as empty files here
4538     (thuban_bdist_rpm._make_spec_file): Override the inherited method
4539     to fill the script files with content.
4540    
4541 bh 202 * Thuban/Model/save.py (relative_filename): Wrapper around
4542     Thuban.Lib.fileutil.relative_filename that accepts an empty dir
4543     argument. save_session now automatically uses this version,
4544     solving a problem when saving to a relative filename.
4545    
4546     * setup.py: In the setup call, make sure that the library
4547     directories are under $prefix/lib not directly under $prefix.
4548    
4549 tkoester 403 2002-06-20 Jan-Oliver Wagner <[email protected]>
4550 jan 199
4551     * Thuban/Model/extension.py: new module to handle extension objects.
4552     * Thuban/Model/messages.py: new messages for extensions.
4553     * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
4554     Session.AddExtension): new for handling extensions.
4555     Also some other minor changes to round up extension handling.
4556     * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
4557     of Extension titles and title and names of its objects.
4558    
4559 bh 194 2002-05-29 Bernhard Herzog <[email protected]>
4560    
4561     * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
4562 bh 202 the events for a command.
4563 bh 194 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
4564     Call bind_command_events to bind the events. add_toolbar_command
4565     can now bind events too so that it's possible to have commands
4566     that are only available through the toolbar.
4567     (MainWindow.init_ids): New instance variable events_bound to keep
4568     track of for which commands events have been bound.
4569    
4570 bh 190 2002-05-28 Bernhard Herzog <[email protected]>
4571    
4572     * Thuban/UI/menu.py: New module to build and manage menus.
4573    
4574     * Thuban/UI/mainwindow.py: Remove some unused imports.
4575     (MainWindow.__init__, main_menu): move the definition of the main
4576     menu from __init__ to the Menu instance main_menu.
4577     (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
4578     build the menu bar and sub-menus from a menu description.
4579    
4580     * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
4581     startup file
4582     (ThubanApplication.read_startup_files): New method to run
4583     ~/.thuban/thubanstart.py
4584    
4585 bh 192 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
4586     Move the toolbar definition to the Menu instance main_toolbar.
4587     (MainWindow.build_toolbar): New method to build the toolbar
4588     similar to the build_menu methods
4589    
4590 bh 184 2002-05-23 Bernhard Herzog <[email protected]>
4591    
4592 bh 186 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
4593     layer_outline_color. Fix it in the definition of the command too.
4594    
4595 bh 184 * Thuban/UI/command.py (Command): Fix typo in doc string
4596    
4597 bh 182 2002-05-22 Bernhard Herzog <[email protected]>
4598    
4599     * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
4600     in the docstring
4601    
4602 bh 175 2002-05-15 Bernhard Herzog <[email protected]>
4603    
4604 bh 180 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
4605     when the shapefile is empty.
4606     (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
4607     now return None for empty shapefiles. Update doc-strings.
4608    
4609     * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
4610     the layer's bbox being None.
4611    
4612     * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
4613     layer's bbox being None.
4614    
4615 bh 175 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
4616     necessary.
4617     (MapCanvas.__init__): New instance variables, last_selected_layer
4618     and last_selected_shape to determine how the selection has
4619     changed.
4620    
4621     * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
4622     AutoSizeColumns because it will cause a traversal of the entire
4623     table which for large .dbf files will take a very long time.
4624    
4625 bh 172 2002-05-14 Bernhard Herzog <[email protected]>
4626    
4627     * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
4628     maximum depth for the tree than shapelib does by default.
4629    
4630 bh 165 2002-05-10 Bernhard Herzog <[email protected]>
4631    
4632     * setup.py (py_modules): The shptree modules doesn't have a
4633     wrapper, so don't include it in the py_modules
4634    
4635 bh 163 2002-05-08 Bernhard Herzog <[email protected]>
4636    
4637     * extensions/shapelib/shptree.c (compare_ints): Make arguments
4638     const void * as in the qsort prototype
4639     (SHPTreeFindLikelyShapes): Remove some unused variables.
4640    
4641     * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
4642     maintains to redraw the window during a drag.
4643     (MapCanvas.unprojected_rect_around_point): New method to determine
4644     a small region around a point for hit-testing.
4645     (MapCanvas.find_shape_at): Only test the shapes in a small region
4646     around the point.
4647    
4648     * setup.py: Increment the version to 0.1.2
4649    
4650     * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
4651     debug print and set session to None after unsubscribing
4652    
4653 bh 146 2002-05-07 Bernhard Herzog <[email protected]>
4654    
4655 bh 154 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
4656     the file to have a .thuban extension.
4657    
4658 bh 152 * Thuban/UI/tree.py (session_channels): New class constant with
4659     all the session channels to subscribe to to update the tree
4660     (SessionTreeCtrl.session_changed): Remember the session so that we
4661     can unsubscribe properly. Use the new class constant to
4662     unsubscribe from the old session and subscribe to the new one.
4663     (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
4664     subscriptions of the SessionTreeCtrl.
4665     (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
4666    
4667     * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
4668     Session Tree" command to the file menu.
4669    
4670     * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
4671     as update_region to the renderer.
4672    
4673     * Thuban/UI/renderer.py
4674     (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
4675     update box is now directly a tuple, not a wxRect anymore.
4676    
4677     * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
4678     prints.
4679    
4680     2002-05-07 Bernhard Herzog <[email protected]>
4681    
4682 bh 146 * setup.py: Add the shptree extension module. See
4683     extensions/pyshapelib/ChangeLog for more details.
4684    
4685     * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
4686     extensions/shapelib/dbfopen.c: Really update to the versions of
4687     shapelib 1.2.9. For some reason it wasn't really done on
4688     2002-04-11.
4689    
4690     * extensions/shapelib/shptree.c: Modified version of shptree.c of
4691     shapelib 1.2.9. The only real difference is the use of qsort
4692     instead of a bubble sort implementation
4693    
4694     * Thuban/Model/layer.py (Layer.__init__): New instance variable
4695     shapetree to hold the shapelib quadtree for the shapefile
4696     (Layer.open_shapefile): Create the quad tree.
4697     (Layer.ShapesInRegion): New method to return the ids of shapes in
4698     a given region using the quad tree.
4699    
4700     * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
4701     comment
4702     (draw_polygon_shape): Accept both arcs and polygons.
4703     (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
4704     the api.
4705    
4706     * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
4707     return the shape ids to be rendered in a given layer.
4708     (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
4709     ids. Use draw_polygon_shape to draw arc shapes as well.
4710     (ScreenRenderer.RenderMap): New parameter for the rectangle that
4711     has to be updated
4712     (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
4713     calling it's ShapesInRegion method.
4714    
4715     * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4716     update_region for the update region.
4717     (MapCanvas.OnPaint): Maintain the update region
4718     (MapCanvas.do_redraw): Pass the bounding box of the update_region
4719     to the renderer when drawing the bitmap. Reset the update_region.
4720    
4721 bh 129 2002-05-03 Bernhard Herzog <[email protected]>
4722    
4723 bh 131 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
4724     MainWindow.OpenSession): Change the file extension of the session
4725     files to .thuban
4726    
4727 bh 129 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
4728     Move the map channels to be forwarded by the session into the
4729 bh 146 class constant with forwarded_channels. Also add
4730     LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
4731     forwarded_channels
4732 bh 129
4733     * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
4734     typo and some rewording).
4735    
4736 bh 126 2002-05-02 Bernhard Herzog <[email protected]>
4737    
4738     * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
4739     around to speed up most redraws:
4740     (MapCanvas.__init__): New instance variable bitmap which holds the
4741     bitmap
4742     (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
4743     self.bitmap to draw.
4744     (MapCanvas.full_redraw): New method to force a full redraw
4745     including the bitmap
4746     (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
4747     make sure the bitmap is redrawn.
4748     (MapCanvas.projection_changed, MapCanvas.set_view_transform,
4749     MapCanvas.shape_selected): Call full_redraw instead of readraw to
4750     make sure the bitmap is redrawn.
4751     (MapCanvas.OnSize): New method to handle size events so that the
4752     bitmap can be redrawn.
4753    
4754 bh 124 2002-04-29 Bernhard Herzog <[email protected]>
4755    
4756     * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4757     canvas' VIEW_POSITION event
4758     (MainWindow.view_position_changed): Handler for VIEW_POSITION.
4759     Update the text in the status-bar accordingly.
4760    
4761     * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
4762     (MapCanvas.__del__): Implement because Publisher.__del__ has to be
4763     called.
4764     (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
4765     current_position
4766     (MapCanvas.set_current_position): New method to set
4767     current_position. Issue a VIEW_POSITION event
4768     (MapCanvas.CurrentPosition): New public method to return the value
4769     of current_position. Should be called when the VIEW_POSITION event
4770     is processed.
4771     (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
4772     Update the position.
4773     (MapCanvas.OnLeaveWindow): Set the position to None.
4774    
4775     * Thuban/UI/messages.py (VIEW_POSITION): New message for the
4776     position in the statusbar
4777    
4778 tkoester 403 2002-04-26 Frank Koormann <[email protected]>
4779 frank 120
4780     * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
4781    
4782 tkoester 403 2002-04-24 Frank Koormann <[email protected]>
4783    
4784 frank 118 * Resources/Bitmaps/identify.xpm: shadow added
4785    
4786     * Resources/Bitmaps/fullextent.xpm: new
4787 jan 116
4788 tkoester 403 2002-04-22 Jan-Oliver Wagner <[email protected]>
4789 jan 116
4790 tkoester 403 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
4791     box
4792 jan 114
4793 tkoester 403 2002-04-21 Jan-Oliver Wagner <[email protected]>
4794    
4795 jan 114 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
4796    
4797     * Thuban/UI/tree.py (update_tree): added added map extent
4798    
4799     * Thuban/UI/mainwindow.py (_method_command): extended by parameter
4800 tkoester 403 icon; added map_full_extend as tool
4801 jan 114
4802 tkoester 403 2002-04-19 Jan-Oliver Wagner <[email protected]>
4803 jan 107
4804     * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
4805     saving _new_ sessions
4806    
4807     * Thuban/Model/session.py (create_empty_session): new session
4808     don't have a filename (set to None)
4809    
4810     * Thuban/UI/tree.py (update_tree): added filename and modified flag
4811    
4812     * Thuban/Model/load.py (ProcessSession): convert projection
4813     parameters from unicode to regular string
4814    
4815     * Data/iceland_sample.session: Added UTM Zone 26 projection.
4816    
4817 bh 100 2002-04-11 Bernhard Herzog <[email protected]>
4818    
4819     * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
4820     extensions/shapelib/dbfopen.c: Update to the versions of shapelib
4821     1.2.9
4822    
4823     * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
4824     the pyshapelib directoy into the list of include dirs, so that
4825     pyshapelib_api.h can be found.
4826    
4827     * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
4828     holds the pyshapelib C-API
4829     (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
4830     pyshapelib_api to access the shapelib functions.
4831     (initwxproj): Import the c_api from the shapelib module and
4832     initialize pyshapelib_api.
4833    
4834 bh 89 2002-04-04 Bernhard Herzog <[email protected]>
4835    
4836 bh 91 * setup.py (thuban_bdist_rpm.initialize_options): Use
4837     initialize_options to create the scripts for the rpm.
4838    
4839 bh 89 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
4840    
4841 bh 85 2002-04-03 Bernhard Herzog <[email protected]>
4842    
4843 bh 87 * setup.py: Increment version to 0.1.1
4844    
4845 bh 85 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
4846     Layer" and "Remove Layer" commands from the layer menu to the map
4847     menu
4848    
4849 bh 83 2002-02-15 Bernhard Herzog <[email protected]>
4850    
4851     * Thuban/Model/layer.py (Layer.Shape): list append only takes one
4852     argument (python <= 1.5.2 erroneously accepted multiuple
4853     arguments)
4854    
4855 bh 81 2002-02-04 Bernhard Herzog <[email protected]>
4856    
4857     * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
4858     RecordGrid in the identifyview.
4859     (IdentifyView.__init__): Use IdentifyGridCtrl instead of
4860     IdentifyListCtrl. The grid allows editing of the values.
4861    
4862     * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
4863     implementing a grid for a single row of a thuban table.
4864    
4865     * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
4866     layers by default. Easier to use than the previous default of only
4867     searching through the select layer which meant that if no layer
4868     was selected, you couldn't select a shape.
4869    
4870     * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
4871    
4872     * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
4873     stroke_width attribute
4874    
4875     * Thuban/Model/save.py (save_session): Write the new stroke_width
4876     attribute
4877    
4878     * Thuban/Model/load.py (ProcessSession.startElement): Read the
4879     stroke_width attribute
4880    
4881     * Thuban/Model/layer.py (Layer.__init__): New parameter and
4882     instance variable stroke_width
4883     (Layer.SetStrokeWidth): Set the stroke_width.
4884    
4885 bh 72 2002-02-01 Bernhard Herzog <[email protected]>
4886    
4887     * extensions/thuban/wxproj.cpp (project_points): Fix two
4888     off-by-one errors in the last loop that joins the various parts
4889     together.
4890    
4891 bh 71 2002-01-14 Bernhard Herzog <[email protected]>
4892    
4893     * setup.py (data_dist.make_distribution): Fix some typos
4894    
4895 bh 70 2001-09-18 Bernhard Herzog <[email protected]>
4896    
4897     * README: Slight tweaking in preparation for the 0.1 release
4898    
4899     * setup.cfg: Add section for sdist to create both tgz and zip
4900     archives
4901    
4902     * setup.py: increase version number to 0.1
4903     (data_dist): New command class for data distribution
4904    
4905 bh 64 2001-09-14 Bernhard Herzog <[email protected]>
4906    
4907 bh 70 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
4908     Handle the case of no layer (i.e. layer is None) properly.
4909    
4910 tkoester 403 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
4911 bh 70 Set the initial selection of the combo boxes to reflect the
4912     projection we're starting with in a way that works on windows,
4913     too.
4914    
4915 bh 64 * Thuban/Lib/connector.py (Connector.print_connections): Print the
4916     puiblisher's ids in hex to make it easier to compare them to the
4917     standard repr of python methods
4918    
4919     * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
4920     messages
4921    
4922 bh 59 2001-09-13 Bernhard Herzog <[email protected]>
4923    
4924 bh 64 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
4925     deselect the layer if no layer is selected
4926    
4927 bh 59 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
4928     idle time when there actually is something to draw. If there's
4929     nothing to draw simply clear the window
4930     (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
4931     (MapCanvas.SetMap): force a redraw in all cases because
4932     FitMapToWindow doesn't always do it.
4933     (MapCanvas.ZoomFactor): Add an optional parameter, center, to
4934     specify the point to move into the center of the window
4935     (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
4936     dragged, zoon in/out by a factor of 2
4937 bh 64 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
4938     index, i.e. reversed drawing order) so that objects appearing to
4939     be in from of others are selected first. This is probably mostly
4940     relevant for point shapes where the symbols used may overlap
4941 bh 59
4942     * Thuban/Model/session.py (create_empty_session): Unset the
4943     modified bit before returning it
4944    
4945     * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
4946     create_empty_session session to create the new, empty session.
4947    
4948     * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
4949     the tool bitmaps.
4950     (MainWindow.OnClose, MainWindow.save_modified_session): Separate
4951     the code that asks whether the session should be saved into the
4952     new method save_modified_session.
4953     (MainWindow.OpenSession, MainWindow.NewSession): Use the new
4954     method to save modified session here too.
4955    
4956 bh 55 2001-09-11 Bernhard Herzog <[email protected]>
4957    
4958     * setup.py (InnoIconItem): fix typo
4959    
4960     (thuban_bdist_inno.run):
4961     (bdist_inno.run): Move the decision not to create symlinks on
4962     non-nt platforms to thuban_bdist_inno and do it unconditinally
4963     since we never want to create the symlinks here
4964    
4965 bh 48 2001-09-10 Bernhard Herzog <[email protected]>
4966    
4967 bh 53 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
4968     identify view immediately
4969    
4970     * Thuban/UI/controls.py: New file with two classes RecordListCtrl
4971     and SelectableRecordListCtrl that implement the code shared by the
4972     identify view and the label dialog
4973    
4974     * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
4975     new class RecordListCtrl
4976    
4977     * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
4978     return value of GetValue is None instead of using it as a boolean
4979     directly so that Zero numbers are handled properly.
4980     (LabelListCtrl): Derive from the new class
4981     SelectableRecordListCtrl
4982    
4983 bh 48 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
4984     (Proj4Dialog.dialogLayout): Make the window resizable and set the
4985     size of the text control explicitly to make the sizers work on
4986     both Windows and X.
4987    
4988 bh 44 2001-09-07 Bernhard Herzog <[email protected]>
4989    
4990     * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
4991     that can limit the search to the currently selected layer.
4992     (MapCanvas.SelectShapeAt): Make sure that the currently selected
4993     layer stays selected even when no shape is found
4994 bh 46 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
4995     height do nothing (avoids zero division errors)
4996 bh 44
4997 bh 32 2001-09-06 Bernhard Herzog <[email protected]>
4998    
4999 bh 42 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
5000     Correct the spelling of SessionTreeCtrl. dabbrev is too damn
5001     convenient :-)
5002     (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
5003     a new instvar layer_to_item to map layers to tree items
5004     (SessionTreeCtrl.layer_selected): Select the appropriate tree item
5005     to match the current selection in the interactor
5006    
5007 bh 40 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
5008     (Interactor.HasSelectedLayer): New methods to query the current
5009     selection
5010    
5011     * Thuban/UI/mainwindow.py (MainWindow.current_layer):
5012     (MainWindow.has_selected_layer): Simply call the appropriate
5013     interactor method
5014    
5015     * Thuban/UI/mainwindow.py (MainWindow.__init__):
5016     (MainWindow.LayerShowTable):
5017     (MainWindow.identify_view_on_demand): Store the interactor in an
5018     instvar and use that reference instead of going through main.app
5019    
5020 tkoester 403 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
5021     * Thuban/UI/application.py (ThubanApplication.OnInit):
5022 bh 40 * Thuban/UI/main.py (main): Create the session tree view in main
5023     with the new mainwindow method ShowSessionTree and not directly
5024     the application's OnInit method
5025    
5026     * Thuban/UI/tree.py (myTreeCtrlPanel):
5027     (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
5028     TreeCtrl isntead of a panel. This affects most method since we now
5029     refer to self instead of self.tree
5030     (SessionTreeView): New class implementing a non-modal dialog
5031     showing the session tree.
5032    
5033 bh 35 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
5034     layer to the tableview dialog.
5035    
5036     * Thuban/UI/tableview.py: Add some doc-strings
5037 tkoester 403 (TableGrid):
5038 bh 35 (TableGrid.OnRangeSelect):
5039     (TableGrid.OnSelectCell):
5040     (TableFrame.__init__):
5041     (TableFrame.row_selected):
5042     Selecting rows in the grid view now updates the selected shapes
5043     through the TableFrame. To achieve this we derive TableGrid from
5044     Publisher and introduce the message type ROW_SELECTED which the
5045     TableFrame subscribes to and which is issued by OnRangeSelect and
5046     OnSelectCell
5047    
5048     (DataTable.SelectRow): Removed because it's no longer needed in
5049     the row/shape selection scheme
5050    
5051 bh 32 * Thuban/UI/dialogs.py: New file implementing common classes for
5052     dialogs
5053    
5054     * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
5055     the SELECTED_SHAPE message anymore. This is now handled by the
5056     parent.
5057     (TableGrid.select_shape): Only update the selection if the shape
5058     is not None.
5059     (TableFrame): Inherit from the new NonModalDialog class.
5060     (TableFrame.__init__, TableFrame.select_shape): Handle the
5061     SELECT_SHAPE message.
5062     (TableFrame.OnClose): Extend the inherited method to unsubscribe
5063     SELECT_SHAPE
5064    
5065     * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
5066     (MainWindow.add_dialog):
5067     (MainWindow.dialog_open):
5068     (MainWindow.remove_dialog):
5069     (MainWindow.get_open_dialog): New methods to maintain a dictionary
5070     of opened non-modal dialogs.
5071    
5072     (MainWindow.__init__): Initialize the new non-modal dictionary
5073     management code
5074     (MainWindow.LayerShowTable): maintain separate dialogs for each
5075     table using the non-modal dialog management code to only open a
5076     view once for each table.
5077    
5078     (MainWindow.IdentifyTool):
5079     (MainWindow.__init__):
5080     (MainWindow.identify_view_on_demand): Don't open the identify view
5081     in IdentifyTool anymore. This will be done automatically by the
5082     new method identify_view_on_demand which handles the
5083     SELECTED_SHAPE message so that the identify view will be opened on
5084     demand
5085    
5086     * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
5087     the interactor argument. The SELECTED_SHAPE message is now handled
5088     by the parent.
5089     (IdentifyView.__init__): Add the interactor argument so that we
5090     can handle the SELECTED_SHAPE message here
5091     (IdentifyView.selected_shape): New method to handle the
5092     SELECTED_SHAPE messages
5093    
5094     * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
5095     NonModalDialog class
5096     (IdentifyView.OnClose): Extend the inherited version to
5097     unsubscribe SELECT_SHAPE
5098    
5099     * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
5100    
5101 bh 26 2001-09-05 Bernhard Herzog <[email protected]>
5102    
5103     * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
5104 tkoester 403
5105 bh 26 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
5106     interactor to pass through to the MapCanvas
5107 tkoester 403
5108 bh 26 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
5109     argument to the MainWindow constructor to get rid of the ugly hack
5110     that made main.app available early just so that the mapcanvas
5111     could access the interactor object.
5112    
5113 bh 19 2001-09-04 Bernhard Herzog <[email protected]>
5114    
5115 bh 22 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
5116     that runs a modal message box
5117     (MainWindow.OnClose): Use the new method
5118     (MainWindow.RemoveLayer): Just do nothing in case no layer is
5119     selected. The command should be grayed out anyway, so there's no
5120     need to pop up a message box.
5121     (MainWindow.AddLayer): Pop up a message box with an error message
5122     if the shape file can't be opened
5123    
5124     * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
5125     immediately. This will cause an exception in case the file can't
5126     be opened and we can display an appropriate message.
5127    
5128 bh 19 * MANIFEST.in: Add extensions/pyprojection/LICENSE
5129    
5130     * setup.py (thuban_bdist_rpm): New class implementing a Thuban
5131     specific bdist_rpm command.
5132    
5133     * Thuban/UI/main.py: Catch ImportError exceptions when importing
5134     the locale module because it may not be available on some
5135     installations.
5136    
5137     * extensions/pyprojection/LICENSE: Copy of the license text in
5138     Projection.i. Having it in a separate file makes it easier to
5139     refer to license text in e.g. RPMs
5140    
5141 bh 18 2001-09-03 Bernhard Herzog <[email protected]>
5142    
5143 bh 19 * setup.py: use wx-config instead of wxgtk-config because it's
5144     more generic
5145    
5146     * setup.py (ThubanInstall.get_outputs): Add the symlink in
5147     <prefix>/bin to the outputs
5148     (ThubanInstall.link_file): New method to link files. We need this
5149     because the standard copy_files refuses to link non-existing
5150     files.
5151     (ThubanInstall.run): Remove the leading install root from the
5152     script filename if an install root was specified and use the new
5153     link_file method
5154 tkoester 403
5155 bh 18 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
5156     the window when the first layer is added to the map.
5157    
5158     * setup.py (ThubanInstall.run): Honor the build root (self.root)
5159     when linking thuban.py to <prefix>/bin
5160    
5161 bh 16 2001-08-31 Bernhard Herzog <[email protected]>
5162    
5163     * setup.py: In the setup call, the install parameters shouldn't
5164     have trailing slashes because distutils on non-posix platforms
5165     doesn't like that. The same applies to other directories like
5166     "Resources/Bitmaps"
5167    
5168     In the configuration section for nt, move the wxWindows directory
5169     optins into the part clearly marked as editable.
5170    
5171     (InstallLocal.initialize_options):
5172     (InstallLocal.user_options): remove the currently unused debug
5173     flag
5174     (thuban_build_py.find_all_modules): Add this method so that it
5175     works for our case of having packages and modules in one
5176     distribution as well.
5177     (ThubanInstall.initialize_options):
5178     (ThubanInstall.finalize_options):
5179     (ThubanInstall.user_options):
5180     (ThubanInstall.boolean_options): Add new options, do-symlink and
5181     extra files. Since these are the first ThubanInstall specific
5182     options, override user_options and boolean_options
5183     (ThubanInstall.run): Honor the new do-symlink and extra-files
5184     options.
5185     (ThubanInstall.get_outputs): Add to override the base-class's
5186     version and add the extra-files to the outputs
5187     (bdist_inno): New class for windows distributions with Inno Setup
5188     (InnoIconItem): Helper class for bdist_inno
5189     (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
5190     this together with the appropriate parameters, to the setup call.
5191 tkoester 403
5192 bh 16 * setup.cfg (bdist_inno): added new section for the inno setup
5193     installer
5194    
5195     * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
5196     changing_selection to avoid recursive selection events when
5197     modifying the selection in response to a selection event.
5198     (myTreeCtrlPanel.normalize_selection): Set the new inst var when
5199     changing the tree's selection.
5200     (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
5201     we're not being called indirectly from normalize_selection.
5202    
5203     * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
5204     event.Check only if the command is actuall checkable.
5205     (MainWindow.__init__): Call the toolbar's Realize method to make
5206     sure that the items are actually shown
5207    
5208 bh 7 2001-08-28 Bernhard Herzog <[email protected]>
5209    
5210 bh 9 * setup.py: Fix some doc strings
5211    
5212 bh 7 * ChangeLog: started
5213    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26