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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2055 - (show annotations)
Fri Feb 6 08:42:03 2004 UTC (21 years, 1 month ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 345204 byte(s)
* po/pt_BR.po: Fixed charset

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26