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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1409 - (hide annotations)
Mon Jul 14 09:38:55 2003 UTC (21 years, 7 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 221365 byte(s)
Bugfix #2013

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26