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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1981 - (show annotations)
Tue Nov 25 15:59:30 2003 UTC (21 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 333090 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26