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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2029 - (show annotations)
Tue Dec 16 11:05:00 2003 UTC (21 years, 3 months ago) by silke
Original Path: trunk/thuban/ChangeLog
File size: 340767 byte(s)
Some changes to ensure compliance of debian package with FHS when build
from tarball

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26