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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2069 - (show annotations)
Mon Feb 16 19:42:23 2004 UTC (21 years ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 348669 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26