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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2010 - (show annotations)
Tue Dec 2 18:14:55 2003 UTC (21 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 337609 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26