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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2073 - (show annotations)
Tue Feb 17 13:15:22 2004 UTC (21 years ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 349617 byte(s)
update ChangeLog

1 2004-02-17 Bernhard Herzog <[email protected]>
2
3 Fix for RT#2245
4
5 * Thuban/UI/application.py (ThubanApplication.OnInit): Initialize
6 instance variables before trying to create any windows. Creating
7 windows can start an event loop if e.g. message boxes are popped
8 up for some reason, and event handlers, especially EVT_UPDATE_UI
9 may want to access things from the application.
10 (ThubanApplication.maps_changed): The mainwindow may not have been
11 created yet, so check whether it has been created before calling
12 its methods
13
14 * Thuban/UI/view.py (MapCanvas.OnIdle): Only try to redraw if we
15 have a map
16
17 2004-02-17 Bernhard Herzog <[email protected]>
18
19 * test/test_svgmapwriter.py, Extensions/svgsaver.py,
20 Extensions/svgmapwriter.py, Extensions/maplegend.py,
21 extensions/svgexport/svgsaver.py,
22 extensions/svgexport/svgmapwriter.py,
23 extensions/svgexport/maplegend.py: Removed. These files were in
24 the wrong places or didn't work at all.
25
26 2004-02-16 Bernhard Herzog <[email protected]>
27
28 * Thuban/UI/view.py (MapCanvas.Export): Remove accidentally added
29 line
30
31 2004-02-16 Bernhard Herzog <[email protected]>
32
33 * Thuban/UI/view.py (MapCanvas.Export): Avoid UnboundLocalError.
34
35 2004-02-15 Markus Rechtien <[email protected]>
36
37 * Extensions/svgexport/svgmapwriter.py: New. Adds the capability
38 to write a session to a file in SVG format.
39 * Extensions/svgexport/svgsaver.py: New. Uses svgmapwriter.py
40 to write a SVG map of a session.
41 * Extensions/svgexport/maplegend: New. Writes a basic maplegend
42 in SVG format for the current session.
43
44 2004-02-13 Bernhard Herzog <[email protected]>
45
46 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): When the layer
47 can't be created, return immediately after displaying the error
48 message.
49
50 2004-02-11 Bernhard Herzog <[email protected]>
51
52 Handle postgis tables with more than one geometry column.
53
54 * Thuban/Model/postgisdb.py
55 (PostGISTable._fetch_table_information): Delegate the creation of
56 column objects to a different method so that we can extend that in
57 derived classes
58 (PostGISTable._create_col_from_description): New. Column object
59 creation part of _fetch_table_information
60 (PostGISShapeStore._create_col_from_description): New. Extend
61 inherited method to handle geometry columns
62 (PostGISShapeStore.__init__): New parameter geometry_column to
63 specify which geometry column to use. Optional but mandatory for
64 tables with more than one geometry column
65 (PostGISShapeStore._fetch_table_information): Also use the name of
66 the geometry column when looking for the srid
67 (PostGISShapeStore.ShapeType): Also use the name of the geometry
68 column when looking for the shape type
69
70 * test/test_save.py (SaveSessionTest.test_save_postgis): Adapt
71 NonConnectionStore to changes in the PostGISShapeStore
72
73 * test/test_postgis_db.py
74 (TestPostGISSpecialCases.test_shapestore_two_geom_cols): Test
75 PostGISShapeStore with tables having two geometry columns.
76
77 2004-02-10 Bernhard Herzog <[email protected]>
78
79 Fix some postgis problems. What remains to be done is real
80 handling of SRIDs as they affect how reprojection is done
81
82 * Thuban/Model/postgisdb.py (quote_identifier): Fix typo in
83 doc-string
84 (PostGISShapeStore._fetch_table_information): New. Extend
85 inherited method to retrieve srid
86 (PostGISShapeStore.BoundingBox): Handle tables without data.
87 extent yields NULL for those
88 (PostGISShapeStore.ShapesInRegion): Use the srid of the table.
89
90 * test/test_postgis_db.py
91 (TestPostGISSpecialCases.test_shapestore_empty_table): New test
92 for the special case of a table without any data
93 (TestPostGISShapestorePointSRID): New class with tests for a table
94 that uses srids
95 (PolygonTests): Fix a doc-string typo
96
97 * test/postgissupport.py (PostGISDatabase.__init__): New parameter
98 reference_systems with a specification of spacial reference
99 systems to create in the new db.
100 (PostgreSQLServer.new_postgis_db)
101 (PostgreSQLServer.get_static_data_db): New parameter
102 reference_systems to be passed through ultimately to
103 PostGISDatabase. In new_postgis_db also check whether an existing
104 db already has the right srids
105 (PostgreSQLServer.get_default_static_data_db): Add srids and a
106 table that uses srids
107 (PostGISDatabase.initdb): Create the entries for the reference
108 systems
109 (PostGISDatabase.has_data): Add reference_systems parameter to
110 check for those too
111 (upload_shapefile): New parameter srid to create tables with a
112 specific srid
113
114 2004-02-06 Frank Koormann <[email protected]>
115
116 * po/pt_BR.po: Fixed charset
117
118 2004-02-05 Frank Koormann <[email protected]>
119
120 * po/pt_BR.po: Fixed format string for error message, missing %s
121 added (Thuban/UI/application.py:273)
122
123 2004-02-03 Frank Koormann <[email protected]>
124
125 First version of Portuguese (Brazilian) translation
126
127 * po/pt_BR.po: New, translation of pot (2004-01-15 16:07+0300) for
128 Brazilian Portuguese by Eduardo Patto Kanegae.
129
130 * Thuban/UI/about.py (About.__init.py__): Added Eduardo to the list of
131 translators.
132
133
134 2004-01-22 Frank Koormann <[email protected]>
135
136 * Doc/manual/thuban-manual.xml: Added section on installation of
137 Thuban under Win32 systems. Fixed image path references in the postgis
138 section. Some minor source formattings.
139
140 2004-01-21 Frank Koormann <[email protected]>
141
142 Make Thuban remember path selections (at least for one application run).
143
144 * Thuban/UI/application.py (Application.OnInit): Initialize path as a
145 attribute of application object. Path is a dictionary of
146 strings, currently with the items "data" and "projection".
147 (Application.SetPath): New, stores path for the specified item.
148 (Application.Path): New, return path for the specified item.
149
150 * Thuban/UI/mainwindow.py
151 (MainWindow.OpenSession, MainWindow.SaveSessionAs,
152 MainWindow.AddLayer, MainWindow.AddRasterLayer,
153 MainWindow.TableOpen): Access "data" path information of the
154 application.
155
156 * Thuban/UI/projdialog.py (ProjFrame._OnImport, ProjFrame._OnExport):
157 Access "projection" path information of the application.
158
159 2004-01-05 Bernhard Herzog <[email protected]>
160
161 * po/ru.po: Updated translations from Alex Shevlakov
162
163 2004-01-05 Bernhard Herzog <[email protected]>
164
165 * po/Makefile, po/README: Move the description of how to generate
166 the translation statistics to the README.
167
168 2003-12-23 Bernhard Herzog <[email protected]>
169
170 * NEWS: Update for 1.0.0
171
172 * po/it.po: Another update from Maurizio Napolitano
173
174 2003-12-23 Bernhard Herzog <[email protected]>
175
176 * po/it.po: Updated translation from Maurizio Napolitano
177
178 2003-12-23 Bernhard Herzog <[email protected]>
179
180 * Thuban/UI/join.py (JoinDialog.__init__): Mark one more string
181 for translation
182
183 * Thuban/UI/mainwindow.py (MainWindow.TableRename)
184 (MainWindow.RenameMap, MainWindow.RenameLayer): Mark some more
185 strings for translation
186
187 * po/de.po: Update with the newly marked strings.
188
189 2003-12-22 Bernhard Herzog <[email protected]>
190
191 * HOWTO-Release: Fix the places where version numbers have to be
192 updated
193
194 2003-12-22 Bernhard Herzog <[email protected]>
195
196 * setup.py (setup call): 1.0.0, yeah!
197
198 * Thuban/version.py (longversion): 1.0.0, yeah!
199
200 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
201 1.0.0 namespace too
202
203 * Thuban/Model/save.py (SessionSaver.write_session): Save with
204 1.0.0 namespace
205
206 * test/test_load.py (LoadSessionTest.dtd)
207 (TestSingleLayer.file_contents)
208 (TestNonAsciiColumnName.file_contents)
209 (TestLayerVisibility.file_contents)
210 (TestClassification.file_contents, TestLabels.file_contents)
211 (TestLayerProjection.file_contents)
212 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
213 (TestLabelLayer.file_contents, TestPostGISLayer.file_contents)
214 (TestPostGISLayerPassword.file_contents)
215 (TestLoadError.file_contents, TestLoadError.test): Update for
216 1.0.0 namespace
217
218 * test/test_save.py (SaveSessionTest.dtd)
219 (SaveSessionTest.testEmptySession)
220 (SaveSessionTest.testSingleLayer)
221 (SaveSessionTest.testLayerProjection)
222 (SaveSessionTest.testRasterLayer)
223 (SaveSessionTest.testClassifiedLayer)
224 (SaveSessionTest.test_dbf_table)
225 (SaveSessionTest.test_joined_table)
226 (SaveSessionTest.test_save_postgis): Update for 1.0.0 namespace
227
228 2003-12-22 Bernhard Herzog <[email protected]>
229
230 * Thuban/Model/load.py (SessionLoader.start_label): Make sure the
231 alignment flags are byte strings not unicode and that they have
232 valid values
233
234 * test/test_load.py (TestLabelLayer): New. Test loading (and
235 indirectly saving) of maps with labels.
236
237 2003-12-22 Bernhard Herzog <[email protected]>
238
239 * Thuban/UI/tableview.py (TableGrid.OnDestroy)
240 (TableGrid.__init__): Handle EVT_WINDOW_DESTROY in the grid to
241 unsubscribe all subscribers.
242 (LayerTableFrame.OnDestroy): Do not unsubscribe any messages from
243 self.grid since it may already have been destroyed.
244 Fixes RT #2256
245
246 2003-12-19 Bernhard Herzog <[email protected]>
247
248 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
249
250 2003-12-16 Bernhard Herzog <[email protected]>
251
252 * debian/bitmappath.patch, debian/setup.py.patch:
253 added to ensure compliance with FHS for debian
254 * debian/rules, debian/changelog:
255 added patches in rules to ensure compliance with FHS for debian
256
257 2003-12-16 Bernhard Herzog <[email protected]>
258
259 * po/Makefile (mo): Make the output a bit nicer so that it prints
260 statistics about the translations. Add a comment how produce even
261 nicer statistics with sed.
262
263 2003-12-09 Frank Koormann <[email protected]>
264
265 * Resources/Projections/defaults.proj:
266 French projection sample with correct accents (UNICODE).
267
268 2003-12-05 Bernhard Herzog <[email protected]>
269
270 * MANIFEST.in: Add the devtools directory
271
272 * setup.py (setup call): Use license instead of licence. This
273 silences a deprecation warning on Python 2.3
274
275 2003-12-05 Frank Koormann <[email protected]>
276
277 Documentation synced with 1.0rc1
278
279 * Doc/manual/thuban-manual.xml:
280 Minor formatting changes and references to database layers .
281 Introduction.Internationalization: New section on i18n.
282 MapManagement.AddingandRemovingLayers: Added item on database layers.
283 MapManagement.TheLegend: Added section and screenshot on popup menu.
284 ProjectionManagement: Updated screenshot and sentence on EPSG.
285 Appendix.SupportedDataSources: Added PostGIS.
286 Appendix.WorkingwithPostGIS: New section.
287
288 * Doc/manual/images/6_projection.png: Updated screenshot including
289 EPSG checkboxes.
290
291 * Doc/manual/images/3_5_popup_menu.png: New, popup menu screenshot.
292
293 * Doc/manual/images/app_postgis_add_layer.png,
294 Doc/manual/images/app_postgis_db_add.png,
295 Doc/manual/images/app_postgis_db_management.png:
296 New screenshots focussing on database layers
297
298 2003-12-05 Frank Koormann <[email protected]>
299
300 * Thuban/UI/projdialog.py (load_user_proj): If user.proj is missing
301 write warning to stderr instead of rising a warning dialog
302
303 2003-12-03 Bernhard Herzog <[email protected]>
304
305 Fix for RT #2243
306
307 * Thuban/UI/mainwindow.py (MainWindow.has_selected_shape_layer):
308 New. Like has_selected_layer but for shape layers only
309 (_has_selected_shape_layer): New. Like _has_selected_layer but for
310 shape layers only
311 (layer_show_table command, layer_jointable command): Use these
312 commands should only be available for shape layers
313
314 2003-12-03 Bernhard Herzog <[email protected]>
315
316 * Thuban/UI/mainwindow.py (MainWindow.Unsubscribe): Deal with
317 publishers that are wx objects and may have been destroyed by wx
318 already. Fixes RT #2242.
319
320 2003-12-03 Bernhard Herzog <[email protected]>
321
322 * po/ru.po: Updates from Alex Shevlakov
323
324 2003-12-03 Silke Reimer <silkeintevation.de>
325
326 * debian/control, debian/changelog: Added gdal-support to
327 debian package, updated to new thuban version
328
329
330 2003-12-03 Bernhard Herzog <[email protected]>
331
332 * Thuban/Lib/version.py: New. Module for version number
333 manipulations. The version of make_tuple here also deals better
334 with more unusual version number strings, such as e.g.
335 "1.2+cvs20031111"
336
337 * Thuban/version.py (make_tuple): Removed. It's now in
338 Thuban.Lib.version. Use that implementation instead.
339
340 * test/test_lib_version.py: New. Tests for Thuban/Lib/version.py
341
342 2003-12-02 Bernhard Herzog <[email protected]>
343
344 * MANIFEST.in: Add debian files
345
346 * setup.py (setup call): Add packages for the Extensions so that
347 they're installed too
348 (data_files): Add READMEs and sample data from some Extensions
349
350 * NEWS: Add note about the extensions in binary packages
351
352 2003-12-02 Bernhard Herzog <[email protected]>
353
354 * Thuban/Model/save.py (SessionSaver.write_session): Save files
355 with the thuban-1.0rc1
356
357 * Thuban/Model/load.py (SessionLoader.__init__): Recognize the
358 thuban-1.0rc1 namespace too
359
360 * test/test_save.py (SaveSessionTest.dtd)
361 (SaveSessionTest.testEmptySession)
362 (SaveSessionTest.testSingleLayer)
363 (SaveSessionTest.testLayerProjection)
364 (SaveSessionTest.testRasterLayer)
365 (SaveSessionTest.testClassifiedLayer)
366 (SaveSessionTest.test_dbf_table)
367 (SaveSessionTest.test_joined_table)
368 (SaveSessionTest.test_save_postgis): Update to thuban-1.0rc1
369 namespace
370
371 * test/test_load.py (LoadSessionTest.dtd): Update to thuban-1.0rc1
372 namespace
373 (TestSingleLayer.file_contents)
374 (TestNonAsciiColumnName.file_contents)
375 (TestLayerVisibility.file_contents)
376 (TestClassification.file_contents, TestLabels.file_contents)
377 (TestLayerProjection.file_contents)
378 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
379 (TestPostGISLayer.file_contents)
380 (TestPostGISLayerPassword.file_contents)
381 (TestLoadError.file_contents, TestLoadError.test): Update to
382 thuban-1.0rc1 namespace
383
384 2003-12-01 Bernhard Herzog <[email protected]>
385
386 * setup.py (proj4_prefix, wx_prefix, gdal_prefix): Fix these for
387 nt to better match Intevation's current w32 setup
388
389 * HOWTO-Release: Add note about updating MANIFEST.in
390
391 * MANIFEST.in: Add the Extensions
392
393 * NEWS: Update for 1.0rc1
394
395 2003-12-01 Bernhard Herzog <[email protected]>
396
397 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Change the wild
398 cards for the dialog so that shapefiles ending in all uppercase
399 SHP are listed too
400
401 2003-11-28 Bernhard Herzog <[email protected]>
402
403 * Thuban/version.py (longversion): Update to 1.0rc1
404
405 * setup.py (setup call): Update version to 1.0rc1. Use the
406 [email protected] email address as author email instead of my
407 personal one.
408
409 2003-11-28 Bernhard Herzog <[email protected]>
410
411 * po/de.po: Update german translation.
412
413 2003-11-28 Bernhard Herzog <[email protected]>
414
415 Unify the filenames stored in .thuban files so that the .thuban
416 files are more platform independend
417
418 * Thuban/Model/save.py (unify_filename): New. Unify filenames so
419 that they can be used on both windows and unix
420 (SessionSaver.prepare_filename): New. Handle all filename
421 transformations for filenames stored in the thuban file
422 (SessionSaver.write_data_containers, SessionSaver.write_layer):
423 Use prepare_filename
424
425 * test/test_save.py (SaveSessionTest.testSingleLayer)
426 (SaveSessionTest.testLayerProjection)
427 (SaveSessionTest.testRasterLayer)
428 (SaveSessionTest.testClassifiedLayer)
429 (SaveSessionTest.test_dbf_table)
430 (SaveSessionTest.test_joined_table): Filenames are always stored
431 with slashes on all currently supported platforms so adapt all
432 tests to this
433
434 * test/test_load.py (LoadSessionTest.filenames): With the new
435 filename scheme the filenames in the tests should be
436 understandable on all currently supported platforms so we turn
437 this into an empty list because we don't have to normalize them
438 anymore
439
440 2003-11-28 Bernhard Herzog <[email protected]>
441
442 * test/test_layer.py (TestLayer.test_arc_layer_with_projection):
443 Add the ellipsoid to the projection since some Proj versions
444 complain if it's missing.
445
446 2003-11-27 Bernhard Herzog <[email protected]>
447
448 Corect some bounding box projection problems
449
450 * Thuban/Model/proj.py (Projection.InverseBBox): New. Inverse
451 version of ForwardBBox
452 (Projection._transform_bbox): New. common implementation of
453 ForwardBBox and InverseBBox
454 (Projection.ForwardBBox): Use _transform_bbox.
455
456 * test/test_proj.py (TestProjection.test): Add test for
457 InverseBBox
458
459 * Thuban/Model/layer.py (Layer.LatLongBoundingBox)
460 (Layer.ShapesBoundingBox, RasterLayer.LatLongBoundingBox): Use the
461 new InverseBBox method to determine the unprojected bounding box
462 (Layer.ShapesInRegion): Use the ForwardBBox method to project the
463 bbox.
464
465 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
466 Removed.
467 (TestLayer.test_arc_layer_with_projection): New. This test is
468 better able to test whether bounding boxes are projected correctly
469 than test_point_layer_with_projection
470
471 * Thuban/UI/viewport.py (ViewPort.map_projection_changed): Use
472 InverseBBox to unproject bboxes
473
474 2003-11-25 Bernhard Herzog <[email protected]>
475
476 * Thuban/UI/about.py (About.__init__): Make sure we have ASCII
477 source code.
478
479 2003-11-25 Bernhard Herzog <[email protected]>
480
481 * Thuban/Model/layer.py (Layer.__getattr__): Removed. It was only
482 there for backwards compatibility and all code relying on that
483 should have been updated by now.
484
485 2003-11-25 Bernhard Herzog <[email protected]>
486
487 * test/test_load.py (TestClassification.test): Add the missing
488 round trip test.
489 (TestClassification.file_contents): Update to the newest file
490 format
491
492 2003-11-25 Bernhard Herzog <[email protected]>
493
494 Add very experimental (and possibly dangerous) extension to draw
495 polygons:
496
497 * Extensions/drawshape/README: New. Brief installation
498 instructions
499
500 * Extensions/drawshape/drawshape.py: New. Implementation of the
501 drawshape extensions
502
503 * Extensions/drawshape/patch.diff: Patch to apply before the
504 extension can be used.
505
506 2003-11-24 Bernhard Herzog <[email protected]>
507
508 * Thuban/Model/data.py (ShapefileStore._open_shapefile)
509 (ShapefileStore.__init__): Factor opening the shapefile into a
510 separate method (the new _open_shapefile). This makes the code a
511 bit more readable but the real reason is that it makes some evil
512 hacks easier. :-)
513
514 2003-11-24 Bernhard Herzog <[email protected]>
515
516 * Thuban/Model/load.py (SessionLoader.check_attrs): If no
517 converter is specified for an attribute assume it's a string
518 containing only Latin1 characters. Update doc-string accordingly.
519 This change should fix many places where unicode objects might
520 accidentally enter Thuban.
521
522 * test/test_load.py (TestNonAsciiColumnName): New test to check
523 what happens with column names in DBF files that contain non-ascii
524 characters
525
526 2003-11-21 Bernhard Herzog <[email protected]>
527
528 Enable the experimental attribute editing again and introduce a
529 command line switch to actually activate it
530
531 * Thuban/UI/main.py (options): New. Container for options set on
532 the commmand line
533 (main): Add the --enable-attribute-editing flag.
534
535 * Thuban/UI/identifyview.py (IdentifyView.__init__): If attribute
536 editing is enabled use the grid ctrl which allows editing of the
537 values
538
539 * Thuban/Model/transientdb.py (AutoTransientTable.write_record):
540 New. Just delegate this to the underlying table.
541
542 2003-11-20 Bernhard Herzog <[email protected]>
543
544 * test/test_proj.py (ProjFileReadTests.test_read_unreadable_file):
545 Skip this test if run under non-posix systems since it only works
546 there
547
548 2003-11-19 Bernhard Herzog <[email protected]>
549
550 * Thuban/Model/resource.py: Rework the way gdal support is
551 determined so that we can give a reason in the about why gdal is
552 not supported.
553 (gdal_support_status): New. Variable holding a string with the
554 reason for no gdal support
555
556 * Thuban/UI/about.py (About.__init__): Add the reason why gdal is
557 not supported to the message
558
559 2003-11-19 Bernhard Herzog <[email protected]>
560
561 Remove the old table interface and its test cases
562
563 * Thuban/Model/table.py (OldTableInterfaceMixin): Removed.
564 (DBFTable, MemoryTable): Do not derive from OldTableInterfaceMixin
565 anymore
566
567 * Thuban/Model/transientdb.py (TransientTableBase)
568 (AutoTransientTable): Do not derive from OldTableInterfaceMixin
569 anymore
570
571 * test/test_table.py: Removed since the old interface it tests is
572 gone.
573
574 * test/runtests.py (main): The old table interface is gone and
575 with it the deprecation warnings so remove the code that turns
576 these warnings into errors
577
578 2003-11-19 Bernhard Herzog <[email protected]>
579
580 * test/test_table.py: Revert to revision 1.5 again. Changing the
581 tests to use the new table interface is completely wrong since the
582 whole purpose of the tests in this module is to test the old
583 interface.
584
585 2003-11-18 Bernhard Herzog <[email protected]>
586
587 * Thuban/Model/postgisdb.py (PostGISConnection.MatchesParameters):
588 New. Test whether the connection matches a set of connection
589 parameters
590
591 * Thuban/UI/dbdialog.py (DBFrame.conns_changed): Fix doc-string
592 (DBFrame.OnAdd): Use the new MatchesParameters method when looking
593 for existing connections with the same parameters and break out of
594 the loop correctly.
595
596 * test/test_postgis_db.py (TestBriefDescription)
597 (TestPostGISSimple.test_brief_description): Rename
598 TestBriefDescription to TestPostGISSimple and the test method to
599 test_brief_description so that we can add more test methods.
600 (TestPostGISSimple.test_matches_parameters): New. Test the new
601 MatchesParameters method
602
603 2003-11-18 Bernhard Herzog <[email protected]>
604
605 * Thuban/Lib/connector.py (Publisher): Introduce a new flag,
606 _was_destroyed, to indicate whether an publisher instance has
607 already been destroyed.
608 (Publisher.Unsubscribe): Only disconnect if the publisher has not
609 been destroyed yet.
610 (Publisher.Destroy): Set the _was_destroyed flag to true.
611
612 * test/test_connector.py
613 (TestPublisher.test_unsubscribe_after_destroy): New. Test that
614 calling Unsubscribe after Destroy doesn't raise an exception
615
616 2003-11-14 Bernhard Herzog <[email protected]>
617
618 * Thuban/UI/identifyview.py (IdentifyView.selected_shape): Fix
619 typo in doc-string
620
621 2003-11-13 Bernhard Herzog <[email protected]>
622
623 Quote table and column names properly for postgis.
624
625 * Thuban/Model/postgisdb.py (quote_identifier): New. Function to
626 quote an identifier for use in an sql statement
627 (PostGISColumn.__init__): Add the quoted_name attribute
628 (PostGISTable.__init__): New instance variable quoted_tablename
629 (PostGISTable._fetch_table_information): Use the quoted table
630 name. New isntance variable quoted_geo_col with a quoted version
631 of geometry_column
632 (PostGISTable.NumRows, PostGISTable.RowIdToOrdinal)
633 (PostGISTable.RowOrdinalToId): Use the quoted table name
634 (PostGISTable.ReadValue, PostGISTable.ValueRange)
635 (PostGISTable.UniqueValues, PostGISTable.SimpleQuery)
636 (PostGISShapeStore.BoundingBox, PostGISShapeStore.Shape)
637 (PostGISShapeStore.AllShapes, PostGISShapeStore.ShapesInRegion):
638 Use quoted table and column names
639
640 * test/test_postgis_db.py (TestPostGISSpecialCases)
641 (TestPostGISIgnoredColumns): Rename the class to
642 TestPostGISSpecialCases because that better describes the new
643 cases
644 (TestPostGISSpecialCases.test_unsupported_types)
645 (TestPostGISSpecialCases.test): Rename the method to
646 test_unsupported_types because we need a more descriptive name now
647 that there are more methods
648 (TestPostGISSpecialCases.test_table_name_quoting)
649 (TestPostGISSpecialCases.test_column_name_quoting)
650 (TestPostGISSpecialCases.test_shapestore_name_quoting): New test
651 cases to test quoting of table and column names in PostGISTable
652 and PostGISShapeStore
653
654 * test/postgissupport.py
655 (skip_if_addgeometrycolumn_does_not_use_quote_ident): New. Skip if
656 AddGeometryColumn desn't support table or column names with sapces
657 or double quotes
658
659 2003-11-12 Jan-Oliver Wagner <[email protected]>
660
661 * Extensions/wms/__init__.py: New: Init to make this
662 directory a package.
663
664 * Extensions/wms/wms.py: New: Provide layers via OGC WMS.
665
666 2003-11-11 Bernhard Herzog <[email protected]>
667
668 * Thuban/Model/resource.py (EPSG_DEPRECATED_PROJ_FILE): New.
669 Constant for the file woth deprecated epsg projections
670 (get_system_proj_file): Update doc-string
671
672 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Add a space
673 above the EPS widgets, introduce a check box for the deprecated
674 eps projections and a label for the epsg widgets
675 (ProjFrame._OnShowEPSG): Handle the deprecated EPSG projections
676 too
677
678 2003-11-11 Bernhard Herzog <[email protected]>
679
680 Avoid warnings when run under Python 2.3
681
682 * Thuban/UI/baserenderer.py (BaseRenderer.draw_point_shape)
683 (BaseRenderer.draw_label_layer): Coordinates must be ints.
684
685 * Thuban/UI/renderer.py (MapRenderer.make_point): Turn this into a
686 real method so that we can convert to int.
687 (MapRenderer.label_font): The font size mist be an int.
688
689 * Thuban/UI/common.py (Color2wxColour): The color values must be
690 ints. Also, remove the unnecessary asserts.
691
692 * test/test_load_0_8.py (TestUnicodeStrings.file_contents)
693 (TestUnicodeStrings.test): Python source code should not contain
694 non-ascii characters unless an encoding is specified in the file.
695 Therefore use \x escapes in the string literals for non-ascii
696 characters.
697
698 2003-11-11 Bernhard Herzog <[email protected]>
699
700 * Thuban/Model/resource.py (get_system_proj_file): Add a filename
701 parameter so that this function can be used for all proj files in
702 Resource/Projections
703 (DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
704 get_system_proj_file
705
706 * Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
707 ProjFile self.__sysProjFile use a dictionary of system ProjFile
708 objects self._sys_proj_files
709 (ProjFrame.build_dialog): Adapt to the new changes in the
710 ProjectionList constructor. Add a check button to toggle whether
711 EPSG projections are shown
712 (ProjFrame._OnShowEPSG): New. Handler for the epsg check button
713 events.
714 (ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
715 the busy cursor if the files have not yet been loaded by the
716 dialog.
717 (ProjFrame.load_system_proj): Add a parameter for the name of the
718 proj file. Maintain the dictionary of system projections
719 self._sys_proj_files
720
721 * Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
722 user_projs parameters into one parameter proj_files which is a
723 list of proj files.
724 (ProjectionList._subscribe_proj_files)
725 (ProjectionList._unsubscribe_proj_files): New. Move
726 subscription/unsubscription of projfile messages to separate
727 methods
728 (ProjectionList.Destroy): The unsubscribe is now done in
729 _unsubscribe_proj_files
730 (ProjectionList.update_projections): We now have a list of proj
731 file objects
732 (ProjectionList.SetProjFiles): New method to set a new list of
733 proj file objects
734
735 * test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
736 Specify explicitly which system proj file to load.
737
738 2003-11-11 Bernhard Herzog <[email protected]>
739
740 * Thuban/Model/load.py (SessionLoader.Destroy): New. Clear all
741 instance variables to cut cyclic references. The GC would have
742 collected the loader eventually but it can happen that it doesn't
743 run at all until thuban is closed (2.3 but not 2.2 tries a bit
744 harder and forces a collection when the interpreter terminates)
745 (load_session): Call the handler's Destroy method to make sure
746 that it gets garbage collected early. Otherwise it will be
747 collected very late if at all and it holds some references to e.g.
748 shapestores and the session which can lead to leaks (of e.g. the
749 temporary files)
750
751 * test/test_load.py (TestSingleLayer.test_leak): New. test for the
752 resource leak in load_session
753
754 2003-11-10 Bernhard Herzog <[email protected]>
755
756 * Thuban/UI/baserenderer.py: Add a way to specify how layers in
757 extensions are to be rendered.
758 (_renderer_extensions): New. List with renderer for layers in
759 extensions
760 (add_renderer_extension): New. Add a renderer extension
761 (init_renderer_extensions): New. Init the renderer extensions
762 (BaseRenderer.render_map_incrementally): Search
763 _renderer_extensions for how to draw unknown layer types
764 (BaseRenderer.draw_raster_data): Add format parameter so that
765 formats other than BMP can be drawn
766 (BaseRenderer.draw_raster_layer): Pass an explicit format to
767 draw_raster_data
768
769 * Thuban/UI/renderer.py (raster_format_map): New. Mapping form the
770 strings of the format parameter of draw_raster_data method to wx
771 constants
772 (MapRenderer.draw_raster_data): Add the format parameter and use
773 raster_format_map to map it to the right wxwindows constant for
774 wxImageFromStream
775
776 * test/test_baserenderer.py (SimpleRenderer.draw_raster_data): Add
777 the format parameter and record it
778 (TestBaseRenderer.test_raster_no_projection): check the format
779 paramter of the draw_raster_data method
780 (TestBaseRenderer.test_renderer_extension): New. Test the renderer
781 extension facility
782
783 2003-11-07 Bernhard Herzog <[email protected]>
784
785 Tweak the usage of the sqlite database to make common use cases
786 more responsive. In most cases copying the data to the sqlite
787 database takes so long that using sqlite doesn't have enough
788 advantages.
789
790 * Thuban/Model/transientdb.py (TransientTableBase.ValueRange): Add
791 comments about performance and query the min and max in separate
792 statements because only that way will indexes be used.
793 (TransientTableBase.UniqueValues): Add some comments about
794 performance.
795 (AutoTransientTable.ValueRange, AutoTransientTable.UniqueValues):
796 Do not copy the data to the transient DB but use the transient
797 copy if it exists. See the new comments for the performance trade
798 offs
799
800 * test/test_transientdb.py
801 (TestTransientTable.test_auto_transient_table): Make sure that the
802 data is copied to the transient database at some point.
803
804 2003-11-03 Bernhard Herzog <[email protected]>
805
806 * Thuban/Model/data.py (ShapefileStore.ShapesInRegion): Bind some
807 globals to locals so that it's a bit faster
808
809 2003-11-03 Bernhard Herzog <[email protected]>
810
811 * Thuban/UI/baserenderer.py
812 (BaseRenderer.draw_shape_layer_incrementally): Use the ReadValue
813 method. ReadValue is faster than ReadRowAsDict since it only reads
814 one cell especially now that the dbf file objects actually
815 implement it.
816
817 * Thuban/Model/table.py (DBFTable.ReadValue): Use the new
818 read_attribute method of the dbf objects
819
820 2003-11-03 Bernhard Herzog <[email protected]>
821
822 * Extensions/profiling/profiling.py (popup_dialog_box): New config
823 variable to indicate whether the result should be shown in a
824 dialog box
825 (profile_screen_renderer, time_screen_renderer): Only show a
826 dialog box if popup_dialog_box is true.
827 (profile_screen_renderer): Flush stdout after the printing the
828 first part of the "profiling..." message
829
830 * Thuban/UI/baserenderer.py
831 (BaseRenderer.draw_shape_layer_incrementally): Cache the pens and
832 brushes for the groups so that they're not created over and over
833 again
834
835 * Thuban/Model/classification.py (Classification.__getattr__)
836 (Classification._compile_classification)
837 (Classification._clear_compiled_classification): New. Methods to
838 manage a 'compiled' representation of the classification groups
839 which is created on demand
840 (Classification.InsertGroup, Classification.RemoveGroup)
841 (Classification.ReplaceGroup): reset the compiled representation
842 (Classification.FindGroup): Use the compiled representation to
843 find the matching group
844 (ClassGroupRange.GetRangeTuple): New. Return the range as a tuple
845
846 2003-10-31 Bernhard Herzog <[email protected]>
847
848 * Thuban/Model/classification.py (Classification.SetDefaultGroup):
849 Send a CLASS_CHANGED message
850 (Classification.RemoveGroup): Send a CLASS_CHANGED message and do
851 not return the removed group since it wasn't used.
852
853 * test/test_classification.py
854 (TestClassification.test_set_default_group): New. Test the
855 SetDefaultGroup method
856 (TestClassification.test_insert_group): New. Test the InsertGroup
857 method
858 (TestClassification.test_remove_group): New. Test the RemoveGroup
859 method
860 (TestClassification.test_replace_group): New. Test the
861 ReplaceGroup method
862
863 2003-10-31 Bernhard Herzog <[email protected]>
864
865 * test/test_classification.py (TestClassification.setUp):
866 Subscribe to the CLASS_CHANGED messages
867 (TestClassification.tearDown): New. Destroy the classification
868 properly
869 (TestClassification.test_defaults): Add tests for the default line
870 width and whether no messages were sent yet
871 (TestClassification.test_set_default_properties): Add tests for
872 messages and setting the default line width
873 (TestClassification.test_add_singleton)
874 (TestClassification.test_add_range)
875 (TestClassification.test_multiple_groups): Add tests for messages
876
877 2003-10-31 Bernhard Herzog <[email protected]>
878
879 Some more refactoring in preparation for new tests:
880
881 * test/test_classification.py (TestClassification.setUp): New.
882 Instantiate the classification here. Update the test methods
883 accordingly.
884 (TestClassification.test_multiple_groups): Make sure that the two
885 singletons matching 1 are considered different.
886
887 2003-10-31 Bernhard Herzog <[email protected]>
888
889 * test/test_classification.py (red, green, blue): New. These
890 constants were used in several cases. Update the relevant methods.
891 (TestClassification.test_defaults)
892 (TestClassification.test_set_default_properties)
893 (TestClassification.test_add_singleton)
894 (TestClassification.test_add_range)
895 (TestClassification.test_multiple_groups)
896 (TestClassification.test_deepcopy): New. These were formerly all
897 part of the single method test.
898 (TestClassification.test_deepcopy): Removed.
899 (TestClassIterator): Removed. The test case is now a method of
900 TestClassification since it tests part of the public interface of
901 Classification
902 (TestClassification.test_iterator): New. Used to be
903 TestClassIterator effectively
904
905 2003-10-31 Jan-Oliver Wagner <[email protected]>
906
907 GUIfied the functions of the profiling extension.
908
909 * /Extensions/profiling/__init__.py: New: Init to make this
910 directory a package.
911
912 * Extensions/profiling/profiling.py: Moved menu entries to
913 the Extensions menu. Applied _() for strings.
914 (profile_screen_renderer): Catch the detailed printout and present
915 it in a dialog.
916 (time_screen_renderer): Raise a dialog to present the result instead
917 of printing it to stdout.
918
919 2003-10-31 Bernhard Herzog <[email protected]>
920
921 * test/test_classification.py (TestClassGroupProperties)
922 (TestClassGroup, TestClassGroupDefault, TestClassGroupRange)
923 (TestClassGroupSingleton, TestClassIterator, TestClassification):
924 Split TestClassification into several classes, one for each class
925 being tested. TestClassification itself now only tests
926 Classification. This split makes changes to the tests a bit easier
927
928 2003-10-31 Bernhard Herzog <[email protected]>
929
930 * Extensions/profiling/profiling.py: New. Extension to measure
931 Thuban performance
932
933 2003-10-31 Frank Koormann <[email protected]>
934
935 Added two items to legend popup menu: Remove Layer and Show Layer Table
936
937 * Thuban/UI/legend.py (LegendPanel._OnRemoveLayer,
938 LegendPanel._OnShowTable): New event handlers, call the corresponding
939 mainwindow methods.
940 (LegendTree._OnRightClick): Added items to popup menu.
941
942 2003-10-30 Bernhard Herzog <[email protected]>
943
944 * Thuban/UI/dialogs.py (ThubanFrame.__init__): Handle
945 EVT_WINDOW_DESTROY
946 (ThubanFrame.OnDestroy): New. Handler for EVT_WINDOW_DESTROY. Does
947 nothing but is convenient for the derived classes.
948
949 * Thuban/UI/tableview.py
950 (TableFrame.OnDestroy, LayerTableFrame.OnDestroy): New.
951 Unsubscribe the messages here not in OnClose because that might
952 get called multiple times. Fixes RT #2196
953 (TableFrame.OnClose, LayerTableFrame.OnClose): Removed. Not needed
954 anymore.
955
956 * README: Update the minimum requirement for wxPython. Since we
957 now use the EVT_WINDOW_DESTROY event, we need at least 2.4.0.4,
958 the version in which that was introduced for all platforms
959
960 2003-10-30 Frank Koormann <[email protected]>
961
962 * Thuban/UI/join.py (JoinDialog.OnJoin): Wrapped the major parts of
963 the join process in a ThubanBeginBusyCursor, ThubanEndBusyCursor
964 frame.
965
966 2003-10-30 Jan-Oliver Wagner <[email protected]>
967
968 Improved APR import extension, added further EPSG definitions
969 and some cleanup regarding string class.
970
971 * test/test_proj.py (TestProjection.test_get_projection_units_geo):
972 Added test for alias 'longlat'.
973
974 * Resources/Projections/epsg-deprecated.proj: New. Contains
975 deprecated EPSG definitions.
976
977 * Extensions/importAPR/odb.py (ODBBaseObject.TreeInfo): Added
978 the variable names for objects.
979
980 * Extensions/importAPR/apr.py (APR_BLnSym, APR_BMkSym, APR_BShSym): New.
981 Copied from importAPR and provided with documentation.
982
983 * Extensions/importAPR/importAPR.py (APR_BLnSym, APR_BMkSym, APR_BShSym):
984 Moved to apr.py.
985 (APR_View): Added object ref 'ITheme'.
986
987 * Thuban/Lib/fileutil.py, Thuban/UI/proj4dialog.py: Replaced string
988 split function by corresponding use of the string class method.
989
990 * Thuban/Model/xmlwriter.py: Replaced string replace function by
991 corresponding string method.
992
993 2003-10-29 Bernhard Herzog <[email protected]>
994
995 * Thuban/UI/baserenderer.py
996 (BaseRenderer.draw_shape_layer_incrementally): Speed up the
997 special case of a classification that only has the default group
998
999 2003-10-27 Bernhard Herzog <[email protected]>
1000
1001 * po/fr.po, po/es.po: Updated translations from Daniel Calvelo
1002
1003 * po/de.po: Update.
1004
1005 * Thuban/UI/application.py
1006 (ThubanApplication.ShowExceptionDialog): Handle translation of the
1007 dialog message properly
1008
1009 2003-10-27 Bernhard Herzog <[email protected]>
1010
1011 Rework how localization works so that we use wx's translation
1012 functions when running Thuban as a normal application but not when
1013 we don't need any UI, such as in the test suite. See the comment
1014 in Thuban/__init__.py for details
1015
1016 * Thuban/__init__.py (_): Add one level of indirection to make the
1017 translation handling more flexible and to make it possible to use
1018 either wx's translation services or not.
1019 (gettext_identity, translation_function_installed)
1020 (install_translation_function): New function to help with this
1021
1022 * Thuban/UI/__init__.py: Install the wx specific translation
1023 function if it's OK to do that
1024
1025 * test/support.py (initthuban): Install a dummy translation
1026 function so that importing Thuban.UI doesn't install a wx specific
1027 one for which would need to import wxPython
1028
1029 2003-10-27 Bernhard Herzog <[email protected]>
1030
1031 * HOWTO-Release: Source archives should be created first and the
1032 binary packages should be created from the source archives.
1033 There's an official debian package now so there's no need to test
1034 the rpm on debian anymore
1035
1036 2003-10-27 Bernhard Herzog <[email protected]>
1037
1038 Several rendering changes:
1039
1040 - Render the selection into a separate bitmap so that only that
1041 bitmap needs to be redrawn when the selection changes
1042
1043 - Render incrementally showing previews and allowing interaction
1044 before rendering is complete
1045
1046 - Update the renderer interface a bit. Most parameters of
1047 RenderMap are now parameters of the constructor
1048
1049 * Thuban/UI/baserenderer.py (BaseRenderer.__init__): Add the map
1050 and the update region as parameters. Update the doc-string
1051 (BaseRenderer.render_map_incrementally): New. Generator function
1052 to renders the map incrementally
1053 (BaseRenderer.render_map): Remove the map argument (it's now in
1054 the constructor) and simply iterate over the
1055 render_map_incrementally generator to draw the map.
1056 (BaseRenderer.draw_shape_layer_incrementally)
1057 (BaseRenderer.draw_shape_layer): Renamed to
1058 draw_shape_layer_incrementally and changed into a generator that
1059 yields True every 500 shapes. Used by render_map_incrementally to
1060 render shape layers incrementally
1061
1062 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Removed the
1063 map and region parameters which are now in the constructor
1064 (ScreenRenderer.RenderMapIncrementally): New. Public frontend for
1065 the inherited render_map_incrementally.
1066 (BaseRenderer.draw_shape_layer): Removed.
1067 (ScreenRenderer.draw_selection_incrementally): New. The selection
1068 drawing part of the removed draw_shape_layer as a generator
1069 (ScreenRenderer.layer_shapes): Update because of the region
1070 parameter change
1071 (ExportRenderer.__init__): New. Extend the inherited constructor
1072 with the destination region for the drawing
1073 (ExportRenderer.RenderMap): Removed the map and region parameters
1074 which are now in the constructor
1075
1076 * Thuban/UI/view.py (MapCanvas.PreviewBitmap): New. Return a
1077 bitmap suitable for a preview in a tool
1078 (CanvasPanTool.MouseMove): Use the PreviewBitmap method to get the
1079 bitmap
1080 (MapPrintout.draw_on_dc): Adapt to new renderer interface
1081 (MapCanvas.OnPaint): Handle drawing the selection bitmap if it
1082 exists
1083 (MapCanvas.OnIdle): Update the logic to deal with incremental
1084 rendering and the selection bitmap
1085 (MapCanvas._do_redraw): Handle the instantiation of the render
1086 iterator and the redraws during rendering
1087 (MapCanvas._render_iterator): New. Generator to incrementally
1088 redraw both bitmaps
1089 (MapCanvas.Export): Adapt to new renderer interface.
1090 (MapCanvas.full_redraw): Reset the selection bitmap and the
1091 renderer iterator too
1092 (MapCanvas.redraw_selection): New. Force a redraw of the selection
1093 bitmap
1094 (MapCanvas.shape_selected): Only redraw the selection bitmap
1095
1096 * test/test_baserenderer.py
1097 (TestBaseRenderer.test_polygon_no_projection)
1098 (TestBaseRenderer.test_raster_no_projection)
1099 (TestBaseRenderer.test_point_map_projection)
1100 (TestBaseRenderer.test_point_layer_and_map_projection)
1101 (TestBaseRenderer.test_point_layer_projection)
1102 (TestBaseRenderer.test_point_with_classification): Adapt to new
1103 renderer interface
1104
1105 2003-10-24 Bernhard Herzog <[email protected]>
1106
1107 * libraries/thuban/wxproj.cpp (draw_polygon_shape)
1108 (point_in_polygon_shape, shape_centroid): Raise an exception if
1109 the shape can't be read. Previously invalid shape ids would lead
1110 to a segfault.
1111
1112 * test/test_wxproj.py (TestShapeCentroid.test_invalid_shape_id):
1113 New. test whether an exception is raised for invalid shape ids
1114
1115 2003-10-24 Jan-Oliver Wagner <[email protected]>
1116
1117 * Thuban/Model/proj.py (Projection.GetProjectedUnits): Added 'longlat'
1118 as alias for 'latlong'.
1119
1120 * Thuban/UI/projdialog.py (ProjFrame.__init__): Added 'longlat'
1121 as alias for 'latlong'.
1122
1123 2003-10-24 Jan-Oliver Wagner <[email protected]>
1124
1125 * Thuban/UI/projdialog.py (ProjFrame.proj_selection_changed): Set
1126 the projection even for the UnknownPanel.
1127 (UnknownProjPanel.__init__): Define the text and create the textctrl
1128 widget.
1129 (UnknownProjPanel._DoLayout): Replaced static text widget by the
1130 textctrl created in __init__.
1131 (UnknownProjPanel.SetProjection): Set the text for the text ctrl
1132 including the parameters of the projection.
1133
1134 2003-10-24 Jan-Oliver Wagner <[email protected]>
1135
1136 * Resources/Projections/epsg.proj: New. This is a list of
1137 EPSG codes with parameters for proj. The list has been
1138 generated using devtools/create_epsg.py based on the
1139 file nad/epsg of the proj 4.4.7 package. Four projection
1140 definitions have been deleted as they are not accepted by proj:
1141 "CH1903+ / LV95", "Bern 1898 (Bern) / LV03C", "CH1903 / LV03"
1142 and "HD72 / EOV".
1143
1144 2003-10-22 Bernhard Herzog <[email protected]>
1145
1146 Some more tweaks to the projection dialog which should fix RT
1147 #1886.
1148
1149 * Thuban/UI/projlist.py (ProjectionList.Destroy): Unsubscribe from
1150 the ProjFile's messages and call the base class methods correctly
1151 (ProjectionList.SelectProjection): Set the wxLIST_STATE_FOCUSED
1152 flag on the newly selected item too. Otherwise some other item is
1153 focused and the first time the focus is moved with the keyboard
1154 the selection moves in unexpected ways.
1155
1156 * Thuban/UI/projdialog.py (ProjFrame.__init__): Do not set the
1157 focus on the OK button, only on the projection list. That way the
1158 list really has the focus initially
1159 (ProjFrame.OnClose): Call the projection list's Destroy method to
1160 make it unsubscribe all messages
1161
1162 2003-10-21 Bernhard Herzog <[email protected]>
1163
1164 Rework the projection dialog to fix a few bugs, including RT 2166
1165 and most of 2168
1166
1167 * Thuban/UI/projlist.py: New. The class ProjectionList is a
1168 special wxListCtrl to show a list of projections in a more MVC
1169 fashion
1170
1171 * Thuban/UI/projdialog.py (ProjFrame): Substantial changes
1172 throughout the class. The main change is to use the ProjectionList
1173 class instead of a normal wxListBox. Also, add an explicit
1174 "Unknown" projection to the projection choice control.
1175 (ProjPanel.__init__): Add an "unknown" ellipsoid
1176 (TMPanel.__init__, LCCPanel.__init__): Tweak the order of
1177 instantiation of the panel's controls to make the tab-order more
1178 natural
1179
1180 2003-10-21 Bernhard Herzog <[email protected]>
1181
1182 * test/test_load.py (TestSingleLayer.file_contents)
1183 (TestSingleLayer.test): Add non-ascii characters to the titles of
1184 session, map and layer. This is effectively a port of the
1185 TestUnicodeStrings test in test_load_0_8.py which for some reason
1186 was only added there.
1187
1188 * test/test_load_0_9.py (TestSingleLayer.file_contents)
1189 (TestSingleLayer.test): Same as in test_load.py: add non-ascii
1190 characters to the titles of session, map and layer,.
1191
1192 2003-10-21 Bernhard Herzog <[email protected]>
1193
1194 Add EPSG projection handling to .thuban files
1195
1196 * test/test_save.py (SaveSessionTest.dtd)
1197 (SaveSessionTest.testEmptySession)
1198 (SaveSessionTest.testLayerProjection)
1199 (SaveSessionTest.testRasterLayer)
1200 (SaveSessionTest.testClassifiedLayer)
1201 (SaveSessionTest.test_dbf_table)
1202 (SaveSessionTest.test_joined_table)
1203 (SaveSessionTest.test_save_postgis): Update to 1.0-dev namespace
1204 (SaveSessionTest.testSingleLayer): Update to 1.0-dev namespace and
1205 use a and epsg projection to test saving them
1206
1207 * test/test_load.py (LoadSessionTest.dtd): Update to 1.0-dev
1208 namespace
1209 (TestLayerVisibility.file_contents, TestLabels.file_contents)
1210 (TestLayerProjection.file_contents)
1211 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1212 (TestPostGISLayer.file_contents)
1213 (TestPostGISLayerPassword.file_contents)
1214 (TestLoadError.file_contents, TestLoadError.test): Update to use
1215 1.0-dev namespace
1216 (TestSingleLayer.file_contents, TestSingleLayer.test): Update to
1217 use 1.0-dev namespace and use an EPSG projection to test whether
1218 loading it works
1219
1220 * test/test_load_0_9.py: New. Effectively a copy of test_load.py
1221 as of Thuban 0.9. These are now tests to determine whether Thuban
1222 can still read files generated by Thuban 0.9
1223
1224 * Thuban/Model/save.py (SessionSaver.write)
1225 (SessionSaver.write_session): Use the 1.0 dtd and 1.0-dev
1226 namespace
1227 (SessionSaver.write_projection): Write the projection's epsg
1228 attribute
1229
1230 * Thuban/Model/load.py (SessionLoader.__init__): Also accept the
1231 thuban-1.0-dev.dtd namespace
1232 (SessionLoader.check_attrs): Allow a callable object as conversion
1233 too
1234 (SessionLoader.start_projection, SessionLoader.end_projection)
1235 (SessionLoader.start_parameter): Handle the epsg attribute and
1236 rename a few instance variables to lower case
1237
1238 * Resources/XML/thuban-1.0.dtd: New. Only difference to
1239 thuban-0.9.dtd is the epsg attribute for projections.
1240
1241 2003-10-21 Bernhard Herzog <[email protected]>
1242
1243 * test/runtests.py (main): Let the user specify which tests to run
1244 on the command line
1245
1246 * test/support.py (ThubanTestResult.getDescription): Override to
1247 give a better short description. The description can be used as a
1248 parameter to run_tests to run that particular test in isolation.
1249
1250 2003-10-21 Frank Koormann <[email protected]>
1251
1252 Popup menu for legend. Scheduled for the 1.2 release this was too
1253 simple to implement: The popup menu is bound to the legend tree, while
1254 the events are hanlded by its anchestor, the legend panel. This
1255 allows reuse of all the event handlers already implemented for the
1256 legend toolbar buttons.
1257
1258 * Thuban/UI/legend.py (LegendPanel.__init__): EVT_MENU macros
1259 to add handlers for the events issued by the popup menu.
1260 (LegendPanel._OnToggleVisibility): Handler for toggling layer
1261 visibility event
1262 (LegendPanel._OnProjection): Handler for layer projection event.
1263 (LegendTree.__init__): Added EVT_TREE_ITEM_RIGHT_CLICK
1264 (LegendTree._OnRightClick): Event handler for right click, select item
1265 and pop up menu.
1266 (LegendTree.ToggleVisibility): Toggle layer visibility
1267 (LegendTree.LayerProjection): Raise layer projection dialog for
1268 current layer.
1269
1270 2003-10-21 Bernhard Herzog <[email protected]>
1271
1272 * Resources/Projections/defaults.proj: Use correct DOCTYPE
1273 declaration. The top-level element is projectionlist not projfile
1274
1275 2003-10-20 Bernhard Herzog <[email protected]>
1276
1277 * Thuban/UI/projdialog.py (ProjFrame.write_proj_file): New. helper
1278 method to write a projfile and display a busy cursor and error
1279 dialogs.
1280 (ProjFrame._OnSave, ProjFrame._OnAddToList, ProjFrame._OnImport)
1281 (ProjFrame._OnExport, ProjFrame._OnRemove): Use write_proj_file
1282 (ProjFrame.__FillAvailList): Translate "<None>" too and display a
1283 busy cursor while loading the user and system prj files.
1284
1285 2003-10-16 Bernhard Herzog <[email protected]>
1286
1287 * Thuban/Model/resource.py (projfile_cache): Introduce a cache for
1288 ProjFile objects
1289 (clear_proj_file_cache): New function to clear the cache. Mainly
1290 useful for use by the test suite
1291 (read_proj_file): Use the cache.
1292
1293 * test/test_proj.py (TestProjFile): Clarify the doc-string
1294 (ProjFileReadTests): Update doc-string
1295 (ProjFileReadTests.test_get_system_proj_file): Check whether the
1296 system proj files is cached.
1297 (ProjFileLoadTestCase): New base class for the proj file tests
1298 derived from support.FileLoadTestCase to provide some common
1299 behavior.
1300 (TestLoadingProjFile)
1301 (TestLoadingProjFileWithEmptyProjectionlist.file_contents)
1302 (TestProjFileWithInvalidParameters.file_contents): Derive from
1303 ProjFileLoadTestCase
1304 (TestLoadingProjFile.test_caching): New. Test whether the cache
1305 works
1306
1307 2003-10-16 Silke Reimer <[email protected]>
1308
1309 * debian/*: New directory with configuration files for building a thuban
1310 deb-package.
1311
1312 2003-10-14 Bernhard Herzog <[email protected]>
1313
1314 * test/test_proj.py: Execute support.run_tests when run as
1315 __main__ so that missing unsubscribes are detected
1316 (TestProjFile.tearDown): Destroy the proj_file properly
1317
1318 2003-10-14 Bernhard Herzog <[email protected]>
1319
1320 * Thuban/Model/messages.py (PROJECTION_ADDED)
1321 (PROJECTION_REPLACED, PROJECTION_REMOVED): New message types for
1322 the ProjFile objects
1323
1324 * Thuban/Model/proj.py (ProjFile): Derive from Publisher so we can
1325 easily send messages when the projections change
1326 (ProjFile.Add, ProjFile.Remove, ProjFile.Replace): Issue messages
1327 when the change was successful
1328
1329 * test/test_proj.py (TestProjFile.setUp): Subscribe to some of the
1330 proj file messages
1331 (TestProjFile.test_add_remove)
1332 (TestProjFile.test_remove_non_existing)
1333 (TestProjFile.test_replace)
1334 (TestProjFile.test_replace_non_existing): Test whether the right
1335 messages are sent
1336
1337 2003-10-14 Bernhard Herzog <[email protected]>
1338
1339 * test/test_proj.py (TestProjFile.test): Refactor into several
1340 tests
1341 (TestProjFile.test_add_remove)
1342 (TestProjFile.test_remove_non_existing)
1343 (TestProjFile.test_replace)
1344 (TestProjFile.test_replace_non_existing): Some of the new
1345 individual test cases
1346 (TestProjFileSimple): New class for the rest of the test cases
1347 that came out of the refactoring
1348 (ProjFileTest): Derive from xmlsupport.ValidationTest so that the
1349 derived classes don't have to
1350
1351 2003-10-13 Bernhard Herzog <[email protected]>
1352
1353 Add an optional EPSG code to the projection objects and extend the
1354 .proj file format accordingly.
1355
1356 * Resources/XML/projfile.dtd (element projection): Add epsg
1357 attribute
1358
1359 * Thuban/Model/proj.py (Projection.__init__): New parameter and
1360 instance variable epsg. Update doc-string
1361 (Projection.EPSGCode, Projection.Label): New methods to provide
1362 access to EPSG code and a label for use in dialogs
1363
1364 * Thuban/Model/resource.py (ProjFileReader.start_projection)
1365 (ProjFileReader.end_projection, ProjFileSaver.write_projfile):
1366 Handle the epsg code attribute when reading or writing proj files
1367
1368 * Thuban/UI/projdialog.py (ProjFrame._OnSave)
1369 (ProjFrame._OnAddToList, ProjFrame.__DoOnProjAvail)
1370 (ProjFrame.__FillAvailList): Use the projection's Label method to
1371 get the string for the list box
1372
1373 * test/test_proj.py (TestProjection.test_label)
1374 (TestProjection.test_label_epsg)
1375 (TestProjection.test_epsgcode_for_non_epsg_projection)
1376 (TestProjection.test_epsgcode_for_real_epsg_projection): New tests
1377 for the label and EPSGCode methods
1378 (WriteProjFileTests.doTestWrite, WriteProjFileTests.test_write)
1379 (WriteProjFileTests.test_write_empty_file): Create the ProjFile
1380 objects in the test cases and put the expected contents into the
1381 test case methods too. Update doTestWrite accordingly
1382 (TestLoadingProjFile)
1383 (TestLoadingProjFileWithEmptyProjectionlist): New classes with the
1384 read tests from TestProjFile.
1385 (TestProjFile.doTestRead, TestProjFile.testRead): Removed. These
1386 tests are now in the new classes.
1387 (sample_projfile, sample_projfile_data)
1388 (sample_projfile2, sample_projfile_data2): Removed. Not used
1389 anymore.
1390 (TestProjFile.test_read_unreadable_file): No need to reset the
1391 permissions at the end anymore since we use a unique filename
1392
1393 2003-10-13 Bernhard Herzog <[email protected]>
1394
1395 * test/test_proj.py: Some more refactoring of the test cases
1396 (ProjFileTest): New base class for the proj file tests.
1397 (TestProjFile): Derive from ProjFileTest
1398 (TestProjFile.test_read_unreadable_file)
1399 (TestProjFile.test_read_empty_file, TestProjFile.doTestRead): Use
1400 the new filename method to get a unique filename
1401 (TestProjFile.doTestWrite, TestProjFile.testWrite): Removed.
1402 (WriteProjFileTests): New class for proj file write tests.
1403 Contains the write test that were in TestProjFile originally.
1404
1405 2003-10-13 Bernhard Herzog <[email protected]>
1406
1407 * test/test_proj.py (TestProjFile.testRead)
1408 (TestProjFile.test_read_non_existing_file)
1409 (TestProjFile.test_read_unreadable_file)
1410 (TestProjFile.test_read_empty_file): Split into several methods.
1411
1412 2003-10-10 Bernhard Herzog <[email protected]>
1413
1414 * Thuban/UI/sizers.py: New file with custom sizers.
1415
1416 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): Instantiate
1417 all projection type specific panels and put them into a
1418 NotebookLikeSizer. This way the dialog doesn't change its size
1419 when a different projection is selected
1420 (ProjFrame.__init__): Rename projection_panels
1421 projection_panel_defs and reuse projection_panels for a list of
1422 the instantiated panels.
1423 (ProjFrame._show_proj_panel, ProjFrame.__DoOnProjAvail)
1424 (ProjFrame.__DoOnProjChoice): Changes due to the new handling of
1425 the panels
1426 (UnknownProjPanel._DoLayout): Place the newlines in the message
1427 differently to make the panel narrower.
1428 (TMPanel._DoLayout): Layout the parameters in one column.
1429
1430 2003-10-10 Bernhard Herzog <[email protected]>
1431
1432 * Thuban/UI/projdialog.py (ProjFrame.build_dialog): New method
1433 that contains all the setup for the dialog's widgets, layout and
1434 event handling.
1435 (__): Call build_dialog to build the dialog.
1436 (ProjFrame.__set_properties, ProjFrame.__do_layout): Removed.
1437 Their functionality is now in build_dialog
1438 (ProjFrame.__VerifyButtons, ProjFrame.__VerifyButtons)
1439 (ProjFrame.__DoOnProjAvail, ProjFrame.__DoOnProjAvail)
1440 (ProjFrame.__DoOnProjChoice): Small updates due to slightly
1441 different widget names and hierarchy introduced with build_dialog.
1442
1443 2003-10-10 Bernhard Herzog <[email protected]>
1444
1445 * README: Fix typo.
1446
1447 2003-10-09 Bernhard Herzog <[email protected]>
1448
1449 * Thuban/Model/proj.py (ProjFile.Add): Do not check whether the
1450 projection is already in the list. This is *a lot* faster when
1451 loading files with hundreds of projections since it saves a linear
1452 search. OTOH this will allow adding the same projection to the
1453 user.proj file multiple times in the projection dialog but we'll
1454 deal with that later
1455
1456 2003-10-09 Jan-Oliver Wagner <[email protected]>
1457
1458 * devtools: New. Directory for developer tools that are not intended
1459 for the regular user.
1460
1461 * devtools/create_epsg.py: New. Convert the epsg file of proj into
1462 a python .proj file.
1463
1464 2003-10-09 Bernhard Herzog <[email protected]>
1465
1466 * test/test_proj.py
1467 (TestProjection.test_get_parameter_without_equals_sign): New. Test
1468 whether GetParameter handles parameters without "=" sign correctly
1469
1470 * Thuban/Model/proj.py (Projection.GetParameter): Handle
1471 parameters that do not contain a "=". Update the doc-string
1472
1473 2003-10-08 Bernhard Herzog <[email protected]>
1474
1475 * Thuban/UI/projdialog.py (ProjFrame.__set_properties): Remove the
1476 length limit on the projname text control
1477
1478 2003-10-08 Bernhard Herzog <[email protected]>
1479
1480 * test/test_proj.py (TestProjection.test_get_projection_units_geo)
1481 (TestProjection.test_get_projection_units_normal): New. Tests for
1482 the Projection.GetProjectedUnits method
1483
1484 2003-10-08 Jan-Oliver Wagner <[email protected]>
1485
1486 * Thuban/Model/resource.py (get_user_proj_file): small bug-fix:
1487 Added missing 'val' parameter.
1488
1489 2003-10-08 Bernhard Herzog <[email protected]>
1490
1491 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): When the
1492 projection type of the currently selected projection is not known,
1493 i.e. there's no panel for it, use the UnknownProjPanel
1494 (ProjFrame.__DoOnProjChoice, ProjFrame._show_proj_panel): Split
1495 the actual replacing of the proj panel into the new method
1496 _show_proj_panel.
1497 (UnknownProjPanel): Add doc-string.
1498 (UnknownProjPanel._DoLayout): Insert a newline into the text so
1499 that the panel is not so wide.
1500
1501 2003-10-08 Bernhard Herzog <[email protected]>
1502
1503 * Thuban/Model/resource.py (read_proj_file): Return the warnings
1504 too. Update the doc-string
1505 (get_proj_files): Removed. It wasn't used anywhere
1506 (get_system_proj_files, get_system_proj_file): Rename to
1507 get_system_proj_file and return the ProjFile object and not a list
1508 of ProjFile objects. Update the callers.
1509 (get_user_proj_files, get_user_proj_file): Rename to
1510 get_user_proj_file return the ProjFile object and not a list of
1511 ProjFile objects. Update the callers.
1512 (ProjFileReader.__init__): New instance variable for the warnings.
1513 Rename the __pf ivar to projfile. Update the methods referring to
1514 __pf
1515 (ProjFileReader.end_projection): Catch any errors raised when
1516 instantiating the projection and record that as an error. The
1517 projection will not be in the final ProjFile object.
1518 (ProjFileReader.GetWarnings): New method to return the warnings.
1519
1520 * Thuban/UI/projdialog.py (ProjFrame.show_warnings): New method to
1521 show the warnings from the projfile reader
1522 (ProjFrame._OnImport): Deal with any warnings returned by
1523 read_proj_file
1524 (ProjFrame.__FillAvailList): Deal with any warnings returned by
1525 get_system_proj_file or get_user_proj_file.
1526
1527 * test/test_proj.py (TestProjFile.doTestRead): Check the warnings.
1528 (TestProjFileWithInvalidParameters.file_contents): New test cases
1529 to test whether read_proj_file handles invalid projection
1530 parameters correctly
1531 (TestProjFile.test_get_system_proj_file): New. Simple test for
1532 resource.get_system_proj_file
1533
1534 2003-10-07 Bernhard Herzog <[email protected]>
1535
1536 * test/test_derivedshapestore.py
1537 (TestDerivedShapeStoreExceptions.tearDown): Clear the session
1538 properly so that the temporary directories get deleted correctly
1539
1540 2003-10-06 Bernhard Herzog <[email protected]>
1541
1542 Handle the title changes in a proper MVC way.
1543
1544 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
1545 canvas' TITLE_CHANGED messages
1546 (MainWindow.update_title): New. Update the main window's title
1547 (MainWindow.__SetTitle): Removed. Use update_title instead.
1548 (MainWindow.SetMap): Use update_title instead of __SetTitle
1549 (MainWindow.RenameMap): Do change the window title explicitly
1550 here. That's handled in a proper MVC way now.
1551 (MainWindow.title_changed): New. Subscriber for the TITLE_CHANGED
1552 messages
1553
1554 * Thuban/Lib/connector.py (Conduit): New class to help classes
1555 that forward messages
1556
1557 * Thuban/UI/viewport.py: Forward the map's TITLE_CHANGED messages
1558 (ViewPort): Derive from Conduit instead of Publisher
1559 (ViewPort.Subscribe, ViewPort.Unsubscribe): Use the new base class
1560 when calling the inherited versions
1561 (ViewPort._subscribe_map, ViewPort._unsubscribe_map): New helper
1562 methods to subscribe and unsubscribe map messages
1563 (ViewPort.SetMap, ViewPort.Destroy): Use the new helper methods to
1564 handle the map subscriptions
1565 (ViewPort.Map, ViewPort.map_projection_changed)
1566 (ViewPort.layer_projection_changed): Add or update doc-strings
1567
1568 * test/test_connector.py (TestPublisher.test_issue_simple): Fix
1569 typo
1570 (MyConduit): Helper class for the Conduit test.
1571 (TestConduit): Test cases for Conduit
1572
1573 * test/test_connector.py: Use support.run_tests as main.
1574
1575 * test/test_viewport.py (ViewPortTest.setUp): Also subscribe to
1576 the TITLE_CHANGED messages
1577 (ViewPortTest.test_forwarding_title_changed): New test to check
1578 whether the viewport forwards the map's TITLE_CHANGED messages
1579 (TestViewportWithPostGIS.tearDown): Call the map's Destroy method
1580 after the port's because the latter may require a still functional
1581 map.
1582
1583 2003-10-06 Bernhard Herzog <[email protected]>
1584
1585 * Thuban/UI/application.py (ThubanApplication.maps_changed): Add
1586 doc-string
1587
1588 2003-10-06 Bernhard Herzog <[email protected]>
1589
1590 * test/test_viewport.py (ViewPortTest.setUp)
1591 (SimpleViewPortTest.test_init_with_size): Move the test for the
1592 initial size as a constructor parameter from ViewPortTest.setUp
1593 method to a new separate test in SimpleViewPortTest.
1594
1595 2003-10-06 Bernhard Herzog <[email protected]>
1596
1597 * test/test_viewport.py (MockView): New class derived from
1598 ViewPort with a mock implementation of GetTextExtent to be used in
1599 the test cases
1600 (ViewPortTest.setUp): Use MockView instead of ViewPort
1601
1602 * Thuban/UI/viewport.py (ViewPort.GetTextExtent): Turn this method
1603 into what would be a "pure virtual function" in C++: always raise
1604 NotImplementedError. Mock implementations for test cases don't
1605 belong into the real code
1606
1607 2003-10-02 Bernhard Herzog <[email protected]>
1608
1609 * test/test_layer.py (TestLayer.test_empty_layer): Explicitly
1610 close the dbf file we create so that it's contents have been
1611 written properly.
1612
1613 * libraries/shapelib/shptree.c, libraries/shapelib/shpopen.c,
1614 libraries/shapelib/shapefil.h, libraries/shapelib/dbfopen.c:
1615 Update to shapelib 1.2.10
1616
1617 2003-10-01 Jan-Oliver Wagner <[email protected]>
1618
1619 * Thuban/UI/tree.py, Thuban/UI/main.py: Remove the #! line as
1620 it annoys lintian which warns about these files not being
1621 executable. The #! isn't necessary here since if you absolutely
1622 must execute them you can always say "python <filename>".
1623
1624 2003-09-26 Bernhard Herzog <[email protected]>
1625
1626 * Thuban/Model/classgen.py (GenQuantiles0): Removed since it's
1627 only used in GREAT-ER but not used in Thuban itself. When GREAT-ER
1628 is ported to a newer the import will fail, so it should be noticed
1629 immediately that this function is gone.
1630 Fixes RT#1919
1631
1632 2003-09-26 Bernhard Herzog <[email protected]>
1633
1634 Add a DTD for the projection files and make thuban write valid
1635 projection files
1636
1637 * Resources/XML/projfile.dtd: New. DTD for thuban's projection
1638 files
1639
1640 * Thuban/Model/resource.py (ProjFileSaver.write): Use
1641 'projectionlist' as the name in the document type declaration so
1642 that it matches the element type of the root element.
1643
1644 * test/test_proj.py (sample_projfile, sample_projfile2): Use
1645 'projectionlist' as the name in the document type declaration just
1646 as it is done now in the files thuban would write
1647 (sample_projfile, sample_projfile_data): Fix spelling of
1648 "Mercator"
1649 (TestProjFile.doTestWrite): Validate the written and the expected
1650 XML data
1651 (TestProjFile): Derive from ValidationTest so that we can run xml
1652 validation tests
1653
1654 2003-09-24 Bernhard Herzog <[email protected]>
1655
1656 * Thuban/UI/renderer.py (ExportRenderer.render_legend): Do not
1657 modify the list returned by map.Layers() in place since it is the
1658 actual list of layers used by the map.
1659
1660 2003-09-23 Jan-Oliver Wagner <[email protected]>
1661
1662 * Doc/manual/thuban-manual.xml: Added subsection to chapter
1663 Extensions to describe the extensions coming with the Thuban
1664 standard package (gns2shp and importAPR).
1665
1666 2003-09-23 Bernhard Herzog <[email protected]>
1667
1668 * libraries/thuban/wxproj.cpp (project_point): if there's an
1669 inverse but no forward projection, convert to degrees after
1670 applying the inverse projection. Fixes RT#2096
1671
1672 * test/test_wxproj.py: New. Test cases for wxproj.so. One test
1673 implicitly tests for the fix to RT#2096
1674
1675 * test/support.py (FloatComparisonMixin.assertFloatSeqEqual):
1676 Check that the sequences have the same lengths
1677
1678 * Resources/Projections/defaults.proj (Geographic projection): Use
1679 a much more precise value for the to_meter attribute.
1680
1681 2003-09-22 Bernhard Herzog <[email protected]>
1682
1683 * test/support.py (initthuban): Make sure to unset the LANG env.
1684 var. so that tests that compare translated strings work. Solves RT
1685 #2094
1686
1687 2003-09-22 Jan-Oliver Wagner <[email protected]>
1688
1689 Small improvement of APR import.
1690
1691 * Extensions/importAPR/test/test_apr.py (aprTest.test_LClass):
1692 Added tests for text-ranges.
1693
1694 * Extensions/importAPR/apr.py (APR_LClass.GetThubanRange): Now
1695 returns a string object if the range is based on text.
1696
1697 * Extensions/importAPR/importAPR.py (import_apr_dialog): Unified
1698 range retrieval.
1699
1700 2003-09-22 Jan-Oliver Wagner <[email protected]>
1701
1702 Initial version of the importAPR extension which is in
1703 experimental state.
1704
1705 * /Extensions/importAPR/, /Extensions/importAPR/samples/,
1706 /Extensions/importAPR/test/: New directories.
1707
1708 * /Extensions/importAPR/samples/README: New: Howto load the samples.
1709
1710 * /Extensions/importAPR/samples/iceland.apr: New: A sample APR
1711 file which refers to the Thuban Iceland demo data.
1712
1713 * /Extensions/importAPR/test/README: New: Howto execute the tests.
1714
1715 * /Extensions/importAPR/test/test_apr.py: New: Tests for APR classes.
1716
1717 * /Extensions/importAPR/apr.py: New: Classes for ArcView Objects
1718 as in '.apr'-files.
1719
1720 * /Extensions/importAPR/odb.py: New: Classes for generic ArcView
1721 ODB Objects as in '.apr', '.avl' and other files.
1722
1723 * /Extensions/importAPR/__init__.py: New: Init to make this
1724 directory a package.
1725
1726 * /Extensions/importAPR/importAPR.py: New: Import a ArcView
1727 project file (.apr) and convert it to Thuban.
1728
1729 2003-09-22 Jan-Oliver Wagner <[email protected]>
1730
1731 * Extensions/gns2shp.gns2shp.py: The main module of gns2shp.
1732
1733 2003-09-19 Jan-Oliver Wagner <[email protected]>
1734
1735 * Doc/manual/thuban-manual.xml: Extended section 'Installation'
1736 with description on RPM installation and RPM binary package
1737 creation.
1738
1739 2003-09-18 Bernhard Herzog <[email protected]>
1740
1741 * setup.py (data_files): Only add the mo files if the Locales
1742 directory actually exists, so that setup.py works with a fresh CVS
1743 checkout
1744
1745 2003-09-12 Jan-Oliver Wagner <[email protected]>
1746
1747 * Examples/simple_extensions/simple_tool.py: bugfix: Tool is now
1748 in viewport, not anymore in view
1749
1750 2003-09-04 Jan-Oliver Wagner <[email protected]>
1751
1752 Introducing first Extension (gns2shp).
1753
1754 * Extensions, Extensions/gns2shp, Extensions/gns2shp/test: New.
1755
1756 * Extensions/__init__.py: New. init to make this dir a package.
1757
1758 * Extensions/gns2shp/__init__.py: New. init to make this dir a package.
1759
1760 * Extensions/gns2shp/test/README: New. some info on this test directory.
1761
1762 * Extensions/gns2shp/test/ls.txt: New. test data set (Liechtenstein).
1763
1764 * Extensions/gns2shp/test/test_gns2shp.py: New. Test for correct creation
1765 of Shapefile from GNS text file format
1766
1767 2003-09-03 Jan-Oliver Wagner <[email protected]>
1768
1769 Fix/workaround for bug #2019:
1770 https://intevation.de/rt/webrt?serial_num=2019
1771
1772 * Thuban/UI/identifyview.py (IdentifyView.ID_STOP): New.
1773 (IdentifyView.__init__): Added another button that allows to
1774 stop the identify mode.
1775 (IdentifyView.OnStop): New. Stops the identify mode.
1776
1777 2003-09-03 Jan-Oliver Wagner <[email protected]>
1778
1779 Introducing a new exception dialog that allows to exit the
1780 application immediately.
1781 This fixes bug #2060: https://intevation.de/rt/webrt?serial_num=2060
1782
1783 * Thuban/UI/exceptiondialog.py: New. A special exception dialog.
1784
1785 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
1786 Made strings available to translations. Exchanged the simple
1787 ScrolledMessageDialog by the new ExceptionDialog.
1788
1789 2003-09-01 Bernhard Herzog <[email protected]>
1790
1791 * NEWS: New. Summary of changes and release notes.
1792
1793 * MANIFEST.in: Add NEWS
1794
1795 2003-09-01 Bernhard Herzog <[email protected]>
1796
1797 * MANIFEST.in: Correct the include statement for the mo-files and
1798 include the documentation too.
1799
1800 * setup.py (data_files): Add the .mo files
1801 (setup call): Up to version 0.9.0
1802
1803 2003-09-01 Bernhard Herzog <[email protected]>
1804
1805 * Thuban/UI/dbdialog.py (ChooseDBTableDialog.__init__): Change the
1806 parameter list to just parent and session
1807 (ChooseDBTableDialog.__set_properties): Removed. Setting the
1808 selection of empty list boxes is not allowed (and produces C++
1809 assertion errors) and the rest of the setup is better done in
1810 __init__ anyway.
1811 (ChooseDBTableDialog.OnCancel, ChooseDBTableDialog.OnOK)
1812 (ChooseDBTableDialog.OnLBDClick, DBDialog.OnOK): Use the Python
1813 builtins True/False for booleans to avoid warnings from wxPython
1814
1815 * Thuban/UI/mainwindow.py (MainWindow.AddDBLayer): Adapt to new
1816 ChooseDBTableDialog constructor parameters.
1817
1818 2003-09-01 Bernhard Herzog <[email protected]>
1819
1820 * Thuban/Model/postgisdb.py
1821 (PostGISTable): Extend doc-string
1822 (PostGISTable._fetch_table_information): Set the column index
1823 correctly, pretending ignored columns don't exist.
1824
1825 * test/test_postgis_db.py (TestPostGISIgnoredColumns): New tests
1826 for postgis tables with data types not yet supported by thuban.
1827
1828 2003-08-29 Bernhard Herzog <[email protected]>
1829
1830 * HOWTO-Release: Tweak item about running the tests.
1831
1832 2003-08-29 Jan-Oliver Wagner <[email protected]>
1833
1834 * /Doc/manual/thuban-manual.xml: updated to version 1.0pre2.
1835
1836 2003-08-29 Bernhard Herzog <[email protected]>
1837
1838 Add some missing parameters to projections. Proj complains about
1839 them on windows but for some reason not on Linux.
1840
1841 * test/test_save.py (SaveSessionTest.testLayerProjection): Add
1842 missing required projection parameters
1843
1844 * test/test_proj.py (TestProjFile.test): Add missing required
1845 projection parameters
1846
1847 * test/test_load_0_8.py (TestLayerProjection.file_contents)
1848 (TestLayerProjection.test): Add missing required projection
1849 parameters and tests for them
1850
1851 * test/test_load.py (TestLayerProjection.file_contents)
1852 (TestLayerProjection.test): Add missing required projection
1853 parameters and tests for them
1854
1855 * test/test_layer.py (TestLayer.test_base_layer): Add missing
1856 required projection parameters
1857
1858 2003-08-29 Bernhard Herzog <[email protected]>
1859
1860 * libraries/pyprojection/Projection.i: Use pj_get_errno_ref to
1861 access the pj_errno because directly accessing pj_errno doesn't
1862 work on windows if the proj library is in a DLL
1863
1864 * libraries/pyprojection/Projection_wrap.c: Update from Projection.i
1865
1866 2003-08-28 Bernhard Herzog <[email protected]>
1867
1868 * test/test_proj.py: Import things from Thuban after calling
1869 initthuban
1870
1871 * test/test_load.py (LoadSessionTest.filenames): New class
1872 variable with the filename attributes to normalize
1873 (LoadSessionTest.check_format): Pass self.filenames to
1874 sax_eventlist to normalize the filename attributes
1875
1876 * test/xmlsupport.py: Add cvs keywords
1877 (SaxEventLister.__init__): New parameter filenames which indicates
1878 attributes that contain filenames
1879 (SaxEventLister.startElementNS): Normalize the filename attributes
1880 with os.path.normpath
1881 (sax_eventlist): New parameter filenames to pass through to
1882 SaxEventLister
1883
1884 * test/test_derivedshapestore.py: Make this file callable as a
1885 program to execute the tests
1886 (TestDerivedShapeStoreExceptions.test_table_with_wrong_size): Bind
1887 the session to self.session so that it gets destroyed properly
1888
1889 * test/test_layer.py (TestLayer.tearDown): Call the session's
1890 Destroy method
1891
1892 * test/test_map.py (TestMapBase.tearDown): Destroy self.session
1893 too if it exists
1894 (TestMapAddLayer.test_add_layer): Bind the session to self.session
1895 so that it gets destroyed properly
1896
1897 * test/postgissupport.py (reason_for_not_running_tests): Add a
1898 test for the existence of popen2.Popen4.
1899
1900 * test/test_save.py (SaveSessionTest.tearDown): New. Provide a
1901 reliable way to destroy the sessions created in the test cases
1902 (SaveSessionTest.test_dbf_table): Bind the session to self.session
1903 so that it gets destroyed properly
1904 (SaveSessionTest.testLayerProjection): Bind the session to
1905 self.session so that it gets destroyed properly
1906
1907 * test/test_session.py (UnreferencedTablesTests.tearDown): Make
1908 sure that the session is destroyed properly
1909
1910 * test/test_shapefilestore.py: Make this callable as a program to
1911 execute the tests
1912
1913 * test/test_scalebar.py: Remove unnecessary import of _ from
1914 Thuban
1915
1916 * test/support.py (print_garbage_information): Call initthuban
1917 here because it may be called indirectly from test cases that test
1918 test support modules which do not use anything from thuban itself
1919 (ThubanTestProgram.runTests): Remove unnecessary debug print
1920
1921 2003-08-28 Bernhard Herzog <[email protected]>
1922
1923 * Thuban/version.py (longversion): Update to 0.9
1924
1925 * Thuban/UI/mainwindow.py: Remove some unused imports
1926
1927 * README: Add section about required additional software. Add date
1928 and revision CVS keywords
1929
1930 * HOWTO-Release: Add item about the translations. Add date and
1931 revision CVs keywords and change formatting to match README a bit
1932 better
1933
1934 * po/de.po: Update for 0.9
1935
1936 * test/README: Tweak the wording a little because many tests are
1937 not really unittest.
1938
1939 2003-08-27 Bernhard Herzog <[email protected]>
1940
1941 As preparation for the 0.9 release, switch thuban files to a
1942 non-dev namespace
1943
1944 * Thuban/Model/save.py (SessionSaver.write_session): Write files
1945 with the http://thuban.intevation.org/dtds/thuban-0.9.dtd
1946 namespace
1947
1948 * Thuban/Model/load.py (SessionLoader.__init__): Accept the
1949 http://thuban.intevation.org/dtds/thuban-0.9.dtd namespace too
1950
1951 * test/test_save.py (SaveSessionTest.dtd)
1952 (SaveSessionTest.testEmptySession)
1953 (SaveSessionTest.testSingleLayer)
1954 (SaveSessionTest.testLayerProjection)
1955 (SaveSessionTest.testRasterLayer)
1956 (SaveSessionTest.testClassifiedLayer)
1957 (SaveSessionTest.test_dbf_table)
1958 (SaveSessionTest.test_joined_table)
1959 (SaveSessionTest.test_save_postgis): Update for new namespace
1960
1961 * test/test_load.py (LoadSessionTest.dtd, TestSingleLayer)
1962 (TestLayerVisibility.file_contents, TestLabels.file_contents)
1963 (TestLayerProjection.file_contents)
1964 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
1965 (TestPostGISLayer.file_contents)
1966 (TestPostGISLayerPassword.file_contents)
1967 (TestLoadError.file_contents, TestLoadError.test): Update for new
1968 namespace
1969
1970 2003-08-27 Bernhard Herzog <[email protected]>
1971
1972 Make the table interface distinguish between row ids (an integer
1973 that uniquely identifies a row) and row ordinals (a simple row
1974 count from 0 to NumRows() - 1)
1975
1976 * Thuban/Model/postgisdb.py (PostGISTable.RowIdToOrdinal)
1977 (PostGISTable.RowOrdinalToId): New methods to conver between row
1978 ids and row ordinals
1979 (PostGISTable.ReadRowAsDict, PostGISTable.ReadValue): New keyword
1980 parameter row_is_ordinal to indicate whether the row parameter is
1981 the row id or the ordinal
1982
1983 * Thuban/Model/transientdb.py (TransientTableBase.RowIdToOrdinal)
1984 (TransientTableBase.RowOrdinalToId)
1985 (AutoTransientTable.RowIdToOrdinal)
1986 (AutoTransientTable.RowOrdinalToId): Same new methods as in
1987 PostGISTable.
1988 (TransientTableBase.ReadRowAsDict, TransientTableBase.ReadValue)
1989 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ReadValue):
1990 Same new parameter as in PostGISTable.
1991
1992 * Thuban/Model/table.py (DBFTable.RowIdToOrdinal)
1993 (DBFTable.RowOrdinalToId, MemoryTable.RowIdToOrdinal)
1994 (MemoryTable.RowOrdinalToId): Same new methods as in PostGISTable.
1995 (DBFTable.ReadValue, DBFTable.ReadRowAsDict)
1996 (MemoryTable.ReadValue, MemoryTable.ReadRowAsDict): Same new
1997 parameter as in PostGISTable.
1998
1999 * Thuban/UI/tableview.py (DataTable.RowIdToOrdinal)
2000 (DataTable.RowOrdinalToId): New methods to convert between row ids
2001 and row ordinals.
2002 (TableGrid.SelectRowById): New method to select a row based on its
2003 ID as opposed to its ordinal
2004 (DataTable.GetValue, TableGrid.OnRangeSelect)
2005 (TableGrid.OnSelectCell, LayerTableGrid.select_shapes)
2006 (QueryTableFrame.OnQuery, QueryTableFrame.get_selected)
2007 (LayerTableFrame.__init__): Convert between row ids and row
2008 ordinals as appropriate
2009
2010 * test/postgissupport.py (PostGISDatabase.__init__): Add
2011 doc-string.
2012 (PostGISDatabase.initdb): The optional third item in a tuple in
2013 tables is now a (key, value) list with additional arguments to
2014 pass to upload_shapefile
2015 (upload_shapefile): New parameter gid_offset to allow gids that
2016 are not the same as the shapeids in the shapefile
2017 (PostgreSQLServer.get_default_static_data_db): Use the new
2018 gid_offset to make the gids in landmarks 1000 higher than the
2019 shapeids in the shapefile
2020
2021 * test/test_viewport.py
2022 (TestViewportWithPostGIS.test_find_shape_at_point): Adapt to the
2023 new shapeids in the landmarks table
2024
2025 * test/test_transientdb.py
2026 (TestTransientTable.run_iceland_political_tests)
2027 (TestTransientTable.test_transient_joined_table): Add tests for
2028 the new table methods and new keywords arguments.
2029
2030 * test/test_postgis_db.py
2031 (TestPostGISTable.test_read_row_as_dict_row_count_mode)
2032 (TestPostGISTable.test_read_value_row_count_mode)
2033 (TestPostGISTable.test_row_id_to_ordinal)
2034 (TestPostGISTable.test_row_oridnal_to_id): New test for the new
2035 table methods and the new arguments
2036 (TestPostGISShapestorePoint.test_shapes_in_region)
2037 (TestPostGISShapestorePoint.test_shape_raw_data)
2038 (TestPostGISShapestorePoint.test_shape_points)
2039 (TestPostGISShapestorePoint.test_shape_shapeid)
2040 (TestPostGISShapestorePoint.test_all_shapes)
2041 (TestPostGISTable.test_simple_query)
2042 (TestPostGISTable.test_simple_query)
2043 (TestPostGISTable.test_simple_query)
2044 (TestPostGISTable.test_read_value)
2045 (TestPostGISTable.test_read_row_as_dict): Adapt to the new
2046 shapeids in the landmarks table
2047
2048 * test/test_memory_table.py
2049 (TestMemoryTable.test_read_row_as_dict_row_count_mode)
2050 (TestMemoryTable.test_read_value_row_count_mode)
2051 (TestMemoryTable.test_row_id_to_ordinal)
2052 (TestMemoryTable.test_row_oridnal_to_id): New test for the new
2053 table methods and the new arguments
2054
2055 * test/test_dbf_table.py
2056 (TestDBFTable.test_read_row_as_dict_row_count_mode)
2057 (TestDBFTable.test_read_value_row_count_mode)
2058 (TestDBFTable.test_row_id_to_ordinal)
2059 (TestDBFTable.test_row_oridnal_to_id): New test for the new table
2060 methods and the new arguments
2061
2062 2003-08-26 Bernhard Herzog <[email protected]>
2063
2064 * Thuban/Model/postgisdb.py (PostGISShapeStore.BoundingBox): Use a
2065 more postgis specific but much faster method to get the bounding
2066 box
2067
2068 2003-08-26 Bernhard Herzog <[email protected]>
2069
2070 * Thuban/Model/postgisdb.py (PostGISTable.Title)
2071 (PostGISShapeStore.AllShapes): Add these missing methods.
2072 (PostGISShapeStore.ShapesInRegion): No need to raise
2073 StopIteration. We can simply return
2074
2075 * test/test_postgis_db.py (TestPostGISTable.test_title)
2076 (TestPostGISShapestorePoint.test_all_shapes): New tests for the
2077 new methods
2078
2079 2003-08-25 Bernhard Herzog <[email protected]>
2080
2081 * Thuban/Model/postgisdb.py (shapetype_map): Add MUTLIPOLYGON.
2082
2083 * test/test_postgis_db.py (PolygonTests): New class containing
2084 those tests from TestPostGISShapestorePolygon that can also be
2085 used to test MUTLIPOLYGON tables
2086 (TestPostGISShapestorePolygon): Most tests are now in PolygonTests
2087 so derive from that
2088 (TestPostGISShapestoreMultiPolygon): New class with tests for
2089 MUTLIPOLYGON tables
2090
2091 * test/postgissupport.py (PostGISDatabase.initdb): Allow the
2092 tables argument to have tuples with three items to override the
2093 WKT type used.
2094 (PostgreSQLServer.get_default_static_data_db): Use the above to
2095 create a polygon table with MUTLIPOLYGONs
2096 (point_to_wkt, coords_to_point, polygon_to_wkt, coords_to_polygon)
2097 (arc_to_wkt, coords_to_multilinestring): Rename from *_to_wkt to
2098 coords_to*
2099 (coords_to_multipolygon): New. Convert to MUTLIPOLYGON
2100 (wkt_converter): New. Map WKT types to converters
2101 (upload_shapefile): New parameter force_wkt_type to use a
2102 different WKT type than the default
2103
2104 2003-08-25 Bernhard Herzog <[email protected]>
2105
2106 * Thuban/UI/application.py
2107 (ThubanApplication.run_db_param_dialog): New. Suitable as a
2108 db_connection_callback. Main difference is that the dialog run
2109 from this method doesn't have a parent so it can be used even when
2110 there is no main window
2111 (ThubanApplication.OpenSession): Use self.run_db_param_dialog if
2112 no db_connection_callback was given. This way the dialog pops up
2113 even when the .thuban file was given as a command line parameter.
2114
2115 2003-08-25 Bernhard Herzog <[email protected]>
2116
2117 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Release the the mouse
2118 before calling MouseLeftUp. MouseLeftUp may pop up modal dialogs
2119 which leads to an effectively frozen X session because the user
2120 can only interact with the dialog but the mouse is still grabbed
2121 by the canvas.
2122 Also, call the tool's Hide method before MouseLeftUp because
2123 MouseLeftUp may change the tool's coordinates.
2124
2125 2003-08-25 Bernhard Herzog <[email protected]>
2126
2127 * Thuban/UI/application.py (ThubanApplication.OpenSession): Catch
2128 LoadCancelled exceptions and handle them by returning immediately.
2129
2130 2003-08-25 Bernhard Herzog <[email protected]>
2131
2132 GUI part of loading sessions with postgis connections which may
2133 require user interaction to get passwords or updated parameters
2134
2135 * Thuban/UI/dbdialog.py (DBDialog): Reimplement to make it look a
2136 bit nucer and be more generic.
2137 (DBFrame.OnAdd): Adapt to new DBDialog interface
2138
2139 * Thuban/UI/application.py (ThubanApplication.OpenSession): New
2140 optional parameter db_connection_callback which is passed to
2141 load_session.
2142
2143 * Thuban/UI/mainwindow.py (MainWindow.run_db_param_dialog): New.
2144 Suitable as a db_connection_callback
2145 (MainWindow.OpenSession): Use self.run_db_param_dialog as the
2146 db_connection_callback of the application's OpenSession method
2147
2148
2149 2003-08-25 Bernhard Herzog <[email protected]>
2150
2151 Basic loading of sessions containing postgis connections:
2152
2153 * Thuban/Model/load.py (LoadError): Add doc-string
2154 (LoadCancelled): New exception class to indicate a cancelled load
2155 (SessionLoader.__init__): Add the db_connection_callback parameter
2156 which will be used by the loader to get updated parameters and a
2157 password for a database connection
2158 (SessionLoader.__init__): Add the new XML elements to the
2159 dispatchers dictionary
2160 (SessionLoader.check_attrs): Two new conversions, ascii to convert
2161 to a byte-string object and idref as a generic id reference
2162 (SessionLoader.start_dbconnection)
2163 (SessionLoader.start_dbshapesource): New. Handlers for the new XML
2164 elements
2165 (load_session): Add the db_connection_callback to pass through the
2166 SessionLoader
2167
2168 * test/test_load.py (TestPostGISLayer, TestPostGISLayerPassword):
2169 New classes to test loading of sessions with postgis database
2170 connections.
2171
2172 2003-08-25 Bernhard Herzog <[email protected]>
2173
2174 * Thuban/UI/mainwindow.py (__ThubanVersion__): Remove this and
2175 replace it and the comment with __BuildDate__ by the Source: and
2176 Id: cvs keywords as used in the other files.
2177
2178 2003-08-25 Bernhard Herzog <[email protected]>
2179
2180 * Thuban/Model/load.py (SessionLoader.check_attrs): Raise a
2181 LoadError when a required attribute is missing. The code used to
2182 be commented out for some reason, but probably should have been
2183 active.
2184
2185 * test/test_load.py (TestLoadError.test): Test the message in the
2186 LoadError too to make sure it really is about the missing
2187 attribute
2188
2189 2003-08-22 Bernhard Herzog <[email protected]>
2190
2191 * test/test_save.py (SaveSessionTest.test_dbf_table)
2192 (SaveSessionTest.test_joined_table): Add XML validation tests.
2193
2194 2003-08-22 Bernhard Herzog <[email protected]>
2195
2196 Implement saving a session with a postgis connection
2197
2198 * Resources/XML/thuban-0.9.dtd (dbconnection, dbshapesource) New
2199 elements for database connections and shapestores using db
2200 connections
2201 (session): Add the dbconnections to the content model
2202
2203 * Thuban/Model/save.py (SessionSaver.write_db_connections): New.
2204 Write the db connections
2205 (SessionSaver.write_session): Call write_db_connections to write
2206 the connection before the data sources
2207 (SessionSaver.write_data_containers): Handle postgis shapestores
2208
2209 * test/test_save.py (SaveSessionTest.thubanids)
2210 (SaveSessionTest.thubanidrefs): Update for new DTD
2211 (SaveSessionTest.test_save_postgis): New. Test saving a session
2212 with postgis connections
2213
2214 * Thuban/Model/postgisdb.py (PostGISTable.DBConnection)
2215 (PostGISTable.TableName): New accessor methods for the connection
2216 and table name
2217
2218 * test/test_postgis_db.py (TestPostGISTable.test_dbconn)
2219 (TestPostGISTable.test_dbname): New methods to test the new
2220 PostGISConnection methods
2221
2222 2003-08-22 Bernhard Herzog <[email protected]>
2223
2224 * Thuban/Model/postgisdb.py (ConnectionError): New exception class
2225 for exceptions occurring when establishing a Database connection
2226 (PostGISConnection.connect): Catch psycopg.OperationalError during
2227 connects and raise ConnectionError.
2228
2229 * test/test_postgis_db.py (TestPostgisDBExceptions): New class for
2230 tests for database exceptions
2231
2232 2003-08-22 Bernhard Herzog <[email protected]>
2233
2234 Prepare the test suite for tests with required authentication
2235
2236 * test/postgissupport.py (PostgreSQLServer.__init__): Add instance
2237 variables with two predefined users/passwords, one for the admin
2238 and one for a non-privileged user.
2239 (PostgreSQLServer.createdb): Pass the admin name to initdb and add
2240 the non-privileged user to the database and set the admin password
2241 (PostgreSQLServer.wait_for_postmaster): Use the admin user name.
2242 Better error reporting
2243 (PostgreSQLServer.connection_params)
2244 (PostgreSQLServer.connection_string): New methods to return
2245 information about how to connect to the server
2246 (PostgreSQLServer.execute_sql): New. Convenience method to execute
2247 SQL statements
2248 (PostgreSQLServer.require_authentication): Toggle whether the
2249 server requires authentication
2250 (PostgreSQLServer.create_user, PostgreSQLServer.alter_user): New.
2251 Add or alter users
2252 (PostGISDatabase.initdb): Pass the admin name one the
2253 subprocesses' command lines. Grant select rights on
2254 geometry_columns to everybody.
2255 (upload_shapefile): Use the admin name and password when
2256 connecting. Grant select rights on the new table to everybody.
2257
2258 * test/test_viewport.py (TestViewportWithPostGIS.setUp): Use the
2259 server's new methods to get the connection parameters.
2260
2261 * test/test_postgis_session.py (TestSessionWithPostGIS.setUp)
2262 (TestSessionWithPostGIS.test_remove_dbconn_exception): Use the
2263 server's new methods to get the connection parameters.
2264
2265 * test/test_postgis_db.py
2266 (TestPostGISConnection.test_gis_tables_empty)
2267 (TestPostGISConnection.test_gis_tables_non_empty)
2268 (PostGISStaticTests.setUp): Use the server's new methods to get
2269 the connection parameters.
2270
2271 2003-08-22 Bernhard Herzog <[email protected]>
2272
2273 * Thuban/UI/about.py (About.__init__): Add the psycopg version.
2274
2275 * Thuban/version.py: Add psycopg version
2276
2277 * Thuban/Model/postgisdb.py (psycopg_version): New. Return the
2278 version of the psycopg module
2279
2280 2003-08-22 Bernhard Herzog <[email protected]>
2281
2282 * Thuban/UI/dbdialog.py (DBPwdDlg): Removed because it's not used.
2283 (DBFrame.OnEdit): Removed because it's not used and wouldn't work
2284 at the moment. The functionality should probably be implemented
2285 some time, though.
2286 (DBFrame.OnRemove): Display a message if the connection can't be
2287 removed because it's still in use.
2288
2289 2003-08-22 Jan-Oliver Wagner <[email protected]>
2290
2291 * Thuban/UI/about.py (About.__init__): split up the huge about
2292 text into elements/lists for easier translation. This fixes bug
2293 https://intevation.de/rt/webrt?serial_num=2058
2294 Also, made some forgotten string available for the i18n.
2295
2296 2003-08-21 Bernhard Herzog <[email protected]>
2297
2298 Make postgis support really optional including insensitive menu
2299 items.
2300
2301 * Thuban/Model/postgisdb.py (has_postgis_support): New. Return
2302 whether the postgis is supported.
2303
2304 * Thuban/UI/dbdialog.py: Put the psycopg import into try..except
2305 to make postgis support optional
2306
2307 * Thuban/UI/mainwindow.py (_has_postgis_support): New. Context
2308 version of Thuban.Model.postgisdb.has_postgis_support
2309 (database_management command): Make it only sensitive if postgis
2310 is supported.
2311
2312 2003-08-21 Jan-Oliver Wagner <[email protected]>
2313
2314 * Doc/manual/thuban-manual.xml: Added CVS revision for rev-history.
2315 (section Adding and Removing Layers): Added text and described
2316 multi-selection.
2317 (chapter Extensions): New.
2318
2319 2003-08-21 Jan-Oliver Wagner <[email protected]>
2320
2321 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Changed dialog
2322 settings to allow multiple files to load into the map.
2323 Also reduced selection to *.shp as a default.
2324
2325 2003-08-20 Bernhard Herzog <[email protected]>
2326
2327 Add dialogs and commands to open database connections and add
2328 database layers.
2329
2330 * Thuban/UI/mainwindow.py (MainWindow.DatabaseManagement): New
2331 method to open the database connection management dialog
2332 (MainWindow.AddDBLayer): New method to add a layer from a database
2333 (_has_dbconnections): New helper function to use for sensitivity
2334 (database_management command, layer_add_db command): New commands
2335 that call the above new methods.
2336 (main_menu): Add the new commands to the menu.
2337
2338 * Thuban/Model/postgisdb.py (PostGISConnection.__init__)
2339 (PostGISConnection.connect): Establish the actual connection in a
2340 separate method and call it in __init__. This makes it easier to
2341 override the behavior in test cases
2342 (PostGISConnection.BriefDescription): New method to return a brief
2343 description for use in dialogs.
2344
2345 * test/test_postgis_db.py (NonConnection): DB connection that
2346 doesn't actually connect
2347 (TestBriefDescription): New class with tests for the new
2348 BriefDescription method
2349
2350 2003-08-19 Jan-Oliver Wagner <[email protected]>
2351
2352 Moved anything from extensions to libraries.
2353
2354 * libraries: New.
2355
2356 * libraries/ pyprojection, pyshapelib, shapelib, thuban: New.
2357
2358 * libraries/pyprojection/ LICENSE, MANIFEST.in, Projection.i,
2359 Projection.py, Projection_wrap.c, setup.py, swighelp.txt: These files have
2360 been moved here from thuban/extensions/pyprojection/
2361 See there in the Attic for the older history.
2362
2363 * libraries/pyshapelib/ COPYING, ChangeLog, NEWS, README, dbflib.i,
2364 dbflib.py, dbflib_wrap.c, pyshapelib_api.h, pytest.py, setup.py,
2365 shapelib.i, shapelib.py, shapelib_wrap.c, shptreemodule.c: These files
2366 have been moved here from thuban/extensions/pyshapelib/
2367 See there in the Attic for the older history.
2368
2369 * libraries/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c: These
2370 files have been moved here from thuban/extensions/shapelib/
2371 See there in the Attic for the older history.
2372
2373 * libraries/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
2374 gdalwarp.cpp, wxproj.cpp: These files have been moved here from
2375 thuban/extensions/thuban/
2376 See there in the Attic for the older history.
2377
2378 * MANIFEST.in, setup.cfg, setup.py: renamed extensions to libraries.
2379
2380 * extensions/thuban/ bmpdataset.cpp, cpl_mfile.cpp, cpl_mfile.h,
2381 gdalwarp.cpp, wxproj.cpp: Moved to libraries/thuban.
2382
2383 * extensions/shapelib/ dbfopen.c, shapefil.h, shpopen.c, shptree.c:
2384 Moved to libraries/shapelib.
2385
2386 * extensions/pyshapelib/ COPYING, NEWS, dbflib.py, pytest.py,
2387 shapelib.py, README, dbflib_wrap.c, setup.py, shapelib_wrap.c,
2388 ChangeLog, dbflib.i, pyshapelib_api.h, shapelib.i, shptreemodule.c:
2389 Moved to libraries/pyshapelib.
2390
2391 * extensions/pyprojection/ MANIFEST.in, Projection.py, setup.py,
2392 LICENSE, Projection.i, Projection_wrap.c, swighelp.txt:
2393 Moved to libraries/pyprojection.
2394
2395 * extensions/ pyprojection, pyshapelib, shapelib, thuban: Removed.
2396
2397 * extensions: Removed.
2398
2399 2003-08-19 Bernhard Herzog <[email protected]>
2400
2401 * test/test_viewport.py (ViewPortTest): We don't use the
2402 facilities of FileTestMixin so don't derive from it.
2403 (TestViewportWithPostGIS): New class with tests for using a
2404 viewport on a map with postgis layers.
2405
2406 2003-08-19 Bernhard Herzog <[email protected]>
2407
2408 Add the db connection management to the session.
2409
2410 * Thuban/Model/session.py (Session.__init__): New instance
2411 variable db_connections
2412 (Session.AddDBConnection, Session.DBConnections)
2413 (Session.HasDBConnections, Session.CanRemoveDBConnection)
2414 (Session.RemoveDBConnection): New methods to manage and query the
2415 db connections managed by the session
2416 (Session.OpenDBShapeStore): New method to open a shapestore from a
2417 db connection
2418
2419 * Thuban/Model/messages.py (DBCONN_REMOVED, DBCONN_ADDED): New
2420 messages for the db connection handling in the session
2421
2422 * test/test_postgis_session.py: New. test cases for the session's
2423 db connection handling with postgis connections
2424
2425 2003-08-19 Bernhard Herzog <[email protected]>
2426
2427 Add very basic postgis database support and the corresponding test
2428 cases. The test cases require a PostgreSQL + postgis installation
2429 but no existing database. The database will be created
2430 automatically by the test cases
2431
2432 * test/README: Add note about skipped tests and the requirements
2433 of the postgis tests.
2434
2435 * Thuban/Model/postgisdb.py: New. Basic postgis database support.
2436
2437 * test/test_postgis_db.py: New. Test cases for the postgis
2438 support.
2439
2440 * Thuban/Model/wellknowntext.py: New. Parser for well-known-text
2441 format
2442
2443 * test/test_wellknowntext.py: New. Test cases for the
2444 wellknowntext parser
2445
2446 * test/postgissupport.py: New. Support module for tests involving
2447 a postgis database.
2448
2449 * test/support.py (execute_as_testsuite): Shut down the postmaster
2450 if it's still running after the tests
2451
2452 * Thuban/Model/data.py (RAW_WKT): New constant for raw data in
2453 well known text format
2454
2455 2003-08-19 Jan-Oliver Wagner <[email protected]>
2456
2457 * Examples/simple_extensions/hello_world.py: New. Raises a Hello World
2458 message dialog.
2459
2460 2003-08-18 Bernhard Herzog <[email protected]>
2461
2462 * test/support.py (ThubanTestResult.printErrors): Indent the
2463 reason for the skips in the output to make it a bit more readable.
2464 (execute_as_testsuite): New helper function to run a test suite
2465 and print some more information.
2466 (run_tests): Use execute_as_testsuite to run the tests
2467
2468 * test/runtests.py (main): Use execute_as_testsuite to run the
2469 tests
2470
2471 2003-08-18 Bernhard Herzog <[email protected]>
2472
2473 Fix some bugs in Thuban and the test suite that were uncovered by
2474 changes introduced in Python 2.3:
2475
2476 * Thuban/Model/table.py (DBFTable.__init__): Make sure the
2477 filename is an absolute name
2478
2479 * Thuban/Model/layer.py (RasterLayer.__init__): Make sure the
2480 filename is an absolute name
2481
2482 * test/test_save.py (SaveSessionTest.testRasterLayer): Use a
2483 unique filename to save to and use the correct relative filename
2484 in the expected output.
2485 (SaveSessionTest.test_dbf_table): Use the correct relative
2486 filename in the expected output.
2487
2488 * test/test_layer.py (TestLayer.test_raster_layer): Update the
2489 test to check whether the filename is absolute.
2490
2491 2003-08-18 Jan-Oliver Wagner <[email protected]>
2492
2493 * Thuban/UI/about.py (About.__init__): Added Silke Reimer.
2494
2495 2003-08-15 Bernhard Herzog <[email protected]>
2496
2497 Change the way shapes are returned by a shape store. The
2498 ShapesInRegion method returns an iterator over actual shape
2499 objects instead of a list of shape ids.
2500
2501 * Thuban/Model/data.py (ShapefileShape.ShapeID): New. Return shape
2502 id.
2503 (ShapefileStore.ShapesInRegion): Return an iterator over the
2504 shapes which yields shape objects instead of returning a list of
2505 shape ids
2506 (ShapefileStore.AllShapes): New. Return an iterator over all
2507 shapes in the shape store
2508 (DerivedShapeStore.AllShapes): New. Like in ShapefileStore
2509
2510 * Thuban/Model/layer.py (Layer.ShapesInRegion): Update
2511 doc-string.
2512
2513 * Thuban/UI/baserenderer.py
2514 (BaseRenderer.layer_ids, BaseRenderer.layer_shapes): Rename to
2515 layer_shapes and make it return an iterator containg shapes
2516 instead of a list of ids.
2517 (BaseRenderer.draw_shape_layer): Update doc-string; Adapt to
2518 layer_shapes() change
2519
2520 * Thuban/UI/renderer.py (ScreenRenderer.layer_ids)
2521 (ScreenRenderer.layer_shapes): Rename as in BaseRenderer
2522
2523 * Thuban/UI/viewport.py (ViewPort._find_shape_in_layer): Adapt to
2524 changes in the ShapesInRegion return value.
2525 (ViewPort._get_hit_tester): Remove commented out code
2526
2527 * test/mockgeo.py (SimpleShapeStore.ShapesInRegion): Adapt to the
2528 new return value.
2529 (SimpleShapeStore.AllShapes): New. Implement this method too.
2530
2531 * test/test_layer.py (TestLayer.test_arc_layer)
2532 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
2533 (TestLayer.test_point_layer_with_projection)
2534 (TestLayer.test_derived_store): Adapt to changes in the
2535 ShapesInRegion return value.
2536
2537 * test/test_shapefilestore.py
2538 (TestShapefileStoreArc.test_shapes_in_region)
2539 (TestShapefileStorePolygon.test_shapes_in_region)
2540 (TestShapefileStorePoint.test_shapes_in_region): Adapt to changes
2541 in the ShapesInRegion return value.
2542 (TestShapefileStorePoint.test_all_shapes)
2543 (TestShapefileStoreArc.test_shape_shapeid): New tests for the new
2544 methods
2545
2546 * test/test_derivedshapestore.py
2547 (TestDerivedShapeStore.test_shapes_in_region): Adapt to changes in
2548 the ShapesInRegion return value.
2549 (TestDerivedShapeStore.test_all_shapes)
2550 (TestDerivedShapeStore.test_shape_shapeid): New tests for the new
2551 methods
2552
2553 2003-08-15 Bernhard Herzog <[email protected]>
2554
2555 Make the renderers deal correctly with raw vs. python level
2556 representation of shape geometries
2557
2558 * Thuban/UI/baserenderer.py (BaseRenderer.low_level_renderer):
2559 Return a flag useraw in addition to the callable and the parameter
2560 to indicate whether the callable can deal with the raw shape data
2561 or uses the higher level python lists of coordinates. The callable
2562 now should accept either the raw data or the return value of the
2563 shape's Points() method.
2564 (BaseRenderer.draw_shape_layer): Adapt to the low_level_renderer
2565 change
2566 (BaseRenderer.projected_points): Instead of the shape id use the
2567 points list as parameter.
2568 (BaseRenderer.draw_polygon_shape, BaseRenderer.draw_arc_shape)
2569 (BaseRenderer.draw_point_shape): Adapt to projected_points()
2570 change and accept the points list as parameter instead of the
2571 shape id.
2572
2573 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Return
2574 the useraw flag as required by the BaseRenderer
2575 (ScreenRenderer.draw_shape_layer): Adapt to low-level renderer
2576 changes.
2577
2578 * test/test_baserenderer.py
2579 (TestBaseRenderer.test_point_with_classification): New test for
2580 rendering a map with classifications.
2581
2582 2003-08-15 Bernhard Herzog <[email protected]>
2583
2584 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
2585 (ViewPort._find_shape_in_layer, ViewPort._find_shape_in_layer)
2586 (ViewPort._get_hit_tester, ViewPort.projected_points)
2587 (ViewPort._hit_point, ViewPort._hit_arc, ViewPort._hit_polygon)
2588 (ViewPort._find_label_at): Split the find_shape_at method into
2589 several new methods and use the functions in the hit-test module.
2590
2591 * Thuban/UI/hittest.py: New module with Python-level hit-testing
2592 functions
2593
2594 * test/test_hittest.py: New. Test for the new hittest module
2595
2596 2003-08-15 Bernhard Herzog <[email protected]>
2597
2598 * Thuban/Model/layer.py (Layer.ShapesInRegion): Apply the layer
2599 projection to all corners of the bounding box to get a better
2600 approximation of the projected bounding box
2601
2602 * test/test_layer.py (TestLayer.test_point_layer_with_projection):
2603 New. Test coordinate handling of a layer with a projection.
2604 Catches the bug fixed in Layer.ShapesInRegion
2605
2606 2003-08-15 Bernhard Herzog <[email protected]>
2607
2608 Move some of the mock objects in test_baserenderer into their own
2609 module so they can easily be used from other tests
2610
2611 * test/mockgeo.py: New test helper module with some mock objects
2612 for geometry related things like shapes, shapestores and
2613 projections.
2614
2615 * test/test_mockgeo.py: New. Tests for the new helper module
2616
2617 * test/test_baserenderer.py: Some of the mock-objects are in
2618 mockgeo now.
2619
2620 2003-08-12 Jan-Oliver Wagner <[email protected]>
2621
2622 * Thuban/UI/about.py (About.__init__): Added Björn Broscheit.
2623
2624 2003-08-12 Bernhard Herzog <[email protected]>
2625
2626 * po/de.po: New. German translations by Bjoern Broscheit
2627
2628 2003-08-12 Bernhard Herzog <[email protected]>
2629
2630 * Thuban/UI/projdialog.py (UnknownProjPanel._DoLayout): Translated
2631 strings have to be one string literal.
2632
2633 2003-08-11 Bernhard Herzog <[email protected]>
2634
2635 * test/support.py (FloatComparisonMixin.assertPointListEquals):
2636 New. This method was used in various derived classes, but it's
2637 better to have it here.
2638
2639 * test/test_shapefilestore.py
2640 (ShapefileStoreTests.assertPointListEquals): Removed. It's now in
2641 FloatComparisonMixin
2642
2643 * test/test_layer.py (TestLayer.assertPointListEquals): Removed.
2644 It's now in FloatComparisonMixin
2645
2646 * test/test_derivedshapestore.py
2647 (TestDerivedShapeStore.assertPointListEquals): Removed. It's now
2648 in FloatComparisonMixin
2649
2650 2003-08-11 Bernhard Herzog <[email protected]>
2651
2652 * Thuban/UI/join.py (JoinDialog.OnJoin): Add missing space to
2653 error message
2654
2655 2003-08-08 Jan-Oliver Wagner <[email protected]>
2656
2657 * Doc/manual/thuban-manual.xml: Now use authorgroup. Added revhistory
2658 with version number.
2659 Changed title to reflect version number of Thuban.
2660
2661 2003-08-08 Jan-Oliver Wagner <[email protected]>
2662
2663 * Thuban/UI/about.py (About.__init__): Reworked the hall of fame. Now
2664 the list corresponds to the "About" web page.
2665
2666 2003-08-08 Bernhard Herzog <[email protected]>
2667
2668 * Thuban/UI/projdialog.py (UTMProposeZoneDialog.dialogLayout):
2669 Make sure translated strings are recognized as one string literal.
2670
2671 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog.dialogLayout):
2672 Make sure translated strings are recognized as one string literal.
2673
2674 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Make sure
2675 translated strings are recognized as one string literal.
2676
2677 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2678 sure translated strings are recognized as one string literal.
2679
2680 2003-08-07 Bernhard Herzog <[email protected]>
2681
2682 * Thuban/Model/data.py (DerivedShapeStore.RawShapeFormat): New.
2683 Simply delegates to the original shapestore.
2684
2685 * test/test_derivedshapestore.py
2686 (TestDerivedShapeStore.test_raw_format): New. Test case for
2687 DerivedShapeStore.RawShapeFormat
2688
2689 2003-08-07 Bernhard Herzog <[email protected]>
2690
2691 Add raw data interface to shape objects.
2692
2693 * Thuban/Model/data.py (ShapefileShape, Shape): Rname the shape
2694 class to ShapefileShape which now holds shapefile specific
2695 information.
2696 (ShapefileShape.compute_bbox): Simplified to not cache any
2697 information. The way this method is used that shouldn't matter
2698 performance wise.
2699 (ShapefileShape.RawData): New. Return the shapeid which is the raw
2700 data format for shapes from shapefiles.
2701 (ShapefileStore.RawShapeFormat): New. Return the raw datatype used
2702 in the shape objects returned by a shapestore. For a
2703 ShapefileStore this is always RAW_SHAPEFILE.
2704 (RAW_PYTHON, RAW_SHAPEFILE): Constants for the RawShapeFormat
2705 method.
2706
2707 * test/test_shapefilestore.py
2708 (TestShapefileStore.test_raw_format): New test to test the raw
2709 format feature of shapes.
2710
2711 * Thuban/Model/layer.py: Remove the unused import of Shape from
2712 data. It was only there for interface compatibility but it's not
2713 used inside of Thuban and the generic Shape class has gone away.
2714
2715 * Thuban/UI/renderer.py (MapRenderer.low_level_renderer): Check
2716 the raw data format and only use an optimized version of its a
2717 shapefile.
2718
2719 2003-08-07 Bernhard Herzog <[email protected]>
2720
2721 * test/test_baserenderer.py (SimpleShape): Shape class for the
2722 tests.
2723 (SimpleShapeStore.Shape): Use SimpleShape instead of
2724 Thuban.Model.data.Shape to make the tests independed of the coming
2725 changes.
2726
2727 2003-08-07 Bernhard Herzog <[email protected]>
2728
2729 * test/support.py (SkipTest, ThubanTestResult, ThubanTestRunner)
2730 (ThubanTestProgram): New classes that extend the respective
2731 classes from unittest. These new version support skipping tests
2732 under certain expected conditions. In the Thuban test suite we
2733 uses this for tests that require the optional gdal support.
2734 (run_tests): Use ThubanTestProgram instead of the unittest.main()
2735
2736 * test/runtests.py (main): Use the new ThubanTestRunner instead of
2737 the normal one from unittest
2738
2739 * test/test_layer.py (TestLayer.test_raster_layer): If this test
2740 is not run because gdal support isn't available report this to the
2741 runner.
2742
2743 * test/test_baserenderer.py
2744 (TestBaseRenderer.test_raster_no_projection): Do not run this test
2745 if gdal support isn't available and report this to the runner.
2746
2747 2003-08-06 Bernhard Herzog <[email protected]>
2748
2749 Rearrange the renderers a bit, partly in preparation for changes
2750 required for the postgis merge, partly to make it more testable.
2751 Also make the representation of coordinates in Shapes more
2752 consistent.
2753
2754 * Thuban/UI/renderer.py (MapRenderer): Most of the code/methods in
2755 this class is now in BaseRenderer. This class is now practically
2756 only a specialization of BaseRenderer for rendering to an actual
2757 wx DC.
2758 (ScreenRenderer.draw_shape_layer): Use self.low_level_renderer()
2759 to get the shapetype specific rendering functions.
2760
2761 * Thuban/UI/baserenderer.py: New file with the basic rendering
2762 logic. The code in this file is completely independend of wx.
2763 (BaseRenderer): Class with the basic rendering logic
2764
2765 * test/test_baserenderer.py: New. Test cases for BaseRenderer
2766
2767 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
2768 error_on_redraw to guard agains endless loops and stack overflows
2769 when there's a bug in the rendering code that raises exceptions.
2770 (MapCanvas.OnIdle, MapCanvas._do_redraw): Split the actual
2771 rendering into a separate method _do_redraw so that error handling
2772 is a bit easier. When an exception occurs, set error_on_redraw to
2773 true. When it's true on entry to OnIdle do nothing and return
2774 immediately.
2775
2776 * Thuban/Model/data.py (ShapefileStore.Shape): For consistency, a
2777 Shape object will always have the coordinates as a list of list of
2778 coordinate pairs (tuples).
2779 (Shape.compute_bbox): Adapt to new representation.
2780
2781 * Thuban/UI/viewport.py (ViewPort.find_shape_at)
2782 (ViewPort.LabelShapeAt): Adapt to new coordinate representation in
2783 Shape objects.
2784
2785 * test/test_shapefilestore.py
2786 (ShapefileStoreTests.assertFloatTuplesEqual)
2787 (ShapefileStoreTests.assertPointListEquals): Rename to
2788 assertPointListEquals and change purpose to checking equality of
2789 the lists returned by Shape.Points().
2790 (TestShapefileStoreArc.test_shape)
2791 (TestShapefileStorePolygon.test_shape)
2792 (TestShapefileStorePoint.test_shape): Use the new
2793 assertPointListEquals instead of assertFloatTuplesEqual
2794
2795 * test/test_layer.py (TestLayer.assertFloatTuplesEqual)
2796 (TestLayer.assertPointListEquals): Rename to assertPointListEquals
2797 and change purpose to checking equality of the lists returned by
2798 Shape.Points().
2799 (TestLayer.test_arc_layer, TestLayer.test_arc_layer)
2800 (TestLayer.test_polygon_layer, TestLayer.test_point_layer)
2801 (TestLayer.test_derived_store): Use the new assertPointListEquals
2802 instead of assertFloatTuplesEqual
2803
2804 * test/test_derivedshapestore.py
2805 (TestDerivedShapeStore.assertFloatTuplesEqual)
2806 (TestDerivedShapeStore.assertPointListEquals): Rename to
2807 assertPointListEquals and change purpose to checking equality of
2808 the lists returned by Shape.Points().
2809 (TestDerivedShapeStore.test_shape): Use the new
2810 assertPointListEquals instead of assertFloatTuplesEqual
2811
2812 2003-08-06 Jan-Oliver Wagner <[email protected]>
2813
2814 * Thuban/UI/projdialog.py (UTMPanel._OnPropose): Added test for
2815 a bounding box. A dialog is raised in case, no bounding box
2816 is found. This fixes bug #2043:
2817 https://intevation.de/rt/webrt?serial_num=2043
2818
2819 2003-08-05 Bernhard Herzog <[email protected]>
2820
2821 * Thuban/Model/color.py (Color.__repr__): Make the repr of a color
2822 object look like a Color instantiation. Formerly it looked like a
2823 tuple.
2824
2825 * test/test_color.py (TestColor.test_repr)
2826 (TestColor.test_equality, TestColor.test_inequality): New. test
2827 some more apects of the Color class
2828 (TestTransparent.test_repr, TestTransparent.test_hex)
2829 (TestTransparent.test_equality): New. Test cases for the
2830 Transparent object.
2831
2832 2003-08-04 Jan-Oliver Wagner <[email protected]>
2833
2834 * Doc/manual/thuban-manual.xml: a number of small improvements.
2835 The resulting file is the version submitted for GREAT-ER II.
2836
2837 2003-08-01 Bernhard Herzog <[email protected]>
2838
2839 * Thuban/UI/resource.py, Thuban/UI/projdialog.py,
2840 Thuban/UI/join.py, Thuban/UI/classgen.py, Thuban/UI/about.py,
2841 Thuban/Model/resource.py: Insert cvs keywords and doc-strings.
2842
2843 * Thuban/UI/common.py: Insert cvs keywords and doc-strings.
2844 (Color2wxColour, wxColour2Color, ThubanBeginBusyCursor)
2845 (ThubanEndBusyCursor): Add doc-strings
2846
2847 2003-08-01 Bernhard Herzog <[email protected]>
2848
2849 First step towards PostGIS integration. More abstraction by movin
2850 more code from the layer to the shapestore. More methods of the
2851 layer are now simply delegated to the equivalent method of the
2852 shapestore. The SHAPETYPE_* constants are now in data not in
2853 layer.
2854
2855 * Thuban/Model/data.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
2856 (SHAPETYPE_POINT, Shape): Move these constants and classes from
2857 layer.py to data.py
2858 (ShapefileStore.__init__): More Initialization for the new methods
2859 and functionality.
2860 (ShapefileStore.ShapeType, ShapefileStore.NumShapes)
2861 (ShapefileStore.BoundingBox, ShapefileStore.ShapesInRegion)
2862 (ShapefileStore.Shape): New methods that were formerly implemented
2863 in the layer.
2864 (DerivedShapeStore.Shape, DerivedShapeStore.ShapesInRegion)
2865 (DerivedShapeStore.ShapeType, DerivedShapeStore.NumShapes)
2866 (DerivedShapeStore.BoundingBox): New. DerivedShapeStore
2867 equivalents of the new shape methods. These versions are simply
2868 delegated to the original shapstore.
2869
2870 * Thuban/Model/layer.py (SHAPETYPE_POLYGON, SHAPETYPE_ARC)
2871 (SHAPETYPE_POINT, Shape): Removed. They're now in data.py
2872 (Layer.SetShapeStore): Removed the initializatin of instance
2873 variables that were needed for the stuff that's now in
2874 ShapefileStore
2875 (Layer.BoundingBox, Layer.NumShapes, Layer.ShapeType)
2876 (Layer.Shape, Layer.ShapesInRegion): Simply delegate to the
2877 shapestore.
2878
2879 * Thuban/UI/classifier.py, Thuban/UI/renderer.py,
2880 Thuban/UI/viewport.py: Import the SHAPETYPE_* constants from data
2881 instead of layer.
2882
2883 * test/test_shapefilestore.py: New. Tests for ShapefileStore.
2884
2885 * test/test_derivedshapestore.py: New. Tests for DerivedShapeStore.
2886
2887 * test/test_layer.py: Import the SHAPETYPE_* constants from data
2888 instead of layer.
2889 (TestLayer.test_derived_store): Remove the test for the exception
2890 when instantiating the DerivedShapeStore with an incompatible
2891 table which is now in test_derivedshapestore.py. Add some more
2892 tests of the layer methods to determine whether they work for a
2893 DerivedShapeStore as well.
2894
2895 2003-07-31 Jonathan Coles <[email protected]>
2896
2897 * Doc/manual/thuban-manual.xml: Fix the list of required packages
2898 by just listing the name and where they can be found.
2899
2900 2003-07-31 Frank Koormann <[email protected]>
2901
2902 * Doc/manual/thuban-manual.xml:
2903 Changed the screenshot elements to figure.
2904 Changed some variablelist elements to itemizedlist.
2905 Added section on GDAL formats.
2906
2907 2003-07-31 Jonathan Coles <[email protected]>
2908
2909 * Doc/manual/thuban-manual.xml: Added a few sentences about
2910 the Fix Border Color option when generating classes.
2911
2912 2003-07-30 Jonathan Coles <[email protected]>
2913
2914 * Thuban/Model/classgen.py: Add docstrings. Rename specific
2915 Ramp instances to use lower_case_style.
2916
2917 * Thuban/UI/classgen.py: Use renamed Ramp instances.
2918
2919 * Thuban/UI/classifier.py: Add docstrings.
2920
2921 * Thuban/UI/dock.py: Add docstrings.
2922
2923 * test/test_classgen.py: Use renamed Ramp instances.
2924
2925 2003-07-30 Bernhard Herzog <[email protected]>
2926
2927 * Thuban/Lib/connector.py (QueueingPublisher): Removed. This class
2928 was never used in Thuban.
2929
2930 2003-07-30 Bernhard Herzog <[email protected]>
2931
2932 * Thuban/UI/join.py (JoinDialog.__init__): Use the table's Title()
2933 method directly instead of going through the transient_table
2934 method. This faster because transient_table may force the copy of
2935 a DBF file into the transient database and setting a table's title
2936 doesnm't affect the title of the associated transient table, so
2937 this fixes RT #2042
2938
2939 * Thuban/UI/main.py (__version__): Don't import the already
2940 removed show_exception_dialog.
2941
2942 2003-07-29 Jonathan Coles <[email protected]>
2943
2944 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2945 Put back this method and remove the equivalent function since we
2946 are setting the exception hook from within this class (OnInit).
2947
2948 2003-07-29 Jonathan Coles <[email protected]>
2949
2950 * Doc/manual/images/5_2_custom_ramp.png,
2951 Doc/manual/images/5_2_quantiles.png,
2952 Doc/manual/images/5_2_uniform_dist.png,
2953 Doc/manual/images/5_2_unique_values.png,
2954 Doc/manual/images/8_int_error.png: New screen shots.
2955
2956 * Doc/manual/thuban-manual.xml: Fixed typos and wording, clarified
2957 some points, and added more screen shots.
2958
2959 2003-07-29 Bernhard Herzog <[email protected]>
2960
2961 * Thuban/Model/data.py: Remove the now unused import of warnings
2962
2963 2003-07-29 Bernhard Herzog <[email protected]>
2964
2965 * Thuban/Model/data.py (SimpleStore): Removed. This class has been
2966 deprecated since before the 0.8 release and isn't used in Thuban
2967 itself anymore.
2968
2969 * Thuban/Model/transientdb.py: Remove some unnecessary imports
2970
2971 2003-07-29 Jonathan Coles <[email protected]>
2972
2973 * Thuban/UI/application.py (ThubanApplication.OnInit): set the
2974 python exception hook here so that we are sure to catch any
2975 Thuban exception that happen during initialization.
2976
2977 * Thuban/UI/main.py (main): Don't set the exception hook here,
2978 it will get set in ThubanApplication.OnInit.
2979
2980 2003-07-29 Jonathan Coles <[email protected]>
2981
2982 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
2983 Removed and called it show_exception_dialog() so that the exception
2984 handler can be set before the class is created.
2985
2986 * Thuban/UI/main.py (main): Install the exception handler before
2987 a ThubanApplication is created.
2988
2989 2003-07-29 Bernhard Herzog <[email protected]>
2990
2991 * po/it.po: New. Italian translation by Maurizio Napolitano
2992
2993 * po/ru.po: New. Russian translation by Alex Shevlakov
2994
2995 2003-07-29 Frank Koormann <[email protected]>
2996
2997 * Doc/manual/thuban-manual.xml: Extended section on supported
2998 projections.
2999
3000 2003-07-29 Frank Koormann <[email protected]>
3001
3002 * Doc/manual/thuban-manual.xml: gaspell-checked.
3003
3004 2003-07-29 Jonathan Coles <[email protected]>
3005
3006 * Doc/manual/images/3_5_legend.png: Added border to improve look
3007 on white background.
3008
3009 2003-07-29 Jonathan Coles <[email protected]>
3010
3011 * Doc/manual/thuban-manual.xml: Fixed grammar and typos. Added
3012 descriptions for the legend toolbar.
3013
3014 * Doc/manual/images/4_2_raster_layer_properties.png: Removed
3015 cursor from dialog box.
3016
3017 2003-07-28 Jonathan Coles <[email protected]>
3018
3019 * Doc/manual/thuban-manual.xml: More screenshots and more chapters.
3020
3021 * Doc/manual/images/2_4_session_tree.png,
3022 Doc/manual/images/3_5_legend.png, Doc/manual/images/3_rename_map.png,
3023 Doc/manual/images/4_2_layer_properties.png,
3024 Doc/manual/images/4_2_raster_layer_properties.png,
3025 Doc/manual/images/5_3_genclass.png,
3026 Doc/manual/images/5_classification.png,
3027 Doc/manual/images/6_projection.png,
3028 Doc/manual/images/7_1_table_view.png,
3029 Doc/manual/images/7_2_5_join.png: New screenshots.
3030
3031 2003-07-24 Jonathan Coles <[email protected]>
3032
3033 * Doc/manual/thuban-manual.xml: Chapter on Projection Management.
3034
3035 2003-07-24 Jonathan Coles <[email protected]>
3036
3037 * Doc/manual/thuban-manual.xml: Added EPS images and wrote
3038 chapter on Layer Management.
3039
3040 * Doc/manual/Makefile: New. Makefile to generate all formats for the
3041 manual and images.
3042
3043 2003-07-24 Bernhard Herzog <[email protected]>
3044
3045 * Thuban/Model/range.py, Thuban/version.py: Remove the #! line as
3046 it annoys lintian which warns about these files not being
3047 executable. The #! isn't necessary here since if you absolutely
3048 must execute them you can always say "python <filename>".
3049
3050 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Remove
3051 superfluous code to set brush and pen for point shapes
3052
3053 * Thuban/UI/viewport.py: Remove commented out code that wouldn't
3054 belong in viewport anyway
3055
3056 2003-07-24 Frank Koormann <[email protected]>
3057
3058 * Doc/manual/thuban-manual.xml: Added section on table management.
3059
3060 2003-07-24 Bernhard Herzog <[email protected]>
3061
3062 * test/runtests.py (main): Recognize the long "verbose" option
3063 correctly.
3064
3065 2003-07-22 Jonathan Coles <[email protected]>
3066
3067 * Doc/manual/thuban-manual.xml: Continue to write first revision
3068 of the manual.
3069
3070 * Thuban/UI/renderer.py (MapRenderer.render_map): Wrap method
3071 with Begin/EndDrawing() calls to ensure we aren't doing to
3072 many updates to the dc during rendering.
3073 (ScreenRenderer.draw_shape_layer): self.draw_point_shape takes
3074 a pen and brush argument so they need to be passed to the function.
3075
3076 * Thuban/UI/viewport.py (ViewPort.calc_min_max_scales): New.
3077 Calculates the minimum and maximum scale values. Factored out
3078 of set_view_transform so that it could be used to zoom all the
3079 way into a single point.
3080 (ViewPort.set_view_transform): Call calc_min_max_scales().
3081 (ViewPort.FitSelectedToWindow): Zoom to the maximum scale
3082 if only a single point is selected.
3083
3084 * Doc/manual/images/1_2_legend_close.png,
3085 Doc/manual/images/1_2_legend_dock.png,
3086 Doc/manual/images/1_2_mainwindow.png,
3087 Doc/manual/images/1_2_mainwindow.ps,
3088 Doc/manual/images/1_2_mainwindow.sk,
3089 Doc/manual/images/3_2_fullextent.png,
3090 Doc/manual/images/3_2_fulllayerextent.png,
3091 Doc/manual/images/3_2_fullshapeextent.png,
3092 Doc/manual/images/3_2_pan.png,
3093 Doc/manual/images/3_2_zoomin.png,
3094 Doc/manual/images/3_2_zoomout.png,
3095 Doc/manual/images/3_3_identify.png,
3096 Doc/manual/images/3_3_label.png,
3097 Doc/manual/images/3_5_invisible.png,
3098 Doc/manual/images/3_5_movedown.png,
3099 Doc/manual/images/3_5_moveup.png,
3100 Doc/manual/images/3_5_props.png,
3101 Doc/manual/images/3_5_tobottom.png,
3102 Doc/manual/images/3_5_totop.png,
3103 Doc/manual/images/3_5_visible.png: New. Images for the documentation.
3104
3105 2003-07-18 Bernhard Herzog <[email protected]>
3106
3107 * Thuban/UI/messages.py (MAP_REPLACED): New message.
3108
3109 * Thuban/UI/viewport.py (ViewPort.SetMap): Issue MAP_REPLACED
3110 after the new map has been assigned
3111
3112 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages):
3113 Delegate MAP_REPLACED to the canvas too
3114 (MainWindow.prepare_new_session): Removed. Thanks to the new
3115 MAP_REPLACED message it's no longer needed
3116 (MainWindow.OpenSession, MainWindow.NewSession):
3117 prepare_new_session has been removed.
3118
3119 * Thuban/UI/classifier.py (Classifier.__init__): Subscribe to
3120 MAP_REPLACED so that we can close the dialog if a new map is set.
3121 (Classifier.unsubscribe_messages): Unsubscribe from MAP_REPLACED
3122 (Classifier.map_replaced): Handle MAP_REPLACED by closing the
3123 dialog
3124
3125 * test/test_viewport.py (SimpleViewPortTest)
3126 (SimpleViewPortTest.test_default_size): Add doc-strings
3127 (ViewPortTest.setUp): Bind map to self.map so we can use it in
3128 tests. Subscribe to MAP_REPLACED messages too.
3129 (ViewPortTest.tearDown): No need to explicitly unsubscribe
3130 (ViewPortTest.test_set_map): New test for the SetMap method.
3131
3132 2003-07-18 Bernhard Herzog <[email protected]>
3133
3134 * test/test_viewport.py (SimpleViewPortTest.test_default_size):
3135 Move this test from ViewPortTest.setUp to this new separate test
3136 case. setUp is not the place for the actual tests.
3137 (ViewPortTest.test_inital_settings, ViewPortTest.setUp): Move some
3138 more of the test from setUp to the new test test_inital_settings.
3139 (ViewPortTest.test_win_to_proj, ViewPortTest.test_proj_to_win)
3140 (ViewPortTest.test_proj_conv): Split test_proj_conv into
3141 test_win_to_proj and test_proj_to_win and make the tests easier to
3142 understand
3143 (ViewPortTest.testFitRectToWindow, ViewPortTest.testZoomFactor)
3144 (ViewPortTest.testZoomOutToRect, ViewPortTest.testTranslate)
3145 (ViewPortTest.test_unprojected_rect_around_point)
3146 (ViewPortTest.test_find_shape_at, ViewPortTest.testTools):
3147 Reformat to increase readability.
3148
3149 2003-07-18 Bernhard Herzog <[email protected]>
3150
3151 * Thuban/UI/view.py (MapCanvas.OnLeftDown): Capture the mouse.
3152
3153 2003-07-18 Bernhard Herzog <[email protected]>
3154
3155 * test/runtests.py: The test suite can now be run without an X
3156 connection. To make sure this remains true, remove the DISPLAY
3157 environment variable so that an error occurs if the wxGTK is
3158 imported accidentally
3159
3160 2003-07-18 Bernhard Herzog <[email protected]>
3161
3162 * Thuban/UI/viewport.py: Remove unused imports
3163
3164 * Thuban/UI/view.py: Remove unused imports
3165
3166 2003-07-18 Bernhard Herzog <[email protected]>
3167
3168 * test/test_export.py Remove unused imports. The OutputTransform
3169 function is now in viewport.py and is called output_transform
3170 (TestScalebar.test_output_transform)
3171 (TestScalebar.test_OutputTransform): Renamed to
3172 test_output_transform and updated to use output_transform instead
3173 of OutputTransform
3174
3175 * Thuban/UI/view.py (OutputTransform): Moved to viewport.py and
3176 renamed.
3177 (MapCanvas.Export, MapPrintout.draw_on_dc): OutputTransform was
3178 renamed to output_transform
3179
3180 * Thuban/UI/viewport.py (OutputTransform, output_transform):
3181 Rename to output_transform
3182
3183 2003-07-18 Bernhard Herzog <[email protected]>
3184
3185 * Thuban/Model/layer.py (Layer.__init__): Rename
3186 classificationField to classificatin_column and init it here so
3187 that it can be used in SetClassificationColumn
3188 (Layer.GetClassificationColumn, Layer.GetClassificationField):
3189 Rename to GetClassificationColumn.
3190 (Layer.SetClassificationColumn, Layer.SetClassificationField):
3191 Rename to SetClassificationColumn and issue a LAYER_CHANGED
3192 message if the column changes.
3193 (Layer._classification_changed, Layer.ClassChanged): Rename to
3194 _classification_changed. Update the callers.
3195 (Layer.SetShapeStore): Further field->column renames.
3196
3197 * Thuban/Model/load.py (SessionLoader.start_classification)
3198 (SessionLoader.start_clpoint): Updates because of
3199 field->column method name changes in the Layer class
3200
3201 * Thuban/Model/save.py (SessionSaver.write_classification): Updates
3202 because of field->column method name changes in the Layer class
3203
3204 * Thuban/UI/classifier.py (Classifier.__init__)
3205 (Classifier._OnTry, Classifier._OnRevert): Updates because of
3206 field->column method name changes in the Layer class
3207
3208 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Updates
3209 because of field->column method name changes in the Layer class
3210
3211 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Updates because
3212 of field->column method name changes in the Layer class
3213
3214 * test/test_save.py (SaveSessionTest.testClassifiedLayer)
3215 (SaveSessionTest.testClassifiedLayer): Update because of
3216 field->column method name changes in the Layer class
3217
3218 * test/test_layer.py (SetShapeStoreTests.setUp)
3219 (SetShapeStoreTests.test_sanity): Update because of field->column
3220 method name changes in the Layer class
3221 (TestLayerModification.setUp): Subscribe to LAYER_CHANGED as well
3222 (TestLayerModification.test_sanity)
3223 (TestLayerModification.test_initial_settings): remove unsued code
3224 and rename to test_sanity.
3225 (TestLayerModification.test_set_classification): New test for
3226 SetClassification and SetClassificationField.
3227
3228 2003-07-18 Bernhard Herzog <[email protected]>
3229
3230 * test/test_classgen.py (TestFixedRamp.test): Extend test to check
3231 the non-fixed values as well. The old test would have accepted a
3232 fixed ramp that only returnes the fixed properties
3233
3234 2003-07-17 Jonathan Coles <[email protected]>
3235
3236 * Doc/manual/mainwindow.png, Doc/manual/mainwindow.xcf: Screen
3237 shots for the manual. The XCF file is the source image and
3238 has additional layers to support changes.
3239
3240 * Doc/manual/thuban-manual.xml: Wrote an initial Introduction.
3241
3242 * Thuban/UI/classifier.py (Classifier.__BuildClassification):
3243 Return both the new class and the field name.
3244
3245 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Don't
3246 fit the map to the window as this changes any zoom level that
3247 the user may have set.
3248
3249 2003-07-16 Jonathan Coles <[email protected]>
3250
3251 * Thuban/Model/classgen.py (generate_singletons,
3252 generate_uniform_distribution, generate_quantiles): Remove
3253 fixes parameter, but maintain the same functionality by having
3254 the calling function pass a FixedRamp object for the ramp.
3255 (FixedRamp): New. Adapts a ramp to have fixed property values.
3256
3257 * Thuban/Model/classification.py: Use new CLASS_CHANGED message.
3258 (Classification): Inherit from Publisher.
3259 (Classification.__init__): Remove the layer parameter.
3260 Classifications no longer need to have a parent layer.
3261 (Classification.GetField, Classification.GetFieldType,
3262 Classification.SetFieldInfo): Removed. The field name is stored
3263 in the layer, and the type can be retreived by calling
3264 Layer.GetFieldType().
3265 (Classification._set_layer, Classification.GetLayer): Removed.
3266 Classifications no longer have a parent layer.
3267
3268 * Thuban/Model/layer.py (Layer.Destroy): Unsubscribe from the
3269 classification.
3270 (Layer.SetShapeStore): Reset the classification first while
3271 we still have the old shape store to work with.
3272 (Layer.GetClassificationField, Layer.SetClassificationField):
3273 New. Method for getting/setting the field to classify on.
3274 (Layer.SetClassification): Simplified now that the layer
3275 simply has to hold a reference to the classification and not
3276 tell the classification who owns it.
3277 Fixes RTbug #2023.
3278
3279 * Thuban/Model/load.py (SessionLoader.start_classification):
3280 Set the field name on the layer, not the classification.
3281
3282 * Thuban/Model/messages.py: Add CLASS_CHANGED for when a
3283 classification is modified.
3284
3285 * Thuban/Model/save.py (SessionSaver.write_classification):
3286 Get the field name and type from the layer.
3287
3288 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Renamed
3289 parameter records to rows and add docstring. Fixes RTbug #1997.
3290
3291 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Use a fixed
3292 ramp when we need to fix certain values of a ramp rather than
3293 using the old fixes parameter. Fixes RTbug #2024.
3294
3295 * Thuban/UI/classifier.py (ClassGrid.CreateTable): Add fieldType
3296 parameter.
3297 (ClassTable.Reset): Add fieldType parameter and use it, rather
3298 than asking the classification.
3299 (Classifier.__init__): Remember the original class's field
3300 and ask the layer for the field type, rather than the classification.
3301 (Classifier.__SetGridTable): Retrieve the field and field type
3302 for the table because they are not in the classification.
3303 (Classifier._OnTry, Classifier._OnRevert): Set the classification
3304 field on the layer in addition to the classification itself.
3305
3306 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Get the
3307 classification field from layer.
3308
3309 * Thuban/UI/viewport.py (ViewPort.find_shape_at): Get the
3310 classification field from layer. Split up tests and remove
3311 *-imports. Fixes RTbug #1992.
3312
3313 * test/test_classgen.py (TestFixedRamp): Test for the FixedRamp class.
3314
3315 * test/test_classification.py
3316 (TestClassification.test_classification): Remove tests for methods
3317 that no longer exist.
3318
3319 * test/test_layer.py (SetShapeStoreTests.setUp): Classification
3320 __init__ no longer has a field parameter, use SetClassificationField.
3321 (SetShapeStoreTests.test_sanity): Use layer object to get class
3322 field info.
3323
3324 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Use
3325 SetClassificationField on layer to set class field info.
3326
3327 * test/test_viewport.py: Renamed from test/test_view.py.
3328
3329 2003-07-16 Jan-Oliver Wagner <[email protected]>
3330
3331 * Doc/manual/thuban-manual.xml: Added authors and an initial
3332 coarse structure.
3333
3334 2003-07-15 Bernhard Herzog <[email protected]>
3335
3336 * test/support.py (FloatComparisonMixin): This is a mix-in class
3337 and therefore should not be derived from any other class.
3338
3339 * test/test_range.py (RangeTest): FloatComparisonMixin is a
3340 mix-in, so derive from TestCase as well.
3341
3342 2003-07-15 Bernhard Herzog <[email protected]>
3343
3344 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Rework the
3345 draw_func handling a bit to remove one layer of indirection. This
3346 makes the renderer about 10% faster in the non-classifying case
3347 and the code a bit cleaner
3348 (MapRenderer.draw_point_shape): Add the pen and brush parameters
3349 and set them in the dc. Now the draw_point_shape method and
3350 wxproj's draw_polygon_shape function have basically the same
3351 signature so that both can be directly used as draw_func
3352
3353 2003-07-15 Bernhard Herzog <[email protected]>
3354
3355 * Thuban/Model/save.py (SessionSaver.write_classification): Encode
3356 string values (in addition to the labels) as UTF 8
3357
3358 * Thuban/Model/load.py (SessionLoader.start_clpoint): Decode the
3359 values if the field type is string
3360
3361 * test/test_save.py (SaveSessionTest.testClassifiedLayer): Test
3362 saving a session with non-ascii string classification values.
3363
3364 * test/test_load.py (TestClassification.file_contents)
3365 (TestClassification.test): Check for non-ascii values in string
3366 classifications
3367
3368 2003-07-14 Jonathan Coles <[email protected]>
3369
3370 * test/test_view.py: New. Tests for ViewPort.
3371
3372 2003-07-14 Frank Koormann <[email protected]>
3373
3374 * Thuban/Model/load.py (SessionLoader.start_map): Encode map
3375 title to latin1. Fixes https://intevation.de/rt/webrt?serial_num=2013
3376
3377 * test/test_load_0_8.py (TestUnicodeStrings): New, test load of
3378 unicode strings from session file: session title, map title and
3379 projection name.
3380
3381 2003-07-10 Jonathan Coles <[email protected]>
3382
3383 * Thuban/UI/viewport.py (Tool.MouseUp): Should have called
3384 drag_stop, not drag_move when the mouse is released.
3385
3386 2003-07-10 Jonathan Coles <[email protected]>
3387
3388 The most important part of this is the seperation of view.py into
3389 two pieces. viewport.py now has a class called ViewPort which
3390 contains all the non-wx parts of view.py and can therefore be
3391 tested. view.py contains only the wx-specific parts and is fairly
3392 simple.
3393
3394 * Thuban/UI/view.py: Stripped out all non-wx functionality. Fixes
3395 RTTbug #1992.
3396 * Thuban/UI/viewport.py: New. Contains non-wx view functionality.
3397 RTTbug #1992.
3398
3399 * Thuban/Model/classgen.py (generate_singletons,
3400 generate_uniform_distribution, generate_quantiles):
3401 Added 'fixes' parameter so that property attributes can
3402 be held constant over the generated classification groups.
3403 (CustomRamp.GetProperties): Remove unused variables.
3404
3405 * Thuban/Model/map.py (Map.SetProjection): Send the old
3406 projection as an argument to listeners of the MAP_PROJECTION_CHANGED
3407 event.
3408
3409 * Thuban/Model/table.py (table_to_dbf, table_to_csv): Added 'records'
3410 parameter which is a list of records that restricts which
3411 records are saved. Fixes RTbug #1997.
3412
3413 * Thuban/UI/application.py (ThubanApplication.ShowExceptionDialog):
3414 Port exception dialog from GREAT-ER. Fixes RTbug #1993.
3415
3416 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Add controls
3417 to allow the user to fix line color/width on generated groups.
3418 (ClassGenDialog.OnOK): Use new 'fixes' parameter of the generate_*
3419 functions to optionally fix group properties.
3420
3421 * Thuban/UI/main.py (main): Set exception hook to the
3422 ShowExceptionDialog. Fixes RTbug #1993.
3423
3424 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): Raise
3425 the table window when it is selectd to be shown.
3426
3427 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Add an
3428 Export Selection button and move the export buttons underneath
3429 the table.
3430 (QueryTableFrame.UpdateStatusText): Added event argument so
3431 that it can respond to grid selection events. The status text
3432 is now updated even when the table is not associated with a
3433 layer as was previously assumed.
3434 (QueryTableFrame.OnGridSelectRange, OnGridSelectCell): Removed.
3435 UpdateStatusText responds to these events.
3436 (QueryTableFrame.OnSaveAs): Renamed to doExport.
3437 (QueryTableFrame.doExport): Helper function that saves the
3438 entire table, or selected rows, to a file.
3439 (QueryTableFrame.OnExport, QueryTableFrame.OnExportSel): New.
3440 Respond to export button events and call doExport.
3441
3442 * extensions/thuban/gdalwarp.cpp (ProjectRasterFile): Make sure
3443 the function doesn't return NULL without first setting a Python
3444 Error.
3445
3446 * test/runtests.py (main): Only print "Unknown option" for
3447 unsupported options.
3448
3449 * test/support.py (FloatComparisonMixin.assertFloatEqual): Take
3450 optional epsilon argument to specify floating point accuracy.
3451 (FloatComparisonMixin.assertFloatSeqEqual): Call assertFloatEqual
3452 for each item test.
3453
3454 * test/test_csv_table.py (TestCSVTable.test_table_to_cvs): Add
3455 tests for saving selected records.
3456
3457 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
3458 tests for saving selected records.
3459
3460 * test/test_map.py (TestMapWithContents.test_set_projection):
3461 MAP_PROJECTION_CHANGED events send the old projection.
3462
3463 * test/test_session.py
3464 (TestSessionWithContent.test_forward_map_projection):
3465 MAP_PROJECTION_CHANGED events send the old projection.
3466
3467 * test/test_table.py (TableTest): Update tests to use non-deprecated
3468 functions.
3469
3470 2003-07-08 Bernhard Herzog <[email protected]>
3471
3472 * Thuban/Model/transientdb.py (TransientTableBase.Width): The type
3473 constants in the column objects are the standard ones defined in
3474 the table module.
3475
3476 * test/test_transientdb.py
3477 (TestTransientTable.test_transienttable_to_dbf): New. Test whether
3478 exporting transient tables as DBF works. This should catch the bug
3479 just fixed in TransientTableBase.Width.
3480
3481 2003-07-08 Bernhard Herzog <[email protected]>
3482
3483 * Thuban/Model/classgen.py (CustomRamp.GetProperties): Compute the
3484 interpolated colors correctly.
3485
3486 * test/test_classgen.py (TestCustomRamp.test_color_interpolation):
3487 New. Test case for the fix in classgen.py
3488
3489 2003-07-08 Bernhard Herzog <[email protected]>
3490
3491 * test/runtests.py (main): Make the default output less verbose
3492 and add a verbosity option (-v) to get the old output
3493
3494 2003-07-08 Bernhard Herzog <[email protected]>
3495
3496 * Resources/XML/thuban-0.9.dtd: New. This will become the DTD for
3497 0.9.
3498
3499 * Thuban/Model/transientdb.py (TransientJoinedTable.JoinType):
3500 New. Return the join type
3501
3502 * Thuban/Model/save.py (SessionSaver.write_session): Use new 0.9
3503 DTD
3504 (SessionSaver.write_data_containers): Save the join type for
3505 joined tables
3506
3507 * Thuban/Model/load.py (SessionLoader.__init__): Add the new 0.9
3508 namespace
3509 (SessionLoader.start_jointable): Handle the jointype attribute
3510
3511 * test/test_load_0_8.py: New. Effectively a copy of test_load.py
3512 as of Thuban 0.8. These are now tests to determine whether Thuban
3513 can still read files generated by Thuban 0.8
3514
3515 * test/test_load.py (LoadSessionTest.dtd)
3516 (TestSingleLayer.file_contents)
3517 (TestLayerVisibility.file_contents, TestLabels.file_contents)
3518 (TestLayerProjection.file_contents)
3519 (TestRasterLayer.file_contents, TestJoinedTable.file_contents)
3520 (TestJoinedTable.file_contents)
3521 (TestLoadError.file_contents): Update for new DTD
3522 (TestJoinedTable.file_contents, TestJoinedTable.setUp): Add test
3523 for new join type attribute
3524
3525 * test/test_save.py (SaveSessionTest.dtd)
3526 (SaveSessionTest.testEmptySession)
3527 (SaveSessionTest.testSingleLayer)
3528 (SaveSessionTest.testLayerProjection)
3529 (SaveSessionTest.testRasterLayer)
3530 (SaveSessionTest.testClassifiedLayer)
3531 (SaveSessionTest.test_dbf_table)
3532 (SaveSessionTest.test_joined_table): Update for new DTD
3533 (SaveSessionTest.test_joined_table): Add test for new join type
3534 attribute
3535
3536 2003-07-04 Bernhard Herzog <[email protected]>
3537
3538 * Thuban/Model/table.py (_find_dbf_column_names): New. Helper
3539 function for table_to_dbf
3540 (table_to_dbf): Deal with names longer than the 10 character limit
3541
3542 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): Add
3543 doc-string
3544 (TestTableToDBF.test_table_to_dbf_long_col_names): New test for
3545 long column names
3546
3547 2003-07-03 Bernhard Herzog <[email protected]>
3548
3549 * Doc/manual/thuban-manual.xml: Fix the CVS Revision Tag syntax
3550
3551 2003-07-03 Bernhard Herzog <[email protected]>
3552
3553 * Doc/manual/thuban-manual.xml, Doc/manual/README: New. Skeleton
3554 for the Thuban manual and README with some basic information about
3555 the manual
3556
3557 2003-07-03 Bernhard Herzog <[email protected]>
3558
3559 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
3560 Update doc-string
3561 (TransientJoinedTable.create): Do not modify the column objects of
3562 the input tables in place and copy all columns of the input tables
3563 into the joined table after all.
3564
3565 * test/test_transientdb.py
3566 (TestTransientTable.test_transient_joined_table_same_column_name):
3567 Update to reflect the new behavior
3568 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
3569 Update to reflect the new behavior
3570 (TestTransientTable.test_transient_joined_table_name_collisions_dont_modify_in_place):
3571 New test case for a bug which modified the column objects in place
3572
3573 2003-07-02 Jonathan Coles <[email protected]>
3574
3575 * Thuban/Model/classgen.py (generate_singletons,
3576 generate_uniform_distribution, generate_quantiles,
3577 GenQuantiles0): Make sure maxValue isn't less than
3578 one, otherwise we could divide by zero.
3579
3580 * test/test_classgen.py (ClassGenTest.doClassRangeTest,
3581 ClassGenTest.doClassSingleTest): Call doBoundsTest to
3582 check the end classification groups against the
3583 proper property values.
3584 (ClassGenTest.doBoundsTest): New. Checks the first and
3585 last classification groups to make sure their properties
3586 are the correct upper and lower bounds for a color ramp.
3587
3588 2003-07-02 Jonathan Coles <[email protected]>
3589
3590 * Thuban/Model/classgen.py (generate_singletons,
3591 generate_uniform_distribution, generate_quantiles,
3592 GenQuantiles0): The denominator was one to high when
3593 calculating the index for the ramp causing the index
3594 to never to reach one.
3595
3596 2003-07-02 Jonathan Coles <[email protected]>
3597
3598 Changed the singature of ClassGroupRange.__init__ and
3599 ClassGroupRange.SetRange() so that the min/max values are
3600 passed as a tuple. This makes a better calling scheme for
3601 when a Range object is passed instead.
3602
3603 * Thuban/Model/classgen.py: Fixed parameters to
3604 ClassGroupRange constructor.
3605
3606 * Thuban/Model/classification.py (ClassGroupRange.__init__):
3607 Consolidate the min/max parameters into a single _range which
3608 can either be a tuple or a Range object.
3609 (ClassGroupRange.SetRange): Consolidate the min/max parameters
3610 into a single _range which can either be a tuple or a Range object.
3611
3612 * Thuban/Model/load.py (SessionLoader.start_clrange): Fix
3613 call to ClassGroupRange constructor to use a tuple.
3614
3615 * Thuban/Model/layer.py (Layer.SetClassification): Switch
3616 the classification instance variable to the new class
3617 before calling _set_layer otherwise subscribers to a
3618 LAYER_CHANGED event will not see any difference.
3619
3620 * test/test_classification.py: Fix tests of ClassGroupRange
3621 so that they use the new signature.
3622
3623 * test/test_load.py: Fix use of ClassGroupRange so that it
3624 uses the new signature.
3625
3626 * test/test_load_0_2.py: Fix use of ClassGroupRange so that it
3627 uses the new signature.
3628
3629 * test/test_save.py: Fix use of ClassGroupRange so that it
3630 uses the new signature.
3631
3632
3633 2003-07-01 Jonathan Coles <[email protected]>
3634
3635 * Thuban/Model/classgen.py: Fixes RTbug #1972, 1971.
3636 Import used objects/class from color.
3637 (generate_singletons): We don't
3638 need the numGroups parameter anymore because we are using
3639 the new ramps with GetProperties().
3640 (generate_uniform_distribution): Use new ramp method
3641 GetProperties().
3642 (generate_quantiles, GenQuantiles0): Use new ramp method
3643 GetProperties().
3644 (CustomRamp.SetNumGroups): Removed. The ramps now map
3645 a value from 0 to 1 to class properties so the number
3646 of groups is not needed ahead of time.
3647 (CustomRamp.next): Removed. CustomRamp does not support
3648 interation anymore.
3649 (CustomRamp.GetProperties): Returns a ClassGroupProperties
3650 object based on the index value from 0 to 1 that is
3651 passed to it.
3652 (GreyRamp, RedRamp, GreenRamp, BlueRamp, GreenToRedRamp):
3653 Made into instances of Monochromatic class instread of
3654 deriving from it.
3655 (HotToCold.SetNumGroups): Removed. See CustomRamp.
3656 (HotToCold.next): Removed. See CustomRamp.
3657
3658 * Thuban/Model/classification.py: Fixes RTbug #1973, 1971.
3659 (Classification.SetField, Classification.SetFieldType):
3660 Replaced with SetFieldInfo.
3661 (Classification.SetFieldInfo): New. Does a better job of
3662 what SetField and SetFieldType used to do by combining
3663 their function since they should really always be done
3664 at the same time.
3665 (Classification.SetLayer): Renamed to _set_layer.
3666 (Classification._set_layer): Should only be called from
3667 Layer's SetClassification. This does not cause a recursive
3668 call as SetLayer did because we know that Layer knows about
3669 the classification.
3670
3671 * Thuban/Model/color.py: Fixes RTbug #1971.
3672 (_Transparent): Renamed from Transparent so it doesn't
3673 conflict with the module variable.
3674 (Transparent, Black): Renamed from Color.Transparent,
3675 Color.Black so they are not class variables.
3676
3677 * Thuban/Model/layer.py: Fixes RTbug #1971, 1973.
3678 (Layer.Destroy): We don't need to call SetClassification
3679 anymore to clear out the back reference in the classifcation
3680 to the layer. It's better to set it to None using _set_layer,
3681 and we won't be creating another clas object too.
3682 (Layer.SetClassification): Classification._set_layer is not
3683 recursive so remove all the locking variables. Also clean
3684 up the code so that it remains unchanged if something fails.
3685
3686 * Thuban/Model/load.py: Fixes RTbug #1971.
3687 (SessionLoader.start_classification): Call
3688 Classification.SetFieldInfo().
3689
3690 * Thuban/Model/save.py: Removed import of Color which wasn't
3691 being used.
3692
3693 * Thuban/UI/classgen.py: Fixes RTbug #1972.
3694 (ClassGenDialog.__init__): Color ramps are now instances
3695 already so we don't need to create any new objects.
3696 (ClassGenDialog.OnOK): Check for numGroups is no longer
3697 necessary because we never use it.
3698
3699 * Thuban/UI/classifier.py: Fixes RTbug #1971.
3700 (Classifier.__BuildClassification, Classifier.__SetGridTable):
3701 Call Classification.SetFieldInfo() instead of SetFieldType.
3702
3703 * Thuban/UI/renderer.py: Fixes RTbug #1971.
3704
3705 * Thuban/UI/view.py: Fixes RTbug #1974, 1971.
3706 (MapCanvas.__init__): Subscribe to the idle time event. Set
3707 background color to white.
3708 (MapCanvas.OnPaint): Set a flag indicating that we should
3709 render the map during idle time. If we already have a bitmap
3710 just draw it now.
3711 (MapCanvas.OnIdle): New. Render the map only during idle time.
3712 This also fixes a problem with the busy cursor under gtk.
3713
3714 * test/test_classgen.py (ClassGenTest.test_generate_singletons):
3715 Fix calls to generate_singletons because the signature changed.
3716
3717 * test/test_classification.py: Fix color references and
3718 change calls to Classification.[SetField|SetFieldType] to
3719 SetFieldInfo.
3720
3721 * test/test_load.py: Fix color references.
3722
3723 * test/test_load_0_2.py: Fix color references.
3724
3725 * test/test_save.py (SaveSessionTest.testClassifiedLayer):
3726 Change calls to Classification.[SetField|SetFieldType] to
3727 SetFieldInfo.
3728
3729 2003-07-01 Frank Koormann <[email protected]>
3730
3731 MERGE from the greater-ms3 branch.
3732
3733 * test/test_transientdb.py
3734 (TestTransientTable.test_transient_joined_table_with_equal_column_names):
3735 New. Test join of two tables with partly equal column names.
3736
3737 * Thuban/Model/transientdb.py (TransientJoinedTable.create):
3738 If duplicates in left and right tables column names are found,
3739 append '_' (underscores) to the name until it is unique.
3740 Create always new internal names for the resulting table and reference
3741 columns in the join statement with <table>.<column>
3742
3743 2003-07-01 Bernhard Herzog <[email protected]>
3744
3745 * test/test_transientdb.py
3746 (TestTransientTable.test_transient_joined_table_same_column_name):
3747 New. Test whether joining on columns with the same names in both
3748 tables works.
3749
3750 * Thuban/Model/transientdb.py (TransientJoinedTable.create): Make
3751 sure to use the right internal names even when joining on field
3752 with the same names in both tables. Also, detect duplicate names
3753 in the joined table correctly.
3754
3755 2003-07-01 Frank Koormann <[email protected]>
3756
3757 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
3758 Reverse List of layers to render in same order as in desktop legend.
3759
3760 2003-06-30 Jonathan Coles <[email protected]>
3761
3762 * Thuban/version.py (make_tuple): Takes a version string
3763 and splits it into a tuple of at most three integers.
3764 Used make_tuple() to make tuple versions of the version
3765 numbers.
3766
3767 * Thuban/UI/about.py: Add Thuban email addresses.
3768
3769 2003-06-30 Jonathan Coles <[email protected]>
3770
3771 * Thuban/version.py: SQLite/PySQLite version dependencies
3772 were too high.
3773
3774 2003-06-30 Jonathan Coles <[email protected]>
3775
3776 * Thuban/version.py: Update version to 0.8.1
3777
3778 * MANIFEST.in: Added Projections so that default.proj is
3779 included.
3780
3781 2003-06-26 Jonathan Coles <[email protected]>
3782
3783 New About box with lots more information including library
3784 versions and credits. More/better version checking before
3785 Thuban starts.
3786
3787 * Thuban/UI/about.py: New. New About box that displays
3788 library version information and credits.
3789
3790 * Thuban/version.py: Added new 'versions' dictionary which
3791 contains the verions of various libraries which are checked
3792 when the module loads.
3793 (verify_versions): Check all version numbers and returns
3794 a list of errors.
3795
3796 * Thuban/UI/classifier.py (Classifier.__EnableButtons):
3797 Reset the status of the buttons as the situation warrants,
3798 but in a better more reliable way by not relying on the
3799 current status to determine what needs to change.
3800
3801 * Thuban/UI/main.py (wxCHECK_VERSION): Removed. Not needed.
3802 (verify_versions): Remove most of the code since it is
3803 now in Thuban.version.verify_versions.o
3804
3805 * Thuban/UI/mainwindow.py (MainWindow.About): Call new
3806 About box in Thuban.UI.about.
3807
3808 * extensions/thuban/gdalwarp.cpp (get_gdal_version): New.
3809 Returns the version of gdal library being used as a string.
3810
3811 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
3812 Removed.
3813 (get_proj_version): Return the version of PROJ that the file
3814 was compiled with.
3815 (get_gtk_version): Return th version of GTK that the file
3816 was compiled with.
3817
3818 2003-06-25 Jonathan Coles <[email protected]>
3819
3820 * Thuban/UI/classifier.py (Classifier.EditSymbol): The parent
3821 of the SelectPropertiesDialog should be self so the window
3822 appears on top.
3823 (ClassGroupPropertiesCtrl.DoEdit): The parent
3824 of the SelectPropertiesDialog should be self so the window
3825 appears on top.
3826
3827 * Thuban/UI/resource.py: Cleaned up how we determine file
3828 extensions.
3829 (GetImageResource): Return an wxImage from our Resources.
3830
3831 2003-06-24 Jonathan Coles <[email protected]>
3832
3833 * Thuban/UI/renderer.py (ExportRenderer.render_legend):
3834 Check that a layer has a classification before trying
3835 to get it. Raster layers don't have classifications.
3836
3837 2003-06-23 Jonathan Coles <[email protected]>
3838
3839 * setup.py: Add Resources/XML to resource list.
3840
3841 2003-06-23 Jonathan Coles <[email protected]>
3842
3843 * setup.cfg: Fix copyright dates
3844
3845 2003-06-23 Jonathan Coles <[email protected]>
3846
3847 * MANIFEST.in: Update with Resources/XML
3848
3849 * setup.py: Don't include Locale resources yet as we don't
3850 have any and it causes problems building the distribution
3851 for Windows. Update version to 0.8.0.
3852
3853 * Doc/thuban.dtd: Removed since it is now in Resources/XML.
3854
3855 * Thuban/UI/mainwindow.py: Add blank line at the end because
3856 file was not being read correctly building the Windows
3857 distribution.
3858
3859 2003-06-23 Jonathan Coles <[email protected]>
3860
3861 * Thuban/UI/mainwindow.py (MainWindow.About): Fix text.
3862
3863 * Thuban/version.py: Temporarily update longversion for
3864 the 0.8 release so that it doesn't have the cvs revision.
3865
3866 2003-06-23 Jonathan Coles <[email protected]>
3867
3868 * Thuban/UI/common.py (ThubanBeginBusyCursor): Call wxSafeYield
3869 to make sure that we don't create reentrant possibilities with
3870 wxYield.
3871
3872 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxBeginBusyCursor()
3873 directly to avoid the wxSafeYield() call which generates an
3874 OnPaint event causing infinite recursion. Don't try to catch
3875 exception anymore. This was for before there were limits on map
3876 scaling.
3877
3878 2003-06-23 Bernhard Herzog <[email protected]>
3879
3880 Bug fix for RT #1961:
3881
3882 * Thuban/Model/load.py (SessionLoader.start_derivedshapesource):
3883 Register DerivedShapestores with the session
3884
3885 * Thuban/Model/session.py (Session.Tables): Make sure each table
3886 is only listed once.
3887
3888 * test/test_load.py (TestJoinedTable.test): Add check_format call.
3889 Update file contents to match the one written out.
3890
3891 2003-06-20 Bernhard Herzog <[email protected]>
3892
3893 * test/xmlsupport.py (SaxEventLister.startElementNS)
3894 (SaxEventLister.endElementNS): Do not include the qname. Python
3895 2.2.1 and 2.2.2 and 2.2.3 differ in this regard. In 2.2.1 qname it
3896 is (presumably incorrectly) None, whereas it's a string with the
3897 element name in the later versions.
3898
3899 * test/test_xmlsupport.py (TestEventList.test_even_list_simple)
3900 (TestEventList.test_even_list_namespace): Update tests to reflect
3901 the new behaviour
3902 (TestEventList.test_even_list_id_normalization): Fix doc-string
3903
3904 2003-06-20 Jonathan Coles <[email protected]>
3905
3906 * Thuban/Model/layer.py (BaseLayer.HasShapes): New. Overridden
3907 by deriving classes to determine if that layer supports shapes.
3908 (Layer): Override HasShapes and return true.
3909
3910 * Thuban/UI/classgen.py: Use Thuban[Begin|End]BusyCursor()
3911 instead of a direct call to wx[Begin|End]CusyCursor().
3912 (GenUniquePanel._OnRetrieve): Set busy cursor while retrieving
3913 table data.
3914
3915 * Thuban/UI/common.py (ThubanBeginBusyCursor, ThubanEndBusyCursor):
3916 New. Wrappers around the wxWindows functions that allow us to
3917 make additional calls such as wxYield which gives the native
3918 system a chance to update the cursor correctly.
3919
3920 * Thuban/UI/tableview.py: Use Thuban[Begin|End]BusyCursor()
3921 instead of a direct call to wx[Begin|End]CusyCursor().
3922
3923 * Thuban/UI/view.py: Use Thuban[Begin|End]BusyCursor()
3924 instead of a direct call to wx[Begin|End]CusyCursor().
3925 (MapCanvas.find_shape_at): Check if the current search layer
3926 support shapes, otherwise go on to the next layer.
3927
3928 * test/test_layer.py: Add tests in each type of layer for
3929 HasClassification() and HasShapes()
3930
3931 2003-06-20 Jonathan Coles <[email protected]>
3932
3933 * Thuban/UI/view.py (MapCanvas.OnPaint): Call wxYield after
3934 turning on the busy cursor to allow the system to change the
3935 cursor before we begin painting. This fixes a problem that
3936 was occuring only under GTK. Fixes RTbug #1840.
3937
3938 2003-06-20 Bernhard Herzog <[email protected]>
3939
3940 * Resources/XML/thuban-0.8.dtd: New DTD for the new file format
3941 version.
3942
3943 * Thuban/Model/save.py (sort_data_stores): New. Make topological
3944 sort of the data sources so they can be written with sources that
3945 data sources that depend on other data sources come after the
3946 sources they depend on.
3947 (SessionSaver.__init__): Add idmap instance variable to map from
3948 objects to the ids used in the file.
3949 (SessionSaver.get_id, SessionSaver.define_id)
3950 (SessionSaver.has_id): New. Methods to manage the idmap
3951 (SessionSaver.write): Use thuban-0.8.dtd
3952 (SessionSaver.write_session): Add a namespace on the session and
3953 write out the data sources before the maps.
3954 (SessionSaver.write_data_containers): New. Write the data
3955 containers.
3956 (SessionSaver.write_layer): Layer elements now refer to a
3957 shapestore and don't contain filenames anymore.
3958
3959 * Thuban/Model/load.py (LoadError): Exception class to raise when
3960 errors in the files are discovered
3961 (SessionLoader.__init__): Define dispatchers for elements with a
3962 thuban-0.8 namespace too.
3963 (SessionLoader.check_attrs): New helper method to check and
3964 convert attributes
3965 (AttrDesc): New. Helper class for SessionLoader.check_attrs
3966 (SessionLoader.start_fileshapesource)
3967 (SessionLoader.start_derivedshapesource)
3968 (SessionLoader.start_filetable, SessionLoader.start_jointable):
3969 Handlers for the new elements in the new fileformat
3970 (SessionLoader.start_layer): Handle the shapestore attribute in
3971 addition to filename.
3972 (SessionLoader.start_table, SessionLoader.end_table): Removed.
3973 They were never used in the old formats and aren't needed for the
3974 new.
3975
3976 * Thuban/Model/session.py (Session.DataContainers): New method to
3977 return all "data containers", i.e. shapestores and tables
3978
3979 * test/xmlsupport.py (SaxEventLister.__init__)
3980 (SaxEventLister.startElementNS, sax_eventlist): Add support to
3981 normalize IDs.
3982
3983 * test/test_xmlsupport.py
3984 (TestEventList.test_even_list_id_normalization): New test case for
3985 id normalization
3986
3987 * test/test_load.py (LoadSessionTest.check_format): Use ID
3988 normalization
3989 (LoadSessionTest.thubanids, LoadSessionTest.thubanidrefs): New
3990 class atrributes used for ID normalization
3991 (TestSingleLayer, TestLayerVisibility, TestLabels.test)
3992 (TestLayerProjection.test, TestRasterLayer.test): Adapt to new
3993 file format
3994 (TestJoinedTable): New test for loading sessions with joined
3995 tables.
3996 (TestLoadError): New. Test whether missing required attributes
3997 cause a LoadError.
3998
3999 * test/test_save.py (SaveSessionTest.thubanids)
4000 (SaveSessionTest.thubanidrefs): New class attributes for ID
4001 normalization in .thuban files.
4002 (SaveSessionTest.compare_xml): Use id-normalization.
4003 (SaveSessionTest.testEmptySession)
4004 (SaveSessionTest.testLayerProjection)
4005 (SaveSessionTest.testRasterLayer)
4006 (SaveSessionTest.testClassifiedLayer): Adapt to new file format.
4007 (SaveSessionTest.testLayerProjection): The filename used was the
4008 same as for testSingleLayer. Use a different one.
4009 (SaveSessionTest.test_dbf_table)
4010 (SaveSessionTest.test_joined_table): New test cases for saving the
4011 new data sources structures.
4012 (TestStoreSort, MockDataStore): Classes to test the sorting of the
4013 data stores for writing.
4014
4015 * test/runtests.py: Add CVS keywords
4016
4017 2003-06-20 Jonathan Coles <[email protected]>
4018
4019 * test/test_session.py
4020 (UnreferencedTablesTests.test_unreferenced_tables_with_joins):
4021 Use the cultural_landmark-point.dbf file for the store so that
4022 the table rows and shape count match.
4023
4024 2003-06-20 Jonathan Coles <[email protected]>
4025
4026 * Thuban/Model/data.py (DerivedShapeStore.__init__): Raise
4027 an exception if the number of shapes is different from the
4028 number of rows in the table. Address RTbug #1933.
4029
4030 * test/test_layer.py (TestLayer.test_derived_store): Add
4031 a test for the new exception in DerivedShapeStore.__init__.
4032
4033 * test/support.py (FloatTestCase): Removed since there is
4034 already FloatComparisonMixin. Fixes RTbug #1954.
4035 (FloatComparisonMixin.assertFloatEqual): Include test for
4036 infinity that was part of FloatTestCase.
4037
4038 * test/test_range.py (RangeTest): Inherit from
4039 support.FloatComparisonMixin now that we don't have
4040 support.FloatTestCase.
4041
4042 2003-06-20 Bernhard Herzog <[email protected]>
4043
4044 * test/test_save.py (SaxEventLister, sax_eventlist): Removed. Use
4045 the implementation in xmlsupport instead.
4046 (SaveSessionTest.compare_xml): sax_eventlist is now in xmlsupport
4047
4048 * test/test_proj.py: Import sax_eventlist from xmlsupport instead
4049 of test_save
4050
4051 2003-06-20 Bernhard Herzog <[email protected]>
4052
4053 * test/test_load.py (LoadSessionTest.check_format): New helper
4054 method to make sure the test files we load might have been written
4055 by the current thuban version.
4056 (ClassificationTest.TestLayers, TestSingleLayer.test)
4057 (TestLayerVisibility.test, TestClassification.test)
4058 (TestLabels.test, TestLayerProjection.test, TestRasterLayer.test):
4059 Add check_format() calls and fix the thuban data to match the data
4060 that would be written by saving the session loaded from it.
4061
4062 * test/xmlsupport.py (SaxEventLister, sax_eventlist): Copies of
4063 the same class and function in test_save.
4064
4065 * test/test_xmlsupport.py (TestEventList): New. test cases for
4066 sax_eventlist
4067
4068 2003-06-20 Bernhard Herzog <[email protected]>
4069
4070 * Resources/XML/thuban.dtd: Add comment about which versions of
4071 Thuban are covered by this DTD
4072 (map): Fix content model for layers and raster layers. There can
4073 be any number or layers and raster layers in any order.
4074
4075 2003-06-20 Jonathan Coles <[email protected]>
4076
4077 This is mainly about fixing RTbug #1949.
4078
4079 * Thuban/Model/classification.py: Remove "from __future__"
4080 import statement since python 2.2 is the earliest supported
4081 version.
4082
4083 * Thuban/Model/proj.py (Projection.GetProjectedUnits): New.
4084 Currently returns PROJ_UNITS_METERS or PROJ_UNITS_DEGREES
4085 depending on the units this projection *forwards* into.
4086
4087 * Thuban/Model/save.py (SessionSaver.write_classification):
4088 Remove unnecessary use of lambdas and nested functions.
4089
4090 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Do scale
4091 adjustment here if the map projection uses degrees.
4092
4093 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Remove
4094 scale adjust code since it is now done before calling
4095 this method. Don't do anything if the map projection
4096 is None.
4097
4098 2003-06-19 Bernhard Herzog <[email protected]>
4099
4100 Move version specific load tests to their own file.
4101
4102 * test/test_load.py: Expand the doc-string to explain a bit how to
4103 handle file format changes.
4104 (TestClassification.test): Update the docstring as this test is
4105 not about Thuban 0.2 anymore.
4106
4107 * test/test_load_0_2.py: New file with the load tests for thuban
4108 files created with Thuban 0.2 and earlier.
4109
4110 2003-06-19 Bernhard Herzog <[email protected]>
4111
4112 Add XML validation to some of the tests. Validation will only be
4113 done if pyRXP is installed (http://reportlab.com/xml/pyrxp.html).
4114 To make the DTD available to the test cases it's moved into
4115 Resources/XML
4116
4117 * Resources/XML/thuban.dtd: New. This is now the real Thuban DTD
4118 for versions up to and including 0.2. Two slight changes: added an
4119 encoding specification and fixed the comment which refered to
4120 GRASS, not Thuban
4121
4122 * test/xmlsupport.py: New support module for tests involving XML.
4123 Currently there's a mix-in class for XML validation.
4124
4125 * test/test_xmlsupport.py: New. Tests for the xmlsupport module
4126
4127 * test/test_save.py (SaveSessionTest): Derive from ValidationTest
4128 so that we can validate the
4129 (SaveSessionTest.testEmptySession)
4130 (SaveSessionTest.testSingleLayer)
4131 (SaveSessionTest.testSingleLayer)
4132 (SaveSessionTest.testLayerProjection)
4133 (SaveSessionTest.testRasterLayer)
4134 (SaveSessionTest.testClassifiedLayer): Validate the generated XML
4135
4136 * test/runtests.py (main): Call print_additional_summary instead
4137 of print_garbage_information
4138
4139 * test/support.py (resource_dir): New function to return the
4140 "Resource" subdirectory
4141 (print_additional_summary): New function to combine several
4142 summary functions
4143 (run_tests): Use print_additional_summary instead of calling
4144 print_garbage_information directly
4145
4146 2003-06-19 Bernhard Herzog <[email protected]>
4147
4148 * Doc/thuban.dtd (classification): Correct the content model of
4149 the classification element.
4150 (projection): Add the "name" attribute
4151
4152 2003-06-19 Frank Koormann <[email protected]>
4153
4154 MERGE from the greater-ms3 branch.
4155
4156 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Apply conversion to
4157 scale if projection is latlong to get better estimate.
4158
4159 Fix problem of hidden properties dialog under windows after double
4160 click on layer tree:
4161 The tree control always gets an Expanded / Collapsed event after
4162 the ItemActivated on double click, which raises the main window again. We add a second ItemActivated event to the queue, which simply
4163 raises the already displayed window.
4164
4165 * Thuban/UI/legend.py (LegendTree.__init__): Instance variable
4166 raiseProperties initialized to prevent endless loops
4167 (LegendTree._OnItemActivated): Depending on self.raiseProperties
4168 simply raise the properties or open the dialog and issue a second
4169 event.
4170
4171 2003-06-18 Jonathan Coles <[email protected]>
4172
4173 * setup.py: Fix a few problems that occured under Windows.
4174
4175 2003-06-18 Jonathan Coles <[email protected]>
4176
4177 When Thuban loaded the map was redrawn twice because the
4178 legend was being opened after the mainwindow was created
4179 and not during its creation. This meant the map was drawn
4180 initially and then had to be redrawn when the legend
4181 caused the display to change. Now the legend is opened
4182 in the mainwindow constructor which resolves this issue.
4183
4184 Also, although we were checking for the existence of
4185 gdal and gdalwarp modules, the gdalwarp extension was
4186 still being compiled (which may fail if the system doesn't
4187 have gdal installed). the build_ext command to setup.py
4188 now accepts the flags --with-gdal and --without-gdal.
4189 If --without-gdal is specified setup.py will try to
4190 use the gdal parameters specified by gdal-config. Under
4191 windows, those parameters have to be set in setup.py
4192 as with proj4 an wxWindows.
4193
4194 * setup.py: Use a list instead of seperate variables for
4195 extension parameters so we can create a generic function
4196 that runs an appropriate *-config script.
4197 (run_cs_script): Renamed from run_wx_script and modified
4198 to accept a second argument which is a list of lists to
4199 be filled in by the values returned from running the command.
4200 (thuban_build_ext): New. Extends the build_ext command and
4201 provides the options --with-gdal/--without-gdal which then
4202 optionally includes the gdalwarp extension.
4203
4204 * Thuban/Model/resource.py: First check if we can import
4205 the gdalwarp Thuban extension before checking for gdal.
4206 Also added some comments.
4207
4208 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Check if
4209 the map is None which may be the case if none has been loaded
4210 yet.
4211
4212 * Thuban/UI/main.py (main): Remove call to ShowLegend.
4213
4214 * Thuban/UI/mainwindow.py (MainWindow.__init__): Call ShowLegend().
4215
4216 * Thuban/UI/renderer.py: Check for gdal support before importing
4217 gdalwarp.
4218 (MapRenderer.render_map): Only try to optimize if we have gdal
4219 support otherwise nothing will get drawn.
4220
4221 * Thuban/UI/view.py (MapCanvas.FitMapToWindow): This may be called
4222 during startup before a map has been created. Check if map is None
4223 before using it and do nothing if it is.
4224
4225 2003-06-17 Jonathan Coles <[email protected]>
4226
4227 Fix the problem with raster layers under Windows that caused
4228 Thuban to crash. The view should respond to layer projection
4229 changed events to update the display. Changes to a projection
4230 should not cause the map to be set to full extent.
4231
4232 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4233 current_map_proj to remember the current map projection so that
4234 when the projection changes we know what the previous projection
4235 was.
4236 (MapCanvas.SetMap): Unsubscribe and subscribe to
4237 LAYER_PROJECTION_CHANGED events.
4238 (MapCanvas.projection_changed): Split into two methods that respond
4239 to map and layer projection changes.
4240 (MapCanvas.map_projection_changed): New. Takes the current view and
4241 projects it using the new projection. This does not cause the
4242 map to be redrawn at full extent.
4243 (MapCanvas.layer_projection_changed): New. Cause a redraw which
4244 will draw each layer in its new projection.
4245
4246 * extensions/thuban/bmpdataset.cpp (BMPDataset::Open): Call
4247 VSIFClose() not VSIFCloseL() to close the file. Fixes a crash
4248 under Windows.
4249
4250 * extensions/thuban/gdalwarp.cpp (MFILENAME): Padding should be
4251 to twice sizeof(void*) because there are two digits for each
4252 hex byte.
4253
4254 2003-06-16 Bernhard Herzog <[email protected]>
4255
4256 Update to the layer interface: Direct access to the table,
4257 shapetable, shapefile and filename attributes is now actively
4258 deprecated by issuing deprecation warnings for all places where
4259 this happens.
4260
4261 * Thuban/Model/layer.py (Layer.__getattr__): New. Implement access
4262 to the instance variables table, shapetable, shapefile and
4263 filename via __getattr__ so that we can issue a deprecation
4264 warning.
4265 (Layer.SetShapeStore): Don't set the deprecated instance variables
4266 any more
4267 (Layer.SetShapeStore): Don't use deprecated layer instance
4268 variables
4269 (Layer.Destroy): No need to explicitly remove the instance
4270 variables any more
4271 (Layer.GetFieldType, Layer.Shape): Don't use deprecated layer
4272 instance variables
4273
4274 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
4275 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve)
4276 (GenQuantilesPanel.GetList, GenQuantilesPanel.OnRetrieve): Don't
4277 use deprecated layer instance variables
4278
4279 * Thuban/UI/classifier.py (Classifier.__init__): Don't use
4280 deprecated layer instance variables
4281
4282 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
4283 (IdentifyGridCtrl.selected_shape): Don't set the deprecated layer
4284 instance variables
4285
4286 * Thuban/UI/tableview.py (LayerTableGrid.select_shapes): Don't use
4287 deprecated layer instance variables
4288
4289 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Don't use
4290 deprecated layer instance variables
4291
4292 * Thuban/Model/save.py (SessionSaver.write_layer): Don't use
4293 deprecated layer instance variables
4294
4295 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer)
4296 (MapRenderer.polygon_render_param): Don't use deprecated layer instance
4297 variables
4298
4299 * test/runtests.py (main): Turn Thuban's deprecation warnings into
4300 errors so that they're cought by the tests
4301
4302 * test/test_load.py (TestSingleLayer.test): Don't use deprecated
4303 layer instance variables
4304
4305 2003-06-16 Jonathan Coles <[email protected]>
4306
4307 Fix a problem under Windows whereby if the user double-clicks on a
4308 layer in the legend that tree item will expand or collapse as well
4309 as open the layer properties dialog. The state of the tree item
4310 should not be affected.
4311
4312 * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
4313 preventExpandCollapse and subscribe to expanding and collapsing
4314 events.
4315 (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
4316 collapsing events and will veto the event if it has been triggered
4317 by the user double clicking on a layer.
4318 (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
4319 that an expanding/collapsing event should be vetoed.
4320
4321 2003-06-13 Bernhard Herzog <[email protected]>
4322
4323 * Thuban/UI/classifier.py (Classifier.OnClose)
4324 (Classifier.map_layers_removed)
4325 (Classifier.layer_shapestore_replaced): Unsubscribe the messages
4326 in OnClose and not in map_layers_removed or
4327 layer_shapestore_replaced to make sure it always happens when the
4328 dialog is closed
4329
4330 2003-06-13 Jonathan Coles <[email protected]>
4331
4332 This puts back a fix for Windows where a panel is needed so that
4333 the background of the table view appears correctly.
4334
4335 * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
4336 object that can be used by derived classes to place any
4337 controls (including the grid) onto.
4338 (QueryTableFrame.__init__): Use the panel as the parent window
4339 for all the controls. Reparent the grid so that the panel is
4340 the parent. Call UpdateStatusText() to correctly initialize
4341 the status bar.
4342
4343 2003-06-13 Jonathan Coles <[email protected]>
4344
4345 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
4346 from wxFrame (as opposed to wxDialog like the other classes)
4347 but otherwise behaves like the other classes. This is needed
4348 for the TableView which isn't really a dialog and needs to
4349 have a status bar and control buttons.
4350
4351 * Thuban/UI/tableview.py (TableGrid.__init__): Create an
4352 instance variable to keep track of how many rows are selected.
4353 Subscribe once to the the events we are interested in.
4354 (ThubanGrid.OnRangeSelect): Only handle event if event handling
4355 hasn't been turned off.
4356 (ThubanGrid.OnSelectCell): Only handle event if event handling
4357 hasn't been turned off.
4358 (ThubanGrid.ToggleEventListeners): Rather than subscribe None
4359 as an event listener (which changes the event handler stack)
4360 simply set an instance variable to False. This is checked in
4361 the event handlers.
4362 (ThubanGrid.GetNumberSelected): Return the number of currently
4363 selected rows.
4364 (TableFrame): Inherit from ThubanFrame so we can have a
4365 status bar and control buttons.
4366 (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
4367 Explicitly set which items are selected in the operator choice and
4368 action choice so there is always a valid selection. Fixes RTbug #1941.
4369 Subscribe to grid cell selection events so we can update the
4370 status bar.
4371 (QueryTableFrame.UpdateStatusText): Update the status bar with
4372 how many rows are in the grid, how many columns, and how many
4373 rows are selected.
4374 (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
4375 Call UpdateStatusText when cells are (de)selected.
4376 (QueryTableFrame.OnQuery): Use the string value in the value
4377 combo if either the selected item index is 0 or if the string
4378 cannot be found in the predefined list (this happens if the
4379 user changes the text). Fixes RTbug #1940.
4380 Only turn off the grid event listeners if there a query comes
4381 back with a none empty list of ids. in the case that the list
4382 is empty this causes a grid.ClearSelection() call to actually
4383 clear the grid selection which causes the selected items in
4384 the map to be deselected. Fixes RTbug #1939.
4385
4386 * test/test_save.py (XMLWriterTest.Encode): Check return values.
4387 Fixes RTbug #1851.
4388
4389 2003-06-13 Bernhard Herzog <[email protected]>
4390
4391 * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
4392 self.selected_shape with the current selection to make sure the
4393 contents of the dialog are up to date when it's shown for the
4394 first time.
4395 The dialog used to work without this by luck. The recent fix to
4396 the connector module 'broke' a 'feature' the identify view was
4397 relying on, i.e that subscribing to a message in response to
4398 receiving a message of that type would mean that the new
4399 subscriber would also be called for the same message.
4400
4401 2003-06-12 Jonathan Coles <[email protected]>
4402
4403 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
4404 the image is rendered. Fixes RTbug #1937.
4405
4406 2003-06-12 Jonathan Coles <[email protected]>
4407
4408 * Thuban/Lib/fileutil.py: As is done under Windows, create the
4409 user directory if it doesn't exist on a posix system.
4410 Fixes RTbug #1815.
4411
4412 * Thuban/Model/resource.py (get_user_proj_files): Moved the
4413 called to get_application_dir here, so that the directory
4414 will only be called if this method is invoked.
4415
4416 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
4417 the projfilepath if no projection is selected.
4418
4419 2003-06-12 Jonathan Coles <[email protected]>
4420
4421 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
4422 the scalebar if the current map has no projection set.
4423
4424 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
4425 projfilepath label to just the basename of the projection file
4426 rather than include the entire path.
4427
4428 * Thuban/Model/resource.py: Fix missed proj functions that
4429 needed to be renamed.
4430
4431 2003-06-12 Jonathan Coles <[email protected]>
4432
4433 * Thuban/Model/classification.py: Removed assert statements that
4434 tested if the variable was an instance of Color.
4435
4436 * Thuban/Model/color.py (Color): Remove commented code that isn't
4437 used.
4438 (Transparent): Renamed from NoColor. Doesn't inherit from Color.
4439 Fixes RTbug #1835.
4440 (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
4441 Needed now that the class doesn't inherit from Color.
4442
4443 2003-06-12 Jonathan Coles <[email protected]>
4444
4445 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
4446 check unicode strings.
4447
4448 * test/test_layer.py: Check for existence of gdal.
4449
4450 2003-06-12 Jonathan Coles <[email protected]>
4451
4452 * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
4453 that was in load.py
4454
4455 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
4456 that was in save.py
4457
4458 2003-06-12 Jonathan Coles <[email protected]>
4459
4460 This is largely a collection of bug fixes. We also handle the
4461 case where gdal is not on the system. The XMLReader and XMLWriter
4462 classes were moved into there own files to resolve some circular
4463 import references and because they shouldn't really be in the
4464 file that is dediciated to reading/writing session files since
4465 they are also used elsewhere.
4466
4467 * Thuban/Model/classgen.py: Renamed functions to follow the
4468 function_names_with_underscores style. Fixes RTbug #1903.
4469 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
4470
4471 * Thuban/Model/layer.py: Import gdal only if it available.
4472 (RasterLayer): Handle the case where the gdal library is unavailable.
4473 Addresses RTbug #1877.
4474
4475 * Thuban/Model/load.py (XMLReader): Moved into seperate file
4476 xmlreader.py.
4477
4478 2003-06-12 Jonathan Coles <[email protected]>
4479
4480 This is largely a collection of bug fixes. We also handle the
4481 case where gdal is not on the system. The XMLReader and XMLWriter
4482 classes were moved into there own files to resolve some circular
4483 import references and because they shouldn't really be in the
4484 file that is dediciated to reading/writing session files since
4485 they are also used elsewhere.
4486
4487 * Thuban/Model/classgen.py: Renamed functions to follow the
4488 function_names_with_underscores style. Fixes RTbug #1903.
4489 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
4490
4491 * Thuban/Model/layer.py: Import gdal only if it available.
4492 (RasterLayer): Handle the case where the gdal library is unavailable.
4493 Addresses RTbug #1877.
4494
4495 * Thuban/Model/load.py (XMLReader): Moved into seperate file
4496 xmlreader.py.
4497
4498 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
4499 file xmlwriter.py.
4500
4501 * Thuban/Model/resource.py: Renamed functions to following the
4502 function_names_with_underscores style.
4503 (has_gdal_support): New function that returns true if the gdal
4504 library is available. Addresses RTbug #1877.
4505
4506 * Thuban/UI/application.py (ThubanApplication.OpenSession):
4507 Display a message box if the gdal library is not available, but
4508 only if there are any layers that would use it. Addresses RTbug #1877.
4509
4510 * Thuban/UI/classgen.py: Use renamed projection resource functions.
4511 (GenUniformPanel.__CalcStepping): Fix a slight discrepency
4512 when using integers versus floats.
4513
4514 * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
4515 determine if the "Add Image Layer" menu option should be
4516 greyed out or not. Addresses RTbug #1877.
4517
4518 * Thuban/UI/projdialog.py: Use renamed projection resource functions.
4519
4520 * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
4521 optimize if a raster layer is visible. Fixes RTbug #1931.
4522 Only draw the raster layer if the gdal library is available.
4523 Addresses RTbug #1877.
4524
4525 * test/test_classgen.py: Add tests for generate_singletons,
4526 generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
4527 (test_calculate_quantiles): Fix some tests to catch the new
4528 ValueError that is raised.
4529
4530 * test/test_proj.py: Use renamed projection resource functions.
4531
4532 * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
4533 test for saving classified layers. Fixes RTbug #1902.
4534 (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
4535
4536 2003-06-12 Jan-Oliver Wagner <[email protected]>
4537
4538 Fix for http://intevation.de/rt/webrt?serial_num=1900.
4539
4540 * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
4541
4542 * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
4543 multiplechoicedialog.py rather than from the wxPython library.
4544
4545 2003-06-11 Frank Koormann <[email protected]>
4546
4547 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
4548 update.
4549
4550 2003-06-11 Frank Koormann <[email protected]>
4551
4552 * Thuban/Lib/fileutil.py (get_application_dir): New function to
4553 determine the absolute .thuban/thuban directory under
4554 "posix" (os.expanduser) and "nt" (read AppData registry key).
4555
4556 * Thuban/Model/resource.py: Use get_application_dir
4557
4558 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4559 Use get_application_dir.
4560
4561 2003-06-10 Bernhard Herzog <[email protected]>
4562
4563 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
4564 the messages MAP_LAYERS_REMOVED messages
4565 (LayerTableFrame.OnClose): Unsubscribe from it.
4566 (LayerTableFrame.map_layers_removed): New. Receiver for
4567 MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
4568 dialog is showing is removed.
4569
4570 2003-06-10 Bernhard Herzog <[email protected]>
4571
4572 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
4573 of the receivers list so that unsubscribing in a receiver doesn't
4574 modify it while iterating over it.
4575
4576 * test/test_connector.py
4577 (ConnectorTest.test_disconnect_in_receiver): New. Test whether
4578 unsubscribing in a receiver works correctly. See docstring for
4579 details
4580
4581 2003-06-10 Bernhard Herzog <[email protected]>
4582
4583 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
4584 message.
4585
4586 * Thuban/Model/layer.py (Layer.SetShapeStore): Send
4587 LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
4588 LAYER_CHANGED will still be sent if the classification changes.
4589
4590 * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
4591 parameter so we can subscribe to some of its messages
4592 (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
4593 and the layer's LAYER_SHAPESTORE_REPLACED
4594 (Classifier.unsubscribe_messages): New. Unsubscribe from message
4595 subscribed to in __init__
4596 (Classifier.map_layers_removed)
4597 (Classifier.layer_shapestore_replaced): receivers for the messages
4598 subscribed to in __init__. Unsubscribe and close the dialog
4599
4600 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
4601 the map to the Classifier dialog
4602
4603 * test/test_layer.py (SetShapeStoreTests): Derive from
4604 SubscriberMixin as well so we can test messages
4605 (SetShapeStoreTests.setUp): Subscribe to some of the layer's
4606 messages
4607 (SetShapeStoreTests.tearDown): Clear the messages again
4608 (SetShapeStoreTests.test_sanity): Expand the doc-string and check
4609 for the modified flag too
4610 (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
4611 to check whether SetShapeStore sets the modified flag
4612 (SetShapeStoreTests.test_set_shape_store_different_field_name)
4613 (SetShapeStoreTests.test_set_shape_store_same_field)
4614 (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
4615 Add tests for the messages. This checks both the new
4616 LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
4617
4618 2003-06-06 Jan-Oliver Wagner <[email protected]>
4619
4620 * Thuban/UI/mainwindow.py: Improved and partly added help texts for
4621 the menu items.
4622
4623 2003-06-05 Frank Koormann <[email protected]>
4624
4625 * Thuban/UI/identifyview.py (IdentifyView.__init__):
4626 Layout reimplemented without panel. Make life easier to fit the list
4627 in the dialog.
4628
4629 2003-06-05 Frank Koormann <[email protected]>
4630
4631 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
4632 once on initialisation (Former implementation resulted in multiple
4633 entries for each projection).
4634 (ProjFrame.__FillAvailList): selectProj as second optional parameter,
4635 if set, select the projection found under the specified name. This
4636 overwrites any other selection estimate.
4637 Removed projchoice filling from this method.
4638 (ProjFrame._OnSave, ProjFrame._OnAddToList):
4639 Updated call of ProjFrame.__FillAvailList
4640 (LCCPanel._DoLayout): Moved parameter controls in more common order.
4641
4642 * Resources/Projections/defaults.proj: Extended defaults representing
4643 various common European projections.
4644
4645 2003-06-05 Frank Koormann <[email protected]>
4646
4647 * Thuban/UI/identifyview.py (IdentifyView.__init__):
4648 Use ListCtrl instead of GridCtrl
4649
4650 * Thuban/Model/resource.py:
4651 Guess location of .thuban directory from tempdir parent directory.
4652
4653 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
4654 Guess location of .thuban directory from tempdir parent directory.
4655
4656 2003-06-04 Bernhard Herzog <[email protected]>
4657
4658 Do not cache the values returned by the tree widget's
4659 GetFirstChild and GetNextChild methods because it led to lots of
4660 segfaults. The new way requires more brute force but is more
4661 reliable.
4662
4663 * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
4664 variable layer2id
4665 (LegendTree.find_layer): New method to do with brute force what
4666 layer2id tried to accomplish
4667 (LegendTree._OnMsgLayerChanged)
4668 (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
4669 Use find_layer instead of layer2id
4670 (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
4671 update layer2id anymore
4672 (LegendTree._OnMsgMapLayersRemoved)
4673 (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
4674
4675 2003-06-03 Thomas Koester <[email protected]>
4676
4677 * Thuban/Model/classgen.py (GenQuantiles0): New function.
4678
4679 2003-06-02 Bernhard Herzog <[email protected]>
4680
4681 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
4682 New commands.
4683 (main_menu): Add the new commands.
4684 (MainWindow.TableRename): New. Implementation of the table_rename
4685 command.
4686 (MainWindow.RenameLayer): New. Implementation of the layer_rename
4687 command.
4688
4689 * Thuban/Model/session.py (Session.AddTable): call self.changed to
4690 set the modified flag
4691
4692 * test/test_session.py (TestSessionSimple.test_add_table): Test
4693 whether the modified flag is set properly
4694
4695 * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
4696 instead of issue so that the modified flags get updated.
4697
4698 * test/test_base.py (SomeTitledObject): Derive from Modifiable
4699 instead of Publisher to reflect reality better and to accomodate
4700 the fact that SetTitle now calls changed instead of issue
4701
4702 2003-06-02 Bernhard Herzog <[email protected]>
4703
4704 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
4705 acquisition has to happen before the try in a try-finally.
4706
4707 2003-06-02 Bernhard Herzog <[email protected]>
4708
4709 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
4710 possible that a layer is removed that is not currently selected in
4711 the legend so don't check for this.
4712
4713 2003-05-30 Bernhard Herzog <[email protected]>
4714
4715 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
4716 variables to None that have direct or indirect references to
4717 shapefiles or dbf files to make sure that they do go away and the
4718 files are closed.
4719
4720 2003-05-30 Bernhard Herzog <[email protected]>
4721
4722 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
4723 availImgListIndices when a new image list is created
4724
4725 2003-05-30 Bernhard Herzog <[email protected]>
4726
4727 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
4728 changing_selection to indicate whether the LegendTree code itself
4729 is currently changing the selection
4730 (LegendTree.normalize_selection): New method to normalize the
4731 selection by selecting the layer item even if the user clicked on
4732 the classification.
4733 (LegendTree._OnSelChanged): normalize the selection. This works
4734 around a bug in wx which doesn't keep track of the selection
4735 properly when subtrees are deleted.
4736
4737 2003-05-30 Bernhard Herzog <[email protected]>
4738
4739 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
4740 maximum and minimum scale factors.
4741
4742 * test/test_classgen.py (ClassGenTest.test): Update to reflect the
4743 changes in classgen.py
4744
4745 2003-05-30 Jonathan Coles <[email protected]>
4746
4747 * Thuban/Model/classgen.py: Remove ClassGenerator class but make
4748 all the methods functions. Fixes RTBug #1903.
4749
4750 * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
4751 to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
4752 RTBug #1907.
4753
4754 * Thuban/UI/classgen.py: Use classgen functions that were part
4755 of the ClassGenerator class. Put try/finally blocks around
4756 code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
4757 RTBug #1904.
4758
4759 * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
4760
4761 * Thuban/UI/legend.py: The legend was cleared and repopulated any
4762 time something changed which caused some state to be lost such
4763 as which children were expanded or collapsed. Fixes RTBug #1901.
4764 (LegendTree._OnMsgMapLayersAdded): Add only new layers.
4765 (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
4766 the legend but not in the map.
4767 (LegendTree.__FillTree): Move main functionality out into smaller
4768 methods that can be used by other methods.
4769 (LegendTree.__FillTreeLayer): Reuse old slots in the image list
4770 if they are available.
4771 (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
4772 that we override the wxTreeCtrl method. Iterate over children
4773 and call __RemoveLayer.
4774 (LegendTree.__AddLayer): New. Add a new layer to the legend.
4775 (LegendTree.__RemoveLayer): Remove a layer from the legend.
4776 (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
4777 Should only be called with the id of a layer branch.
4778 (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
4779 Returns the root item or creates one if necessary.
4780
4781 * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
4782 ProjectRasterFile with tuple arguments instead of strings.
4783
4784 * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
4785 with try/finally. Fixes RTBug #1904.
4786
4787 * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
4788 with try/finally. Fixes RTBug #1904.
4789 (MapCanvas.FitSelectedToWindow): If a single point is selected
4790 simply center it on the display. Fixes RTBug #1849.
4791
4792 * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
4793 to be compiled as a standalone app. Now the code can only be
4794 called from Python which simplifies the parameter passing.
4795 (ProjectRasterFile): Handle Python arguments. Remove code that
4796 checks for a destination dataset. Add more clean up code.
4797
4798 * test/test_map.py (TestMapWithContents.test_raise_layer_top,
4799 TestMapWithContents.test_lower_layer_bottom):
4800 Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
4801 Fixes RTBug #1907.
4802
4803 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
4804 extent to the map when the legend is toggled. Fixes RTBug #1881.
4805
4806 2003-05-29 Jan-Oliver Wagner <[email protected]>
4807
4808 * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
4809 unsubscribes all that is subcribed in __init__.
4810
4811 2003-05-28 Bernhard Herzog <[email protected]>
4812
4813 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
4814 (MainWindow.CanDuplicateLayer): New methods to implement the
4815 Layer/Duplicate command.
4816 (layer_duplicate command): New.
4817 (main_menu): Add layer_duplicate to the Layer menu.
4818
4819 2003-05-28 Bernhard Herzog <[email protected]>
4820
4821 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
4822 renderer so that NULL/None values get displayed differently (by a
4823 gray rectangle).
4824 (TableGrid.__init__): Override the default renderers
4825
4826 2003-05-28 Bernhard Herzog <[email protected]>
4827
4828 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
4829 classification to "None" if the type of the field has changed.
4830
4831 * test/test_layer.py (SetShapeStoreTests): New. Class with a few
4832 test for the Layer.SetShapeStore method
4833
4834 2003-05-28 Jan-Oliver Wagner <[email protected]>
4835
4836 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
4837 does not necessarily have a filename).
4838
4839 2003-05-28 Jan-Oliver Wagner <[email protected]>
4840
4841 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
4842 sort the selection list for the dialog.
4843
4844 2003-05-28 Frank Koormann <[email protected]>
4845
4846 * extensions/thuban/wxproj.cpp
4847 (project_point): Removed cast to int for projected point coordinates.
4848 (shape_centroid): Return last point if all polygon vertices fall
4849 to one point.
4850
4851 2003-05-28 Bernhard Herzog <[email protected]>
4852
4853 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
4854 with layers that don't have shapestores, i.e. raster layers.
4855
4856 2003-05-28 Bernhard Herzog <[email protected]>
4857
4858 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
4859 when determining the title from the filename.
4860
4861 * test/test_dbf_table.py (TestDBFTable.test_title): Update to
4862 reflect changes in the way the title is derived from the filename
4863
4864 2003-05-28 Frank Koormann <[email protected]>
4865
4866 * Thuban/UI/mainwindow.py (MainWindow.TableShow):
4867 Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
4868
4869 2003-05-27 Bernhard Herzog <[email protected]>
4870
4871 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
4872 delegate SelectedLayer.
4873 (MainWindow.LayerUnjoinTable): Implement.
4874 (_can_unjoin): New. Helper function for the sensitivity of the
4875 layer/unjoin command.
4876
4877 * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
4878 (DerivedShapeStore.OrigShapeStore): New. Return the original
4879 shapestore. Used to figure out how to unjoin.
4880 (DerivedShapeStore.Shapefile): Fix a typo.
4881
4882 2003-05-27 Bernhard Herzog <[email protected]>
4883
4884 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
4885 well
4886 (JoinDialog.__init__): Use the layer parameter and only build the
4887 left choice when a layer is given
4888 (JoinDialog.OnJoin): Handle layer joins as well
4889 (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
4890 that the user selects the "Select..." item. The sensitivitly
4891 updating is now in update_sensitivity
4892 (JoinDialog.y): New method to refactor the sensitivity update of
4893 the join button into its own method.
4894
4895 * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
4896
4897 2003-05-27 Bernhard Herzog <[email protected]>
4898
4899 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
4900 iff there are unreferenced tables in the session
4901
4902 2003-05-27 Bernhard Herzog <[email protected]>
4903
4904 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
4905
4906 * Thuban/Model/session.py (Session.UnreferencedTables): New method
4907 to return tables that are not referenced by other tables or shape
4908 stores and can be removed.
4909 (Session.RemoveTable): Issue a TABLE_REMOVED message after
4910 removing the table
4911
4912 * Thuban/UI/mainwindow.py: Remove unused imports
4913 (MainWindow.TableClose): Implement.
4914
4915 * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
4916 messages so that the frame will be automatically closed when a new
4917 session is opened or the table is removed.
4918 (TableFrame.OnClose): Unsubscribe the Subscriptions made in
4919 __init__
4920 (TableFrame.close_on_session_replaced)
4921 (TableFrame.close_on_table_removed): New. Subscribers that close
4922 the window
4923
4924 * test/test_session.py (TestSessionMessages.test_remove_table)
4925 (TestSessionSimple.test_remove_table): Move the test to
4926 TestSessionSimple and add test for the TABLE_REMOVED message
4927 (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
4928 (TestSessionSimple.test_unreferenced_tables) New. Test for the
4929 UnreferencedTables method.
4930 (UnreferencedTablesTests): New. Class with some more sophisticated
4931 tests for UnreferencedTables.
4932
4933 2003-05-27 Frank Koormann <[email protected]>
4934
4935 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
4936 display has some unwanted side effects. Removed again.
4937
4938 2003-05-27 Frank Koormann <[email protected]>
4939
4940 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
4941
4942 * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
4943
4944 2003-05-27 Jan-Oliver Wagner <[email protected]>
4945
4946 * test/test_menu.py (MenuTest.test): Added test for
4947 Menu.RemoveItem().
4948
4949 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
4950 the menu.
4951
4952 2003-05-27 Frank Koormann <[email protected]>
4953
4954 Nonmodal dialogs without parent (i.e. they can fall behind the main
4955 window)
4956
4957 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
4958 all dialogs in the dialogs dictionary and the canvas.
4959
4960 * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
4961 parent, i.e. can fall behind other windows.
4962 (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
4963 dictionary before removing it.
4964
4965 * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
4966
4967 * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
4968 * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
4969 * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
4970
4971 2003-05-27 Bernhard Herzog <[email protected]>
4972
4973 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
4974 tableview dialog
4975 (MainWindow.TableShow): Use ShowTableView to open the dialogs.
4976 Also, don't use the table's titles as the dialog names. The titles
4977 aren't guaranteed to be unique.
4978 (MainWindow.TableOpen): Open a table view dialog after opening the
4979 table
4980
4981 2003-05-27 Bernhard Herzog <[email protected]>
4982
4983 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
4984 effect can be achieved by simply closing the window showing the
4985 table.
4986 (MainWindow.TableHide): Removed.
4987 (main_menu): Removed "table_hide"
4988
4989 2003-05-27 Frank Koormann <[email protected]>
4990
4991 Fix legend tree display problems under Win32
4992
4993 * Thuban/UI/legend.py: BMP_SIZE_W = 15
4994 (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
4995 (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
4996
4997 * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
4998
4999 2003-05-27 Jan-Oliver Wagner <[email protected]>
5000
5001 * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
5002 'after' now allows to insert separators almost anywhere in the menu.
5003
5004 2003-05-27 Frank Koormann <[email protected]>
5005
5006 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
5007 "S" of selection box label to hint on hot key (Alt-S). Works under
5008 Win32 but is ignored under GTK.
5009
5010 2003-05-26 Frank Koormann <[email protected]>
5011
5012 * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
5013 Center Choices.
5014
5015 2003-05-26 Bernhard Herzog <[email protected]>
5016
5017 Remove the Precision methods again. They're too DBF specific to be
5018 part of the table interface and they're only used in table_to_dbf
5019 anyway.
5020
5021 * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
5022 fixed precision of 12 for doubles.
5023 (TransientTableBase.Precision): Removed
5024 (AutoTransientTable.Width): Delegate to self.table.
5025
5026 * Thuban/Model/table.py (DBFTable.Precision)
5027 (MemoryTable.Precision): Removed.
5028 (MemoryTable.Width): Use a fixed precision of 12 for doubles.
5029 (table_to_dbf): Use a fixed precision of 12 for floats unless the
5030 column object specifies something else.
5031
5032 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
5033 test for table_to_dbf
5034
5035 2003-05-26 Bernhard Herzog <[email protected]>
5036
5037 * test/test_transientdb.py
5038 (TestTransientTable.run_iceland_political_tests): Fix a comment.
5039
5040 2003-05-26 Bernhard Herzog <[email protected]>
5041
5042 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
5043 implementation. Mark parts of the file format strings for
5044 localization.
5045
5046 * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
5047 file and add the table to the tables managed by the session
5048
5049 * test/test_session.py (TestSessionSimple.test_open_table_file):
5050 New. test case for OpenTableFile
5051
5052 2003-05-26 Jan-Oliver Wagner <[email protected]>
5053
5054 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
5055 Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
5056 Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
5057 Replace the true/false of wxWindows by True/False of Python 2.2.1.
5058
5059 2003-05-26 Jan-Oliver Wagner <[email protected]>
5060
5061 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
5062 already a selection present, update the grid accordingly.
5063
5064 * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
5065 resizeable and increase its initial size.
5066
5067 2003-05-26 Frank Koormann <[email protected]>
5068
5069 Table export functionality
5070
5071 * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
5072 Return width (in characters) for a column.
5073 (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
5074 (table_to_dbf): Write table to dbf file.
5075 (table_to_csv): Write table to csv file.
5076
5077 * Thuban/Model/transientdb.py (TransientTableBase.Width,
5078 TransientTableBase.Precision): Return column width and precision.
5079
5080 * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
5081 or table_to_csv depending on file selection.
5082
5083 * test/test_dbf_table.py:
5084 Test table_to_dbf (extension of former part of test).
5085
5086 * test/test_csv_table.py:
5087 Test table_to_csv.
5088
5089 2003-05-23 Jan-Oliver Wagner <[email protected]>
5090
5091 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
5092 Use QueryTableFrame instead of TableFrame.
5093
5094 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
5095 table window with 'Layer Table:' instead of 'Table:'.
5096
5097 2003-05-23 Jan-Oliver Wagner <[email protected]>
5098
5099 Give all tables a title via mix-in TitledObject.LayerShowTable
5100
5101 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
5102 only if it exists.
5103
5104 * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
5105 and call its init-method with a default title. Remove Title() method.
5106
5107 * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
5108 AutoTransientTable): mix-in TitledObject and call its init-method with
5109 a default title. Remove Title() method.
5110
5111 2003-05-23 Bernhard Herzog <[email protected]>
5112
5113 * Thuban/Model/session.py (Session.AddShapeStore): Define
5114 AddShapeStore analogously to AddTable.
5115
5116 * test/test_session.py (TestSessionSimple.test_add_shapestore):
5117 New. Test for AddShapeStore
5118
5119 2003-05-23 Jan-Oliver Wagner <[email protected]>
5120
5121 Introducing QueryTableFrame and a very coarse ShowTable implementation.
5122
5123 * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
5124 class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
5125 The latter implements the selection GUI without dependency on a layer.
5126 LayerTableFrame now is derived from QueryTableFrame and connects
5127 to a layer.
5128
5129 * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
5130 implementation that still needs work.
5131
5132 * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
5133
5134 2003-05-22 Frank Koormann <[email protected]>
5135
5136 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
5137 Added "outer_join = False" as optional parameter.
5138 (TransientJoinedTable.create): If outer join is true, perform a
5139 "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
5140 the left table. Records not matching are filled with 0 / None.
5141
5142 * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
5143 (JoinDialog.OnJoin): Consider outer join check box.
5144
5145 2003-05-22 Bernhard Herzog <[email protected]>
5146
5147 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
5148 somewhat safer way. Storing the traceback in a local variable can
5149 lead to memory leaks
5150
5151 2003-05-22 Bernhard Herzog <[email protected]>
5152
5153 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
5154 the wxMessageDialog's Destroy() method.
5155
5156 2003-05-22 Frank Koormann <[email protected]>
5157
5158 * Thuban/UI/join.py (JoinDialog.__init__): Make use of
5159 TransientTable.Title()
5160
5161 2003-05-22 Frank Koormann <[email protected]>
5162
5163 Join Dialog, initial version.
5164
5165 * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
5166
5167 * Thuban/UI/join.py (JoinDialog): Functional implementation of
5168 former framework. Renamed Table1/Table2 to LeftTable/RightTable
5169 in all occurences.
5170
5171 * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
5172 Typo fixed.
5173
5174 2003-05-22 Bernhard Herzog <[email protected]>
5175
5176 Give the tables titles so that the GUI can display more meaningful
5177 names. For now the titles are fixed but depend on e.g. filenames
5178 or the titles of the joined tables.
5179
5180 * Thuban/Model/transientdb.py (TransientTable.Title)
5181 (TransientJoinedTable.Title, AutoTransientTable.Title): New.
5182
5183 * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
5184
5185 * test/test_transientdb.py
5186 (TestTransientTable.test_auto_transient_table_title): New. Test
5187 for the Title method
5188 (TestTransientTable.test_transient_joined_table)
5189 (TestTransientTable.test_transient_table): Add test for the Title
5190 methods
5191
5192 * test/test_memory_table.py (TestMemoryTable.test_title): New.
5193 Test for the Title method
5194
5195 * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
5196 the Title method
5197
5198 2003-05-22 Bernhard Herzog <[email protected]>
5199
5200 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
5201 Provide a better way to destroy the layers
5202 (TestLayer.test_base_layer, TestLayer.test_arc_layer)
5203 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
5204 (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
5205 the new way to destroy the layers.
5206 (TestLayer.test_derived_store): New. Test for using a layer with a
5207 DerivedShapeStore
5208
5209 * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
5210 filename if the shape store actually has one.
5211
5212 2003-05-22 Bernhard Herzog <[email protected]>
5213
5214 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
5215 for the filename
5216
5217 * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
5218 for the FileName method
5219 (TestDBFTableWriting.test_write): Fix spelling of filename
5220
5221 2003-05-22 Thomas Koester <[email protected]>
5222
5223 * Thuban/Model/range.py, test/test_range.py: Brought over new Range
5224 from SciParam that now really is immutable.
5225
5226 2003-05-22 Frank Koormann <[email protected]>
5227
5228 Layer Top/Bottom placement added to legend.
5229
5230 * Thuban/UI/legend.py
5231 (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
5232 bound to tool events.
5233 (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
5234 New, methods binding the event methods with the map methods.
5235
5236 * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
5237 layer at top/bottom of layer stack.
5238
5239 * Resources/Bitmaps/top_layer.xpm: New button icon.
5240
5241 * Resources/Bitmaps/bottom_layer.xpm: New button icon.
5242
5243 2003-05-22 Bernhard Herzog <[email protected]>
5244
5245 * Thuban/Model/session.py (Session.RemoveTable): New method to
5246 remove tables
5247
5248 * test/test_session.py (TestSessionSimple.test_remove_table): New.
5249 Test for RemoveTable
5250
5251 2003-05-22 Thomas Koester <[email protected]>
5252
5253 * Thuban/Model/classgen.py: Added short module doc string and CVS id.
5254 (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
5255
5256 2003-05-22 Bernhard Herzog <[email protected]>
5257
5258 Implement a way to discover dependencies between tables and
5259 shapestores.
5260
5261 * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
5262 (TransientJoinedTable.Dependencies)
5263 (AutoTransientTable.SimpleQuery): New. Implement the dependencies
5264 interface
5265 (TransientJoinedTable.__init__): Keep tack of the original table
5266 objects in addition to the corresponding transient tables.
5267
5268 * Thuban/Model/table.py (DBFTable.Dependencies)
5269 (MemoryTable.Dependencies): New. Implement the dependencies
5270 interface
5271
5272 * Thuban/Model/data.py (ShapeTable): New. Helper class for
5273 ShapefileStore
5274 (ShapefileStore.__init__): Use ShapeTable instead of
5275 AutoTransientTable
5276 (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
5277 (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
5278 methods for filename and type
5279 (ShapefileStore.Dependencies): New. Implement the dependencies
5280 interface
5281 (DerivedShapeStore): New class to replace SimpleStore. The main
5282 difference to SimpleStore is that it depends not on a shapefile
5283 but another shapestore which expresses the dependencies a bit
5284 better
5285 (SimpleStore.__init__): Add deprecation warning.
5286
5287 * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
5288 Test for the Dependencies method.
5289
5290 * test/test_memory_table.py (TestMemoryTable.test_dependencies):
5291 New. Test for the Dependencies method.
5292
5293 * test/test_transientdb.py
5294 (TestTransientTable.test_auto_transient_table_dependencies): New.
5295 Test for the Dependencies method.
5296 (TestTransientTable.test_transient_joined_table): Add test for the
5297 Dependencies method.
5298
5299 * test/test_session.py (TestSessionSimple.setUp)
5300 (TestSessionSimple.tearDown): New. Implement a better way to
5301 destroy the sessions.
5302 (TestSessionSimple.test_initial_state)
5303 (TestSessionSimple.test_add_table): Bind session to self.session
5304 so that it's destroyed by tearDown
5305 (TestSessionSimple.test_open_shapefile): New. Test for
5306 OpenShapefile and the object it returns
5307
5308 2003-05-22 Bernhard Herzog <[email protected]>
5309
5310 * Thuban/Model/session.py (Session.AddTable): New method to
5311 register tables with the session.
5312 (Session.Tables): Return the tables registered with AddTable too.
5313
5314 * test/test_session.py (TestSessionSimple.test_add_table): New.
5315 Test case for the AddTable method
5316
5317 2003-05-22 Frank Koormann <[email protected]>
5318
5319 UI polishing updates: Place main buttons (OK, Cancel, etc) in the
5320 lower right corner, center labels for selections, initialize controls
5321 in reasonable order for keyboard navigation.
5322
5323 * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
5324 (ProjFrame.__DoOnProjAvail): Determine position of current projection
5325 using the wxListBox.FindString() method. Still a problem (#1886)
5326
5327 * Thuban/UI/classifier.py
5328 (Classifier.__init__, SelectPropertiesDialog.__init__)
5329
5330 * Thuban/UI/classgen.py (ClassGenDialog.__init__,
5331 (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
5332 different classification types from here to __init__.
5333 (GenUniquePanel.__init__): Set the column width of the first field
5334 in the Field ListCtrl to the full width.
5335
5336 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
5337 Button to 'Export'. Center Buttons in Selection Box, set Focus to
5338 Grid.
5339 (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
5340 changes focus to the Selection when pressing "Alt-S".
5341
5342 * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
5343 the text if not visible. The italic font sometimes exceeds the
5344 rendering area.
5345
5346 2003-05-21 Jonathan Coles <[email protected]>
5347
5348 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
5349 to OnClose so that Thuban closes correctly.
5350
5351 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
5352 DockFrame.OnClose, not DockFrame._OnClose.
5353
5354 2003-05-21 Jonathan Coles <[email protected]>
5355
5356 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
5357 references to 'inf' and use new Range __init__ to pass floats
5358 directly rather than converting them to strings first.
5359 Fixes RTBug #1876.
5360
5361 * Thuban/Model/classification.py (ClassGroupRange.SetRange):
5362 Use new Range ___init__ to pass floats.
5363
5364 * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
5365 filename is a valid image file. Throw IOError otherwise.
5366
5367 * Thuban/Model/range.py: Brought over new Range from SciParam that
5368 is immutable and has an __init__ which can accept floats.
5369
5370 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
5371 into try block. AddLayer doesn't throw any exceptions anymore.
5372 (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
5373 try block.
5374
5375 * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
5376 the first item in choices. Fixes RTBug #1882.
5377
5378 * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
5379 has gone to 0 which is a serious problem. abort.
5380 (MapRenderer.draw_raster_layer): Catch IOError seperately and
5381 print the error from GDAL.
5382
5383 * Thuban/UI/tableview.py (TableGrid.__init__): Call
5384 ToggleEventListeners to turn on listening.
5385 (TableGrid.ToggleEventListeners): New. Turns event listening on
5386 and off so as to prevent excessive messages.
5387 (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
5388 to suppress excessive messages when selecting many rows.
5389 Fixes RTBug #1880.
5390
5391 * Thuban/UI/view.py: Added checks against if scale == 0. This
5392 is a serious problem that can occur when an image without
5393 geo data is loading and causes the map projection bounds to
5394 go to infinity. Right now, the solution is to simply try
5395 to recover.
5396
5397 * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
5398 to set the MFILEReceiver attributes even if the data is NULL.
5399
5400 * extensions/thuban/gdalwarp.cpp: Improved the error handling
5401 and passed GDAL messages back up to the Python layer. Also
5402 tried to fix some memory leaks that were present in the original
5403 utility but didn't matter because the program aborted.
5404
5405 * test/test_range.py: Copied over tests from SciParam. Removed
5406 tests against importing. Fixes RTBug #1867.
5407
5408 2003-05-21 Bernhard Herzog <[email protected]>
5409
5410 * test/test_load.py: Remove unused imports and restructure the
5411 test code
5412 (LoadSessionTest): Split into one class for each test and turn
5413 LoadSessionTest itself into the base class for all such session
5414 tests.
5415 (ClassificationTest): New base class for load tests that test
5416 classifications
5417 (TestSingleLayer, TestLayerVisibility, TestClassification)
5418 (TestLabels, TestLayerProjection, TestRasterLayer): New classes
5419 for the individual tests
5420
5421 * test/support.py (FileLoadTestCase.filename): New base class for
5422 file loading tests
5423
5424 2003-05-21 Jan-Oliver Wagner <[email protected]>
5425
5426 * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
5427 Mercator' to 'UTM Zone 32' as a more convenient example.
5428 Added 'Gauss Krueger Zone 6'.
5429
5430 * Data/iceland_sample_raster.thuban: political polygon now
5431 filled transparent to have the raster image visible at once.
5432
5433 2003-05-21 Frank Koormann <[email protected]>
5434
5435 * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
5436 OnClose() to keep in sync with extensions. Internally Thuban
5437 still uses "underscored" names.
5438
5439 2003-05-20 Jonathan Coles <[email protected]>
5440
5441 This puts back Raster layer support. These layers support projections
5442 through the GDAL library. Currently, the CVS version is being used.
5443 There are no Debian packages available although this may change soon.
5444 A GDAL driver was extended to support writing to memory rather to
5445 files.
5446
5447 There is still some work that needs to be done, such as some error
5448 handling when loading invalid images or when there is a problem
5449 projecting the image. This putback simply checks in the majority
5450 of the work.
5451
5452 * setup.py: Add gdalwarp library extension.
5453
5454 * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
5455 Defaults to False, but can be overridden by subclasses if they
5456 support classification.
5457 (RasterLayer): New. Defines a new layer that represents an
5458 image.
5459
5460 * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
5461 tag handler.
5462 (SessionLoader.start_layer): Encode the filename.
5463 (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
5464 New. Supports reading a rasterlayer tag.
5465
5466 * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
5467
5468 * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
5469 get a string in Latin1. If we get such as string convert it to
5470 unicode first, otherwise leave if alone before encoding.
5471 (SessionSaver.write_layer): Add support for writing both Layers
5472 and RasterLayers.
5473
5474 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
5475 The right argument may not be a string, it could also be a Column.
5476
5477 * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
5478 Make initial window size 600x400. Fixes RTBug #1872.
5479
5480 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
5481 the dialog is constructed so that we can support layers that
5482 do not have classifications.
5483 (Classifier._OnTry): Only build a classification if the layer
5484 supports one.
5485
5486 * Thuban/UI/legend.py: Change all checks that a layer is an
5487 instance of Layer into checks against BaseLayer.
5488 (LegendTree.__FillTreeLayer): Only add children to a branch if
5489 the layer supports classification.
5490
5491 * Thuban/UI/mainwindow.py (MainWindow.NewSession,
5492 MainWindow.OpenSession): Don't proceed with an action if the
5493 user chooses Cancel when they are asked to save changes.
5494 (MainWindow.AddRasterLayer): New. Open a dialog to allow the
5495 user to select an image file. Create a new RasterLayer and add
5496 it to the map.
5497
5498 * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
5499 for rendering RasterLayer layers.
5500 (MapRenderer.draw_raster_layer): Actually method that calls
5501 the GDALWarp python wrapper and constructs an image from the
5502 data returned.
5503
5504 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
5505 Choices symbols to match those used in the table query method.
5506 Replace deprecated method calls on table with new method names.
5507
5508 * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
5509 how small the scale can get. This still needs more testing.
5510
5511 * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
5512 Provides a driver to output in .bmp format.
5513
5514 * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
5515 New. Provides IO routines which write to memory, rather than a file.
5516
5517 * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
5518 of the gdalwarp utility provided in GDAL. Added function calls
5519 that can be accessed from python.
5520
5521 * Data/iceland_sample_raster.thuban: New. Sample file that uses
5522 a raster layer.
5523
5524 * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
5525 layer image data.
5526
5527 * Doc/thuban.dtd: Added rasterlayer attribute definition.
5528
5529 * test/test_layer.py, test/test_load.py, test/test_save.py: Added
5530 tests associated with the raster layer code.
5531
5532 * test/test_transientdb.py
5533 (TestTransientTable.test_auto_transient_table_query): Added a test
5534 for using a Column object as the "right" parameter to a query.
5535
5536 2003-05-19 Frank Koormann <[email protected]>
5537
5538 * Thuban/version.py (get_changelog_date):
5539 Catch exceptions if ChangeLog does not exist.
5540
5541 * Thuban/UI/view.py (MapCanvas.Export): Bugfix
5542
5543 2003-05-19 Frank Koormann <[email protected]>
5544
5545 Extended version information for Thuban
5546
5547 * Thuban/version.py: New, version information for Thuban: Last
5548 modification date and last ChangeLog entry date.
5549
5550 * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
5551 information: Display Thuban, wxPython and Python version.
5552
5553 2003-05-16 Bernhard Herzog <[email protected]>
5554
5555 * Thuban/Model/save.py: Remove some unused imports including the
5556 __future__ import for nested_scopes as Thuban relies on Python 2.2
5557 now.
5558 (XMLWriter.encode): Remove the special case for a None argument.
5559 In the saver encode is always called with a string argument.
5560
5561 2003-05-16 Bernhard Herzog <[email protected]>
5562
5563 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
5564 in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
5565 of the bug was that e.g. float("1.2") would fail. Thuban now
5566 requires 2.4.x.
5567
5568 2003-05-16 Frank Koormann <[email protected]>
5569
5570 Printing enhancement and WMF export (under Win32)
5571
5572 * Thuban/UI/renderer.py (ExportRenderer): New, derived from
5573 ScreenRenderer. Renders Map, Legend and Scalebar for export.
5574 (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
5575 PrintRender.
5576
5577 * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
5578 to fullfil information needed for PrinterRenderer.
5579 (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
5580 (MapCanvas.Print): Adapted to new MapPrintout.
5581 (OutputTransform): General calculations to transform from canvas
5582 coordinates to export/printing devices.
5583
5584 * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
5585 new method_command to call ExportMap, with platform dependency (only
5586 __WXMSW__)
5587
5588 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
5589 of scalebar drawing area as new parameters.
5590
5591 * Thuban/Model/scalebar.py (roundInterval): round long instead of int
5592
5593 * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
5594 Update to extended scalebar.DrawScalebar header.
5595
5596 * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
5597
5598 * test/test_scalebar.py: Made test executable as standalone.
5599
5600 2003-05-16 Bernhard Herzog <[email protected]>
5601
5602 * Thuban/Model/table.py (Table): Remove this compatibility alias
5603 for DBFTable.
5604
5605 * test/test_table.py: Import DBFTable as Table because that alias
5606 doesn't exist anymore.
5607
5608 * Thuban/UI/classgen.py: Remove some unused imports
5609
5610 2003-05-14 Jonathan Coles <[email protected]>
5611
5612 * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
5613 Fix docstring.
5614 (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
5615 (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
5616 values of the supplied range to determine the beginning and end
5617 bounds of the generated classes.
5618
5619 * Thuban/Model/range.py (Range.number_re): Now accepts floats that
5620 do not have a leading 0 (.5 is now accepted as well as 0.5).
5621
5622 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
5623 call to ClassGenerator.GenUniformDistribution.
5624
5625 * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
5626 layout bug with the 'Projection' label.
5627
5628 * test/support.py (FloatTestCase): New. Needed for the Range tests.
5629
5630 * test/test_range.py: New. Imported from SciParam.
5631
5632 2003-05-12 Jonathan Coles <[email protected]>
5633
5634 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
5635 to table.UniqueValues() with calls that retrieve all the values
5636 from the table. This will need to be replaced by a method on table
5637 which can simply return the list (perhaps more efficiently).
5638
5639 2003-05-12 Jonathan Coles <[email protected]>
5640
5641 The return value of ClassGenerator.CalculateQuantiles has changed.
5642 Refer to the documentation for details.
5643
5644 * test/test_classgen.py: Modified Quantile tests to use the
5645 new return values.
5646
5647 * Thuban/Model/classgen.py
5648 (ClassGenerator.GenQuantiles): Add comments describing the parameters,
5649 use new return values from CalculateQuantiles to produce the correct
5650 range bounds in the Classification.
5651 (ClassGenerator.CalculateQuantiles): Add more comments describing
5652 the return values and parameters. Make minor adjustments to improve
5653 the legibility of the code. Fix problem with adjusted not being set
5654 in most cases.
5655
5656 2003-05-12 Frank Koormann <[email protected]>
5657
5658 * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
5659 and latin1. Fixes #1851 finally.
5660
5661 2003-05-09 Jonathan Coles <[email protected]>
5662
5663 * test/test_classgen.py: New. Tests the Quantile algorithm.
5664
5665 * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
5666 Clean up debugging statement, add comments, fix a small bug in the
5667 returned adjusted percentiles.
5668
5669 2003-05-09 Jonathan Coles <[email protected]>
5670
5671 Introduces Range class from SciParam into the ClassGroupRange class,
5672 and such ranges can now be saved and loaded from disk.
5673
5674 Quantiles are now available in the Classification Generator.
5675
5676 Initial support for building Queries on a table. Doesn't do anything
5677 but run some tests.
5678
5679 * Thuban/Model/classification.py: Explicit imports.
5680 (ClassGroupRange): Use the Range class to store the underlying
5681 range information. The interface remains the same, except for
5682 GetRange(), and you can also supply a Range object as the min
5683 parameter to SetRange or __init__.
5684
5685 * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
5686 string appropriately for use in Thuban. Fixes RTbug #1851.
5687 (SessionLoader.end_projection): Handle the context of the
5688 projection tag a bit better by looking at what objects are not
5689 None. There was an assumption that a projection tag for a map
5690 could occur before any layers.
5691 (SessionLoader.start_clrange): Provide backward compatibility for
5692 reading min/max values as well as the new range parameter.
5693
5694 * Thuban/Model/map.py: Explicit imports.
5695
5696 * Thuban/Model/resource.py: Import _.
5697 (ProjFileSaver.write): write header using projfile.dtd.
5698
5699 * Thuban/Model/save.py: Explicit imports.
5700 (XMLWriter.encode): New. Encode the given string from a format
5701 used by Thuban into UTF-8. Fixes RTbug #1851.
5702
5703 * Thuban/UI/classgen.py: Explicit imports.
5704 (ClassGenDialog.__init__): Clean up the code and add support
5705 for Quantiles.
5706 (ClassGenDialog.OnOK): Add support for Quantiles.
5707 (GenQuantilesPanel): New. Input panel for Quantiles.
5708 (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
5709 GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
5710
5711 * Thuban/Model/classgen.py: New. Contains all the classes named above.
5712
5713 * Thuban/UI/classifier.py: Explicit imports.
5714 (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
5715 ClassTable.SetValueAsCustom): Reworked to use new Range class.
5716
5717 * Thuban/UI/legend.py: Explicit imports.
5718
5719 * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
5720 a Table menu and associated method calls.
5721 (MainWindow.choose_color): Removed. No longer needed.
5722
5723 * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
5724 should be disabled if no projection is selected in the available
5725 list.
5726
5727 * Thuban/UI/renderer.py: Explicit imports.
5728
5729 * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
5730 with correctly selecting the rows and issuing the right events.
5731 Be sure to call Skip() to allow the grid to do some of its own
5732 handling which allows the rows to actually be selected.
5733 (LayerTableGrid.select_shapes): Rename from select_shape. Supports
5734 selecting multiple shapes.
5735 (LayerTableFrame): Support for building Queries.
5736 (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
5737
5738 * Thuban/UI/tree.py: Explicit imports.
5739
5740 * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
5741 table view can call it.
5742
5743 * test/test_classification.py: Explicit imports.
5744 (TestClassification.test_ClassGroupRange): Fix test for new
5745 Range class.
5746
5747 * Doc/thuban.dtd: Add range parameter for clrange.
5748
5749 * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
5750 object in ClassGroupRange, and also uesd for inputting ranges in
5751 the classifer table and elsewhere.
5752
5753 * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
5754 yet.
5755
5756 2003-05-09 Frank Koormann <[email protected]>
5757
5758 * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
5759
5760 2003-05-08 Frank Koormann <[email protected]>
5761
5762 Coding style updates
5763
5764 * test/test_scalebar.py: Replaced tab indentation by spaces.
5765
5766 * Thuban/UI/scalebar.py: Explicit imports.
5767
5768 2003-05-08 Frank Koormann <[email protected]>
5769
5770 * Thuban/UI/scalebar.py
5771 (ScaleBar.DrawScalebar): Format string bug fixed.
5772
5773 2003-05-08 Frank Koormann <[email protected]>
5774
5775 Reorganization of scalebar component (no wx in Thuban/Model)
5776
5777 * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
5778 (deriveInterval):
5779 Calculate scalebar interval and unit which fits in width for scale.
5780 (roundInterval): Round float.
5781
5782 * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
5783
5784 * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
5785
5786 * Thuban/UI/legend.py: Import Thuban.UI.scalebar
5787
5788 2003-05-08 Frank Koormann <[email protected]>
5789
5790 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
5791 Initialize ScaleBar with canvas.map
5792
5793 * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
5794 round intervals to display smarter lengths
5795 (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
5796 layer. If the maps has no projection applied grey the scalebar.
5797
5798 2003-05-07 Frank Koormann <[email protected]>
5799
5800 Basic Scalebar features added.
5801
5802 * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
5803
5804 * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
5805 (ScaleBarBitmap): New, links the scalebar bitmap with view messages
5806 and the renderer.
5807
5808 * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
5809
5810 * Thuban/UI/messages.py: SCALE_CHANGED added.
5811
5812 2003-05-07 Bernhard Herzog <[email protected]>
5813
5814 * Thuban/Model/session.py (Session.__init__): New instance
5815 variable shapestores to hold a list of all open shapestore objects
5816 (Session.ShapeStores): New. Accessor method for the shapestores
5817 list.
5818 (Session._add_shapestore, Session._clean_weak_store_refs): New.
5819 Internal methods to maintain the shapestores list.
5820 (Session.Tables): New. Return all tables open in the session.
5821 (Session.OpenShapefile): Insert the new ShapeStore into the
5822 shapestores list.
5823
5824 * test/test_session.py (TestSessionSimple.test_initial_state): Add
5825 tests for ShapeStores and Tables
5826 (TestSessionWithContent.test_shape_stores)
5827 (TestSessionWithContent.test_tables): New. Test cases for
5828 ShapeStores and Tables
5829
5830 2003-05-07 Bernhard Herzog <[email protected]>
5831
5832 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
5833 Add comments about the optimizations used.
5834 (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
5835 Implement the ReadValue table interface method.
5836
5837 * test/test_transientdb.py
5838 (TestTransientTable.run_iceland_political_tests)
5839 (TestTransientTable.test_transient_joined_table): Add tests for
5840 ReadValue
5841
5842 2003-05-07 Frank Koormann <[email protected]>
5843
5844 * Resources/Bitmaps/fulllayerextent.xpm,
5845 Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
5846 new icons.
5847
5848 2003-05-06 Bernhard Herzog <[email protected]>
5849
5850 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
5851 New. Simply delegate to the transient table's version.
5852
5853 * test/test_transientdb.py
5854 (TestTransientTable.test_auto_transient_table_query): New. Test
5855 case for AutoTransientTable's SimpleQuery
5856
5857 2003-05-06 Bernhard Herzog <[email protected]>
5858
5859 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
5860 Implement a simple query method for the query dialog
5861 (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
5862 the row index or shapeid.
5863 (TransientTable.create): Insert the right value of the row index
5864 (TransientJoinedTable.create): Copy the row index of the left
5865 table to the joined result table
5866
5867 * test/test_transientdb.py
5868 (TestTransientTable.test_transient_table_read_twice): Fix
5869 doc-string
5870 (TestTransientTable.test_transient_table_query): New. Test for the
5871 SimpleQuery method
5872
5873 2003-05-06 Bernhard Herzog <[email protected]>
5874
5875 Convert all table users to use the new table interface. This only
5876 covers Thuban itself, not GREAT-ER or other applications built on
5877 Thuban yet, so the compatibility interface stays in place for the
5878 time being but it now issues DeprecationWarnings.
5879
5880 Finally, the new Table interface has a new method, HasColumn.
5881
5882 * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
5883 issue deprecation warnings when they're. The warnings refer to the
5884 caller of the method.
5885 (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
5886 for the deprecation warnings
5887
5888 * test/test_table.py: Ignore the deprecation warnings for the old
5889 table in the tests in this module. The purpose of the tests is to
5890 test the old interface, after all.
5891
5892 * test/test_transientdb.py
5893 (TestTransientTable.run_iceland_political_tests): Use the
5894 constants for the types. Add a test for HasColumn
5895 (TestTransientTable.test_transient_joined_table): Adapt to new
5896 table interface. Add a test for HasColumn
5897 (TestTransientTable.test_transient_table_read_twice): Adapt to new
5898 table interface
5899
5900 * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
5901 Adapt to new table interface
5902
5903 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
5904 new table interface
5905
5906 * Thuban/UI/controls.py (RecordListCtrl.fill_list)
5907 (RecordTable.SetTable): Adapt to new table interface
5908
5909 * Thuban/UI/classifier.py (Classifier.__init__)
5910 (Classifier.__init__): Adapt to new table interface
5911
5912 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
5913 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
5914 to new table interface
5915
5916 * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
5917 (AutoTransientTable.HasColumn): Implement the new table interface
5918 method
5919 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
5920 (AutoTransientTable.UniqueValues): Adapt to new table interface
5921
5922 * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
5923 Adapt to new table interface
5924
5925 * test/test_layer.py (TestLayer.open_shapefile): Helper method to
5926 simplify opening shapefiles a bit easier.
5927 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
5928 (TestLayer.test_point_layer): Use the new helper method
5929 (TestLayer.test_get_field_type): New. Test for the GetFieldType
5930 method
5931
5932 * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
5933 the new table method
5934
5935 * test/test_memory_table.py (TestMemoryTable.test_has_column):
5936 Test for the new table method HasColumn
5937
5938 2003-05-06 Jonathan Coles <[email protected]>
5939
5940 Addresses the "Selection Extent" wish of RTbug #1787.
5941
5942 * Resources/Bitmaps/fulllayerextent.xpm,
5943 Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
5944 extent. These are just place holders for the real bitmaps.
5945
5946 * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
5947 calculate the bounding box once (the first time compute_bbox() is
5948 called).
5949 (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
5950 the bounding box for the shapes in lat/long coordinates.
5951
5952 * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
5953 option.
5954 (MainWindow.has_selected_shapes): New. Returns true if there are
5955 any selected shapes.
5956 (MainWindow.FullSelectionExtent): New. Calls
5957 MapCanvas.FitSelectedToWindow() when the user selects the menu option.
5958 (_has_selected_shapes): New. Returns true if there are any
5959 selected shapes.
5960
5961 * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
5962 true if there are any selected shapes.
5963
5964 * Thuban/UI/view.py (MapCanvas): Added delegated method
5965 HasSelectedShapes.
5966 (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
5967 shapes on the canvas using the map projection (if any).
5968
5969 * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
5970 for Layer.ShapesBoundingBox().
5971
5972 2003-05-06 Bernhard Herzog <[email protected]>
5973
5974 * Resources/Projections/defaults.proj: Fix spelling of Mercator
5975
5976 2003-05-05 Jonathan Coles <[email protected]>
5977
5978 Addresses the "Full Layer Extent" wish of RTbug #1787.
5979
5980 * Resources/Projections/defaults.proj: Added UK National Grid.
5981
5982 * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
5983 (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
5984 when the user selects the menu option.
5985
5986 * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
5987 scales the given layer on the canvas using the map projection.
5988
5989 2003-05-05 Bernhard Herzog <[email protected]>
5990
5991 Convert the table implementations to a new table interface. All
5992 tables use a common mixin class to provide backwards compatibility
5993 until all table users have been updated.
5994
5995 * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
5996 provide backwards compatibility for table classes implementing the
5997 new interface
5998 (DBFTable, MemoryTable): Implement the new table interface. Use
5999 OldTableInterfaceMixin as base for compatibility
6000 (DBFColumn, MemoryColumn): New. Column description for DBFTable
6001 and MemoryTable resp.
6002
6003 * test/test_dbf_table.py: New. Test cases for the DBFTable with
6004 the new table interface.
6005
6006 * test/test_memory_table.py: New. Test cases for the MemoryTable
6007 with the new table interface.
6008
6009 * test/test_table.py: Document the all tests in this file as only
6010 for backwards compatibility. The equivalent tests for the new
6011 interface are in test_memory_table.py and test_dbf_table.py
6012 (MemoryTableTest.test_read): field_info should be returning tuples
6013 with four items
6014 (MemoryTableTest.test_write): Make doc-string a more precise.
6015
6016 * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
6017 table interface. Derive from from OldTableInterfaceMixin for
6018 compatibility.
6019 (TransientTableBase.create): New intance variable column_map to
6020 map from names and indices to column objects
6021 (TransientTable.create): Use the new table interface of the input
6022 table
6023 (AutoTransientTable): Convert to new table interface. Derive from
6024 from OldTableInterfaceMixin for compatibility.
6025 (AutoTransientTable.write_record): Removed. It's not implemented
6026 yet and we still have to decide how to handle writing with the new
6027 table and data framework.
6028
6029 * test/test_transientdb.py
6030 (TestTransientTable.run_iceland_political_tests)
6031 (TestTransientTable.test_transient_joined_table): Use the new
6032 table interface
6033
6034 2003-05-05 Jonathan Coles <[email protected]>
6035
6036 This is namely a collection of UI updates to improve user interactivity.
6037 Tabbing between controls now exists and you can use ESC to close dialog
6038 boxes; ENTER will active the default button.
6039
6040 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
6041 order that the controls are created so that tabbing works correctly.
6042 (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
6043 wxDialog can handle the default button correctly.
6044 (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
6045 same reasons as for OnOK.
6046 (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
6047 when we ask the table for the maximum/minimum values of a field
6048 which could take a very long time.
6049
6050 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
6051 order that the controls are created so that tabbing works correctly.
6052 (SelectPropertiesDialog.__init__): Rearrange the order that the
6053 controls are created so that tabbing works correctly.
6054
6055 * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
6056 to derive from a wxDialog but behave like the original implementation
6057 which was derived from a wxFrame. wxDialog provides useful key
6058 handling functionality like ESC calling OnCancel and ENTER calling
6059 OnOK which is lost with wxFrame.
6060
6061 * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
6062 new dialogs.
6063
6064 * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
6065 order that the controls are created so that tabbing works correctly.
6066 (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
6067 (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
6068 (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
6069 (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
6070 can provide the "UK National Grid" as a default projection.
6071 (UTMPanel.__init__): Rearrange the order that the controls are
6072 created so that tabbing works correctly.
6073
6074 2003-05-05 Bernhard Herzog <[email protected]>
6075
6076 * extensions/thuban/wxproj.cpp: Fix some of the comments.
6077 (project_point): If a map projection but no layer projection is
6078 given, convert degrees to radians before applying the map
6079 projection.
6080
6081 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
6082 (TableGrid.allow_messages): New methods to make it possible to
6083 inhibit message sending.
6084 (TableGrid.issue): Only send the message if not inhibited.
6085 (LayerTableGrid.select_shape): Use the new methods to make sure
6086 that no ROW_SELECTED message is sent while we're updating the
6087 selected rows to match the selected shapes.
6088
6089 2003-05-02 Jan-Oliver Wagner <[email protected]>
6090
6091 Implementation of MemoryTable.
6092
6093 * Thuban/Model/table.py (MemoryTable): New. Quite simple table
6094 implementation that operates on a list of tuples. All of the data
6095 are kept in the memory.
6096
6097 * test/test_table.py (MemoryTableTest): New.
6098
6099 * test/test_transientdb.py (SimpleTable): Removed.
6100 (TestTransientTable.test_transient_joined_table,
6101 (TestTransientTable.test_transient_table_read_twice): Replaced
6102 SimpleTable by MemoryTable.
6103
6104 2003-04-30 Jonathan Coles <[email protected]>
6105
6106 * Data/iceland_sample.thuban: Now contains correct projections
6107 for each of the layers.
6108
6109 * Resources/Projections/defaults.proj: Geographic projection
6110 contains unit conversion parameter.
6111
6112 2003-04-30 Jonathan Coles <[email protected]>
6113
6114 The most important part of this putback is the projection changes.
6115 It should now be possible to specify the projection that a layer
6116 is in and then specify a different projection for the map. The
6117 projection dialog has an extra parameter for a geographic projection
6118 which lets the user select if the input is in degrees or radians.
6119
6120 * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
6121 to say that the parameter is a tuple of unprojected
6122 points (which is what the callers to this method were assuming).
6123 Also, since the points are unprojected we need to projected them.
6124
6125 * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
6126 LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
6127 groups are selected, move the layer up/down. Fixes RTbug #1833.
6128
6129 * Thuban/UI/mainwindow.py: Move menu item map_rename up.
6130
6131 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
6132 parameter in call to SetClientData.
6133 (GeoPanel): Add support for selecting the units that the
6134 source data is in (Radians or Degrees).
6135
6136 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
6137 the rendering loop by reducing the number of if's, removing the
6138 unnecessary try/except block, and checking if the old group
6139 is the same as the new one (which happens a lot if there is
6140 no classification, or lots of shapes are in the same group).
6141
6142 * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
6143 around the redraw routine to try to catch problems that the user
6144 may create by selecting invalid projections for the data set and
6145 map. Clears the display if there are any problems and prints the
6146 error.
6147 (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
6148 rectangle.
6149
6150 * extensions/thuban/wxproj.cpp (project_point): First invert the
6151 supplied point (which should be in projected coordinates) using
6152 the layer's projection and then project the point using the
6153 map's projection.
6154 (project_points): Use project_point() to project each point.
6155
6156 2003-04-30 Jan-Oliver Wagner <[email protected]>
6157
6158 * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
6159 don't set the Classification to None if the classfication field
6160 is None (ie only a DEFAULT).
6161
6162 2003-04-30 Bernhard Herzog <[email protected]>
6163
6164 * Thuban/UI/view.py: Fix some typos.
6165
6166 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
6167 not pop up the dialog if the selection becomes empty (this could
6168 happen if e.g. a new selection is opened while the identify tool
6169 is active and dialog had been closed)
6170
6171 2003-04-30 Bernhard Herzog <[email protected]>
6172
6173 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
6174 instance variable read_record_last_result
6175 (TransientTableBase.read_record): Make sure reading the same
6176 record twice works. The implementation uses the new instance
6177 variable read_record_last_result
6178
6179 * test/test_transientdb.py
6180 (TestTransientTable.test_transient_table_read_twice): New test
6181 case for the above bug-fix.
6182
6183 2003-04-29 Jonathan Coles <[email protected]>
6184
6185 * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
6186
6187 * Thuban/UI/classgen.py: Remove all uses of Str2Num.
6188
6189 * Thuban/UI/classifier.py: Remove all uses of Str2Num.
6190 (ClassTable.SetValueAsCustom): Rename keyword argument in
6191 ClassGroup* constructors to match argument name.
6192
6193 2003-04-29 Bernhard Herzog <[email protected]>
6194
6195 * Thuban/Model/session.py (Session.Destroy): Explicitly close the
6196 transient DB if it exists to make sure it doesn't leave a journal
6197 file in the temp directory.
6198
6199 * Thuban/Model/transientdb.py (TransientDatabase.close): Set
6200 self.conn to None after closing the connection to make sure it's
6201 not closed twice
6202
6203 2003-04-29 Jonathan Coles <[email protected]>
6204
6205 Add a visible parameter in the layer XML tag. The default value is
6206 "true". If anything other than "false" is specified we also assume
6207 "true". Addresses RTbug #1025.
6208
6209 * Doc/thuban.dtd: Add visible parameter to a layer.
6210
6211 * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
6212 of visible from 1 to True.
6213 (Layer.__init__): Change default value of visible from 1 to True.
6214
6215 * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
6216 parameter.
6217
6218 * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
6219 parameter.
6220
6221 * test/test_load.py: Add new test data contents_test_visible.
6222 (LoadSessionTest.setUp): save test data.
6223 (LoadSessionTest.testLayerVisibility): Test if the visible flag
6224 is loaded correctly.
6225
6226 * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
6227 for saving an invisible layer.
6228
6229 2003-04-29 Jonathan Coles <[email protected]>
6230
6231 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
6232 legend dialog box and tell it to change its map to the one
6233 supplied to SetMap(). Fixes RTbug #1770.
6234
6235 2003-04-29 Bernhard Herzog <[email protected]>
6236
6237 Next step of table implementation. Introduce a transient database
6238 using SQLite that some of the data is copied to on demand. This
6239 allows us to do joins and other operations that require an index
6240 for good performance with reasonable efficiency. Thuban now needs
6241 SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
6242 haven't tested that.
6243
6244 * Thuban/Model/transientdb.py: New. Transient database
6245 implementation.
6246
6247 * test/test_transientdb.py: New. Tests for the transient DB
6248 classes.
6249
6250 * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
6251 classes to help automatically remove temporary files and
6252 directories.
6253 (Session.__init__): New instance variables temp_dir for the
6254 temporary directory and transient_db for the SQLite database
6255 (Session.temp_directory): New. Create a temporary directory if not
6256 yet done and return its name. Use AutoRemoveDir to have it
6257 automatically deleted
6258 (Session.TransientDB): Instantiate the transient database if not
6259 done yet and return it.
6260
6261 * Thuban/Model/data.py (ShapefileStore.__init__): Use an
6262 AutoTransientTable so that data is copied to the transient DB on
6263 demand.
6264 (SimpleStore): New class that simply combines a table and a
6265 shapefile
6266
6267 * Thuban/Model/table.py (Table, DBFTable): Rename Table into
6268 DBFTable and update its doc-string to reflect the fact that this
6269 is only the table interface to a DBF file. Table is now an alias
6270 for DBFTable for temporary backwards compatibility.
6271
6272 * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
6273 the last reference to the session goes away so that the temporary
6274 files are removed properly.
6275
6276 * test/test_load.py (LoadSessionTest.tearDown): Remove the
6277 reference to the session to make sure the temporary files are
6278 removed.
6279
6280 2003-04-29 Bernhard Herzog <[email protected]>
6281
6282 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
6283 the __parser instance variable into a normal local variable in
6284 read. It's only used there and read will never be called more than
6285 once. Plus it introduces a reference cycle that keeps can keep the
6286 session object alive for a long time.
6287
6288 2003-04-29 Jonathan Coles <[email protected]>
6289
6290 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
6291 Projection an immutable item. Fixes RTbug #1825.
6292 (Projection.__init__): Initialize instance variables here.
6293 (ProjFile.Replace): New. Replace the given projection object with
6294 the new projection object. This solves the problem of needing the
6295 mutator Projection.SetProjection() in the ProjFrame class and
6296 allows a projection to change parameters without changing its
6297 location in the file.
6298
6299 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
6300 be of type wxSAVE and should verify overwriting a file.
6301
6302 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
6303 ProjFile.Replace() method instead of the mutator
6304 Projection.SetProjection(). Also requires that we reassign the
6305 client data to the new projection.
6306
6307 * test/test_proj.py (TestProjection.test): Test GetName() and
6308 GetAllParameters()
6309 (TestProjFile.test): Remove tests for Set*() methods. Add tests
6310 for Replace().
6311
6312 2003-04-25 Jonathan Coles <[email protected]>
6313
6314 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
6315 to save the name of the projection.
6316
6317 * test/test_save.py (SaveSessionTest.testLayerProjection): New
6318 test to verify layer projections are saved correctly.
6319
6320 2003-04-25 Jonathan Coles <[email protected]>
6321
6322 * Thuban/Model/proj.py (Projection.SetName): Set the name
6323 to "Unknown" if name is None.
6324 (Projection.SetAllParameters): New. Set the projection's
6325 parameter list to the one supplied.
6326 (Projection.SetProjection): New. Set the projection's
6327 properties to those of the supplied Projection.
6328
6329 * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
6330 the dialog title to include the map's title.
6331 (MainWindow.LayerProjection): Set the dialog title to include
6332 the layer's title.
6333
6334 * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
6335 error dialogs into a single method call.
6336 (ProjFrame.__VerifyButtons): Add more states to check.
6337 (ProjFrame.__GetProjection): Return the current state of an
6338 edited projection or None.
6339 (ProjFrame.__FillAvailList): Remove checks for states that
6340 shouldn't exist.
6341 (ProjFrame._OnNew): Clear all selected items and supply
6342 a projection panel if necessary.
6343
6344 * test/test_proj.py (TestProjFile.test): Add tests for
6345 ProjFile.SetAllParameters, ProjFile.SetProjection,
6346 ProjFile.SetName.
6347
6348 2003-04-25 Jonathan Coles <[email protected]>
6349
6350 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
6351 takes an optional argument to select the current projection.
6352 This does not guarantee that the item is visible due to
6353 limited wxWindows functionality. Fixes RTBug #1821.
6354
6355 2003-04-25 Jonathan Coles <[email protected]>
6356
6357 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
6358 the projection name and use it when constructing the Projection
6359 object.
6360
6361 * Thuban/Model/proj.py (Projection.__init__): Change the default
6362 value for 'name' to None and then test if name is equal to None
6363 in the body of the constructor. This way the caller doesn't have to
6364 know what the default value should be. Namely, useful in load.py
6365 where we have to pick a default value if the 'name' parameter
6366 doesn't exist in the XML file.
6367
6368 * test/test_load.py (LoadSessionTest.testLayerProjection): New.
6369 Tests a file where a layer has a projection.
6370
6371 2003-04-25 Jonathan Coles <[email protected]>
6372
6373 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
6374 tree for projection information.
6375
6376 * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
6377 XMLReader.GetFileName.
6378 (SessionLoader): Added support for loading projection tags that
6379 appear inside a layer.
6380
6381 * Thuban/Model/proj.py (ProjFile): Document the class. Move
6382 back to using a list because the order of the projections in
6383 the file is important to maintain. Fixes RTbug #1817.
6384
6385 * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
6386 to ProjFile.GetFilename.
6387
6388 * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
6389 information.
6390
6391 * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
6392 ProjFrame._OnSaveAs. Removed old dead code from previous
6393 implementation.
6394 (ProjFrame._OnExport): Add support for exporting more than one
6395 projection to a single file.
6396 (ProjFrame.__FillAvailList): use string formatting (% operator)
6397 to build strings that are (partly) translated. Fixes RTbug #1818.
6398
6399 * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
6400 class.
6401
6402 2003-04-24 Bernhard Herzog <[email protected]>
6403
6404 * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
6405
6406 * po/fr.po: New. French translation by Daniel Calvelo Aros
6407
6408 * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
6409 empty strings.
6410
6411 2003-04-24 Jonathan Coles <[email protected]>
6412
6413 * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
6414 implement the interface that the ProjFrame dialog expects.
6415
6416 * Thuban/Model/proj.py (Projection.SetName): New. Allows the
6417 name of the projection to be changed.
6418 (ProjFile): Use a dictionary instead of a list so that removing
6419 projections is easier and we are sure about uniqueness.
6420 (ProjFile.Remove): Remove the given projection object.
6421
6422 * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
6423 Return a list with only one projection file instead of searching for
6424 any projection file. This simplifies many things if the user can
6425 only have one system file and one user file.
6426
6427 * Thuban/UI/classgen.py: Change all references to
6428 genCombo to genChoice.
6429
6430 * Thuban/UI/mainwindow.py: Add a Projection option under the
6431 layer menu.
6432 (MainWindow.LayerProjection): New. Open up a projection window
6433 for a layer.
6434
6435 * Thuban/UI/projdialog.py: Large changes to how the dialog is
6436 laid out. Use three panels instead of one. One for the list of
6437 projections, one for the edit controls, and one for the buttons.
6438 Fixed resizing problems so that the dialog resizes correctly
6439 when the projection panel changes. Added import/export, save, and
6440 new buttons/functionality.
6441
6442 2003-04-24 Bernhard Herzog <[email protected]>
6443
6444 First step towards table management. Introduce a simple data
6445 abstraction so that we replace the data a layer uses more easily
6446 in the next step.
6447
6448 * Thuban/Model/data.py: New file with a simple data abstraction
6449 that bundles shapefile and dbffile into one object.
6450
6451 * Thuban/Model/session.py (Session.OpenShapefile): New method to
6452 open shapefiles and return a shape store object
6453
6454 * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
6455 object instead of a shapefile filename. This introduces a new
6456 instance variable store holding the datastore. For intermediate
6457 backwards compatibility keep the old instance variables.
6458 (open_shapefile): Removed. No longer needed with the shape store.
6459 (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
6460 get the shape store used by a layer.
6461 (Layer.Destroy): No need to explicitly destroy the shapefile or
6462 table anymore.
6463
6464 * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
6465 (MainWindow.AddLayer): Use the session's OpenShapefile method to
6466 open shapefiles
6467
6468 * Thuban/Model/load.py (ProcessSession.start_layer): Use the
6469 session's OpenShapefile method to open shapefiles
6470
6471 * test/test_classification.py
6472 (TestClassification.test_classification): Use the session's
6473 OpenShapefile method to open shapefiles and build the filename in
6474 a more platform independed way
6475
6476 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
6477 Implement to have a session to use in the tests
6478 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
6479 (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
6480 session's OpenShapefile method to open shapefiles
6481 (TestLayerLegend.setUp): Instantiate a session so that we can use
6482 it to open shapefiles.
6483 (TestLayerLegend.tearDown): Make sure that all references to
6484 layers and session are removed otherwise we may get a resource
6485 leak
6486
6487 * test/test_map.py (TestMapAddLayer.test_add_layer)
6488 (TestMapWithContents.setUp): Instantiate a session so that we can
6489 use it to open shapefiles.
6490 (TestMapWithContents.tearDown): Make sure that all references to
6491 layers, maps and sessions are removed otherwise we may get a
6492 resource leak
6493 ("__main__"): use support.run_tests() so that more info about
6494 uncollected garbage is printed
6495
6496 * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
6497 session's OpenShapefile method to open shapefiles
6498 ("__main__"): use support.run_tests() so that more info about
6499 uncollected garbage is printed
6500
6501 * test/test_selection.py (TestSelection.tearDown): Make sure that
6502 all references to the session and the selection are removed
6503 otherwise we may get a resource leak
6504 (TestSelection.get_layer): Instantiate a session so that we can
6505 use it to open shapefiles.
6506 ("__main__"): use support.run_tests() so that more info about
6507 uncollected garbage is printed
6508
6509 * test/test_session.py (TestSessionBase.tearDown)
6510 (TestSessionWithContent.tearDown): Make sure that all references
6511 to the session and layers are removed otherwise we may get a
6512 resource leak
6513 (TestSessionWithContent.setUp): Use the session's OpenShapefile
6514 method to open shapefiles
6515
6516 2003-04-24 Jonathan Coles <[email protected]>
6517
6518 * Thuban/Model/load.py (XMLReader.read): Should have been checking
6519 if the file_or_filename object had the 'read' attribute.
6520
6521 2003-04-23 Jonathan Coles <[email protected]>
6522
6523 * Thuban/Model/resource.py: Fixes RTbug #1813.
6524 (ReadProjFile): Add documentation about which exceptions are raised.
6525 Always pass the exceptions up to the caller.
6526 (GetProjFiles): If the directory can't be read return an empty list.
6527 If any of the proj files can't be read skip that file and go
6528 on to the next one.
6529
6530 * test/test_proj.py: Added test cases to handle nonexistent files,
6531 unreadable files, and files that don't parse correctly.
6532
6533 2003-04-23 Jonathan Coles <[email protected]>
6534
6535 Projection dialog. Allows the user to select from a list
6536 of projection templates and optionally edit them and save new ones.
6537
6538 * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
6539 (ProjPanel): Base class for projection specific panels.
6540 (TMPanel): Projection panel for Transverse Mercartor.
6541 (UTMPanel): Projection panel for Universal Transverse Mercartor.
6542 (LCCPanel): Projection panel for Lambert Conic Conformal.
6543 (GeoPanel): Projetion panel for Geographic Projection.
6544
6545 2003-04-23 Jonathan Coles <[email protected]>
6546
6547 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
6548 promote symmetry. There now exists XMLReader and XMLWriter.
6549 (XMLReader.read): New. Call to read the given file descriptor or
6550 filename.
6551 (XMLReader.close): New. Make sure the file is closed.
6552 (XMLReader.GetFileName): New. Return just the file name that is being
6553 read from.
6554 (XMLReader.GetDirectory): New. Return just the directory of the file
6555 that is being read.
6556 (XMLReader.AddDispatchers): New. Take a dictionary which contains
6557 the names of functions to call as the XML tree is parsed.
6558 (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
6559 (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
6560 (SessionLoader): Removed class variables start_dispatcher and
6561 end_dispatcher since this functionality is now part of a class
6562 instance. Fixes RTbug #1808.
6563 (SessionLoader.__init__): Add dispatcher functions.
6564 (load_xmlfile): Code was moved into the XMLReader.read().
6565 (load_session): Use modified SessionLoader.
6566
6567 * Thuban/Model/map.py (Map.GetProjection): New. Returns the
6568 map's projection.
6569
6570 * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
6571 GetAllParameters.
6572 (Projection.GetParameter): Returns the value for the given parameter.
6573
6574 * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
6575 (GetProjFiles): Renamed from GetProjections. Now returns a list
6576 of ProjFile objects.
6577 (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
6578 a list of ProjFile objects whose files are not user defined.
6579 (GetUserProjFiles): Renamed from GetUserProjections. Returns a
6580 list of ProjFile objects whose files are user defined.
6581 (ProjFileReader): Extend new XMLReader.
6582
6583 * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
6584 promote symmetry.
6585
6586 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
6587 control instead of a wxComboBox. wxChoice controls do not generate
6588 events as the uses highlights possible choices which fixes problems
6589 with resizing the dialog when the use selects an option.
6590
6591 * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
6592 control instead of a wxComboBox.
6593
6594 * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
6595 dialog.
6596
6597 * test/test_proj.py (TestProjection.test): New tests for GetParameter
6598 method.
6599
6600 2003-04-22 Bernhard Herzog <[email protected]>
6601
6602 * Thuban/UI/mainwindow.py: Remove some unused imports and global
6603 constants
6604
6605 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
6606 (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
6607
6608 2003-04-17 Bernhard Herzog <[email protected]>
6609
6610 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
6611 (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
6612 anymore.
6613 (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
6614 (Layer.ShapeType, Layer.Shape): No need to call
6615 self.open_shapefile since it's always called in __init__
6616
6617 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
6618 In wxPython 2.4 there's no need to extend MainLoop anymore since
6619 wxPython itself makes sure OnExit is called.
6620
6621 2003-04-16 Jonathan Coles <[email protected]>
6622
6623 Initial putback of projection management code. Includes new
6624 classes to read and write projection files. The current load
6625 and save classes were abstracted a bit so they could be reused.
6626 The Projection class was extended to provide new methods and
6627 have a name.
6628
6629 * Thuban/Model/load.py (XMLProcessor): New. Contains all the
6630 general XML reading methods that were part of ProcessSession.
6631
6632 * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
6633 name.
6634 (ProjFile): New. Represents a file that contains projection
6635 information.
6636
6637 * Thuban/Model/resource.py: New. Contains general utilities
6638 for read and writing projection files.
6639
6640 * Thuban/Model/save.py (XMLSaver): New. Contains all the
6641 general XML writing methods that were part of SessionSaver.
6642 (SessionSaver): Renamed from Saver.
6643
6644 * test/test_proj.py: New test cases for the projection
6645 file read and write functions.
6646
6647 2003-04-16 Jonathan Coles <[email protected]>
6648
6649 * Thuban/Model/classification.py: Use repr() around values
6650 in the ClassGroup*.__repr__() methods so it is clearer when
6651 a value is a string and when it is a number.
6652
6653 * test/test_load.py: Rework the classification test to test
6654 that we can load old files.
6655 (testLabels): Test a file where the groups have labels.
6656
6657 2003-04-16 Bernhard Herzog <[email protected]>
6658
6659 Safer implementation of the performance enhancements of the
6660 low-level renderer:
6661
6662 * extensions/thuban/wxproj.cpp (extract_projection)
6663 (extract_pointer): Rename extract_projection to extract_pointer
6664 and redefine its purpose to return the pointer stored in a CObject
6665 returned by the object's cobject method. Update all callers.
6666 (s_draw_info, free_draw_info, draw_polygon_init): Implement the
6667 handling of these low-level parameters so that each s_draw_info
6668 instance is handled as a CObject at python level that also
6669 contains real references to the actual python objects which
6670 contain the values in the struct. Add free_draw_info as the
6671 destructor.
6672 (draw_polygon_shape): Add the py_draw_info parameter which must a
6673 cobject containing an s_draw_info pointer.
6674
6675 * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
6676 method to instantiat the low-level render parameter
6677 (MapRenderer.draw_shape_layer): Use the new method. Remove some
6678 commented out code.
6679 (MapRenderer.draw_polygon_shape): Make the first parameter not the
6680 layer but the low-level render parameter
6681 (ScreenRenderer.draw_shape_layer): Use the low-level render
6682 parameter.
6683
6684 2003-04-15 Jonathan Coles <[email protected]>
6685
6686 * Thuban/Model/classification.py: Implemented __repr__ for
6687 the ClassGroup* classes to make debugging a bit easier.
6688 (ClassGroup.SetLabel): Check that the string is an instance
6689 of StringTypes not StringType. Accounts for Unicode strings.
6690
6691 * Thuban/Model/color.py: Implemented __repr__ to make
6692 debugging a bit easier.
6693
6694 * Thuban/Model/save.py (Saver.write_classification): Need to
6695 save the group label.
6696
6697 * test/test_load.py (testClassification): New. Loads the
6698 iceland_sample_test.thuban file and checks if it was loaded
6699 correctly.
6700
6701 2003-04-15 Jonathan Coles <[email protected]>
6702
6703 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
6704 to improve rendering performance by initializing the variables
6705 that are not change each time draw_polygon_shape() is called.
6706 The values are stored in a global struct draw_info.
6707 (draw_polygon_shape): Removed initialization code that is
6708 now in draw_polygon_init().
6709
6710 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
6711 drawing initialization call to draw_polygon_init()
6712 (MapRenderer.draw_polygon_shape): Use new signature of
6713 draw_polygon_shape.
6714
6715 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
6716 weirdness by setting the range to (1, maxint).
6717
6718 * Thuban/Model/classification.py (ClassGroupProperties): Make
6719 instance variables private and optimize comparison operator
6720 by first checking if the color references are the same.
6721 (ClassGroupSingleton): Make instance variables private.
6722 (ClassGroupRange): Make instance variables private.
6723
6724 * HOWTO-Release: Filled in missing steps for releasing packages.
6725
6726 2003-04-15 Bernhard Herzog <[email protected]>
6727
6728 First stab at internationalized messages:
6729
6730 * Thuban/__init__.py (_): Implement the translation function for
6731 real using the python gettext module.
6732
6733 * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
6734 translate empty strings.
6735
6736 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
6737 Add a missing space to a warning message
6738
6739 * po/README: New. Notes about the management of the translation
6740 files.
6741
6742 * po/Makefile: New. Makefile to help manage the translation files.
6743
6744 * po/es.po: New. Spanish translation by Daniel Calvelo Aros
6745
6746 * MANIFEST.in: Include the *.mo files in Resources/Locale and the
6747 translations and support files in po/
6748
6749 * setup.py (data_files): Add the *.mo files to the data_files too
6750
6751 * README: Add note about the translations when building from CVS
6752
6753 2003-04-14 Jonathan Coles <[email protected]>
6754
6755 * Thuban/UI/dock.py: Fixes some window resizing problems most
6756 noticable under windows. Always assume the button bitmaps will
6757 be there. Code clean up.
6758 (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
6759 images for the dock/undock button to the same images.
6760 Work around for RTbug #1801.
6761
6762 * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
6763 be allowed to grow within the sizer. Fixes a bug under Windows
6764 where the toolbar wasn't being drawn.
6765
6766 2003-04-14 Frank Koormann <[email protected]>
6767
6768 * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
6769 Updated design to try to make the button functionality more
6770 transparent.
6771
6772 2003-04-14 Jonathan Coles <[email protected]>
6773
6774 * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
6775 finalize the intialization of the panel.
6776
6777 * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
6778 creation of the panel. Should be the last thing called in the
6779 initializer of a subclass.
6780
6781 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
6782 set the current selections in the combo boxes. This is needed
6783 under Windows.
6784
6785 * Thuban/UI/classifier.py (Classifier.__init__): Add a top
6786 level panel to the dialog so that the background colors are
6787 consistent under Windows.
6788
6789 2003-04-11 Jonathan Coles <[email protected]>
6790
6791 * Thuban/UI/classgen.py: Change color ramps to start at white
6792 not black.
6793
6794 * Thuban/UI/legend.py: Enable/disable the legend buttons when
6795 the legend changes. Fixes RTbug #1793.
6796
6797 * test/test_classification.py: Added test for copying of
6798 classifications.
6799
6800 2003-04-11 Jonathan Coles <[email protected]>
6801
6802 * Thuban/UI/resource.py: New. Centralize the loading of resources
6803 such as bitmaps.
6804
6805 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
6806 added images to the move buttons, added 'reverse' button.
6807 (CustomRampPanel.__init__): Added images to the move buttons.
6808 (GreyRamp): New. Generates a ramp from white to black.
6809 (HotToColdRamp): New. Generates a ramp from cold to hot colors.
6810
6811 * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
6812 ID_PROPERTY_*.
6813 (Classifier.__init__): Minor changes to the layout.
6814 (Classifier._OnTitleChanged): Listen for when the user edits the
6815 title and update the dialog's title and the layer's title.
6816
6817 * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
6818
6819 * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
6820 (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
6821 if the layer's title changes.
6822
6823 * Thuban/UI/mainwindow.py: Added new menu item and associated code
6824 to open a dialog to rename the map.
6825 (MainWindow): Use new resource class to import bitmaps.
6826
6827 2003-04-11 Jonathan Coles <[email protected]>
6828
6829 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
6830 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
6831 Resources/Bitmaps/group_use_none.xpm,
6832 Resources/Bitmaps/group_use_not.xpm,
6833 Resources/Bitmaps/hide_layer.xpm,
6834 Resources/Bitmaps/layer_properties.xpm,
6835 Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
6836 Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
6837 New.
6838
6839 2003-04-10 Jonathan Coles <[email protected]>
6840
6841 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
6842 Should pass group to ClassGroup constructor.
6843
6844 2003-04-10 Jonathan Coles <[email protected]>
6845
6846 * Thuban/Model/classification.py: (ClassGroup): Move all the common
6847 methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
6848 here. Implement SetVisible(), IsVisible().
6849 (ClassGroup.__init__): Add group parameter which acts as a copy
6850 constructor.
6851
6852 * Thuban/UI/classifier.py (ClassTable): Add a new column for the
6853 "Visible" check boxes.
6854 (Classifier): Rename the buttons and refactor the code to match
6855 the new labels.
6856
6857 * Thuban/UI/legend.py: Classify button is now called "Properties".
6858 Refactored the code to change variable names.
6859 (LegendTree.__FillTreeLayer): Only list a group if it is visible.
6860
6861 * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
6862 MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
6863 renamed to MainWindow.LayerEditProperties.
6864 (MainWindow.ToggleLegend): Don't include map name in legend title.
6865 (MainWindow.SetMap): Added the map name to the window title.
6866 (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
6867 MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
6868 Functionality is found in the layer properties dialog.
6869
6870 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
6871 draw visible groups.
6872
6873 2003-04-09 Jonathan Coles <[email protected]>
6874
6875 * Thuban/UI/classgen.py: Modifications to allow simple
6876 addition and selection of new color schemes.
6877 (MonochromaticRamp): New. Generates a ramp between two colors.
6878 (RedRamp): New. Generates a ramp of all red.
6879 (GreenRamp): New. Generates a ramp of all green.
6880 (BlueRamp): New. Generates a ramp of all blue.
6881
6882 2003-04-09 Jonathan Coles <[email protected]>
6883
6884 * Thuban/Model/classification.py (Classification.__deepcopy__):
6885 Need to copy over field and fieldType attributes.
6886
6887 * Thuban/Model/table.py (Table.field_range): New. Retrive the
6888 maximum and minimum values over the entire table for a given
6889 field.
6890 (Table.GetUniqueValues): New. Retrieve all the unique values
6891 in the table for a given field.
6892
6893 * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
6894 (GenUniquePanel): New. Controls to allow the user to select
6895 which unique field values they would like in the classification.
6896 (CustomRampPanel): Code that was in ClassGenDialog that allows
6897 the user to select the properties for a custom ramp.
6898 (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
6899
6900 * Thuban/UI/classifier.py: Removed a lot of debugging code.
6901 (Classifier._SetClassification): Callback method so that the
6902 class generator can set the classification in the grid.
6903 (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
6904 editing of a group properties class into a wxWindows control.
6905
6906 * Thuban/UI/dock.py: It was decided that if the user closes
6907 a dockable window the window should simply hide itself. That
6908 way if the user wants to show the dock again it appears in the
6909 same place as it was when it was closed.
6910 (DockableWindow.Destroy): Call renamed method OnDockDestroy().
6911 (DockableWindow._OnButtonClose): Hide the window instead of
6912 destroying it.
6913 (DockableWindow._OnClose): Hide the window instead of
6914 destroying it.
6915
6916 * Thuban/UI/legend.py (LegendTree): Use a private method to
6917 consistently set the font and style of the text. Fixes RTbug #1786.
6918
6919 * Thuban/UI/mainwindow.py: Import just the Classifier class.
6920
6921 2003-04-07 Bernhard Herzog <[email protected]>
6922
6923 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
6924 to the map module
6925
6926 2003-04-07 Bernhard Herzog <[email protected]>
6927
6928 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
6929 favor of ToggleSessionTree
6930 (MainWindow.ToggleSessionTree): New method to toggle visibility of
6931 the session tree.
6932 (MainWindow.SessionTreeShown): New method to return whether the
6933 session tree is currently shown.
6934 (MainWindow.ToggleLegend): New method to toggle visibility of the
6935 legend
6936 (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
6937 LegendShown
6938 (MainWindow.LegendShown): New method to return whether the legend
6939 is currently shown.
6940 (_method_command): Add checked parameter so we can define check
6941 menu items
6942 (_has_tree_window_shown, _has_legend_shown): Use the appropriate
6943 mainwindow methods.
6944 (show_session_tree, show_legend commands): Removed.
6945 (toggle_session_tree, toggle_legend commands): New commands to
6946 toggle the visibility of the dialogs
6947
6948 2003-04-07 Jonathan Coles <[email protected]>
6949
6950 * Thuban/UI/classgen.py: Fix Windows problem.
6951
6952 * Thuban/UI/dock.py: Fix Windows problem.
6953
6954 * Thuban/UI/mainwindow.py: Use False instead of false.
6955 (MainWindow.ShowLegend): Remove unnecessary switch parameter.
6956
6957 2003-04-07 Jonathan Coles <[email protected]>
6958
6959 Since we now say that the order of the groups in a classification
6960 matters, it makes sense to be able to manipulate that order. Most
6961 of the changes to Thuban/Model/classification.py are to that end.
6962
6963 * Thuban/Model/classification.py (Classification.AppendGroup,
6964 Classification.InsertGroup, Classification.ReplaceGroup,
6965 Classification.RemoveGroup, Classification.GetGroup): Do as the
6966 names imply.
6967 (Classification.FindGroup): This was called GetGroup, but GetGroup
6968 takes an index, while FindGroup takes a value.
6969 (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
6970 REFERENCE. Currently there is a cyclic reference between the layer
6971 and its classification. If the classification doesn't need to know
6972 its owning layer we can change this, since it may make sense to be
6973 able to use the same classification with different layers.
6974
6975 * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
6976
6977 * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
6978 not AddGroup()
6979
6980 * Thuban/UI/classifier.py: Now that we can depend on the order in
6981 a Classification and have methods to manipulate that order we don't
6982 need to use our own data structures in the grid. We can simply make
6983 the grid/table access the information they need from a copy of
6984 the classification object.
6985 (Classifier._OnCloseBtn): Event handler for when the user clicks
6986 'Close'. This is needed so if the user applies changes and then
6987 continues to change the table the user has the option of discarding
6988 the most recent changes and keeping what they applied.
6989
6990 * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
6991 into the same group.
6992
6993 * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
6994 with a really old version of proj, PJ_VERSION won't even be defined.
6995 If it isn't defined then just compile so that the function always
6996 returns Py_False.
6997
6998 * test/test_classification.py: Fix tests to use the renamed methods.
6999 Still need to write tests for the new methods.
7000
7001 2003-04-04 Jonathan Coles <[email protected]>
7002
7003 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
7004 call to SetSelection out of the method and before the call
7005 to __SelectField in __init__. This prevents a recursion of events
7006 when _OnFieldSelect is triggered by the user.
7007
7008 2003-04-04 Jonathan Coles <[email protected]>
7009
7010 * Thuban/Model/classification.py: Rename Color.None to
7011 Color.Transparent.
7012 (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
7013 Don't bother copying the color, since Colors are immutable.
7014
7015 * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
7016 Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
7017 Thuban/UI/renderer.py, Thuban/UI/view.py:
7018 Rename Color.None to Color.Transparent.
7019
7020 * test/test_classification.py, test/test_load.py: Rename Color.None
7021 to Color.Transparent.
7022
7023 2003-04-04 Jonathan Coles <[email protected]>
7024
7025 * Thuban/Model/classification.py: Fix assert calls.
7026 (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
7027 Copy the color parameter rather than hold onto a reference.
7028
7029 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
7030 the color object.
7031 (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
7032 are sure there exists only one refernce to Color.None in the system.
7033 This allows us to use 'is' rather than the comparision functions.
7034
7035 * Thuban/Model/save.py: Fix assert calls.
7036
7037 * Thuban/UI/classifier.py: Fix assert calls.
7038 (ClassGrid._OnCellDClick): Call up to the classifier to open the
7039 dialog to edit the groups properties.
7040 (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
7041 correctly if a cell is resized.
7042 (ClassTable.SetClassification): New. Changes the classification
7043 that is in the table.
7044 (ClassTable.__SetRow): Allow groups to be prepended.
7045 (Classifier): New code for opening the EditProperties and
7046 GenerateRanges dialogs.
7047 (SelectPropertiesDialog.__GetColor): Only set the color in the
7048 color dialog if the current color is not None.
7049
7050 * Thuban/UI/dock.py: Fix assert calls.
7051
7052 * Thuban/UI/legend.py: Fix assert calls.
7053
7054 * Thuban/UI/renderer.py: Fix assert calls.
7055
7056 * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
7057 classifications.
7058 (GenRangePanel): Panel specific to range generation.
7059 (GenSingletonPanel): Panel specific to singleton generation.
7060 (ClassGenerator): Class responsible for actually generating
7061 the classification from the data gathered in the dialog box.
7062 (PropertyRamp): Generates properties whose values range from
7063 a starting property to an ending property.
7064
7065 2003-04-03 Bernhard Herzog <[email protected]>
7066
7067 * test/support.py (print_garbage_information): New function that
7068 prints information about still connected messages and memory
7069 leaks.
7070 (run_suite): Removed.
7071 (run_tests): New function for use as a replacement of
7072 unittest.main in the test_* files. This one calls
7073 print_garbage_information at the end.
7074
7075 * test/runtests.py (main): Use support.print_garbage_information
7076
7077 * test/test_layer.py: Use support.run_tests instead of
7078 unittest.main so we get memory leak information
7079 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
7080 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
7081 (TestLayerLegend.test_visibility): Call the layer's Destroy method
7082 to fix a memory leak.
7083
7084 * test/test_classification.py: Use support.run_tests instead of
7085 unittest.main so we get memory leak information
7086 (TestClassification.test_classification): Call the layer's Destroy
7087 method to fix a memory leak.
7088
7089 2003-04-02 Bernhard Herzog <[email protected]>
7090
7091 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
7092 Handle the reference counts of the return value and errors in
7093 PyArg_ParseTuple correctly.
7094
7095 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
7096 sure the filename is absolute to avoid problems when saving the
7097 session again
7098
7099 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
7100
7101 2003-04-01 Jonathan Coles <[email protected]>
7102
7103 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
7104 that there actually are points in the returned list of points
7105 before trying to index into the list. The list may be empty if
7106 the shape is a Null Shape.
7107
7108 2003-04-01 Bernhard Herzog <[email protected]>
7109
7110 * test/test_map.py: Don't use from <module> import *
7111
7112 2003-04-01 Jonathan Coles <[email protected]>
7113
7114 * Thuban/Model/session.py: Use LAYER_CHANGED instead of
7115 LAYER_LEGEND_CHANGED
7116
7117 * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
7118 self.Destroy() to close the window after yesterday's changes.
7119
7120 * test/test_map.py, test/test_session.py: Fix messages that
7121 are sent from maps and layers.
7122
7123 2003-03-31 Jonathan Coles <[email protected]>
7124
7125 * Thuban/UI/classifier.py: Commented out some debugging statements.
7126 (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
7127 RTbug #1769.
7128
7129 * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
7130 position (although position doesn't work yet under GTK).
7131 (DockableWindow.Destroy): New. Called when the window must be
7132 closed. Namely needed when the DockFrame closes and must close
7133 its children.
7134 (DockFrame): Listen for EVT_CLOSE and destroy all children.
7135
7136 * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
7137 when then window is told to close.
7138 (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
7139 comment in source for more info.
7140
7141 * Thuban/UI/main.py: Show the legend by default when Thuban starts.
7142
7143 * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
7144 symmetry with other such methods.
7145 (MainWindow.ShowLegend): Show the legend docked by default.
7146
7147 2003-03-28 Jonathan Coles <[email protected]>
7148
7149 * Thuban/UI/classifier.py: Support for highlighting a specific
7150 group within the grid when the classification dialog is opened.
7151 Also contains a lot of debugging printouts which will later
7152 be removed.
7153
7154 * Thuban/UI/dock.py: Complete rework on the dock code so that
7155 that it is fairly removed from the rest of the Thuban application.
7156 It is easy to add new docks which the rest of the program having
7157 to be aware of them.
7158
7159 * Thuban/UI/legend.py: Modifications to support selecting a
7160 specific group in the classification dialog. Changed how layers
7161 are drawn when the layer is visible/invisible.
7162
7163 * Thuban/UI/mainwindow.py: Removed legend specific code and
7164 replaced it with calls to the new dock code.
7165
7166 * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
7167 to check if scale > 0. Trying to track down a divide by zero.
7168
7169 2003-03-26 Jonathan Coles <[email protected]>
7170
7171 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
7172 (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
7173 now part of DockableWindow.
7174 (LegendPanel.DoOnSelChanged): Select the current layer in the
7175 map.
7176 (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
7177 with the selected layer and/or group.
7178
7179 2003-03-26 Jonathan Coles <[email protected]>
7180
7181 This putback contains the code for dockable windows. There is
7182 no support in wxWindows as of this date for windows that can
7183 attach themselves to other windows.
7184
7185 The current model contains a DockableWindow which has a parent
7186 window for when it is detached and a dock window that it puts
7187 its contents in when it is docked. The contents of a DockableWindow
7188 must be a DockPanel. DockPanel itself derives from wxPanel.
7189
7190 * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
7191 message, not a LAYER_LEGEND_CHANGED message.
7192
7193 * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
7194
7195 * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
7196 as one of the style properties for the fieldTypeText item to
7197 be sure that its size is correct when the text changes.
7198
7199 * Thuban/UI/dock.py: New. Classes for the DockPanel and
7200 DockableWindow.
7201
7202 * Thuban/UI/legend.py: Added some more buttons and made the
7203 LegendPanel a DockPanel.
7204
7205 * Thuban/UI/mainwindow.py: Added sash windows to the main window
7206 and supporting functions for manipulating the sashes.
7207 (MainWindow.ShowLegend): Create a DockableWindow with the
7208 LegendPanel as the contents.
7209
7210 * Thuban/UI/messages.py: Added DOCKABLE_* messages
7211
7212 * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
7213 not LAYER_LEGEND_CHANGED, messages.
7214
7215 2003-03-25 Jonathan Coles <[email protected]>
7216
7217 * setup.py: Added custom script bdist_rpm_build_script so that
7218 when the rpm is built the path to wx-config is correct.
7219
7220 * setup.cfg: Added line saying to use the custom build script
7221
7222 2003-03-20 Jonathan Coles <[email protected]>
7223
7224 Initial implementation of the Legend.
7225
7226 * Thuban/UI/legend.py: New. Creates a window that shows the map's
7227 Legend information and allows the user to add/modify classifications
7228 and how the layers are drawn on the map.
7229
7230 * setup.py: New command 'build_docs' which currently uses
7231 happydoc to generate html documentation for Thuban.
7232
7233 * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
7234 Returns a string which is appropriately describes the group.
7235
7236 * Thuban/Model/layer.py (Layer.SetClassification): Generate a
7237 LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
7238
7239 * Thuban/Model/map.py (Map): Rename messages and use new, more
7240 specific, messages.
7241
7242 * Thuban/Model/messages.py: New message to indicate that a layer's
7243 data has changed (LAYER_CHANGED). New map messages to indicate
7244 when layers have been added/removed/changed or if the stacking order
7245 of the layers has changed.
7246
7247 * Thuban/Model/session.py: Rename and use new messages.
7248
7249 * Thuban/UI/classifier.py: Remember if any changes have actually
7250 been applied so that if the dialog is cancelled without an application
7251 of changes we don't have to set a new classification.
7252 (ClassDataPreviewer): Pulled out the window specific code and put it
7253 ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
7254 symbols on any DC.
7255
7256 * Thuban/UI/mainwindow.py: New code to open the legend.
7257
7258 * Thuban/UI/view.py: Use new message names.
7259
7260 2003-03-19 Jonathan Coles <[email protected]>
7261
7262 * Thuban/UI/main.py (verify_versions): New. Checks the versions
7263 of Python, wxPython, and some other libraries.
7264
7265 * extensions/thuban/wxproj.cpp (check_version): Checks the given
7266 version against what wxproj was compiled with.
7267 (check_version_gtk): If wxproj was compiled with gtk then check
7268 the given version against the version of the gtk library
7269 currently being used.
7270
7271 2003-03-14 Bernhard Herzog <[email protected]>
7272
7273 * test/test_command.py: Run the tests when the module is run as a
7274 script
7275
7276 2003-03-14 Bernhard Herzog <[email protected]>
7277
7278 Implement selection of multiple selected shapes in the same layer:
7279
7280 - Introduce a new class to hold the selection. This basically
7281 replaces the interactor which was nothing more than the
7282 selection anyway. A major difference is of course that the new
7283 selection class supports multiple selected shapes in one layer
7284
7285 - Move the object that represents the selection from the
7286 application to the canvas. The canvas is a better place than the
7287 application because the selection represents which shapes and
7288 layer of the map displayed by the canvas are selected and
7289 affects how the map is drawn.
7290
7291 - Make the selection and its messages publicly available through
7292 the mainwindow.
7293
7294 - The non-modal dialogs do not get a reference to the interactor
7295 anymore as they can simply refer to their parent, the
7296 mainwindow, for the what the interactor had to offer.
7297
7298 * Thuban/UI/selection.py: New module with a class to represent the
7299 selection.
7300
7301 * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
7302 these unused messages
7303
7304 * Thuban/UI/application.py (ThubanApplication.OnInit)
7305 (ThubanApplication.OnExit, ThubanApplication.SetSession): The
7306 interactor is gone now.
7307 (ThubanApplication.CreateMainWindow): There is no interactor
7308 anymore so we pass None as the interactor argument for now for
7309 compatibility.
7310
7311 * Thuban/UI/view.py (MapCanvas.delegated_messages)
7312 (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
7313 Unsubscribe, delegate messages according to the delegated_messages
7314 class variable.
7315 (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
7316 attributes from instance variables as described with the
7317 delegated_methods class variable.
7318 (MapCanvas.__init__): New instance variable selection holding the
7319 current selection
7320 (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
7321 pass them on to the renderer
7322 (MapCanvas.SetMap): Clear the selection when a different map is
7323 selected.
7324 (MapCanvas.shape_selected): Simple force a complete redraw. The
7325 selection class now takes care of only issueing SHAPES_SELECTED
7326 messages when the set of selected shapes actually does change.
7327 (MapCanvas.SelectShapeAt): The selection is now managed in
7328 self.selection
7329
7330 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
7331 (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
7332 Unsubscribe, delegate messages according to the delegated_messages
7333 class variable.
7334 (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
7335 attributes from instance variables as described with the
7336 delegated_methods class variable.
7337 (MainWindow.__init__): The interactor as ivar is gone. The
7338 parameter is still there for compatibility. The selection messages
7339 now come from the canvas.
7340 (MainWindow.current_layer, MainWindow.has_selected_layer):
7341 Delegate to the the canvas.
7342 (MainWindow.LayerShowTable, MainWindow.Classify)
7343 (MainWindow.identify_view_on_demand): The dialogs don't need the
7344 interactor parameter anymore.
7345
7346 * Thuban/UI/tableview.py (TableFrame.__init__)
7347 (LayerTableFrame.__init__, LayerTableFrame.OnClose)
7348 (LayerTableFrame.row_selected): The interactor is gone. It's job
7349 from the dialog's point of view is now done by the mainwindow,
7350 i.e. the parent. Subscribe to SHAPES_SELECTED instead
7351 of SELECTED_SHAPE
7352
7353 * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
7354 is gone. It's job from the dialog's point of view is now done by
7355 the mainwindow, i.e. the parent.
7356
7357 * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
7358 gone. It's job from the dialog's point of view is now done by the
7359 mainwindow, i.e. the parent.
7360
7361 * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
7362 gone. It's job from the dialog's point of view is now done by the
7363 mainwindow, i.e. the parent.
7364 (SessionTreeCtrl.__init__): New parameter mainwindow which is
7365 stored as self.mainwindow. The mainwindow is need so that the tree
7366 can still subscribe to the selection messages.
7367 (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
7368 (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
7369 selection is now accessible through the mainwindow. Subscribe to
7370 SHAPES_SELECTED instead of SELECTED_SHAPE
7371
7372 * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
7373 SHAPES_SELECTED message now.
7374 (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
7375 so deal with multiple shapes
7376 (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
7377 gone. It's job from the dialog's point of view is now done by the
7378 mainwindow, i.e. the parent.
7379
7380 * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
7381 parameter is now a list of shape ids.
7382 (RecordTable.SetTable): The second parameter is now a list of
7383 indices.
7384
7385 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
7386 selected_shape parameter and ivar to selected_shapes. It's now a
7387 list of shape ids.
7388 (MapRenderer.draw_label_layer): Deal with multiple selected
7389 shapes. Rearrange the code a bit so that the setup and shape type
7390 distinctions are only executed once.
7391
7392 * test/test_selection.py: Test cases for the selection class
7393
7394 2003-03-11 Jonathan Coles <[email protected]>
7395
7396 * Thuban/Model/load.py: Temporary fix so that the xml reader
7397 doesn't cause Thuban to crash.
7398
7399 * Thuban/Model/layer.py: Handle the cyclic references between
7400 a layer and its classification better, and be sure to disconnect
7401 the classification from the layer when the layer is destroyed
7402 so that we don't maintain a cyclic reference that may not be
7403 garbage collected.
7404
7405 * Thuban/Model/classification.py: See comment for layer.py.
7406
7407 2003-03-12 Jan-Oliver Wagner <[email protected]>
7408
7409 * HOWTO-Release: New. Information on the steps for releasing
7410 a new version of Thuban.
7411
7412 2003-03-11 Jonathan Coles <[email protected]>
7413
7414 * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
7415 Use True instead of true.
7416 (Classifier): Should have a single panel in which all the controls lie.
7417
7418 * Thuban/UI/proj4dialog.py: Add normal border.
7419
7420 * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
7421
7422 * Thuban/UI/mainwindow.py: Use True instead of true.
7423
7424 * setup.py: Update some definitions to use wxWindows2.4 files
7425
7426 * Data/iceland_sample_class.thuban: Fixed file so that the
7427 field_type information is present.
7428
7429 2003-03-10 Jonathan Coles <[email protected]>
7430
7431 * Thuban/UI/classifier.py (Classifier.__init__): Make the
7432 field type label grow so that when the text changes the
7433 size is updated correctly. This may be a wxWindows bug.
7434
7435 2003-03-10 Jonathan Coles <[email protected]>
7436
7437 * Thuban/UI/application.py: Changed SESSION_CHANGED to
7438 SESSION_REPLACED.
7439
7440 * Thuban/UI/classifier.py: Wrap text with _().
7441 (ClassGrid.CreateTable): Set dimensions and size hints here,
7442 instead of in Reset, so we only set the size once.
7443
7444 * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
7445
7446 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
7447 Call Close() instead of Shutdown().
7448
7449 * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
7450
7451 * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
7452 Go back to using OnClose() instead of Shutdown().
7453
7454 2003-03-10 Jonathan Coles <[email protected]>
7455
7456 * Thuban/UI/classifier.py (Classifier): SelectField() needed
7457 to know the old field index as well as the new one.
7458
7459 2003-03-10 Jonathan Coles <[email protected]>
7460
7461 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
7462 to correctly set the table information and call this from
7463 __init__ and from _OnFieldSelect so that all the information
7464 is up to date when the dialog opens and when a field is changed.
7465
7466 2003-03-10 Jonathan Coles <[email protected]>
7467
7468 * Thuban/Model/classification.py (Classification): Don't use
7469 layer's message function directly, use the ClassChanged() method
7470 when then classification changes. SetField/SetFieldType/SetLayer
7471 must keep the information about field name and field type in
7472 sync when an owning layer is set or removed.
7473
7474 * Thuban/Model/layer.py: Added ClassChanged() so that the
7475 classification can tell the layer when its data has changed.
7476 (Layer.SetClassification): Accepts None as an arguement to
7477 remove the current classification and correctly handles
7478 adding a new classification.
7479
7480 * Thuban/Model/load.py: Comment out print statement
7481
7482 * test/test_classification.py, test/test_save.py: New and
7483 improved tests.
7484
7485 2003-03-07 Jonathan Coles <[email protected]>
7486
7487 * Thuban/Model/classification.py: Implemented __copy__ and
7488 __deepcopy__ for ClassGroup* and ClassGroupProperites so
7489 they can easily be copied by the classifier dialog.
7490 (ClassGroupProperites.__init__): The default line color should
7491 have been Color.Black.
7492
7493 * Thuban/UI/classifier.py: Setting and Getting table values now
7494 uses a consistent set of functions.
7495 (Classifier): Now non-modal. Has field type label which changes
7496 as the field changes. Keep track of buttons in a list so that
7497 we can enable/disable the buttons when the None field is selected.
7498 (SelectPropertiesDialog): Add buttons to make the colors transparent.
7499
7500 * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
7501 does what OnClose did, but can be called by the application to
7502 close a window. Needed when a session changes, and we have to
7503 close the classifier windows.
7504
7505 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
7506 Shuts down open dialogs. Used when a new session is created
7507 or a session is opened.
7508 (MainWindow.SaveSession): Should only call application.SaveSession()
7509 if we don't call SaveSessionAs first.
7510 (MainWindow.Classify): Allow different classifier dialogs for
7511 different layers.
7512
7513 * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
7514 the parent class handle it. Add Shutdown() to unsubscibe from
7515 event notification and call the parent Shutdown(). This was
7516 necessary so the application can close the tree window.
7517
7518 2003-03-06 Jonathan Coles <[email protected]>
7519
7520 * Thuban/Model/classification.py: Minor documentation changes,
7521 Addition of __eq__ and __ne__ methods.
7522 (Classification.SetLayer): prevent recursion between this method
7523 and Layer.SetClassification().
7524
7525 * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
7526
7527 * Thuban/Model/layer.py (SetClassification): prevent recursion
7528 between this method and Classification.SetLayer().
7529
7530 * test/test_classification.py, test/test_load.py,
7531 test/test_session.py: Fixed and added tests for the classification
7532 classes.
7533
7534 2003-03-06 Bernhard Herzog <[email protected]>
7535
7536 * Thuban/UI/classifier.py (ClassGrid.__init__)
7537 (ClassGrid.CreateTable): Move the SetSelectionMode call to
7538 CreateTable because otherwise it triggers an assertion in
7539 wxPython/wxGTK 2.4.
7540
7541 2003-03-05 Jonathan Coles <[email protected]>
7542
7543 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
7544
7545 * Thuban/Model/load.py: import FIELDTYPE constants from table.
7546
7547 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
7548
7549 * Thuban/Model/table.py: Put FIELDTYPE constants back.
7550
7551 2003-03-05 Jonathan Coles <[email protected]>
7552
7553 * Thuban/UI/classifier.py: Added class documentation.
7554 Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
7555 Store just the groups in the table and generate the other
7556 column information when it is requested. Add "None" field
7557 to pull-down to select no classification.
7558
7559 * Thuban/common.py: Moved FIELDTYPE constants from table.py
7560 (Str2Num): Only catch ValueError exceptions.
7561
7562 * Thuban/Model/classification.py: Class documentation. Renaming
7563 of methods with Stroke to Line. Groups are stored in a single
7564 list with the default as the first element. Groups are searched
7565 in the order they appear in the list.
7566
7567 * Thuban/Model/color.py: Documentation.
7568
7569 * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
7570 the kind of data represented by a field.
7571
7572 * Thuban/Model/load.py (ProcessSession): Use proper string
7573 conversion function; fixes RTbug #1713.
7574
7575 * Thuban/Model/save.py (Saver): Store field type information.
7576
7577 * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
7578 (Table): Add field_info_by_name() to retrieve field information
7579 by specifying the field name, not the number.
7580
7581 * Thuban/UI/mainwindow.py: Function name changes.
7582
7583 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
7584 get the layer classification once. Don't try to classify
7585 values when the field is None: just use the default properties.
7586
7587 * Thuban/UI/view.py: Function name changes.
7588
7589 * Doc/thuban.dtd: Add field_type attribute to a classification.
7590
7591 2003-03-04 Bernhard Herzog <[email protected]>
7592
7593 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
7594 the fill and stroke layer attributes optional with suitable
7595 default values. Add the stroke_width layer attribute. Use correct
7596 syntax for empty elements. Make the attribute list for labels
7597 refer to the label element.
7598
7599 2003-03-04 Bernhard Herzog <[email protected]>
7600
7601 * setup.py (thuban_build_py.build): Add a comment about distutils in
7602 Python 2.3 containing some of the functionality we implement in
7603 setup.py ourselves.
7604
7605 * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
7606 before the selection mode. Doing it the other way round triggers
7607 an assertion in wxWindows.
7608
7609 * Thuban/Model/save.py (escape): Fix typo in doc-string
7610
7611 * Thuban/Model/classification.py: Remove unnecessary wxPython
7612 import
7613
7614 2003-03-04 Jonathan Coles <[email protected]>
7615
7616 * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
7617 Parameter 'value' should default to None.
7618
7619 * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
7620 the class attribute __classification is now private.
7621
7622 * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
7623 Classifier to ClassGrid. Added support for removing selected rows,
7624 which including code for keeping track of when cells are selected,
7625 and deselected.
7626 (ClassTable): Support for added/removing rows. Fixed a problem
7627 with __ParseInput whereby it would not allow strings (only numbers)
7628 to be entered.
7629 (Classifier): Added button and supporting code for removing
7630 selected rows.
7631
7632 2003-02-27 Jonathan Coles <[email protected]>
7633
7634 * Thuban/common.py: Moved color conversion functions into
7635 Thuban/UI/common.py.
7636 (Str2Num): Now converts the float (not the string) to a long/int
7637 so that an exception isn't thrown.
7638
7639 * Thuban/UI/common.py: Common functions used in several UI modules
7640
7641 * Thuban/Model/classification.py: Changed the class hierarchy
7642 so that a Classification consists of Groups which return
7643 Properties when a value matches a Group.
7644
7645 * Thuban/Model/layer.py: Fixed name resolution problem.
7646
7647 * Thuban/Model/load.py: Use new Classification and Group functions.
7648
7649 * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
7650 failure.
7651 (Saver.write_classification): Use new Classification and Group
7652 functions.
7653
7654 * Thuban/UI/classifier.py: Changes to use new Classification and Group
7655 functions. Fix to create a tuple with a single value instead of
7656 simply returning the value.
7657
7658 * Thuban/UI/renderer.py: Use new Classification and Group functions.
7659 Use common.py functions.
7660
7661 * Thuban/UI/tree.py: Use common.py functions.
7662
7663 * test/test_classification.py: Use new Classification and Group
7664 classes.
7665
7666 2003-02-24 Jonathan Coles <[email protected]>
7667
7668 * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
7669 functions from Thuban color objects to wxWindow colour objects.
7670
7671 * Thuban/Model/classification.py (Classification): Renamed
7672 GetProperties() to GetClassData(). Used the new iterator
7673 in TreeInfo().
7674 (ClassIterator): Iterator implementation to iterate over the
7675 ClassData objects in a classification object.
7676
7677 * Thuban/Model/save.py (Saver.write_classificaton): Uses
7678 the new iterator to save the classification information.
7679
7680 * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
7681 for changing the stroke and fill colors and previewing the
7682 changes.
7683
7684 * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
7685 MainWindow.SaveSessionAs): Text string changes so the dialogs
7686 have more meaningful titles.
7687
7688 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
7689 Classification method name from GetProperties to GetClassData.
7690
7691 * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
7692 instead of accessing now non-existent class variables.
7693
7694 2003-02-24 Bernhard Herzog <[email protected]>
7695
7696 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
7697 unneeded Shape() call. Rendering is substantially faster without
7698 it and it avoids some problems with broken shape files.
7699
7700 2003-02-20 Frank Koormann <[email protected]>
7701
7702 Force minimal size of identify and label dialogs. The autosizing
7703 looked too ugly.
7704
7705 * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
7706 * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
7707 Set size of listctrl.
7708 * Thuban/UI/identifyview.py (IdentifyView.__init__):
7709 Set size of dialog.
7710
7711 2003-02-19 Jonathan Coles <[email protected]>
7712
7713 * test/test_classification.py, test/test_layer.py,
7714 test/test_load.py, test/test_map.py, test/test_session.py:
7715 Updated the tests to use the new functions that are in the
7716 respective classes.
7717
7718 * Thuban/Model/classification.py (Classification):
7719 Uses the new ClassData* classes. Modification messages are
7720 passed up to the parent layer (if it exists).
7721 (ClassData): New class to encapsulate the common data in each
7722 classification property.
7723 (ClassDataDefault): Represents the Default class. data.
7724 (ClassDataPoint): Represents a single class. data point
7725 (ClassDataRange): Represents a class. range
7726 (ClassDataMap): Represents a class. map (unused).
7727
7728 * Thuban/Model/color.py: Added Color.None to represent something
7729 with no color. Color.Black represents the color black.
7730 (NoColor): Helper class derived from Color to represent something
7731 with no color.
7732
7733 * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
7734 stroke_width attributes. Made the 'classification' attribute private.
7735 New methods for setting/getting the classification.
7736
7737 * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
7738 to get the classifcation and use the new ClassData* classes to
7739 hold the classification data. Use Str2Num to convert numbers
7740 properly.
7741
7742 * Thuban/Model/save.py (Saver): Use new Color and Classification
7743 methods
7744
7745 * Thuban/UI/classifier.py (ClassGrid): New class to represent a
7746 custom grid.
7747 (ClassTable): Support for editing Values and Labels and for
7748 changing what type (point or range) of data is stored in each
7749 property based on how the user enters the data.
7750 (Classifier): Support for saving the new classifications and
7751 launching the dialog to edit a property.
7752 (SelectPropertiesDialog): New class for editing the visual
7753 properties of a classification (stroke color, width, and fill color)
7754 (ClassPreviewer): Took the Draw method from ClassRenderer and
7755 made most of it into this new class. Intend to use this class in
7756 the SelectPropertiesDialog for previewing changes.
7757
7758 * Thuban/UI/renderer.py: Use new Color and Classification methods.
7759
7760 * Thuban/UI/tree.py: Formatting changes.
7761
7762 * Doc/thuban.dtd: Add 'label' element
7763
7764 * Thuban/common.py: New. Contains common routines used throughout
7765 the code.
7766 (Str2Num): Takes a string and converts it to the "best" type of
7767 number.
7768
7769 2003-02-14 Bernhard Herzog <[email protected]>
7770
7771 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
7772 dragging flag is always set to 0 even when the tool implementation
7773 raises an exception
7774
7775 2003-02-11 Bernhard Herzog <[email protected]>
7776
7777 * Thuban/UI/application.py (ThubanApplication.splash_screen): New
7778 method to create a splash screen.
7779 (ThubanApplication.ShowMainWindow): New. Show the main window.
7780 Needed so the splash screen can display the mainwindow
7781 (ThubanApplication.OnInit): Call the
7782 new splash_screen method to determine whether the application
7783 should display a splash screen. If it displays a splash screen do
7784 not immediately show the main window.
7785
7786 2003-02-11 Jonathan Coles <[email protected]>
7787
7788 * Thuban/Model/classification.py: Added import line to fix
7789 feature conflicts between running on python2.2 and python2.1.
7790
7791 * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
7792 onto the clinfo parameter, so removed the deepcopy().
7793
7794 2003-02-10 Jonathan Coles <[email protected]>
7795
7796 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
7797 Added element_open variable to track opening and closing of tags
7798 so that tags that don't span more than one line are closed with
7799 /> instead of </tag_name>. Use the GetDefault*() methods of
7800 the Classification class.
7801
7802 * Thuban/Model/classification.py (Classificaton): Added set and
7803 get methods for the default data. The class also takes a layer
7804 reference so that modification messages can be sent. Fixed the
7805 methods to use the new ClassData class.
7806 (ClassData): New class to encapsulate the classification data
7807
7808 * Thuban/Model/layer.py (Layer): Remove the
7809 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
7810 SetDefault*() methods on the layer's classification object.
7811 (Layer.__init__): Use the new SetDefault*() methods in the
7812 Classification class.
7813
7814 * Thuban/Model/load.py (ProcessSession): Use the new ClassData
7815 object instead of a dictionary.
7816
7817 * Thuban/UI/classifier.py (ClassRenderer): New class to
7818 draw the classifications in the dialog box's table.
7819 (Classifier): Modified to use the ClassRenderer class.
7820
7821 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
7822 methods of the Classification class.
7823
7824 * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
7825 of the ClassData class.
7826
7827 * test/test_classification.py, test/test_layer.py,
7828 test/test_map.py, test/test_session.py: Fix the tests to work
7829 with the above code changes.
7830
7831 2003-02-03 Jonathan Coles <[email protected]>
7832
7833 * Thuban/Model/classification.py (Classification): Added getNull()
7834 to return the NullData reference
7835
7836 * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
7837 Layer.SetStrokeWidth): Modified these functions to change the
7838 null data in the classification rather than keep these values
7839 directly in the Layer class. Menu options to change these values
7840 work again.
7841
7842 2003-01-28 Jonathan Coles <[email protected]>
7843
7844 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
7845 Fixed crashing problem on some systems. Dialog box shows
7846 classification data.
7847
7848 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
7849 Colors in the tree view.
7850
7851 * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
7852 the tree info for classifications. Commented out unnecessary lines.
7853
7854 * Thuban/Model/classification.py (Classification.TreeInfo): New
7855 function to add information about the classification into the
7856 tree view.
7857
7858 2003-01-27 Jan-Oliver Wagner <[email protected]>
7859
7860 * Thuban/__init__.py (_): New.
7861
7862 * Thuban/Model/classification.py, Thuban/Model/extension.py,
7863 Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
7864 Thuban/Model/session.py, Thuban/UI/application.py,
7865 Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
7866 Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
7867 Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
7868 Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
7869 Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
7870
7871 2003-01-27 Jonathan Coles <[email protected]>
7872
7873 * Thuban/Model/layer.py: Classification initialization calls.
7874
7875 * Thuban/Model/classification.py: Created class to encapsulate
7876 a layer classification. Supports specific data points and
7877 ranges.
7878
7879 * Thuban/Model/load.py: Added support for loading classification
7880 information.
7881
7882 * Thuban/Model/save.py: Added support for saving classification
7883 information.
7884
7885 * Thuban/UI/classifier.py: Initial class for a dialog box for
7886 specifying classification information.
7887
7888 * Thuban/UI/mainwindows.py: Support for opening the classifier
7889 dialog.
7890
7891 * Thuban/UI/renderer.py: Support for drawing a layer with the
7892 classification information.
7893
7894 * Data/iceland_sample_class.thuban: iceland_sample with
7895 classification data.
7896
7897 * test/test_classification: Tests for the Classification class.
7898
7899 2002-12-09 Bernhard Herzog <[email protected]>
7900
7901 * test/test_command.py: New. Tests for the command classes.
7902
7903 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
7904 (Command.IsTool): New method to distinguish between command
7905 switching tools and other commands.
7906
7907 * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
7908 the tool to avoid direct assignments to instance variables
7909 (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
7910 (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
7911 change the tool
7912
7913 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
7914 active tool's command turns insensitive, disable the tool.
7915 (_tool_command): Use the new ToolCommand class
7916
7917 * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
7918 SelectTool method to change the tool
7919 (iconfile): Use the ToolCommand class
7920
7921 2002-12-03 Bernhard Herzog <[email protected]>
7922
7923 * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
7924 the case of selected items that are not children of Layers or Maps
7925 properly. Previously this bug would trigger an assertion in
7926 wxWindows.
7927
7928 2002-11-06 Frank Koormann <[email protected]>
7929
7930 * Thuban/UI/mainwindow.py: Altered the order of tools in the
7931 toolbar: First now are all navigation tools (Zoom In/Out, Pan,
7932 Full Extent).
7933
7934 2002-10-23 Bernhard Herzog <[email protected]>
7935
7936 * setup.py (setup call): version now 0.1.3
7937
7938 * MANIFEST.in: Add the files in test/
7939
7940 * test/README: Add note about tests requiring the iceland data
7941
7942 * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
7943 copyright notice.
7944
7945 2002-10-18 Bernhard Herzog <[email protected]>
7946
7947 * test/test_map.py
7948 (TestMapWithContents.test_projected_bounding_box): Use an explicit
7949 epsilon.
7950
7951 * test/support.py (FloatComparisonMixin.assertFloatEqual)
7952 (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
7953 message if the assertion fails and don't return the return value
7954 of self.assert_. In assertFloatSeqEqual the return meant that not
7955 all items of the sequence were compared.
7956
7957 2002-09-20 Bernhard Herzog <[email protected]>
7958
7959 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
7960
7961 * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
7962
7963 * test/test_map.py (TestMapWithContents.test_tree_info): Create
7964 the string with the bounding box on the fly because of platform
7965 differences in the way %g is handled.
7966
7967 * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
7968 DBFfile too because Thuban layers can't yet cope missing DBF
7969 files.
7970
7971 2002-09-20 Bernhard Herzog <[email protected]>
7972
7973 * test/test_menu.py: Use initthuban instead of
7974 add_thuban_dir_to_path to initialize Thuban.
7975
7976 * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
7977 Mixin class for float comparisons
7978 (SubscriberMixin): New. Mixin class to test messages sent through
7979 the Connector class
7980
7981 * test/README: Fix a typo and add the -v flag to the command for
7982 individual tests
7983
7984 * test/test_session.py: New. Test cases for Thuban.Model.session
7985
7986 * test/test_proj.py: New. Test cases for Thuban.Model.proj
7987
7988 * test/test_map.py: New. Test cases for Thuban.Model.map
7989
7990 * test/test_layer.py: New. Test cases for Thuban.Model.layer
7991
7992 * test/test_label.py: New. Test cases for Thuban.Model.label
7993
7994 * test/test_connector.py: New. Test cases for Thuban.Lib.connector
7995
7996 * test/test_color.py: New. Test cases for Thuban.Model.color
7997
7998 * test/test_base.py: New. Test cases for Thuban.Model.base
7999
8000 2002-09-13 Bernhard Herzog <[email protected]>
8001
8002 * Thuban/Model/session.py (Session.forwarded_channels): Forward
8003 the CHANGED channel too.
8004
8005 * Thuban/Model/map.py (Map.forwarded_channels): Forward the
8006 CHANGED channel too.
8007 (Map.__init__): Call the Modifiable constructor as well.
8008
8009 * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
8010 event if the modified flag changes.
8011 (Modifiable.changed): Tweak the doc-string.
8012
8013 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
8014 (MainWindow.set_position_text): Put the code that puts the text
8015 with the mouse position into the status bar into the new method
8016 set_position_text so that it can overwritten in derived classes.
8017
8018 2002-09-12 Bernhard Herzog <[email protected]>
8019
8020 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
8021 message box on the main window.
8022
8023 2002-09-11 Bernhard Herzog <[email protected]>
8024
8025 * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
8026 the 'E' because it's less likely to interfere with other menu
8027 entries.
8028 (MainWindow.build_menu): remove an incorrect comment.
8029
8030 2002-09-10 Bernhard Herzog <[email protected]>
8031
8032 * Thuban/UI/mainwindow.py (MainWindow.Map): New.
8033 (_tool_command): Add sensitive parameter
8034 (_has_visible_map): Sensitivity callback to tools and other
8035 commands that require a visible map. Use it in map_zoom_in_tool,
8036 map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
8037 and map_full_extent
8038
8039 2002-09-06 Bernhard Herzog <[email protected]>
8040
8041 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
8042 VIEW_POSITION
8043
8044 2002-09-04 Frank Koormann <[email protected]>
8045
8046 * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
8047
8048 2002-09-02 Bernhard Herzog <[email protected]>
8049
8050 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
8051 wxWindows already and our implementation doesn't work correctly
8052 with wxGTK 2.3:
8053 (MapCanvas.__init__): Remove the instance variable
8054 (MapCanvas.OnPaint): Always call do_redraw when there's a map to
8055 be drawin
8056 (MapCanvas.OnIdle): Removed.
8057
8058 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
8059 a parameter to determine the size of the rectangle.
8060 (MapCanvas.find_shape_at): Create the box around the point on a
8061 layer by layer basis and make the size depend on the shape type.
8062 This solves a problem with the selection of point shapes at the
8063 border of the layer's bounding box
8064
8065 2002-08-30 Bernhard Herzog <[email protected]>
8066
8067 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
8068 for the sensitivity of remove layer.
8069 (_can_remove_layer): New. Sensitivity callback for remove layer
8070 (Command layer_remove): Use _can_remove_layer
8071
8072 * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
8073 determine whether a given layer can be deleted.
8074
8075 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
8076 (MapCanvas.do_redraw): Get rid of the unused update_region
8077 instance variable
8078
8079 * Thuban/UI/view.py: Add/update some doc-strings.
8080
8081 * test/: new subdirectory with a bunch of unit tests.
8082
8083 * test/README, test/test_table.py, test/test_save.py,
8084 test/test_menu.py, test/test_load.py: Initial set of tests and
8085 brief instructions on how to run them
8086
8087 2002-08-29 Bernhard Herzog <[email protected]>
8088
8089 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
8090 arcs with multiple parts.
8091
8092 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
8093 Handle degenrate rectangles.
8094
8095 * Thuban/Model/table.py: Make writing records work correctly:
8096 (Table.__init__): Keep track of whether the DBF is open for
8097 writing
8098 (Table.write_record): Open the DBF file for writing when necessary
8099
8100 2002-08-27 Bernhard Herzog <[email protected]>
8101
8102 * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
8103 dbf files only for reading by default. Use a new writable dbf
8104 object for writing.
8105
8106 2002-08-26 Bernhard Herzog <[email protected]>
8107
8108 * Thuban/UI/mainwindow.py: Refactor the context creation:
8109 (MainWindow.Context): New method to return a context
8110 (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
8111 new method
8112
8113 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
8114 layer table specific code from TableGrid into LayerTableGrid
8115 (TableFrame, LayerTableFrame): Split the layer table specific code
8116 from TableFrame into LayerTableFrame
8117 (LayerTableGrid.select_shape): Remove a debug print
8118
8119 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
8120 LayerTableFrame
8121
8122 2002-08-23 Bernhard Herzog <[email protected]>
8123
8124 * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
8125 absolute filename.
8126
8127 2002-08-22 Bernhard Herzog <[email protected]>
8128
8129 * Thuban/Model/table.py (Table.write_record): New method to write
8130 records.
8131 (Table.__init__): Open the DBF file for writing too.
8132
8133 * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
8134 into the underlying table.
8135
8136 * extensions/shapelib/shapefil.h (DBFCommit),
8137 extensions/shapelib/dbfopen.c (DBFCommit): New API function to
8138 commit any changes made to the DBF file.
8139
8140 * Thuban/UI/mainwindow.py (make_check_current_tool)
8141 (_tool_command): Put the code that generates the "checked"
8142 callback into a separate function so that we can reuse it
8143 elsewhere
8144
8145 * Thuban/Model/save.py (Saver): New class to handle serializing a
8146 session into an XML file. The main reason to introduce a class is
8147 that applications built on Thuban can derive from it so that they
8148 can save additional information in a session file.
8149 (save_session): Delegate almost all the work to the Saver class.
8150 Rename the filename argument to file because it may be a file like
8151 object now.
8152
8153 * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
8154 code. Remove the little test code which would be executed when the
8155 module is run as a script which didn't work anymore since it can't
8156 import the other Thuban modules.
8157 (ProcessSession, load_session): Refactor the ProcessSession to
8158 have one method for each element start and end tag so that derived
8159 classes can easily override the processing of individual tags.
8160 Also, always parse with namespaces enabled because applications
8161 built on top of Thuban will likely use namespaces if they extend
8162 the session file format.
8163
8164 2002-08-21 Bernhard Herzog <[email protected]>
8165
8166 * setup.py (ThubanInstall.run): Don't repr install_lib_orig
8167 because thubaninit_contents will do it for us.
8168
8169 2002-08-16 Jan-Oliver Wagner <[email protected]>
8170
8171 * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
8172 tree window already open
8173
8174 2002-08-15 Bernhard Herzog <[email protected]>
8175
8176 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
8177 with self.
8178
8179 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
8180 when we have actually captured it.
8181
8182 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
8183 shapefile and destroy the table.
8184
8185 * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
8186
8187 2002-08-14 Bernhard Herzog <[email protected]>
8188
8189 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
8190 instance variable columns
8191 (RecordTable.GetTypeName): row and col may be negative in some
8192 cases.
8193
8194 * setup.py (InstallLocal.initialize_options)
8195 (InstallLocal.finalize_options, InstallLocal.user_options): New
8196 option create-init-file to build a thubaninit.py when running
8197 install_local
8198 (InstallLocal.run): Create the thubaninit.py module when requested
8199 (thubaninit_contents): Split the template into several parts and
8200 create a new function thubaninit_contents that creates the
8201 contents of a thubaninit module.
8202 (ThubanInstall.run): Use the new function to create the thubaninit
8203 module.
8204
8205 2002-07-30 Bernhard Herzog <[email protected]>
8206
8207 * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
8208 cleanup.
8209 (ThubanApplication.MainLoop): Extend to automatically call OnExit.
8210
8211 * Thuban/Model/session.py (Session.Destroy): Don't bypass the
8212 direct base class' Destroy method.
8213
8214 * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
8215 layers.
8216 (Map.Destroy): Destroy the label_layer as well and call the
8217 inherited Desatroymethod first so that no more messages are
8218 issued.
8219 (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
8220 message if the stacking order actually has changed. Add
8221 doc-strings.
8222 (Map.BoundingBox): Correct the doc-string.
8223 (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
8224 (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
8225
8226 * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
8227 all labels.
8228
8229 2002-07-29 Bernhard Herzog <[email protected]>
8230
8231 * Thuban/Model/map.py (Map.subscribe_layer_channels)
8232 (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
8233 to a layer's channels into separate methods.
8234 (Map.RemoveLayer, Map.AddLayer): Call the new methods
8235 (Map.Destroy): Unsubscribe from a layer's channels before
8236 destroying it.
8237
8238 * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
8239 selected_layer parameter to searched_layer which is the layer to
8240 search in.
8241 (MapCanvas.SelectShapeAt): New parameter layer to restrict the
8242 search to that layer. Return the selected layer and shape.
8243
8244 * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
8245 typo
8246
8247 2002-07-24 Bernhard Herzog <[email protected]>
8248
8249 * Thuban/UI/application.py (ThubanApplication.create_session):
8250 Extend the doc string.
8251 (ThubanApplication.subscribe_session)
8252 (ThubanApplication.unsubscribe_session): New methods to
8253 subscribe/unsubscribe to/from session channels.
8254 (ThubanApplication.SetSession): Call the new methods here.
8255 (ThubanApplication.maps_changed, ThubanApplication.set_map):
8256 Renamed set_map to maps_changed. Its now a subscriber for
8257 MAPS_CHANGED.
8258
8259 * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
8260 x-coordinate in case of simple clicks
8261
8262 * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
8263 don't pass it as a parameter
8264
8265 * Thuban/Model/session.py (Session.RemoveMap): New
8266
8267 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
8268 window size into a parameter.
8269
8270 2002-07-23 Bernhard Herzog <[email protected]>
8271
8272 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
8273 just commands.
8274
8275 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
8276 parameter list a bit to allow setting the window title and the
8277 initial message in the status bar. Update the callers.
8278
8279 * Thuban/UI/application.py (ThubanApplication.OnInit)
8280 (ThubanApplication.CreateMainWindow): Put the mainwindow
8281 instantiation into a separate method so that it can be overridden
8282 by a subclass.
8283
8284 2002-07-19 Bernhard Herzog <[email protected]>
8285
8286 * Thuban/Model/session.py: Issue a CHANGED message every time
8287 another changed message is issued to make it easier to get
8288 notified of changes.
8289 (Session): Update the doc string
8290 (Session.forward): Issue changed-events as CHANGED as well.
8291 (Session.changed): Overwrite the inherited version to issue
8292 CHANGED events as well.
8293
8294 * Thuban/UI/tree.py: We can now simply subscribe to the session's
8295 CHANGED channel to be informed of changes.
8296 (SessionTreeCtrl.session_channels): Not needed any longer.
8297 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
8298 Only have to (un)subscribe CHANGED
8299
8300 * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
8301
8302 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
8303 for the wxPython locale bug to __init__.py so that it's
8304 automatically executed by anybody using UI code from Thuban.
8305
8306 2002-07-18 Bernhard Herzog <[email protected]>
8307
8308 * Thuban/UI/main.py (main): app no longer needs to be global
8309
8310 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
8311 as parameter and store it in an instance variable
8312 (MainWindow.invoke_command, MainWindow.update_command_ui)
8313 (MainWindow.save_modified_session, MainWindow.NewSession)
8314 (MainWindow.OpenSession, MainWindow.SaveSession)
8315 (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
8316 application object.
8317
8318 * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
8319 the main window with self.
8320
8321 * Thuban/UI/context.py: New module with the context class
8322
8323 * Thuban/UI/command.py (Command): Update doc string.
8324
8325 * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
8326 MainWindow.update_command_ui): Pass an instance of the context
8327 class to the command's methods
8328 (check_current_tool, call_method): Handle the new context
8329 implementation
8330
8331 * Examples/simple_extensions/simple_tool.py (simple_tool,
8332 check_simple_tool): Handle the new context implementation
8333
8334 * Examples/simple_extensions/simple_command.py (simple_command):
8335 Handle the new context implementation. Update the comments about
8336 the context.
8337
8338 * Thuban/UI/application.py (ThubanApplication.SetSession): Add
8339 doc-string
8340 (ThubanApplication.Session): New method to return the session
8341 object
8342
8343 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
8344 interactor's selected_layer may not be a layer of the current
8345 session when the tree is updated while a new session is being set.
8346
8347 2002-07-17 Bernhard Herzog <[email protected]>
8348
8349 * Thuban/UI/tree.py (color_string): Removed. No longer used.
8350 (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
8351 update_tree into update_tree and add_items. The tree now uses a
8352 more generic way to display the contents of the tree.
8353 (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
8354
8355 * Thuban/Model/layer.py (Layer.TreeInfo),
8356 Thuban/Model/extension.py (Extension.TreeInfo),
8357 Thuban/Model/map.py (Map.TreeInfo),
8358 Thuban/Model/session.py (Session.TreeInfo):
8359 Add TreeInfo methods to implement the new tree view update scheme
8360
8361 2002-07-16 Bernhard Herzog <[email protected]>
8362
8363 * Thuban/UI/application.py: Don't use "import from" for the
8364 MainWindow. It can't always be resolved.
8365 (ThubanApplication.OnInit): change reference to MainWindow
8366 accordingly.
8367
8368 * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
8369 completely
8370
8371 2002-07-10 Bernhard Herzog <[email protected]>
8372
8373 * setup.py (create_init_module): New configurable variable whose
8374 default depends on the platform we're running on.
8375 (ThubanInstall.initialize_options): Initialize
8376 self.create_init_module from the global create_init_module
8377 (ThubanInstall.user_options): indictate that the options
8378 create-init-module and init-module-dir have arguments.
8379
8380 * setup.py: In the setup call change the version number to include
8381 cvs.
8382
8383 * MANIFEST.in: Add the files in Examples
8384
8385 2002-07-09 Bernhard Herzog <[email protected]>
8386
8387 * setup.py: In the setup call, use the thuban homepage as the
8388 value of the url parameter.
8389
8390 * Examples: New subdirectory for examples.
8391
8392 * Examples/simple_extensions/simple_tool.xpm,
8393 Examples/simple_extensions/simple_tool.py,
8394 Examples/simple_extensions/simple_command.py,
8395 Examples/simple_extensions/README: Simple examples showing how to
8396 add new commands and tools.
8397
8398 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
8399 bdist_rpm that we also have an install script.
8400 (bdist_inno): Add 2002 to the copyright notice.
8401
8402 * setup.py: Create a file in python's site-packages directory to
8403 make installation of Thuban as a library easier.
8404 (ThubanInstall.user_options): Add two new options,
8405 create-init-module and init-module-dir
8406 (ThubanInstall.expand_with_pure_python_dirs): New method to expand
8407 filenames for installation in the default directories.
8408 (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
8409 the inherited methods to capture some filenames before they're
8410 transformed too much by distutils.
8411 (ThubanInstall.run): Create the init module if requested.
8412 (ThubanInstall.thuban_init_filename): New method to return the
8413 full name of the init module.
8414 (ThubanInstall.get_outputs): Append the filename of the init
8415 module.
8416
8417 2002-07-08 Bernhard Herzog <[email protected]>
8418
8419 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
8420 handle the prefix properly which means that the default for the
8421 installation prefix should be /usr for RPMs and /usr/local when
8422 doing a normal source install.
8423 (bdist_rpm_install_script): Script to override the default install
8424 commands in the specfile generated by the bdist_rpm command.
8425 (thuban_bdist_rpm.user_options): Add a prefix option
8426 (thuban_bdist_rpm.initialize_options): Init the prefix option.
8427 Create the script files for the spec files as empty files here
8428 (thuban_bdist_rpm._make_spec_file): Override the inherited method
8429 to fill the script files with content.
8430
8431 * Thuban/Model/save.py (relative_filename): Wrapper around
8432 Thuban.Lib.fileutil.relative_filename that accepts an empty dir
8433 argument. save_session now automatically uses this version,
8434 solving a problem when saving to a relative filename.
8435
8436 * setup.py: In the setup call, make sure that the library
8437 directories are under $prefix/lib not directly under $prefix.
8438
8439 2002-06-20 Jan-Oliver Wagner <[email protected]>
8440
8441 * Thuban/Model/extension.py: new module to handle extension objects.
8442 * Thuban/Model/messages.py: new messages for extensions.
8443 * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
8444 Session.AddExtension): new for handling extensions.
8445 Also some other minor changes to round up extension handling.
8446 * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
8447 of Extension titles and title and names of its objects.
8448
8449 2002-05-29 Bernhard Herzog <[email protected]>
8450
8451 * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
8452 the events for a command.
8453 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
8454 Call bind_command_events to bind the events. add_toolbar_command
8455 can now bind events too so that it's possible to have commands
8456 that are only available through the toolbar.
8457 (MainWindow.init_ids): New instance variable events_bound to keep
8458 track of for which commands events have been bound.
8459
8460 2002-05-28 Bernhard Herzog <[email protected]>
8461
8462 * Thuban/UI/menu.py: New module to build and manage menus.
8463
8464 * Thuban/UI/mainwindow.py: Remove some unused imports.
8465 (MainWindow.__init__, main_menu): move the definition of the main
8466 menu from __init__ to the Menu instance main_menu.
8467 (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
8468 build the menu bar and sub-menus from a menu description.
8469
8470 * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
8471 startup file
8472 (ThubanApplication.read_startup_files): New method to run
8473 ~/.thuban/thubanstart.py
8474
8475 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
8476 Move the toolbar definition to the Menu instance main_toolbar.
8477 (MainWindow.build_toolbar): New method to build the toolbar
8478 similar to the build_menu methods
8479
8480 2002-05-23 Bernhard Herzog <[email protected]>
8481
8482 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
8483 layer_outline_color. Fix it in the definition of the command too.
8484
8485 * Thuban/UI/command.py (Command): Fix typo in doc string
8486
8487 2002-05-22 Bernhard Herzog <[email protected]>
8488
8489 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
8490 in the docstring
8491
8492 2002-05-15 Bernhard Herzog <[email protected]>
8493
8494 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
8495 when the shapefile is empty.
8496 (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
8497 now return None for empty shapefiles. Update doc-strings.
8498
8499 * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
8500 the layer's bbox being None.
8501
8502 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
8503 layer's bbox being None.
8504
8505 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
8506 necessary.
8507 (MapCanvas.__init__): New instance variables, last_selected_layer
8508 and last_selected_shape to determine how the selection has
8509 changed.
8510
8511 * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
8512 AutoSizeColumns because it will cause a traversal of the entire
8513 table which for large .dbf files will take a very long time.
8514
8515 2002-05-14 Bernhard Herzog <[email protected]>
8516
8517 * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
8518 maximum depth for the tree than shapelib does by default.
8519
8520 2002-05-10 Bernhard Herzog <[email protected]>
8521
8522 * setup.py (py_modules): The shptree modules doesn't have a
8523 wrapper, so don't include it in the py_modules
8524
8525 2002-05-08 Bernhard Herzog <[email protected]>
8526
8527 * extensions/shapelib/shptree.c (compare_ints): Make arguments
8528 const void * as in the qsort prototype
8529 (SHPTreeFindLikelyShapes): Remove some unused variables.
8530
8531 * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
8532 maintains to redraw the window during a drag.
8533 (MapCanvas.unprojected_rect_around_point): New method to determine
8534 a small region around a point for hit-testing.
8535 (MapCanvas.find_shape_at): Only test the shapes in a small region
8536 around the point.
8537
8538 * setup.py: Increment the version to 0.1.2
8539
8540 * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
8541 debug print and set session to None after unsubscribing
8542
8543 2002-05-07 Bernhard Herzog <[email protected]>
8544
8545 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
8546 the file to have a .thuban extension.
8547
8548 * Thuban/UI/tree.py (session_channels): New class constant with
8549 all the session channels to subscribe to to update the tree
8550 (SessionTreeCtrl.session_changed): Remember the session so that we
8551 can unsubscribe properly. Use the new class constant to
8552 unsubscribe from the old session and subscribe to the new one.
8553 (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
8554 subscriptions of the SessionTreeCtrl.
8555 (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
8556
8557 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
8558 Session Tree" command to the file menu.
8559
8560 * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
8561 as update_region to the renderer.
8562
8563 * Thuban/UI/renderer.py
8564 (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
8565 update box is now directly a tuple, not a wxRect anymore.
8566
8567 * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
8568 prints.
8569
8570 2002-05-07 Bernhard Herzog <[email protected]>
8571
8572 * setup.py: Add the shptree extension module. See
8573 extensions/pyshapelib/ChangeLog for more details.
8574
8575 * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
8576 extensions/shapelib/dbfopen.c: Really update to the versions of
8577 shapelib 1.2.9. For some reason it wasn't really done on
8578 2002-04-11.
8579
8580 * extensions/shapelib/shptree.c: Modified version of shptree.c of
8581 shapelib 1.2.9. The only real difference is the use of qsort
8582 instead of a bubble sort implementation
8583
8584 * Thuban/Model/layer.py (Layer.__init__): New instance variable
8585 shapetree to hold the shapelib quadtree for the shapefile
8586 (Layer.open_shapefile): Create the quad tree.
8587 (Layer.ShapesInRegion): New method to return the ids of shapes in
8588 a given region using the quad tree.
8589
8590 * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
8591 comment
8592 (draw_polygon_shape): Accept both arcs and polygons.
8593 (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
8594 the api.
8595
8596 * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
8597 return the shape ids to be rendered in a given layer.
8598 (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
8599 ids. Use draw_polygon_shape to draw arc shapes as well.
8600 (ScreenRenderer.RenderMap): New parameter for the rectangle that
8601 has to be updated
8602 (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
8603 calling it's ShapesInRegion method.
8604
8605 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
8606 update_region for the update region.
8607 (MapCanvas.OnPaint): Maintain the update region
8608 (MapCanvas.do_redraw): Pass the bounding box of the update_region
8609 to the renderer when drawing the bitmap. Reset the update_region.
8610
8611 2002-05-03 Bernhard Herzog <[email protected]>
8612
8613 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
8614 MainWindow.OpenSession): Change the file extension of the session
8615 files to .thuban
8616
8617 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
8618 Move the map channels to be forwarded by the session into the
8619 class constant with forwarded_channels. Also add
8620 LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
8621 forwarded_channels
8622
8623 * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
8624 typo and some rewording).
8625
8626 2002-05-02 Bernhard Herzog <[email protected]>
8627
8628 * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
8629 around to speed up most redraws:
8630 (MapCanvas.__init__): New instance variable bitmap which holds the
8631 bitmap
8632 (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
8633 self.bitmap to draw.
8634 (MapCanvas.full_redraw): New method to force a full redraw
8635 including the bitmap
8636 (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
8637 make sure the bitmap is redrawn.
8638 (MapCanvas.projection_changed, MapCanvas.set_view_transform,
8639 MapCanvas.shape_selected): Call full_redraw instead of readraw to
8640 make sure the bitmap is redrawn.
8641 (MapCanvas.OnSize): New method to handle size events so that the
8642 bitmap can be redrawn.
8643
8644 2002-04-29 Bernhard Herzog <[email protected]>
8645
8646 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
8647 canvas' VIEW_POSITION event
8648 (MainWindow.view_position_changed): Handler for VIEW_POSITION.
8649 Update the text in the status-bar accordingly.
8650
8651 * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
8652 (MapCanvas.__del__): Implement because Publisher.__del__ has to be
8653 called.
8654 (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
8655 current_position
8656 (MapCanvas.set_current_position): New method to set
8657 current_position. Issue a VIEW_POSITION event
8658 (MapCanvas.CurrentPosition): New public method to return the value
8659 of current_position. Should be called when the VIEW_POSITION event
8660 is processed.
8661 (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
8662 Update the position.
8663 (MapCanvas.OnLeaveWindow): Set the position to None.
8664
8665 * Thuban/UI/messages.py (VIEW_POSITION): New message for the
8666 position in the statusbar
8667
8668 2002-04-26 Frank Koormann <[email protected]>
8669
8670 * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
8671
8672 2002-04-24 Frank Koormann <[email protected]>
8673
8674 * Resources/Bitmaps/identify.xpm: shadow added
8675
8676 * Resources/Bitmaps/fullextent.xpm: new
8677
8678 2002-04-22 Jan-Oliver Wagner <[email protected]>
8679
8680 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
8681 box
8682
8683 2002-04-21 Jan-Oliver Wagner <[email protected]>
8684
8685 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
8686
8687 * Thuban/UI/tree.py (update_tree): added added map extent
8688
8689 * Thuban/UI/mainwindow.py (_method_command): extended by parameter
8690 icon; added map_full_extend as tool
8691
8692 2002-04-19 Jan-Oliver Wagner <[email protected]>
8693
8694 * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
8695 saving _new_ sessions
8696
8697 * Thuban/Model/session.py (create_empty_session): new session
8698 don't have a filename (set to None)
8699
8700 * Thuban/UI/tree.py (update_tree): added filename and modified flag
8701
8702 * Thuban/Model/load.py (ProcessSession): convert projection
8703 parameters from unicode to regular string
8704
8705 * Data/iceland_sample.session: Added UTM Zone 26 projection.
8706
8707 2002-04-11 Bernhard Herzog <[email protected]>
8708
8709 * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
8710 extensions/shapelib/dbfopen.c: Update to the versions of shapelib
8711 1.2.9
8712
8713 * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
8714 the pyshapelib directoy into the list of include dirs, so that
8715 pyshapelib_api.h can be found.
8716
8717 * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
8718 holds the pyshapelib C-API
8719 (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
8720 pyshapelib_api to access the shapelib functions.
8721 (initwxproj): Import the c_api from the shapelib module and
8722 initialize pyshapelib_api.
8723
8724 2002-04-04 Bernhard Herzog <[email protected]>
8725
8726 * setup.py (thuban_bdist_rpm.initialize_options): Use
8727 initialize_options to create the scripts for the rpm.
8728
8729 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
8730
8731 2002-04-03 Bernhard Herzog <[email protected]>
8732
8733 * setup.py: Increment version to 0.1.1
8734
8735 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
8736 Layer" and "Remove Layer" commands from the layer menu to the map
8737 menu
8738
8739 2002-02-15 Bernhard Herzog <[email protected]>
8740
8741 * Thuban/Model/layer.py (Layer.Shape): list append only takes one
8742 argument (python <= 1.5.2 erroneously accepted multiuple
8743 arguments)
8744
8745 2002-02-04 Bernhard Herzog <[email protected]>
8746
8747 * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
8748 RecordGrid in the identifyview.
8749 (IdentifyView.__init__): Use IdentifyGridCtrl instead of
8750 IdentifyListCtrl. The grid allows editing of the values.
8751
8752 * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
8753 implementing a grid for a single row of a thuban table.
8754
8755 * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
8756 layers by default. Easier to use than the previous default of only
8757 searching through the select layer which meant that if no layer
8758 was selected, you couldn't select a shape.
8759
8760 * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
8761
8762 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
8763 stroke_width attribute
8764
8765 * Thuban/Model/save.py (save_session): Write the new stroke_width
8766 attribute
8767
8768 * Thuban/Model/load.py (ProcessSession.startElement): Read the
8769 stroke_width attribute
8770
8771 * Thuban/Model/layer.py (Layer.__init__): New parameter and
8772 instance variable stroke_width
8773 (Layer.SetStrokeWidth): Set the stroke_width.
8774
8775 2002-02-01 Bernhard Herzog <[email protected]>
8776
8777 * extensions/thuban/wxproj.cpp (project_points): Fix two
8778 off-by-one errors in the last loop that joins the various parts
8779 together.
8780
8781 2002-01-14 Bernhard Herzog <[email protected]>
8782
8783 * setup.py (data_dist.make_distribution): Fix some typos
8784
8785 2001-09-18 Bernhard Herzog <[email protected]>
8786
8787 * README: Slight tweaking in preparation for the 0.1 release
8788
8789 * setup.cfg: Add section for sdist to create both tgz and zip
8790 archives
8791
8792 * setup.py: increase version number to 0.1
8793 (data_dist): New command class for data distribution
8794
8795 2001-09-14 Bernhard Herzog <[email protected]>
8796
8797 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
8798 Handle the case of no layer (i.e. layer is None) properly.
8799
8800 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
8801 Set the initial selection of the combo boxes to reflect the
8802 projection we're starting with in a way that works on windows,
8803 too.
8804
8805 * Thuban/Lib/connector.py (Connector.print_connections): Print the
8806 puiblisher's ids in hex to make it easier to compare them to the
8807 standard repr of python methods
8808
8809 * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
8810 messages
8811
8812 2001-09-13 Bernhard Herzog <[email protected]>
8813
8814 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
8815 deselect the layer if no layer is selected
8816
8817 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
8818 idle time when there actually is something to draw. If there's
8819 nothing to draw simply clear the window
8820 (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
8821 (MapCanvas.SetMap): force a redraw in all cases because
8822 FitMapToWindow doesn't always do it.
8823 (MapCanvas.ZoomFactor): Add an optional parameter, center, to
8824 specify the point to move into the center of the window
8825 (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
8826 dragged, zoon in/out by a factor of 2
8827 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
8828 index, i.e. reversed drawing order) so that objects appearing to
8829 be in from of others are selected first. This is probably mostly
8830 relevant for point shapes where the symbols used may overlap
8831
8832 * Thuban/Model/session.py (create_empty_session): Unset the
8833 modified bit before returning it
8834
8835 * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
8836 create_empty_session session to create the new, empty session.
8837
8838 * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
8839 the tool bitmaps.
8840 (MainWindow.OnClose, MainWindow.save_modified_session): Separate
8841 the code that asks whether the session should be saved into the
8842 new method save_modified_session.
8843 (MainWindow.OpenSession, MainWindow.NewSession): Use the new
8844 method to save modified session here too.
8845
8846 2001-09-11 Bernhard Herzog <[email protected]>
8847
8848 * setup.py (InnoIconItem): fix typo
8849
8850 (thuban_bdist_inno.run):
8851 (bdist_inno.run): Move the decision not to create symlinks on
8852 non-nt platforms to thuban_bdist_inno and do it unconditinally
8853 since we never want to create the symlinks here
8854
8855 2001-09-10 Bernhard Herzog <[email protected]>
8856
8857 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
8858 identify view immediately
8859
8860 * Thuban/UI/controls.py: New file with two classes RecordListCtrl
8861 and SelectableRecordListCtrl that implement the code shared by the
8862 identify view and the label dialog
8863
8864 * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
8865 new class RecordListCtrl
8866
8867 * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
8868 return value of GetValue is None instead of using it as a boolean
8869 directly so that Zero numbers are handled properly.
8870 (LabelListCtrl): Derive from the new class
8871 SelectableRecordListCtrl
8872
8873 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
8874 (Proj4Dialog.dialogLayout): Make the window resizable and set the
8875 size of the text control explicitly to make the sizers work on
8876 both Windows and X.
8877
8878 2001-09-07 Bernhard Herzog <[email protected]>
8879
8880 * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
8881 that can limit the search to the currently selected layer.
8882 (MapCanvas.SelectShapeAt): Make sure that the currently selected
8883 layer stays selected even when no shape is found
8884 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
8885 height do nothing (avoids zero division errors)
8886
8887 2001-09-06 Bernhard Herzog <[email protected]>
8888
8889 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
8890 Correct the spelling of SessionTreeCtrl. dabbrev is too damn
8891 convenient :-)
8892 (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
8893 a new instvar layer_to_item to map layers to tree items
8894 (SessionTreeCtrl.layer_selected): Select the appropriate tree item
8895 to match the current selection in the interactor
8896
8897 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
8898 (Interactor.HasSelectedLayer): New methods to query the current
8899 selection
8900
8901 * Thuban/UI/mainwindow.py (MainWindow.current_layer):
8902 (MainWindow.has_selected_layer): Simply call the appropriate
8903 interactor method
8904
8905 * Thuban/UI/mainwindow.py (MainWindow.__init__):
8906 (MainWindow.LayerShowTable):
8907 (MainWindow.identify_view_on_demand): Store the interactor in an
8908 instvar and use that reference instead of going through main.app
8909
8910 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
8911 * Thuban/UI/application.py (ThubanApplication.OnInit):
8912 * Thuban/UI/main.py (main): Create the session tree view in main
8913 with the new mainwindow method ShowSessionTree and not directly
8914 the application's OnInit method
8915
8916 * Thuban/UI/tree.py (myTreeCtrlPanel):
8917 (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
8918 TreeCtrl isntead of a panel. This affects most method since we now
8919 refer to self instead of self.tree
8920 (SessionTreeView): New class implementing a non-modal dialog
8921 showing the session tree.
8922
8923 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
8924 layer to the tableview dialog.
8925
8926 * Thuban/UI/tableview.py: Add some doc-strings
8927 (TableGrid):
8928 (TableGrid.OnRangeSelect):
8929 (TableGrid.OnSelectCell):
8930 (TableFrame.__init__):
8931 (TableFrame.row_selected):
8932 Selecting rows in the grid view now updates the selected shapes
8933 through the TableFrame. To achieve this we derive TableGrid from
8934 Publisher and introduce the message type ROW_SELECTED which the
8935 TableFrame subscribes to and which is issued by OnRangeSelect and
8936 OnSelectCell
8937
8938 (DataTable.SelectRow): Removed because it's no longer needed in
8939 the row/shape selection scheme
8940
8941 * Thuban/UI/dialogs.py: New file implementing common classes for
8942 dialogs
8943
8944 * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
8945 the SELECTED_SHAPE message anymore. This is now handled by the
8946 parent.
8947 (TableGrid.select_shape): Only update the selection if the shape
8948 is not None.
8949 (TableFrame): Inherit from the new NonModalDialog class.
8950 (TableFrame.__init__, TableFrame.select_shape): Handle the
8951 SELECT_SHAPE message.
8952 (TableFrame.OnClose): Extend the inherited method to unsubscribe
8953 SELECT_SHAPE
8954
8955 * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
8956 (MainWindow.add_dialog):
8957 (MainWindow.dialog_open):
8958 (MainWindow.remove_dialog):
8959 (MainWindow.get_open_dialog): New methods to maintain a dictionary
8960 of opened non-modal dialogs.
8961
8962 (MainWindow.__init__): Initialize the new non-modal dictionary
8963 management code
8964 (MainWindow.LayerShowTable): maintain separate dialogs for each
8965 table using the non-modal dialog management code to only open a
8966 view once for each table.
8967
8968 (MainWindow.IdentifyTool):
8969 (MainWindow.__init__):
8970 (MainWindow.identify_view_on_demand): Don't open the identify view
8971 in IdentifyTool anymore. This will be done automatically by the
8972 new method identify_view_on_demand which handles the
8973 SELECTED_SHAPE message so that the identify view will be opened on
8974 demand
8975
8976 * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
8977 the interactor argument. The SELECTED_SHAPE message is now handled
8978 by the parent.
8979 (IdentifyView.__init__): Add the interactor argument so that we
8980 can handle the SELECTED_SHAPE message here
8981 (IdentifyView.selected_shape): New method to handle the
8982 SELECTED_SHAPE messages
8983
8984 * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
8985 NonModalDialog class
8986 (IdentifyView.OnClose): Extend the inherited version to
8987 unsubscribe SELECT_SHAPE
8988
8989 * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
8990
8991 2001-09-05 Bernhard Herzog <[email protected]>
8992
8993 * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
8994
8995 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
8996 interactor to pass through to the MapCanvas
8997
8998 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
8999 argument to the MainWindow constructor to get rid of the ugly hack
9000 that made main.app available early just so that the mapcanvas
9001 could access the interactor object.
9002
9003 2001-09-04 Bernhard Herzog <[email protected]>
9004
9005 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
9006 that runs a modal message box
9007 (MainWindow.OnClose): Use the new method
9008 (MainWindow.RemoveLayer): Just do nothing in case no layer is
9009 selected. The command should be grayed out anyway, so there's no
9010 need to pop up a message box.
9011 (MainWindow.AddLayer): Pop up a message box with an error message
9012 if the shape file can't be opened
9013
9014 * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
9015 immediately. This will cause an exception in case the file can't
9016 be opened and we can display an appropriate message.
9017
9018 * MANIFEST.in: Add extensions/pyprojection/LICENSE
9019
9020 * setup.py (thuban_bdist_rpm): New class implementing a Thuban
9021 specific bdist_rpm command.
9022
9023 * Thuban/UI/main.py: Catch ImportError exceptions when importing
9024 the locale module because it may not be available on some
9025 installations.
9026
9027 * extensions/pyprojection/LICENSE: Copy of the license text in
9028 Projection.i. Having it in a separate file makes it easier to
9029 refer to license text in e.g. RPMs
9030
9031 2001-09-03 Bernhard Herzog <[email protected]>
9032
9033 * setup.py: use wx-config instead of wxgtk-config because it's
9034 more generic
9035
9036 * setup.py (ThubanInstall.get_outputs): Add the symlink in
9037 <prefix>/bin to the outputs
9038 (ThubanInstall.link_file): New method to link files. We need this
9039 because the standard copy_files refuses to link non-existing
9040 files.
9041 (ThubanInstall.run): Remove the leading install root from the
9042 script filename if an install root was specified and use the new
9043 link_file method
9044
9045 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
9046 the window when the first layer is added to the map.
9047
9048 * setup.py (ThubanInstall.run): Honor the build root (self.root)
9049 when linking thuban.py to <prefix>/bin
9050
9051 2001-08-31 Bernhard Herzog <[email protected]>
9052
9053 * setup.py: In the setup call, the install parameters shouldn't
9054 have trailing slashes because distutils on non-posix platforms
9055 doesn't like that. The same applies to other directories like
9056 "Resources/Bitmaps"
9057
9058 In the configuration section for nt, move the wxWindows directory
9059 optins into the part clearly marked as editable.
9060
9061 (InstallLocal.initialize_options):
9062 (InstallLocal.user_options): remove the currently unused debug
9063 flag
9064 (thuban_build_py.find_all_modules): Add this method so that it
9065 works for our case of having packages and modules in one
9066 distribution as well.
9067 (ThubanInstall.initialize_options):
9068 (ThubanInstall.finalize_options):
9069 (ThubanInstall.user_options):
9070 (ThubanInstall.boolean_options): Add new options, do-symlink and
9071 extra files. Since these are the first ThubanInstall specific
9072 options, override user_options and boolean_options
9073 (ThubanInstall.run): Honor the new do-symlink and extra-files
9074 options.
9075 (ThubanInstall.get_outputs): Add to override the base-class's
9076 version and add the extra-files to the outputs
9077 (bdist_inno): New class for windows distributions with Inno Setup
9078 (InnoIconItem): Helper class for bdist_inno
9079 (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
9080 this together with the appropriate parameters, to the setup call.
9081
9082 * setup.cfg (bdist_inno): added new section for the inno setup
9083 installer
9084
9085 * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
9086 changing_selection to avoid recursive selection events when
9087 modifying the selection in response to a selection event.
9088 (myTreeCtrlPanel.normalize_selection): Set the new inst var when
9089 changing the tree's selection.
9090 (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
9091 we're not being called indirectly from normalize_selection.
9092
9093 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
9094 event.Check only if the command is actuall checkable.
9095 (MainWindow.__init__): Call the toolbar's Realize method to make
9096 sure that the items are actually shown
9097
9098 2001-08-28 Bernhard Herzog <[email protected]>
9099
9100 * setup.py: Fix some doc strings
9101
9102 * ChangeLog: started
9103

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26