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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1370 - (show annotations)
Thu Jul 3 16:27:31 2003 UTC (21 years, 8 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 214914 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26