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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2094 - (show annotations)
Thu Feb 26 11:22:43 2004 UTC (21 years ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 352320 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26