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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26