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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2037 - (show annotations)
Mon Dec 22 17:50:06 2003 UTC (21 years, 2 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 342680 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26