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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1318 - (hide annotations)
Mon Jun 30 09:57:16 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 206134 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26