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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2087 - (show annotations)
Fri Feb 20 20:09:40 2004 UTC (21 years ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 351337 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26