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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1958 - (show annotations)
Tue Nov 18 15:37:55 2003 UTC (21 years, 3 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 329388 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26