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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2005 - (show annotations)
Tue Dec 2 13:26:13 2003 UTC (21 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 337313 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26