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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1977 - (show annotations)
Tue Nov 25 14:26:26 2003 UTC (21 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 332747 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26