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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2020 - (show annotations)
Wed Dec 3 18:56:32 2003 UTC (21 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 338861 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26