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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1894 - (show annotations)
Thu Oct 30 18:17:17 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 315066 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26