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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1212 - (show annotations)
Mon Jun 16 12:28:25 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 185755 byte(s)
updated ChangeLog

1 2003-06-16 Jonathan Coles <[email protected]>
2
3 Fix a problem under Windows whereby if the user double-clicks on a
4 layer in the legend that tree item will expand or collapse as well
5 as open the layer properties dialog. The state of the tree item
6 should not be affected.
7
8 * Thuban/UI/legend.py (LegendTree.__init__): Add instance variable
9 preventExpandCollapse and subscribe to expanding and collapsing
10 events.
11 (LegendTree.OnItemExpandCollapse): New. Responds to expanding and
12 collapsing events and will veto the event if it has been triggered
13 by the user double clicking on a layer.
14 (LegendTree._OnItemActivated): Set preventExpandCollapse to indicate
15 that an expanding/collapsing event should be vetoed.
16
17 2003-06-13 Bernhard Herzog <[email protected]>
18
19 * Thuban/UI/classifier.py (Classifier.OnClose)
20 (Classifier.map_layers_removed)
21 (Classifier.layer_shapestore_replaced): Unsubscribe the messages
22 in OnClose and not in map_layers_removed or
23 layer_shapestore_replaced to make sure it always happens when the
24 dialog is closed
25
26 2003-06-13 Jonathan Coles <[email protected]>
27
28 This puts back a fix for Windows where a panel is needed so that
29 the background of the table view appears correctly.
30
31 * Thuban/UI/tableview.py (TableFrame.__init__): Add a panel
32 object that can be used by derived classes to place any
33 controls (including the grid) onto.
34 (QueryTableFrame.__init__): Use the panel as the parent window
35 for all the controls. Reparent the grid so that the panel is
36 the parent. Call UpdateStatusText() to correctly initialize
37 the status bar.
38
39 2003-06-13 Jonathan Coles <[email protected]>
40
41 * Thuban/UI/dialogs.py (ThubanFrame): New: a class that inherits
42 from wxFrame (as opposed to wxDialog like the other classes)
43 but otherwise behaves like the other classes. This is needed
44 for the TableView which isn't really a dialog and needs to
45 have a status bar and control buttons.
46
47 * Thuban/UI/tableview.py (TableGrid.__init__): Create an
48 instance variable to keep track of how many rows are selected.
49 Subscribe once to the the events we are interested in.
50 (ThubanGrid.OnRangeSelect): Only handle event if event handling
51 hasn't been turned off.
52 (ThubanGrid.OnSelectCell): Only handle event if event handling
53 hasn't been turned off.
54 (ThubanGrid.ToggleEventListeners): Rather than subscribe None
55 as an event listener (which changes the event handler stack)
56 simply set an instance variable to False. This is checked in
57 the event handlers.
58 (ThubanGrid.GetNumberSelected): Return the number of currently
59 selected rows.
60 (TableFrame): Inherit from ThubanFrame so we can have a
61 status bar and control buttons.
62 (QueryTableFrame.__init__): Create a status bar. Fixes RTbug #1942.
63 Explicitly set which items are selected in the operator choice and
64 action choice so there is always a valid selection. Fixes RTbug #1941.
65 Subscribe to grid cell selection events so we can update the
66 status bar.
67 (QueryTableFrame.UpdateStatusText): Update the status bar with
68 how many rows are in the grid, how many columns, and how many
69 rows are selected.
70 (QueryTableFrame.OnGridSelectRange, QueryTableFrame.OnGridSelectCell):
71 Call UpdateStatusText when cells are (de)selected.
72 (QueryTableFrame.OnQuery): Use the string value in the value
73 combo if either the selected item index is 0 or if the string
74 cannot be found in the predefined list (this happens if the
75 user changes the text). Fixes RTbug #1940.
76 Only turn off the grid event listeners if there a query comes
77 back with a none empty list of ids. in the case that the list
78 is empty this causes a grid.ClearSelection() call to actually
79 clear the grid selection which causes the selected items in
80 the map to be deselected. Fixes RTbug #1939.
81
82 * test/test_save.py (XMLWriterTest.Encode): Check return values.
83 Fixes RTbug #1851.
84
85 2003-06-13 Bernhard Herzog <[email protected]>
86
87 * Thuban/UI/identifyview.py (IdentifyView.__init__): Call
88 self.selected_shape with the current selection to make sure the
89 contents of the dialog are up to date when it's shown for the
90 first time.
91 The dialog used to work without this by luck. The recent fix to
92 the connector module 'broke' a 'feature' the identify view was
93 relying on, i.e that subscribing to a message in response to
94 receiving a message of that type would mean that the new
95 subscriber would also be called for the same message.
96
97 2003-06-12 Jonathan Coles <[email protected]>
98
99 * extensions/thuban/gdalwarp.cpp: Removed debug printing as
100 the image is rendered. Fixes RTbug #1937.
101
102 2003-06-12 Jonathan Coles <[email protected]>
103
104 * Thuban/Lib/fileutil.py: As is done under Windows, create the
105 user directory if it doesn't exist on a posix system.
106 Fixes RTbug #1815.
107
108 * Thuban/Model/resource.py (get_user_proj_files): Moved the
109 called to get_application_dir here, so that the directory
110 will only be called if this method is invoked.
111
112 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Clear
113 the projfilepath if no projection is selected.
114
115 2003-06-12 Jonathan Coles <[email protected]>
116
117 * Thuban/UI/legend.py (ScaleBarBitmap.__SetScale): Don't draw
118 the scalebar if the current map has no projection set.
119
120 * Thuban/UI/projdialog.py (ProjFrame.__DoOnProjAvail): Set the
121 projfilepath label to just the basename of the projection file
122 rather than include the entire path.
123
124 * Thuban/Model/resource.py: Fix missed proj functions that
125 needed to be renamed.
126
127 2003-06-12 Jonathan Coles <[email protected]>
128
129 * Thuban/Model/classification.py: Removed assert statements that
130 tested if the variable was an instance of Color.
131
132 * Thuban/Model/color.py (Color): Remove commented code that isn't
133 used.
134 (Transparent): Renamed from NoColor. Doesn't inherit from Color.
135 Fixes RTbug #1835.
136 (Transparent.__eq__, Transparent.__ne, Transparent.__repr): New.
137 Needed now that the class doesn't inherit from Color.
138
139 2003-06-12 Jonathan Coles <[email protected]>
140
141 * test/test_save.py (XMLWriterTest.testEncode): Explicitly
142 check unicode strings.
143
144 * test/test_layer.py: Check for existence of gdal.
145
146 2003-06-12 Jonathan Coles <[email protected]>
147
148 * Thuban/Model/xmlreader.py: New. Contains the XMLReader class
149 that was in load.py
150
151 * Thuban/Model/xmlwriter.py: New. Contains the XMLWriter class
152 that was in save.py
153
154 2003-06-12 Jonathan Coles <[email protected]>
155
156 This is largely a collection of bug fixes. We also handle the
157 case where gdal is not on the system. The XMLReader and XMLWriter
158 classes were moved into there own files to resolve some circular
159 import references and because they shouldn't really be in the
160 file that is dediciated to reading/writing session files since
161 they are also used elsewhere.
162
163 * Thuban/Model/classgen.py: Renamed functions to follow the
164 function_names_with_underscores style. Fixes RTbug #1903.
165 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
166
167 * Thuban/Model/layer.py: Import gdal only if it available.
168 (RasterLayer): Handle the case where the gdal library is unavailable.
169 Addresses RTbug #1877.
170
171 * Thuban/Model/load.py (XMLReader): Moved into seperate file
172 xmlreader.py.
173
174 2003-06-12 Jonathan Coles <[email protected]>
175
176 This is largely a collection of bug fixes. We also handle the
177 case where gdal is not on the system. The XMLReader and XMLWriter
178 classes were moved into there own files to resolve some circular
179 import references and because they shouldn't really be in the
180 file that is dediciated to reading/writing session files since
181 they are also used elsewhere.
182
183 * Thuban/Model/classgen.py: Renamed functions to follow the
184 function_names_with_underscores style. Fixes RTbug #1903.
185 (calculate_quantiles): Raise ValueError if 'percents' is invalid.
186
187 * Thuban/Model/layer.py: Import gdal only if it available.
188 (RasterLayer): Handle the case where the gdal library is unavailable.
189 Addresses RTbug #1877.
190
191 * Thuban/Model/load.py (XMLReader): Moved into seperate file
192 xmlreader.py.
193
194 * Thuban/Model/save.py (escape, XMLWriter): Moved into seperate
195 file xmlwriter.py.
196
197 * Thuban/Model/resource.py: Renamed functions to following the
198 function_names_with_underscores style.
199 (has_gdal_support): New function that returns true if the gdal
200 library is available. Addresses RTbug #1877.
201
202 * Thuban/UI/application.py (ThubanApplication.OpenSession):
203 Display a message box if the gdal library is not available, but
204 only if there are any layers that would use it. Addresses RTbug #1877.
205
206 * Thuban/UI/classgen.py: Use renamed projection resource functions.
207 (GenUniformPanel.__CalcStepping): Fix a slight discrepency
208 when using integers versus floats.
209
210 * Thuban/UI/mainwindow.py (_has_gdal_support): New. Used to
211 determine if the "Add Image Layer" menu option should be
212 greyed out or not. Addresses RTbug #1877.
213
214 * Thuban/UI/projdialog.py: Use renamed projection resource functions.
215
216 * Thuban/UI/renderer.py (MapRenderer.render_map): Only try to
217 optimize if a raster layer is visible. Fixes RTbug #1931.
218 Only draw the raster layer if the gdal library is available.
219 Addresses RTbug #1877.
220
221 * test/test_classgen.py: Add tests for generate_singletons,
222 generate_uniform_distribution, generate_quantiles. Fixes RTbug #1903.
223 (test_calculate_quantiles): Fix some tests to catch the new
224 ValueError that is raised.
225
226 * test/test_proj.py: Use renamed projection resource functions.
227
228 * test/test_save.py (SaveSessionTest.testClassifiedLayer): New
229 test for saving classified layers. Fixes RTbug #1902.
230 (XMLWriterTest): New. Tests the XMLWriter class. Fixes RTbug #1851.
231
232 2003-06-12 Jan-Oliver Wagner <[email protected]>
233
234 Fix for http://intevation.de/rt/webrt?serial_num=1900.
235
236 * Thuban/UI/multiplechoicedialog.py: New. A multiple choice dialog.
237
238 * Thuban/UI/mainwindow.py: import wxMultipleChoiceDialog from
239 multiplechoicedialog.py rather than from the wxPython library.
240
241 2003-06-11 Frank Koormann <[email protected]>
242
243 * Thuban/Lib/fileutil.py (get_application_dir): Minor stability
244 update.
245
246 2003-06-11 Frank Koormann <[email protected]>
247
248 * Thuban/Lib/fileutil.py (get_application_dir): New function to
249 determine the absolute .thuban/thuban directory under
250 "posix" (os.expanduser) and "nt" (read AppData registry key).
251
252 * Thuban/Model/resource.py: Use get_application_dir
253
254 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
255 Use get_application_dir.
256
257 2003-06-10 Bernhard Herzog <[email protected]>
258
259 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Subscribe to
260 the messages MAP_LAYERS_REMOVED messages
261 (LayerTableFrame.OnClose): Unsubscribe from it.
262 (LayerTableFrame.map_layers_removed): New. Receiver for
263 MAP_LAYERS_REMOVED. Close the dialog when the layer whose the
264 dialog is showing is removed.
265
266 2003-06-10 Bernhard Herzog <[email protected]>
267
268 * Thuban/Lib/connector.py (Connector.Issue): Iterate over a copy
269 of the receivers list so that unsubscribing in a receiver doesn't
270 modify it while iterating over it.
271
272 * test/test_connector.py
273 (ConnectorTest.test_disconnect_in_receiver): New. Test whether
274 unsubscribing in a receiver works correctly. See docstring for
275 details
276
277 2003-06-10 Bernhard Herzog <[email protected]>
278
279 * Thuban/Model/messages.py (LAYER_SHAPESTORE_REPLACED): New
280 message.
281
282 * Thuban/Model/layer.py (Layer.SetShapeStore): Send
283 LAYER_SHAPESTORE_REPLACED when the shapestore changes. A
284 LAYER_CHANGED will still be sent if the classification changes.
285
286 * Thuban/UI/classifier.py (Classifier.__init__): Add the map as
287 parameter so we can subscribe to some of its messages
288 (Classifier.__init__): Subscribe to the map's MAP_LAYERS_REMOVED
289 and the layer's LAYER_SHAPESTORE_REPLACED
290 (Classifier.unsubscribe_messages): New. Unsubscribe from message
291 subscribed to in __init__
292 (Classifier.map_layers_removed)
293 (Classifier.layer_shapestore_replaced): receivers for the messages
294 subscribed to in __init__. Unsubscribe and close the dialog
295
296 * Thuban/UI/mainwindow.py (MainWindow.OpenLayerProperties): Pass
297 the map to the Classifier dialog
298
299 * test/test_layer.py (SetShapeStoreTests): Derive from
300 SubscriberMixin as well so we can test messages
301 (SetShapeStoreTests.setUp): Subscribe to some of the layer's
302 messages
303 (SetShapeStoreTests.tearDown): Clear the messages again
304 (SetShapeStoreTests.test_sanity): Expand the doc-string and check
305 for the modified flag too
306 (SetShapeStoreTests.test_set_shape_store_modified_flag): New test
307 to check whether SetShapeStore sets the modified flag
308 (SetShapeStoreTests.test_set_shape_store_different_field_name)
309 (SetShapeStoreTests.test_set_shape_store_same_field)
310 (SetShapeStoreTests.test_set_shape_store_same_field_different_type):
311 Add tests for the messages. This checks both the new
312 LAYER_SHAPESTORE_REPLACED and the older LAYER_CHANGED
313
314 2003-06-06 Jan-Oliver Wagner <[email protected]>
315
316 * Thuban/UI/mainwindow.py: Improved and partly added help texts for
317 the menu items.
318
319 2003-06-05 Frank Koormann <[email protected]>
320
321 * Thuban/UI/identifyview.py (IdentifyView.__init__):
322 Layout reimplemented without panel. Make life easier to fit the list
323 in the dialog.
324
325 2003-06-05 Frank Koormann <[email protected]>
326
327 * Thuban/UI/projdialog.py (ProjFrame.__init__): Fill the projchoice
328 once on initialisation (Former implementation resulted in multiple
329 entries for each projection).
330 (ProjFrame.__FillAvailList): selectProj as second optional parameter,
331 if set, select the projection found under the specified name. This
332 overwrites any other selection estimate.
333 Removed projchoice filling from this method.
334 (ProjFrame._OnSave, ProjFrame._OnAddToList):
335 Updated call of ProjFrame.__FillAvailList
336 (LCCPanel._DoLayout): Moved parameter controls in more common order.
337
338 * Resources/Projections/defaults.proj: Extended defaults representing
339 various common European projections.
340
341 2003-06-05 Frank Koormann <[email protected]>
342
343 * Thuban/UI/identifyview.py (IdentifyView.__init__):
344 Use ListCtrl instead of GridCtrl
345
346 * Thuban/Model/resource.py:
347 Guess location of .thuban directory from tempdir parent directory.
348
349 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
350 Guess location of .thuban directory from tempdir parent directory.
351
352 2003-06-04 Bernhard Herzog <[email protected]>
353
354 Do not cache the values returned by the tree widget's
355 GetFirstChild and GetNextChild methods because it led to lots of
356 segfaults. The new way requires more brute force but is more
357 reliable.
358
359 * Thuban/UI/legend.py (LegendTree.__init__): Remove instance
360 variable layer2id
361 (LegendTree.find_layer): New method to do with brute force what
362 layer2id tried to accomplish
363 (LegendTree._OnMsgLayerChanged)
364 (LegendTree._OnMsgLayerTitleChanged, LegendTree.__ShowHideLayer):
365 Use find_layer instead of layer2id
366 (LegendTree.__RemoveLayer, LegendTree.__AddLayer): No need to
367 update layer2id anymore
368 (LegendTree._OnMsgMapLayersRemoved)
369 (LegendTree._OnMsgMapLayersAdded): Get by without layer2id.
370
371 2003-06-03 Thomas Koester <[email protected]>
372
373 * Thuban/Model/classgen.py (GenQuantiles0): New function.
374
375 2003-06-02 Bernhard Herzog <[email protected]>
376
377 * Thuban/UI/mainwindow.py (layer_rename command, table_rename command):
378 New commands.
379 (main_menu): Add the new commands.
380 (MainWindow.TableRename): New. Implementation of the table_rename
381 command.
382 (MainWindow.RenameLayer): New. Implementation of the layer_rename
383 command.
384
385 * Thuban/Model/session.py (Session.AddTable): call self.changed to
386 set the modified flag
387
388 * test/test_session.py (TestSessionSimple.test_add_table): Test
389 whether the modified flag is set properly
390
391 * Thuban/Model/base.py (TitledObject.SetTitle): Call changed
392 instead of issue so that the modified flags get updated.
393
394 * test/test_base.py (SomeTitledObject): Derive from Modifiable
395 instead of Publisher to reflect reality better and to accomodate
396 the fact that SetTitle now calls changed instead of issue
397
398 2003-06-02 Bernhard Herzog <[email protected]>
399
400 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Resource
401 acquisition has to happen before the try in a try-finally.
402
403 2003-06-02 Bernhard Herzog <[email protected]>
404
405 * Thuban/UI/legend.py (LegendTree._OnMsgMapLayersRemoved): It's
406 possible that a layer is removed that is not currently selected in
407 the legend so don't check for this.
408
409 2003-05-30 Bernhard Herzog <[email protected]>
410
411 * Thuban/Model/layer.py (Layer.Destroy): Set all instance
412 variables to None that have direct or indirect references to
413 shapefiles or dbf files to make sure that they do go away and the
414 files are closed.
415
416 2003-05-30 Bernhard Herzog <[email protected]>
417
418 * Thuban/UI/legend.py (LegendTree.GetRootItem): Reset
419 availImgListIndices when a new image list is created
420
421 2003-05-30 Bernhard Herzog <[email protected]>
422
423 * Thuban/UI/legend.py (LegendTree.__init__): New instance variable
424 changing_selection to indicate whether the LegendTree code itself
425 is currently changing the selection
426 (LegendTree.normalize_selection): New method to normalize the
427 selection by selecting the layer item even if the user clicked on
428 the classification.
429 (LegendTree._OnSelChanged): normalize the selection. This works
430 around a bug in wx which doesn't keep track of the selection
431 properly when subtrees are deleted.
432
433 2003-05-30 Bernhard Herzog <[email protected]>
434
435 * Thuban/UI/view.py (MapCanvas.set_view_transform): Limit the
436 maximum and minimum scale factors.
437
438 * test/test_classgen.py (ClassGenTest.test): Update to reflect the
439 changes in classgen.py
440
441 2003-05-30 Jonathan Coles <[email protected]>
442
443 * Thuban/Model/classgen.py: Remove ClassGenerator class but make
444 all the methods functions. Fixes RTBug #1903.
445
446 * Thuban/Model/map.py (Map.TopLayer, Map.BottomLayer): Renamed
447 to MoveLayerToTop and MoveLayerToBottom respectively. Fixes
448 RTBug #1907.
449
450 * Thuban/UI/classgen.py: Use classgen functions that were part
451 of the ClassGenerator class. Put try/finally blocks around
452 code that uses wxBeginBusyCursor()/wxEndBusyCursor(). Fixes
453 RTBug #1904.
454
455 * Thuban/UI/classifier.py: Remove unused import of ClassGenerator.
456
457 * Thuban/UI/legend.py: The legend was cleared and repopulated any
458 time something changed which caused some state to be lost such
459 as which children were expanded or collapsed. Fixes RTBug #1901.
460 (LegendTree._OnMsgMapLayersAdded): Add only new layers.
461 (LegendTree.__OnMsgMapLayersRemoved): Remove layers that exist in
462 the legend but not in the map.
463 (LegendTree.__FillTree): Move main functionality out into smaller
464 methods that can be used by other methods.
465 (LegendTree.__FillTreeLayer): Reuse old slots in the image list
466 if they are available.
467 (LegendTree.DeleteAllItems): Renamed from __DeleteAllItems so
468 that we override the wxTreeCtrl method. Iterate over children
469 and call __RemoveLayer.
470 (LegendTree.__AddLayer): New. Add a new layer to the legend.
471 (LegendTree.__RemoveLayer): Remove a layer from the legend.
472 (LegendTree.DeleteChildren): New, overrides wxTreeCtrl method.
473 Should only be called with the id of a layer branch.
474 (LegendTree.GetRootItem): New, overrides wxTreeCtrl method.
475 Returns the root item or creates one if necessary.
476
477 * Thuban/UI/renderer.py (MapRenderer.draw_raster_layer): Call
478 ProjectRasterFile with tuple arguments instead of strings.
479
480 * Thuban/UI/tableview.py (QueryTableFrame.OnQuery): Wrap code
481 with try/finally. Fixes RTBug #1904.
482
483 * Thuban/UI/view.py (MapCanvas.OnPaint): Wrap code
484 with try/finally. Fixes RTBug #1904.
485 (MapCanvas.FitSelectedToWindow): If a single point is selected
486 simply center it on the display. Fixes RTBug #1849.
487
488 * extensions/thuban/gdalwarp.cpp: Removed code that allowed gdalwarp
489 to be compiled as a standalone app. Now the code can only be
490 called from Python which simplifies the parameter passing.
491 (ProjectRasterFile): Handle Python arguments. Remove code that
492 checks for a destination dataset. Add more clean up code.
493
494 * test/test_map.py (TestMapWithContents.test_raise_layer_top,
495 TestMapWithContents.test_lower_layer_bottom):
496 Test Map.MoveLayerToTop() and Map.MoveLayerToBottom() respectively.
497 Fixes RTBug #1907.
498
499 * Thuban/UI/mainwindow.py (MainWindow.ToggleLegend): Apply a full
500 extent to the map when the legend is toggled. Fixes RTBug #1881.
501
502 2003-05-29 Jan-Oliver Wagner <[email protected]>
503
504 * Thuban/UI/tableview.py (LayerTableFrame.OnClose): Bug-fix: Now
505 unsubscribes all that is subcribed in __init__.
506
507 2003-05-28 Bernhard Herzog <[email protected]>
508
509 * Thuban/UI/mainwindow.py (MainWindow.DuplicateLayer)
510 (MainWindow.CanDuplicateLayer): New methods to implement the
511 Layer/Duplicate command.
512 (layer_duplicate command): New.
513 (main_menu): Add layer_duplicate to the Layer menu.
514
515 2003-05-28 Bernhard Herzog <[email protected]>
516
517 * Thuban/UI/tableview.py (NullRenderer.Draw): New. Our own
518 renderer so that NULL/None values get displayed differently (by a
519 gray rectangle).
520 (TableGrid.__init__): Override the default renderers
521
522 2003-05-28 Bernhard Herzog <[email protected]>
523
524 * Thuban/Model/layer.py (Layer.SetShapeStore): Set the
525 classification to "None" if the type of the field has changed.
526
527 * test/test_layer.py (SetShapeStoreTests): New. Class with a few
528 test for the Layer.SetShapeStore method
529
530 2003-05-28 Jan-Oliver Wagner <[email protected]>
531
532 * Thuban/Model/layer.py (Layer.TreeInfo): Fixed a bug (a layer
533 does not necessarily have a filename).
534
535 2003-05-28 Jan-Oliver Wagner <[email protected]>
536
537 * Thuban/UI/mainwindow.py (MainWindow.TableClose, MainWindow.TableShow):
538 sort the selection list for the dialog.
539
540 2003-05-28 Frank Koormann <[email protected]>
541
542 * extensions/thuban/wxproj.cpp
543 (project_point): Removed cast to int for projected point coordinates.
544 (shape_centroid): Return last point if all polygon vertices fall
545 to one point.
546
547 2003-05-28 Bernhard Herzog <[email protected]>
548
549 * Thuban/UI/mainwindow.py (_can_unjoin): Add doc-string and cope
550 with layers that don't have shapestores, i.e. raster layers.
551
552 2003-05-28 Bernhard Herzog <[email protected]>
553
554 * Thuban/Model/table.py (DBFTable.__init__): Omit the extension
555 when determining the title from the filename.
556
557 * test/test_dbf_table.py (TestDBFTable.test_title): Update to
558 reflect changes in the way the title is derived from the filename
559
560 2003-05-28 Frank Koormann <[email protected]>
561
562 * Thuban/UI/mainwindow.py (MainWindow.TableShow):
563 Added wxDEFAULT_DIALOG_STYLE to show table dialog styles.
564
565 2003-05-27 Bernhard Herzog <[email protected]>
566
567 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages): Also
568 delegate SelectedLayer.
569 (MainWindow.LayerUnjoinTable): Implement.
570 (_can_unjoin): New. Helper function for the sensitivity of the
571 layer/unjoin command.
572
573 * Thuban/Model/data.py (ShapefileStore.OrigShapeStore)
574 (DerivedShapeStore.OrigShapeStore): New. Return the original
575 shapestore. Used to figure out how to unjoin.
576 (DerivedShapeStore.Shapefile): Fix a typo.
577
578 2003-05-27 Bernhard Herzog <[email protected]>
579
580 * Thuban/UI/join.py (JoinDialog): Extend to handle layer joins as
581 well
582 (JoinDialog.__init__): Use the layer parameter and only build the
583 left choice when a layer is given
584 (JoinDialog.OnJoin): Handle layer joins as well
585 (JoinDialog.OnLeftTable, JoinDialog.OnRightTable): Handle the case
586 that the user selects the "Select..." item. The sensitivitly
587 updating is now in update_sensitivity
588 (JoinDialog.y): New method to refactor the sensitivity update of
589 the join button into its own method.
590
591 * Thuban/UI/mainwindow.py (MainWindow.LayerJoinTable): Implement.
592
593 2003-05-27 Bernhard Herzog <[email protected]>
594
595 * Thuban/UI/mainwindow.py (table_close command): Make it sensitive
596 iff there are unreferenced tables in the session
597
598 2003-05-27 Bernhard Herzog <[email protected]>
599
600 * Thuban/Model/messages.py (TABLE_REMOVED): New message.
601
602 * Thuban/Model/session.py (Session.UnreferencedTables): New method
603 to return tables that are not referenced by other tables or shape
604 stores and can be removed.
605 (Session.RemoveTable): Issue a TABLE_REMOVED message after
606 removing the table
607
608 * Thuban/UI/mainwindow.py: Remove unused imports
609 (MainWindow.TableClose): Implement.
610
611 * Thuban/UI/tableview.py (TableFrame.__init__): Subscribe to some
612 messages so that the frame will be automatically closed when a new
613 session is opened or the table is removed.
614 (TableFrame.OnClose): Unsubscribe the Subscriptions made in
615 __init__
616 (TableFrame.close_on_session_replaced)
617 (TableFrame.close_on_table_removed): New. Subscribers that close
618 the window
619
620 * test/test_session.py (TestSessionMessages.test_remove_table)
621 (TestSessionSimple.test_remove_table): Move the test to
622 TestSessionSimple and add test for the TABLE_REMOVED message
623 (TestSessionBase.setUp): Also subscribe to TABLE_REMOVED
624 (TestSessionSimple.test_unreferenced_tables) New. Test for the
625 UnreferencedTables method.
626 (UnreferencedTablesTests): New. Class with some more sophisticated
627 tests for UnreferencedTables.
628
629 2003-05-27 Frank Koormann <[email protected]>
630
631 * Thuban/UI/tableview.py (QueryTableFrame.__init__): The "_S_election"
632 display has some unwanted side effects. Removed again.
633
634 2003-05-27 Frank Koormann <[email protected]>
635
636 * Resources/Bitmaps/legend_icon_layer.xpm: New, icon for legend.
637
638 * Thuban/UI/legend.py (LegendTree.__FillTree): Use "legend_icon_layer"
639
640 2003-05-27 Jan-Oliver Wagner <[email protected]>
641
642 * test/test_menu.py (MenuTest.test): Added test for
643 Menu.RemoveItem().
644
645 * Thuban/UI/menu.py (Menu.RemoveItem): New. Remove an item from
646 the menu.
647
648 2003-05-27 Frank Koormann <[email protected]>
649
650 Nonmodal dialogs without parent (i.e. they can fall behind the main
651 window)
652
653 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Explicitly destroy
654 all dialogs in the dialogs dictionary and the canvas.
655
656 * Thuban/UI/dialogs.py (NonModalNonParentDialog): New class, without
657 parent, i.e. can fall behind other windows.
658 (NonModalDialog.OnClose): Check is dialog is in mainwindow.dialog
659 dictionary before removing it.
660
661 * Thuban/UI/classifier.py: Dialog derived from NonModalNonParentDialog
662
663 * Thuban/UI/projdialog.py: Dialog derived from NonModalNonParentDialog
664 * Thuban/UI/tableview.py: Dialog derived from NonModalNonParentDialog
665 * Thuban/UI/tree.py: Dialog derived from NonModalNonParentDialog
666
667 2003-05-27 Bernhard Herzog <[email protected]>
668
669 * Thuban/UI/mainwindow.py (MainWindow.ShowTableView): New. Open a
670 tableview dialog
671 (MainWindow.TableShow): Use ShowTableView to open the dialogs.
672 Also, don't use the table's titles as the dialog names. The titles
673 aren't guaranteed to be unique.
674 (MainWindow.TableOpen): Open a table view dialog after opening the
675 table
676
677 2003-05-27 Bernhard Herzog <[email protected]>
678
679 * Thuban/UI/mainwindow.py: Remove the Table/Hide menu item. Its
680 effect can be achieved by simply closing the window showing the
681 table.
682 (MainWindow.TableHide): Removed.
683 (main_menu): Removed "table_hide"
684
685 2003-05-27 Frank Koormann <[email protected]>
686
687 Fix legend tree display problems under Win32
688
689 * Thuban/UI/legend.py: BMP_SIZE_W = 15
690 (LegendTree.__FillTree): Display "legend_icon_map.xpm" with layer title.
691 (LegendTree.__FillTreeLayer): Explicitely set SelectedImage.
692
693 * Resources/Bitmaps/legend_icon_map.xpm: New icon for legend.
694
695 2003-05-27 Jan-Oliver Wagner <[email protected]>
696
697 * Thuban/UI/menu.py (Menu.InsertSeparator): Additional optional parameter
698 'after' now allows to insert separators almost anywhere in the menu.
699
700 2003-05-27 Frank Koormann <[email protected]>
701
702 * Thuban/UI/tableview.py (QueryTableFrame.__init__): Underline the
703 "S" of selection box label to hint on hot key (Alt-S). Works under
704 Win32 but is ignored under GTK.
705
706 2003-05-26 Frank Koormann <[email protected]>
707
708 * Thuban/UI/projdialog.py (ProjFrame.__do_layout, ProjPanel._DoLayout):
709 Center Choices.
710
711 2003-05-26 Bernhard Herzog <[email protected]>
712
713 Remove the Precision methods again. They're too DBF specific to be
714 part of the table interface and they're only used in table_to_dbf
715 anyway.
716
717 * Thuban/Model/transientdb.py (TransientTableBase.Width):Use a
718 fixed precision of 12 for doubles.
719 (TransientTableBase.Precision): Removed
720 (AutoTransientTable.Width): Delegate to self.table.
721
722 * Thuban/Model/table.py (DBFTable.Precision)
723 (MemoryTable.Precision): Removed.
724 (MemoryTable.Width): Use a fixed precision of 12 for doubles.
725 (table_to_dbf): Use a fixed precision of 12 for floats unless the
726 column object specifies something else.
727
728 * test/test_dbf_table.py (TestTableToDBF.test_table_to_dbf): New.
729 test for table_to_dbf
730
731 2003-05-26 Bernhard Herzog <[email protected]>
732
733 * test/test_transientdb.py
734 (TestTransientTable.run_iceland_political_tests): Fix a comment.
735
736 2003-05-26 Bernhard Herzog <[email protected]>
737
738 * Thuban/UI/mainwindow.py (MainWindow.TableOpen): Real
739 implementation. Mark parts of the file format strings for
740 localization.
741
742 * Thuban/Model/session.py (Session.OpenTableFile): New. Open a dbf
743 file and add the table to the tables managed by the session
744
745 * test/test_session.py (TestSessionSimple.test_open_table_file):
746 New. test case for OpenTableFile
747
748 2003-05-26 Jan-Oliver Wagner <[email protected]>
749
750 * Thuban/UI/controls.py, Thuban/UI/identifyview.py, Thuban/UI/join.py,
751 Thuban/UI/labeldialog.py, Thuban/UI/mainwindow.py,
752 Thuban/UI/proj4dialog.py, Thuban/UI/tableview.py, Thuban/UI/view.py:
753 Replace the true/false of wxWindows by True/False of Python 2.2.1.
754
755 2003-05-26 Jan-Oliver Wagner <[email protected]>
756
757 * Thuban/UI/tableview.py (LayerTableFrame.__init__): If there is
758 already a selection present, update the grid accordingly.
759
760 * Thuban/UI/mainwindow.py (MainWindow.TableShow): Make the dialog
761 resizeable and increase its initial size.
762
763 2003-05-26 Frank Koormann <[email protected]>
764
765 Table export functionality
766
767 * Thuban/Model/table.py (DBFTable.Width, MemoryTable.Width):
768 Return width (in characters) for a column.
769 (DBFTable.Precision, MemoryTable.Precision): Return decimal precision.
770 (table_to_dbf): Write table to dbf file.
771 (table_to_csv): Write table to csv file.
772
773 * Thuban/Model/transientdb.py (TransientTableBase.Width,
774 TransientTableBase.Precision): Return column width and precision.
775
776 * Thuban/UI/tableview.py (QueryTableFrame.OnSaveAs): Call table_to_dbf
777 or table_to_csv depending on file selection.
778
779 * test/test_dbf_table.py:
780 Test table_to_dbf (extension of former part of test).
781
782 * test/test_csv_table.py:
783 Test table_to_csv.
784
785 2003-05-23 Jan-Oliver Wagner <[email protected]>
786
787 * Thuban/UI/join.py (JoinDialog.OnJoin): Use _() for strings.
788 Use QueryTableFrame instead of TableFrame.
789
790 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Prefix the
791 table window with 'Layer Table:' instead of 'Table:'.
792
793 2003-05-23 Jan-Oliver Wagner <[email protected]>
794
795 Give all tables a title via mix-in TitledObject.LayerShowTable
796
797 * Thuban/Model/base.py (TitledObject.SetTitle): Call method 'issue'
798 only if it exists.
799
800 * Thuban/Model/table.py (DBFTable, MemoryTable): mix-in TitledObject
801 and call its init-method with a default title. Remove Title() method.
802
803 * Thuban/Model/transientdb.py (TransientTable, TransientJoinedTable,
804 AutoTransientTable): mix-in TitledObject and call its init-method with
805 a default title. Remove Title() method.
806
807 2003-05-23 Bernhard Herzog <[email protected]>
808
809 * Thuban/Model/session.py (Session.AddShapeStore): Define
810 AddShapeStore analogously to AddTable.
811
812 * test/test_session.py (TestSessionSimple.test_add_shapestore):
813 New. Test for AddShapeStore
814
815 2003-05-23 Jan-Oliver Wagner <[email protected]>
816
817 Introducing QueryTableFrame and a very coarse ShowTable implementation.
818
819 * Thuban/UI/tableview.py (LayerTableFrame, QueryTableFrame): Split the
820 class LayerTableFrame into two classes, LayerTableFrame and QueryTableFrame.
821 The latter implements the selection GUI without dependency on a layer.
822 LayerTableFrame now is derived from QueryTableFrame and connects
823 to a layer.
824
825 * Thuban/UI/mainwindow.py (MainWindow.TableShow): A very coarse
826 implementation that still needs work.
827
828 * Thuban/Model/layer.py (Layer.TreeInfo): Added filename.
829
830 2003-05-22 Frank Koormann <[email protected]>
831
832 * Thuban/Model/transientdb.py (TransientJoinedTable.__init__):
833 Added "outer_join = False" as optional parameter.
834 (TransientJoinedTable.create): If outer join is true, perform a
835 "LEFT OUTER JOIN" instead of "JOIN", which preserves all records of
836 the left table. Records not matching are filled with 0 / None.
837
838 * Thuban/UI/join.py (JoinDialog.__init__): Checkbox for outer join.
839 (JoinDialog.OnJoin): Consider outer join check box.
840
841 2003-05-22 Bernhard Herzog <[email protected]>
842
843 * Thuban/UI/join.py (JoinDialog.OnJoin): Use exc_info in a
844 somewhat safer way. Storing the traceback in a local variable can
845 lead to memory leaks
846
847 2003-05-22 Bernhard Herzog <[email protected]>
848
849 * Thuban/UI/join.py (JoinDialog.OnJoin): Make sure to really call
850 the wxMessageDialog's Destroy() method.
851
852 2003-05-22 Frank Koormann <[email protected]>
853
854 * Thuban/UI/join.py (JoinDialog.__init__): Make use of
855 TransientTable.Title()
856
857 2003-05-22 Frank Koormann <[email protected]>
858
859 Join Dialog, initial version.
860
861 * Thuban/UI/mainwindow.py (MainWindow.TableJoin): Removed print.
862
863 * Thuban/UI/join.py (JoinDialog): Functional implementation of
864 former framework. Renamed Table1/Table2 to LeftTable/RightTable
865 in all occurences.
866
867 * Thuban/Model/transientdb.py (TransientJoinedTable.__doc__):
868 Typo fixed.
869
870 2003-05-22 Bernhard Herzog <[email protected]>
871
872 Give the tables titles so that the GUI can display more meaningful
873 names. For now the titles are fixed but depend on e.g. filenames
874 or the titles of the joined tables.
875
876 * Thuban/Model/transientdb.py (TransientTable.Title)
877 (TransientJoinedTable.Title, AutoTransientTable.Title): New.
878
879 * Thuban/Model/table.py (DBFTable.Title, MemoryTable.Title): New.
880
881 * test/test_transientdb.py
882 (TestTransientTable.test_auto_transient_table_title): New. Test
883 for the Title method
884 (TestTransientTable.test_transient_joined_table)
885 (TestTransientTable.test_transient_table): Add test for the Title
886 methods
887
888 * test/test_memory_table.py (TestMemoryTable.test_title): New.
889 Test for the Title method
890
891 * test/test_dbf_table.py (TestDBFTable.test_title): New. Test for
892 the Title method
893
894 2003-05-22 Bernhard Herzog <[email protected]>
895
896 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
897 Provide a better way to destroy the layers
898 (TestLayer.test_base_layer, TestLayer.test_arc_layer)
899 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
900 (TestLayer.test_polygon_layer, TestLayer.test_get_field_type): Use
901 the new way to destroy the layers.
902 (TestLayer.test_derived_store): New. Test for using a layer with a
903 DerivedShapeStore
904
905 * Thuban/Model/layer.py (Layer.SetShapeStore): Only set the
906 filename if the shape store actually has one.
907
908 2003-05-22 Bernhard Herzog <[email protected]>
909
910 * Thuban/Model/table.py (DBFTable.FileName): New. Accessor method
911 for the filename
912
913 * test/test_dbf_table.py (TestDBFTable.test_filename): New. Test
914 for the FileName method
915 (TestDBFTableWriting.test_write): Fix spelling of filename
916
917 2003-05-22 Thomas Koester <[email protected]>
918
919 * Thuban/Model/range.py, test/test_range.py: Brought over new Range
920 from SciParam that now really is immutable.
921
922 2003-05-22 Frank Koormann <[email protected]>
923
924 Layer Top/Bottom placement added to legend.
925
926 * Thuban/UI/legend.py
927 (LegendPanel._OnMoveTop(), LayerPanel._OnMoveBottom): New, methods
928 bound to tool events.
929 (LegendTree.MoveCurrentItemTop(), LegendTree.MoveCurrentItemBottom):
930 New, methods binding the event methods with the map methods.
931
932 * Thuban/Model/map.py (Map.TopLayer(), Map.BottomLayer()): New, place
933 layer at top/bottom of layer stack.
934
935 * Resources/Bitmaps/top_layer.xpm: New button icon.
936
937 * Resources/Bitmaps/bottom_layer.xpm: New button icon.
938
939 2003-05-22 Bernhard Herzog <[email protected]>
940
941 * Thuban/Model/session.py (Session.RemoveTable): New method to
942 remove tables
943
944 * test/test_session.py (TestSessionSimple.test_remove_table): New.
945 Test for RemoveTable
946
947 2003-05-22 Thomas Koester <[email protected]>
948
949 * Thuban/Model/classgen.py: Added short module doc string and CVS id.
950 (ClassGenerator.GenUniformDistribution): Use new Range __init__, too.
951
952 2003-05-22 Bernhard Herzog <[email protected]>
953
954 Implement a way to discover dependencies between tables and
955 shapestores.
956
957 * Thuban/Model/transientdb.py (TransientTableBase.Dependencies)
958 (TransientJoinedTable.Dependencies)
959 (AutoTransientTable.SimpleQuery): New. Implement the dependencies
960 interface
961 (TransientJoinedTable.__init__): Keep tack of the original table
962 objects in addition to the corresponding transient tables.
963
964 * Thuban/Model/table.py (DBFTable.Dependencies)
965 (MemoryTable.Dependencies): New. Implement the dependencies
966 interface
967
968 * Thuban/Model/data.py (ShapeTable): New. Helper class for
969 ShapefileStore
970 (ShapefileStore.__init__): Use ShapeTable instead of
971 AutoTransientTable
972 (ShapefileStore.Table, ShapefileStore.Shapefile): Add doc-strings
973 (ShapefileStore.FileName, ShapefileStore.FileType): New. Accessor
974 methods for filename and type
975 (ShapefileStore.Dependencies): New. Implement the dependencies
976 interface
977 (DerivedShapeStore): New class to replace SimpleStore. The main
978 difference to SimpleStore is that it depends not on a shapefile
979 but another shapestore which expresses the dependencies a bit
980 better
981 (SimpleStore.__init__): Add deprecation warning.
982
983 * test/test_dbf_table.py (TestDBFTable.test_dependencies): New.
984 Test for the Dependencies method.
985
986 * test/test_memory_table.py (TestMemoryTable.test_dependencies):
987 New. Test for the Dependencies method.
988
989 * test/test_transientdb.py
990 (TestTransientTable.test_auto_transient_table_dependencies): New.
991 Test for the Dependencies method.
992 (TestTransientTable.test_transient_joined_table): Add test for the
993 Dependencies method.
994
995 * test/test_session.py (TestSessionSimple.setUp)
996 (TestSessionSimple.tearDown): New. Implement a better way to
997 destroy the sessions.
998 (TestSessionSimple.test_initial_state)
999 (TestSessionSimple.test_add_table): Bind session to self.session
1000 so that it's destroyed by tearDown
1001 (TestSessionSimple.test_open_shapefile): New. Test for
1002 OpenShapefile and the object it returns
1003
1004 2003-05-22 Bernhard Herzog <[email protected]>
1005
1006 * Thuban/Model/session.py (Session.AddTable): New method to
1007 register tables with the session.
1008 (Session.Tables): Return the tables registered with AddTable too.
1009
1010 * test/test_session.py (TestSessionSimple.test_add_table): New.
1011 Test case for the AddTable method
1012
1013 2003-05-22 Frank Koormann <[email protected]>
1014
1015 UI polishing updates: Place main buttons (OK, Cancel, etc) in the
1016 lower right corner, center labels for selections, initialize controls
1017 in reasonable order for keyboard navigation.
1018
1019 * Thuban/UI/projdialog.py (ProjFrame.__init__, ProjFrame.__doLayout)
1020 (ProjFrame.__DoOnProjAvail): Determine position of current projection
1021 using the wxListBox.FindString() method. Still a problem (#1886)
1022
1023 * Thuban/UI/classifier.py
1024 (Classifier.__init__, SelectPropertiesDialog.__init__)
1025
1026 * Thuban/UI/classgen.py (ClassGenDialog.__init__,
1027 (ClassGenDialog.__DoOnGenTypeSelect): Moved initialization of the
1028 different classification types from here to __init__.
1029 (GenUniquePanel.__init__): Set the column width of the first field
1030 in the Field ListCtrl to the full width.
1031
1032 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Rename 'Save As'
1033 Button to 'Export'. Center Buttons in Selection Box, set Focus to
1034 Grid.
1035 (LayerTableFrame.OnKeyDown()): New, bound to the grid with EVT_KEY_DOWN,
1036 changes focus to the Selection when pressing "Alt-S".
1037
1038 * Thuban/UI/legend.py (LegendTree.__SetVisibilityStyle): Only gray out
1039 the text if not visible. The italic font sometimes exceeds the
1040 rendering area.
1041
1042 2003-05-21 Jonathan Coles <[email protected]>
1043
1044 * Thuban/UI/dock.py (DockFrame): Rename references to _OnClose
1045 to OnClose so that Thuban closes correctly.
1046
1047 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Call
1048 DockFrame.OnClose, not DockFrame._OnClose.
1049
1050 2003-05-21 Jonathan Coles <[email protected]>
1051
1052 * Thuban/Model/classgen.py (ClassGenerator.GenQuantiles): Remove
1053 references to 'inf' and use new Range __init__ to pass floats
1054 directly rather than converting them to strings first.
1055 Fixes RTBug #1876.
1056
1057 * Thuban/Model/classification.py (ClassGroupRange.SetRange):
1058 Use new Range ___init__ to pass floats.
1059
1060 * Thuban/Model/layer.py (RasterLayer.__init__): Test if the
1061 filename is a valid image file. Throw IOError otherwise.
1062
1063 * Thuban/Model/range.py: Brought over new Range from SciParam that
1064 is immutable and has an __init__ which can accept floats.
1065
1066 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Move OpenShapefile
1067 into try block. AddLayer doesn't throw any exceptions anymore.
1068 (MainWindow.AddRasterLayer): Move constructor of RasterLayer into
1069 try block.
1070
1071 * Thuban/UI/projdialog.py (GeoPanel.__init__): Put Degrees as
1072 the first item in choices. Fixes RTBug #1882.
1073
1074 * Thuban/UI/renderer.py (MapRenderer.render_map): Check if scale
1075 has gone to 0 which is a serious problem. abort.
1076 (MapRenderer.draw_raster_layer): Catch IOError seperately and
1077 print the error from GDAL.
1078
1079 * Thuban/UI/tableview.py (TableGrid.__init__): Call
1080 ToggleEventListeners to turn on listening.
1081 (TableGrid.ToggleEventListeners): New. Turns event listening on
1082 and off so as to prevent excessive messages.
1083 (LayerTableFrame.OnQuery): Use TableGrid.ToggleEventListeners
1084 to suppress excessive messages when selecting many rows.
1085 Fixes RTBug #1880.
1086
1087 * Thuban/UI/view.py: Added checks against if scale == 0. This
1088 is a serious problem that can occur when an image without
1089 geo data is loading and causes the map projection bounds to
1090 go to infinity. Right now, the solution is to simply try
1091 to recover.
1092
1093 * extensions/thuban/cpl_mfile.cpp (MFILEClose): Make sure
1094 to set the MFILEReceiver attributes even if the data is NULL.
1095
1096 * extensions/thuban/gdalwarp.cpp: Improved the error handling
1097 and passed GDAL messages back up to the Python layer. Also
1098 tried to fix some memory leaks that were present in the original
1099 utility but didn't matter because the program aborted.
1100
1101 * test/test_range.py: Copied over tests from SciParam. Removed
1102 tests against importing. Fixes RTBug #1867.
1103
1104 2003-05-21 Bernhard Herzog <[email protected]>
1105
1106 * test/test_load.py: Remove unused imports and restructure the
1107 test code
1108 (LoadSessionTest): Split into one class for each test and turn
1109 LoadSessionTest itself into the base class for all such session
1110 tests.
1111 (ClassificationTest): New base class for load tests that test
1112 classifications
1113 (TestSingleLayer, TestLayerVisibility, TestClassification)
1114 (TestLabels, TestLayerProjection, TestRasterLayer): New classes
1115 for the individual tests
1116
1117 * test/support.py (FileLoadTestCase.filename): New base class for
1118 file loading tests
1119
1120 2003-05-21 Jan-Oliver Wagner <[email protected]>
1121
1122 * Resources/Projections/defaults.proj: Renamed 'Universal Transverse
1123 Mercator' to 'UTM Zone 32' as a more convenient example.
1124 Added 'Gauss Krueger Zone 6'.
1125
1126 * Data/iceland_sample_raster.thuban: political polygon now
1127 filled transparent to have the raster image visible at once.
1128
1129 2003-05-21 Frank Koormann <[email protected]>
1130
1131 * Thuban/UI/mainwindow.py (MainWindow): Renamed _OnClose() back to
1132 OnClose() to keep in sync with extensions. Internally Thuban
1133 still uses "underscored" names.
1134
1135 2003-05-20 Jonathan Coles <[email protected]>
1136
1137 This puts back Raster layer support. These layers support projections
1138 through the GDAL library. Currently, the CVS version is being used.
1139 There are no Debian packages available although this may change soon.
1140 A GDAL driver was extended to support writing to memory rather to
1141 files.
1142
1143 There is still some work that needs to be done, such as some error
1144 handling when loading invalid images or when there is a problem
1145 projecting the image. This putback simply checks in the majority
1146 of the work.
1147
1148 * setup.py: Add gdalwarp library extension.
1149
1150 * Thuban/Model/layer.py (BaseLayer.HasClassification): New.
1151 Defaults to False, but can be overridden by subclasses if they
1152 support classification.
1153 (RasterLayer): New. Defines a new layer that represents an
1154 image.
1155
1156 * Thuban/Model/load.py (SessionLoader.__init__): Add rasterlayer
1157 tag handler.
1158 (SessionLoader.start_layer): Encode the filename.
1159 (SessionLoader.start_rasterlayer, SessionLoader.end_rasterlayer):
1160 New. Supports reading a rasterlayer tag.
1161
1162 * Thuban/Model/map.py (Map.BoundingBox): Fix typo in comment.
1163
1164 * Thuban/Model/save.py (XMLWriter.encode): Don't assume that we
1165 get a string in Latin1. If we get such as string convert it to
1166 unicode first, otherwise leave if alone before encoding.
1167 (SessionSaver.write_layer): Add support for writing both Layers
1168 and RasterLayers.
1169
1170 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1171 The right argument may not be a string, it could also be a Column.
1172
1173 * Thuban/UI/application.py (ThubanApplication.CreateMainWindow):
1174 Make initial window size 600x400. Fixes RTBug #1872.
1175
1176 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange how
1177 the dialog is constructed so that we can support layers that
1178 do not have classifications.
1179 (Classifier._OnTry): Only build a classification if the layer
1180 supports one.
1181
1182 * Thuban/UI/legend.py: Change all checks that a layer is an
1183 instance of Layer into checks against BaseLayer.
1184 (LegendTree.__FillTreeLayer): Only add children to a branch if
1185 the layer supports classification.
1186
1187 * Thuban/UI/mainwindow.py (MainWindow.NewSession,
1188 MainWindow.OpenSession): Don't proceed with an action if the
1189 user chooses Cancel when they are asked to save changes.
1190 (MainWindow.AddRasterLayer): New. Open a dialog to allow the
1191 user to select an image file. Create a new RasterLayer and add
1192 it to the map.
1193
1194 * Thuban/UI/renderer.py (MapRenderer.render_map): Add support
1195 for rendering RasterLayer layers.
1196 (MapRenderer.draw_raster_layer): Actually method that calls
1197 the GDALWarp python wrapper and constructs an image from the
1198 data returned.
1199
1200 * Thuban/UI/tableview.py (LayerTableFrame.__init__): Change the
1201 Choices symbols to match those used in the table query method.
1202 Replace deprecated method calls on table with new method names.
1203
1204 * Thuban/UI/view.py (MapCanvas.set_view_transform): Try to limit
1205 how small the scale can get. This still needs more testing.
1206
1207 * extensions/thuban/bmpdataset.cpp: New, but copied from GDAL.
1208 Provides a driver to output in .bmp format.
1209
1210 * extensions/thuban/cpl_mfile.cpp, extensions/thuban/cpl_mfile.h:
1211 New. Provides IO routines which write to memory, rather than a file.
1212
1213 * extensions/thuban/gdalwarp.cpp: New, but basically a direct copy
1214 of the gdalwarp utility provided in GDAL. Added function calls
1215 that can be accessed from python.
1216
1217 * Data/iceland_sample_raster.thuban: New. Sample file that uses
1218 a raster layer.
1219
1220 * Data/iceland/island.tfw, Data/iceland/island.tif: New. Raster
1221 layer image data.
1222
1223 * Doc/thuban.dtd: Added rasterlayer attribute definition.
1224
1225 * test/test_layer.py, test/test_load.py, test/test_save.py: Added
1226 tests associated with the raster layer code.
1227
1228 * test/test_transientdb.py
1229 (TestTransientTable.test_auto_transient_table_query): Added a test
1230 for using a Column object as the "right" parameter to a query.
1231
1232 2003-05-19 Frank Koormann <[email protected]>
1233
1234 * Thuban/version.py (get_changelog_date):
1235 Catch exceptions if ChangeLog does not exist.
1236
1237 * Thuban/UI/view.py (MapCanvas.Export): Bugfix
1238
1239 2003-05-19 Frank Koormann <[email protected]>
1240
1241 Extended version information for Thuban
1242
1243 * Thuban/version.py: New, version information for Thuban: Last
1244 modification date and last ChangeLog entry date.
1245
1246 * Thuban/UI/mainwindow.py (MainWindow.About()): Extended version
1247 information: Display Thuban, wxPython and Python version.
1248
1249 2003-05-16 Bernhard Herzog <[email protected]>
1250
1251 * Thuban/Model/save.py: Remove some unused imports including the
1252 __future__ import for nested_scopes as Thuban relies on Python 2.2
1253 now.
1254 (XMLWriter.encode): Remove the special case for a None argument.
1255 In the saver encode is always called with a string argument.
1256
1257 2003-05-16 Bernhard Herzog <[email protected]>
1258
1259 * Thuban/UI/__init__.py: Remove the work-around for the locale bug
1260 in wxPython (at least when usinvg wxGTK) prior to 2.4. The symptom
1261 of the bug was that e.g. float("1.2") would fail. Thuban now
1262 requires 2.4.x.
1263
1264 2003-05-16 Frank Koormann <[email protected]>
1265
1266 Printing enhancement and WMF export (under Win32)
1267
1268 * Thuban/UI/renderer.py (ExportRenderer): New, derived from
1269 ScreenRenderer. Renders Map, Legend and Scalebar for export.
1270 (PrinterRenderer): New, derived from ExportRenderer. Replaces the old
1271 PrintRender.
1272
1273 * Thuban/UI/view.py (MapPrintout.__init__): Enhanced parameter set
1274 to fullfil information needed for PrinterRenderer.
1275 (MapCanvas.Export): New. Export Map (currently only to WMF on Win32).
1276 (MapCanvas.Print): Adapted to new MapPrintout.
1277 (OutputTransform): General calculations to transform from canvas
1278 coordinates to export/printing devices.
1279
1280 * Thuban/UI/mainwindow.py (MainWindow.ExportMap()): New. Added also
1281 new method_command to call ExportMap, with platform dependency (only
1282 __WXMSW__)
1283
1284 * Thuban/UI/scalebar.py (ScaleBar.DrawScaleBar): Position and Size
1285 of scalebar drawing area as new parameters.
1286
1287 * Thuban/Model/scalebar.py (roundInterval): round long instead of int
1288
1289 * Thuban/UI/legend.py (ScalebarBitmap.__SetScale):
1290 Update to extended scalebar.DrawScalebar header.
1291
1292 * test/test_export.py: New, test Thuban.UI.view.OutputTransform()
1293
1294 * test/test_scalebar.py: Made test executable as standalone.
1295
1296 2003-05-16 Bernhard Herzog <[email protected]>
1297
1298 * Thuban/Model/table.py (Table): Remove this compatibility alias
1299 for DBFTable.
1300
1301 * test/test_table.py: Import DBFTable as Table because that alias
1302 doesn't exist anymore.
1303
1304 * Thuban/UI/classgen.py: Remove some unused imports
1305
1306 2003-05-14 Jonathan Coles <[email protected]>
1307
1308 * Thuban/Model/classgen.py (ClassGenerator.GenSingletonsFromList):
1309 Fix docstring.
1310 (ClassGenerator.GenUniformDistribution): Fix spelling of method name.
1311 (ClassGenerator.GenQuantiles): Use the left/right brackets and min/max
1312 values of the supplied range to determine the beginning and end
1313 bounds of the generated classes.
1314
1315 * Thuban/Model/range.py (Range.number_re): Now accepts floats that
1316 do not have a leading 0 (.5 is now accepted as well as 0.5).
1317
1318 * Thuban/UI/classgen.py (ClassGenDialog.OnOK): Fix name of method
1319 call to ClassGenerator.GenUniformDistribution.
1320
1321 * Thuban/UI/projdialog.py (ProjFrame.__do_layout): Fix Windows
1322 layout bug with the 'Projection' label.
1323
1324 * test/support.py (FloatTestCase): New. Needed for the Range tests.
1325
1326 * test/test_range.py: New. Imported from SciParam.
1327
1328 2003-05-12 Jonathan Coles <[email protected]>
1329
1330 * Thuban/UI/classgen.py (GenQuantilesPanel.GetList): Replace call
1331 to table.UniqueValues() with calls that retrieve all the values
1332 from the table. This will need to be replaced by a method on table
1333 which can simply return the list (perhaps more efficiently).
1334
1335 2003-05-12 Jonathan Coles <[email protected]>
1336
1337 The return value of ClassGenerator.CalculateQuantiles has changed.
1338 Refer to the documentation for details.
1339
1340 * test/test_classgen.py: Modified Quantile tests to use the
1341 new return values.
1342
1343 * Thuban/Model/classgen.py
1344 (ClassGenerator.GenQuantiles): Add comments describing the parameters,
1345 use new return values from CalculateQuantiles to produce the correct
1346 range bounds in the Classification.
1347 (ClassGenerator.CalculateQuantiles): Add more comments describing
1348 the return values and parameters. Make minor adjustments to improve
1349 the legibility of the code. Fix problem with adjusted not being set
1350 in most cases.
1351
1352 2003-05-12 Frank Koormann <[email protected]>
1353
1354 * Thuban/Model/save.py (XMLWriter.encode()): Explicite call to unicode
1355 and latin1. Fixes #1851 finally.
1356
1357 2003-05-09 Jonathan Coles <[email protected]>
1358
1359 * test/test_classgen.py: New. Tests the Quantile algorithm.
1360
1361 * Thuban/Model/classgen.py (ClassGenerator.CalculateQuantiles):
1362 Clean up debugging statement, add comments, fix a small bug in the
1363 returned adjusted percentiles.
1364
1365 2003-05-09 Jonathan Coles <[email protected]>
1366
1367 Introduces Range class from SciParam into the ClassGroupRange class,
1368 and such ranges can now be saved and loaded from disk.
1369
1370 Quantiles are now available in the Classification Generator.
1371
1372 Initial support for building Queries on a table. Doesn't do anything
1373 but run some tests.
1374
1375 * Thuban/Model/classification.py: Explicit imports.
1376 (ClassGroupRange): Use the Range class to store the underlying
1377 range information. The interface remains the same, except for
1378 GetRange(), and you can also supply a Range object as the min
1379 parameter to SetRange or __init__.
1380
1381 * Thuban/Model/load.py (XMLReader.encode): New. Encodes the given
1382 string appropriately for use in Thuban. Fixes RTbug #1851.
1383 (SessionLoader.end_projection): Handle the context of the
1384 projection tag a bit better by looking at what objects are not
1385 None. There was an assumption that a projection tag for a map
1386 could occur before any layers.
1387 (SessionLoader.start_clrange): Provide backward compatibility for
1388 reading min/max values as well as the new range parameter.
1389
1390 * Thuban/Model/map.py: Explicit imports.
1391
1392 * Thuban/Model/resource.py: Import _.
1393 (ProjFileSaver.write): write header using projfile.dtd.
1394
1395 * Thuban/Model/save.py: Explicit imports.
1396 (XMLWriter.encode): New. Encode the given string from a format
1397 used by Thuban into UTF-8. Fixes RTbug #1851.
1398
1399 * Thuban/UI/classgen.py: Explicit imports.
1400 (ClassGenDialog.__init__): Clean up the code and add support
1401 for Quantiles.
1402 (ClassGenDialog.OnOK): Add support for Quantiles.
1403 (GenQuantilesPanel): New. Input panel for Quantiles.
1404 (ClassGenerator, CustomRamp, MonochromaticRamp, GreyRamp, RedRamp,
1405 GreenRamp, BlueRamp, HotToColdRamp): Move to Thuban/Model/classgen.py
1406
1407 * Thuban/Model/classgen.py: New. Contains all the classes named above.
1408
1409 * Thuban/UI/classifier.py: Explicit imports.
1410 (ClassTable.GetValueAsCust, ClassTable.__ParseInput,
1411 ClassTable.SetValueAsCustom): Reworked to use new Range class.
1412
1413 * Thuban/UI/legend.py: Explicit imports.
1414
1415 * Thuban/UI/mainwindow.py: Add support for the Join Dialog. Added
1416 a Table menu and associated method calls.
1417 (MainWindow.choose_color): Removed. No longer needed.
1418
1419 * Thuban/UI/projdialog.py (ProjFrame.__VerifyButtons): Save button
1420 should be disabled if no projection is selected in the available
1421 list.
1422
1423 * Thuban/UI/renderer.py: Explicit imports.
1424
1425 * Thuban/UI/tableview.py (TableGrid.OnRangeSelect): Fix some issues
1426 with correctly selecting the rows and issuing the right events.
1427 Be sure to call Skip() to allow the grid to do some of its own
1428 handling which allows the rows to actually be selected.
1429 (LayerTableGrid.select_shapes): Rename from select_shape. Supports
1430 selecting multiple shapes.
1431 (LayerTableFrame): Support for building Queries.
1432 (LayerTableFrame.select_shapes): Allow multiple shapes to be selected.
1433
1434 * Thuban/UI/tree.py: Explicit imports.
1435
1436 * Thuban/UI/view.py (MapCanvas): Delegate "SelectedShapes" so the
1437 table view can call it.
1438
1439 * test/test_classification.py: Explicit imports.
1440 (TestClassification.test_ClassGroupRange): Fix test for new
1441 Range class.
1442
1443 * Doc/thuban.dtd: Add range parameter for clrange.
1444
1445 * Thuban/Model/range.py: Taken from SciParam. Used as the underlying
1446 object in ClassGroupRange, and also uesd for inputting ranges in
1447 the classifer table and elsewhere.
1448
1449 * Thuban/UI/join.py: New. Initial Join dialog. No real functionality
1450 yet.
1451
1452 2003-05-09 Frank Koormann <[email protected]>
1453
1454 * Thuban/UI/scalebar.py (DrawScaleBar): Draw only if interval > 0.0.
1455
1456 2003-05-08 Frank Koormann <[email protected]>
1457
1458 Coding style updates
1459
1460 * test/test_scalebar.py: Replaced tab indentation by spaces.
1461
1462 * Thuban/UI/scalebar.py: Explicit imports.
1463
1464 2003-05-08 Frank Koormann <[email protected]>
1465
1466 * Thuban/UI/scalebar.py
1467 (ScaleBar.DrawScalebar): Format string bug fixed.
1468
1469 2003-05-08 Frank Koormann <[email protected]>
1470
1471 Reorganization of scalebar component (no wx in Thuban/Model)
1472
1473 * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
1474 (deriveInterval):
1475 Calculate scalebar interval and unit which fits in width for scale.
1476 (roundInterval): Round float.
1477
1478 * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
1479
1480 * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
1481
1482 * Thuban/UI/legend.py: Import Thuban.UI.scalebar
1483
1484 2003-05-08 Frank Koormann <[email protected]>
1485
1486 * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
1487 Initialize ScaleBar with canvas.map
1488
1489 * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
1490 round intervals to display smarter lengths
1491 (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
1492 layer. If the maps has no projection applied grey the scalebar.
1493
1494 2003-05-07 Frank Koormann <[email protected]>
1495
1496 Basic Scalebar features added.
1497
1498 * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
1499
1500 * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
1501 (ScaleBarBitmap): New, links the scalebar bitmap with view messages
1502 and the renderer.
1503
1504 * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
1505
1506 * Thuban/UI/messages.py: SCALE_CHANGED added.
1507
1508 2003-05-07 Bernhard Herzog <[email protected]>
1509
1510 * Thuban/Model/session.py (Session.__init__): New instance
1511 variable shapestores to hold a list of all open shapestore objects
1512 (Session.ShapeStores): New. Accessor method for the shapestores
1513 list.
1514 (Session._add_shapestore, Session._clean_weak_store_refs): New.
1515 Internal methods to maintain the shapestores list.
1516 (Session.Tables): New. Return all tables open in the session.
1517 (Session.OpenShapefile): Insert the new ShapeStore into the
1518 shapestores list.
1519
1520 * test/test_session.py (TestSessionSimple.test_initial_state): Add
1521 tests for ShapeStores and Tables
1522 (TestSessionWithContent.test_shape_stores)
1523 (TestSessionWithContent.test_tables): New. Test cases for
1524 ShapeStores and Tables
1525
1526 2003-05-07 Bernhard Herzog <[email protected]>
1527
1528 * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
1529 Add comments about the optimizations used.
1530 (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
1531 Implement the ReadValue table interface method.
1532
1533 * test/test_transientdb.py
1534 (TestTransientTable.run_iceland_political_tests)
1535 (TestTransientTable.test_transient_joined_table): Add tests for
1536 ReadValue
1537
1538 2003-05-07 Frank Koormann <[email protected]>
1539
1540 * Resources/Bitmaps/fulllayerextent.xpm,
1541 Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
1542 new icons.
1543
1544 2003-05-06 Bernhard Herzog <[email protected]>
1545
1546 * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
1547 New. Simply delegate to the transient table's version.
1548
1549 * test/test_transientdb.py
1550 (TestTransientTable.test_auto_transient_table_query): New. Test
1551 case for AutoTransientTable's SimpleQuery
1552
1553 2003-05-06 Bernhard Herzog <[email protected]>
1554
1555 * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
1556 Implement a simple query method for the query dialog
1557 (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
1558 the row index or shapeid.
1559 (TransientTable.create): Insert the right value of the row index
1560 (TransientJoinedTable.create): Copy the row index of the left
1561 table to the joined result table
1562
1563 * test/test_transientdb.py
1564 (TestTransientTable.test_transient_table_read_twice): Fix
1565 doc-string
1566 (TestTransientTable.test_transient_table_query): New. Test for the
1567 SimpleQuery method
1568
1569 2003-05-06 Bernhard Herzog <[email protected]>
1570
1571 Convert all table users to use the new table interface. This only
1572 covers Thuban itself, not GREAT-ER or other applications built on
1573 Thuban yet, so the compatibility interface stays in place for the
1574 time being but it now issues DeprecationWarnings.
1575
1576 Finally, the new Table interface has a new method, HasColumn.
1577
1578 * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
1579 issue deprecation warnings when they're. The warnings refer to the
1580 caller of the method.
1581 (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
1582 for the deprecation warnings
1583
1584 * test/test_table.py: Ignore the deprecation warnings for the old
1585 table in the tests in this module. The purpose of the tests is to
1586 test the old interface, after all.
1587
1588 * test/test_transientdb.py
1589 (TestTransientTable.run_iceland_political_tests): Use the
1590 constants for the types. Add a test for HasColumn
1591 (TestTransientTable.test_transient_joined_table): Adapt to new
1592 table interface. Add a test for HasColumn
1593 (TestTransientTable.test_transient_table_read_twice): Adapt to new
1594 table interface
1595
1596 * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
1597 Adapt to new table interface
1598
1599 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
1600 new table interface
1601
1602 * Thuban/UI/controls.py (RecordListCtrl.fill_list)
1603 (RecordTable.SetTable): Adapt to new table interface
1604
1605 * Thuban/UI/classifier.py (Classifier.__init__)
1606 (Classifier.__init__): Adapt to new table interface
1607
1608 * Thuban/UI/classgen.py (ClassGenDialog.__init__)
1609 (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
1610 to new table interface
1611
1612 * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
1613 (AutoTransientTable.HasColumn): Implement the new table interface
1614 method
1615 (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
1616 (AutoTransientTable.UniqueValues): Adapt to new table interface
1617
1618 * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
1619 Adapt to new table interface
1620
1621 * test/test_layer.py (TestLayer.open_shapefile): Helper method to
1622 simplify opening shapefiles a bit easier.
1623 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1624 (TestLayer.test_point_layer): Use the new helper method
1625 (TestLayer.test_get_field_type): New. Test for the GetFieldType
1626 method
1627
1628 * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
1629 the new table method
1630
1631 * test/test_memory_table.py (TestMemoryTable.test_has_column):
1632 Test for the new table method HasColumn
1633
1634 2003-05-06 Jonathan Coles <[email protected]>
1635
1636 Addresses the "Selection Extent" wish of RTbug #1787.
1637
1638 * Resources/Bitmaps/fulllayerextent.xpm,
1639 Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
1640 extent. These are just place holders for the real bitmaps.
1641
1642 * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
1643 calculate the bounding box once (the first time compute_bbox() is
1644 called).
1645 (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
1646 the bounding box for the shapes in lat/long coordinates.
1647
1648 * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
1649 option.
1650 (MainWindow.has_selected_shapes): New. Returns true if there are
1651 any selected shapes.
1652 (MainWindow.FullSelectionExtent): New. Calls
1653 MapCanvas.FitSelectedToWindow() when the user selects the menu option.
1654 (_has_selected_shapes): New. Returns true if there are any
1655 selected shapes.
1656
1657 * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
1658 true if there are any selected shapes.
1659
1660 * Thuban/UI/view.py (MapCanvas): Added delegated method
1661 HasSelectedShapes.
1662 (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
1663 shapes on the canvas using the map projection (if any).
1664
1665 * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
1666 for Layer.ShapesBoundingBox().
1667
1668 2003-05-06 Bernhard Herzog <[email protected]>
1669
1670 * Resources/Projections/defaults.proj: Fix spelling of Mercator
1671
1672 2003-05-05 Jonathan Coles <[email protected]>
1673
1674 Addresses the "Full Layer Extent" wish of RTbug #1787.
1675
1676 * Resources/Projections/defaults.proj: Added UK National Grid.
1677
1678 * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
1679 (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
1680 when the user selects the menu option.
1681
1682 * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
1683 scales the given layer on the canvas using the map projection.
1684
1685 2003-05-05 Bernhard Herzog <[email protected]>
1686
1687 Convert the table implementations to a new table interface. All
1688 tables use a common mixin class to provide backwards compatibility
1689 until all table users have been updated.
1690
1691 * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
1692 provide backwards compatibility for table classes implementing the
1693 new interface
1694 (DBFTable, MemoryTable): Implement the new table interface. Use
1695 OldTableInterfaceMixin as base for compatibility
1696 (DBFColumn, MemoryColumn): New. Column description for DBFTable
1697 and MemoryTable resp.
1698
1699 * test/test_dbf_table.py: New. Test cases for the DBFTable with
1700 the new table interface.
1701
1702 * test/test_memory_table.py: New. Test cases for the MemoryTable
1703 with the new table interface.
1704
1705 * test/test_table.py: Document the all tests in this file as only
1706 for backwards compatibility. The equivalent tests for the new
1707 interface are in test_memory_table.py and test_dbf_table.py
1708 (MemoryTableTest.test_read): field_info should be returning tuples
1709 with four items
1710 (MemoryTableTest.test_write): Make doc-string a more precise.
1711
1712 * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
1713 table interface. Derive from from OldTableInterfaceMixin for
1714 compatibility.
1715 (TransientTableBase.create): New intance variable column_map to
1716 map from names and indices to column objects
1717 (TransientTable.create): Use the new table interface of the input
1718 table
1719 (AutoTransientTable): Convert to new table interface. Derive from
1720 from OldTableInterfaceMixin for compatibility.
1721 (AutoTransientTable.write_record): Removed. It's not implemented
1722 yet and we still have to decide how to handle writing with the new
1723 table and data framework.
1724
1725 * test/test_transientdb.py
1726 (TestTransientTable.run_iceland_political_tests)
1727 (TestTransientTable.test_transient_joined_table): Use the new
1728 table interface
1729
1730 2003-05-05 Jonathan Coles <[email protected]>
1731
1732 This is namely a collection of UI updates to improve user interactivity.
1733 Tabbing between controls now exists and you can use ESC to close dialog
1734 boxes; ENTER will active the default button.
1735
1736 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
1737 order that the controls are created so that tabbing works correctly.
1738 (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
1739 wxDialog can handle the default button correctly.
1740 (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
1741 same reasons as for OnOK.
1742 (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
1743 when we ask the table for the maximum/minimum values of a field
1744 which could take a very long time.
1745
1746 * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
1747 order that the controls are created so that tabbing works correctly.
1748 (SelectPropertiesDialog.__init__): Rearrange the order that the
1749 controls are created so that tabbing works correctly.
1750
1751 * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
1752 to derive from a wxDialog but behave like the original implementation
1753 which was derived from a wxFrame. wxDialog provides useful key
1754 handling functionality like ESC calling OnCancel and ENTER calling
1755 OnOK which is lost with wxFrame.
1756
1757 * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
1758 new dialogs.
1759
1760 * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
1761 order that the controls are created so that tabbing works correctly.
1762 (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
1763 (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
1764 (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
1765 (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
1766 can provide the "UK National Grid" as a default projection.
1767 (UTMPanel.__init__): Rearrange the order that the controls are
1768 created so that tabbing works correctly.
1769
1770 2003-05-05 Bernhard Herzog <[email protected]>
1771
1772 * extensions/thuban/wxproj.cpp: Fix some of the comments.
1773 (project_point): If a map projection but no layer projection is
1774 given, convert degrees to radians before applying the map
1775 projection.
1776
1777 * Thuban/UI/tableview.py (TableGrid.disallow_messages)
1778 (TableGrid.allow_messages): New methods to make it possible to
1779 inhibit message sending.
1780 (TableGrid.issue): Only send the message if not inhibited.
1781 (LayerTableGrid.select_shape): Use the new methods to make sure
1782 that no ROW_SELECTED message is sent while we're updating the
1783 selected rows to match the selected shapes.
1784
1785 2003-05-02 Jan-Oliver Wagner <[email protected]>
1786
1787 Implementation of MemoryTable.
1788
1789 * Thuban/Model/table.py (MemoryTable): New. Quite simple table
1790 implementation that operates on a list of tuples. All of the data
1791 are kept in the memory.
1792
1793 * test/test_table.py (MemoryTableTest): New.
1794
1795 * test/test_transientdb.py (SimpleTable): Removed.
1796 (TestTransientTable.test_transient_joined_table,
1797 (TestTransientTable.test_transient_table_read_twice): Replaced
1798 SimpleTable by MemoryTable.
1799
1800 2003-04-30 Jonathan Coles <[email protected]>
1801
1802 * Data/iceland_sample.thuban: Now contains correct projections
1803 for each of the layers.
1804
1805 * Resources/Projections/defaults.proj: Geographic projection
1806 contains unit conversion parameter.
1807
1808 2003-04-30 Jonathan Coles <[email protected]>
1809
1810 The most important part of this putback is the projection changes.
1811 It should now be possible to specify the projection that a layer
1812 is in and then specify a different projection for the map. The
1813 projection dialog has an extra parameter for a geographic projection
1814 which lets the user select if the input is in degrees or radians.
1815
1816 * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
1817 to say that the parameter is a tuple of unprojected
1818 points (which is what the callers to this method were assuming).
1819 Also, since the points are unprojected we need to projected them.
1820
1821 * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
1822 LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
1823 groups are selected, move the layer up/down. Fixes RTbug #1833.
1824
1825 * Thuban/UI/mainwindow.py: Move menu item map_rename up.
1826
1827 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
1828 parameter in call to SetClientData.
1829 (GeoPanel): Add support for selecting the units that the
1830 source data is in (Radians or Degrees).
1831
1832 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
1833 the rendering loop by reducing the number of if's, removing the
1834 unnecessary try/except block, and checking if the old group
1835 is the same as the new one (which happens a lot if there is
1836 no classification, or lots of shapes are in the same group).
1837
1838 * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
1839 around the redraw routine to try to catch problems that the user
1840 may create by selecting invalid projections for the data set and
1841 map. Clears the display if there are any problems and prints the
1842 error.
1843 (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
1844 rectangle.
1845
1846 * extensions/thuban/wxproj.cpp (project_point): First invert the
1847 supplied point (which should be in projected coordinates) using
1848 the layer's projection and then project the point using the
1849 map's projection.
1850 (project_points): Use project_point() to project each point.
1851
1852 2003-04-30 Jan-Oliver Wagner <[email protected]>
1853
1854 * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
1855 don't set the Classification to None if the classfication field
1856 is None (ie only a DEFAULT).
1857
1858 2003-04-30 Bernhard Herzog <[email protected]>
1859
1860 * Thuban/UI/view.py: Fix some typos.
1861
1862 * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
1863 not pop up the dialog if the selection becomes empty (this could
1864 happen if e.g. a new selection is opened while the identify tool
1865 is active and dialog had been closed)
1866
1867 2003-04-30 Bernhard Herzog <[email protected]>
1868
1869 * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
1870 instance variable read_record_last_result
1871 (TransientTableBase.read_record): Make sure reading the same
1872 record twice works. The implementation uses the new instance
1873 variable read_record_last_result
1874
1875 * test/test_transientdb.py
1876 (TestTransientTable.test_transient_table_read_twice): New test
1877 case for the above bug-fix.
1878
1879 2003-04-29 Jonathan Coles <[email protected]>
1880
1881 * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
1882
1883 * Thuban/UI/classgen.py: Remove all uses of Str2Num.
1884
1885 * Thuban/UI/classifier.py: Remove all uses of Str2Num.
1886 (ClassTable.SetValueAsCustom): Rename keyword argument in
1887 ClassGroup* constructors to match argument name.
1888
1889 2003-04-29 Bernhard Herzog <[email protected]>
1890
1891 * Thuban/Model/session.py (Session.Destroy): Explicitly close the
1892 transient DB if it exists to make sure it doesn't leave a journal
1893 file in the temp directory.
1894
1895 * Thuban/Model/transientdb.py (TransientDatabase.close): Set
1896 self.conn to None after closing the connection to make sure it's
1897 not closed twice
1898
1899 2003-04-29 Jonathan Coles <[email protected]>
1900
1901 Add a visible parameter in the layer XML tag. The default value is
1902 "true". If anything other than "false" is specified we also assume
1903 "true". Addresses RTbug #1025.
1904
1905 * Doc/thuban.dtd: Add visible parameter to a layer.
1906
1907 * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
1908 of visible from 1 to True.
1909 (Layer.__init__): Change default value of visible from 1 to True.
1910
1911 * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
1912 parameter.
1913
1914 * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
1915 parameter.
1916
1917 * test/test_load.py: Add new test data contents_test_visible.
1918 (LoadSessionTest.setUp): save test data.
1919 (LoadSessionTest.testLayerVisibility): Test if the visible flag
1920 is loaded correctly.
1921
1922 * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
1923 for saving an invisible layer.
1924
1925 2003-04-29 Jonathan Coles <[email protected]>
1926
1927 * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
1928 legend dialog box and tell it to change its map to the one
1929 supplied to SetMap(). Fixes RTbug #1770.
1930
1931 2003-04-29 Bernhard Herzog <[email protected]>
1932
1933 Next step of table implementation. Introduce a transient database
1934 using SQLite that some of the data is copied to on demand. This
1935 allows us to do joins and other operations that require an index
1936 for good performance with reasonable efficiency. Thuban now needs
1937 SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
1938 haven't tested that.
1939
1940 * Thuban/Model/transientdb.py: New. Transient database
1941 implementation.
1942
1943 * test/test_transientdb.py: New. Tests for the transient DB
1944 classes.
1945
1946 * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
1947 classes to help automatically remove temporary files and
1948 directories.
1949 (Session.__init__): New instance variables temp_dir for the
1950 temporary directory and transient_db for the SQLite database
1951 (Session.temp_directory): New. Create a temporary directory if not
1952 yet done and return its name. Use AutoRemoveDir to have it
1953 automatically deleted
1954 (Session.TransientDB): Instantiate the transient database if not
1955 done yet and return it.
1956
1957 * Thuban/Model/data.py (ShapefileStore.__init__): Use an
1958 AutoTransientTable so that data is copied to the transient DB on
1959 demand.
1960 (SimpleStore): New class that simply combines a table and a
1961 shapefile
1962
1963 * Thuban/Model/table.py (Table, DBFTable): Rename Table into
1964 DBFTable and update its doc-string to reflect the fact that this
1965 is only the table interface to a DBF file. Table is now an alias
1966 for DBFTable for temporary backwards compatibility.
1967
1968 * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
1969 the last reference to the session goes away so that the temporary
1970 files are removed properly.
1971
1972 * test/test_load.py (LoadSessionTest.tearDown): Remove the
1973 reference to the session to make sure the temporary files are
1974 removed.
1975
1976 2003-04-29 Bernhard Herzog <[email protected]>
1977
1978 * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
1979 the __parser instance variable into a normal local variable in
1980 read. It's only used there and read will never be called more than
1981 once. Plus it introduces a reference cycle that keeps can keep the
1982 session object alive for a long time.
1983
1984 2003-04-29 Jonathan Coles <[email protected]>
1985
1986 * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
1987 Projection an immutable item. Fixes RTbug #1825.
1988 (Projection.__init__): Initialize instance variables here.
1989 (ProjFile.Replace): New. Replace the given projection object with
1990 the new projection object. This solves the problem of needing the
1991 mutator Projection.SetProjection() in the ProjFrame class and
1992 allows a projection to change parameters without changing its
1993 location in the file.
1994
1995 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
1996 be of type wxSAVE and should verify overwriting a file.
1997
1998 * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
1999 ProjFile.Replace() method instead of the mutator
2000 Projection.SetProjection(). Also requires that we reassign the
2001 client data to the new projection.
2002
2003 * test/test_proj.py (TestProjection.test): Test GetName() and
2004 GetAllParameters()
2005 (TestProjFile.test): Remove tests for Set*() methods. Add tests
2006 for Replace().
2007
2008 2003-04-25 Jonathan Coles <[email protected]>
2009
2010 * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
2011 to save the name of the projection.
2012
2013 * test/test_save.py (SaveSessionTest.testLayerProjection): New
2014 test to verify layer projections are saved correctly.
2015
2016 2003-04-25 Jonathan Coles <[email protected]>
2017
2018 * Thuban/Model/proj.py (Projection.SetName): Set the name
2019 to "Unknown" if name is None.
2020 (Projection.SetAllParameters): New. Set the projection's
2021 parameter list to the one supplied.
2022 (Projection.SetProjection): New. Set the projection's
2023 properties to those of the supplied Projection.
2024
2025 * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
2026 the dialog title to include the map's title.
2027 (MainWindow.LayerProjection): Set the dialog title to include
2028 the layer's title.
2029
2030 * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
2031 error dialogs into a single method call.
2032 (ProjFrame.__VerifyButtons): Add more states to check.
2033 (ProjFrame.__GetProjection): Return the current state of an
2034 edited projection or None.
2035 (ProjFrame.__FillAvailList): Remove checks for states that
2036 shouldn't exist.
2037 (ProjFrame._OnNew): Clear all selected items and supply
2038 a projection panel if necessary.
2039
2040 * test/test_proj.py (TestProjFile.test): Add tests for
2041 ProjFile.SetAllParameters, ProjFile.SetProjection,
2042 ProjFile.SetName.
2043
2044 2003-04-25 Jonathan Coles <[email protected]>
2045
2046 * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
2047 takes an optional argument to select the current projection.
2048 This does not guarantee that the item is visible due to
2049 limited wxWindows functionality. Fixes RTBug #1821.
2050
2051 2003-04-25 Jonathan Coles <[email protected]>
2052
2053 * Thuban/Model/load.py (SessionLoader.start_projection): Remember
2054 the projection name and use it when constructing the Projection
2055 object.
2056
2057 * Thuban/Model/proj.py (Projection.__init__): Change the default
2058 value for 'name' to None and then test if name is equal to None
2059 in the body of the constructor. This way the caller doesn't have to
2060 know what the default value should be. Namely, useful in load.py
2061 where we have to pick a default value if the 'name' parameter
2062 doesn't exist in the XML file.
2063
2064 * test/test_load.py (LoadSessionTest.testLayerProjection): New.
2065 Tests a file where a layer has a projection.
2066
2067 2003-04-25 Jonathan Coles <[email protected]>
2068
2069 * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
2070 tree for projection information.
2071
2072 * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
2073 XMLReader.GetFileName.
2074 (SessionLoader): Added support for loading projection tags that
2075 appear inside a layer.
2076
2077 * Thuban/Model/proj.py (ProjFile): Document the class. Move
2078 back to using a list because the order of the projections in
2079 the file is important to maintain. Fixes RTbug #1817.
2080
2081 * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
2082 to ProjFile.GetFilename.
2083
2084 * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
2085 information.
2086
2087 * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
2088 ProjFrame._OnSaveAs. Removed old dead code from previous
2089 implementation.
2090 (ProjFrame._OnExport): Add support for exporting more than one
2091 projection to a single file.
2092 (ProjFrame.__FillAvailList): use string formatting (% operator)
2093 to build strings that are (partly) translated. Fixes RTbug #1818.
2094
2095 * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
2096 class.
2097
2098 2003-04-24 Bernhard Herzog <[email protected]>
2099
2100 * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
2101
2102 * po/fr.po: New. French translation by Daniel Calvelo Aros
2103
2104 * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
2105 empty strings.
2106
2107 2003-04-24 Jonathan Coles <[email protected]>
2108
2109 * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
2110 implement the interface that the ProjFrame dialog expects.
2111
2112 * Thuban/Model/proj.py (Projection.SetName): New. Allows the
2113 name of the projection to be changed.
2114 (ProjFile): Use a dictionary instead of a list so that removing
2115 projections is easier and we are sure about uniqueness.
2116 (ProjFile.Remove): Remove the given projection object.
2117
2118 * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
2119 Return a list with only one projection file instead of searching for
2120 any projection file. This simplifies many things if the user can
2121 only have one system file and one user file.
2122
2123 * Thuban/UI/classgen.py: Change all references to
2124 genCombo to genChoice.
2125
2126 * Thuban/UI/mainwindow.py: Add a Projection option under the
2127 layer menu.
2128 (MainWindow.LayerProjection): New. Open up a projection window
2129 for a layer.
2130
2131 * Thuban/UI/projdialog.py: Large changes to how the dialog is
2132 laid out. Use three panels instead of one. One for the list of
2133 projections, one for the edit controls, and one for the buttons.
2134 Fixed resizing problems so that the dialog resizes correctly
2135 when the projection panel changes. Added import/export, save, and
2136 new buttons/functionality.
2137
2138 2003-04-24 Bernhard Herzog <[email protected]>
2139
2140 First step towards table management. Introduce a simple data
2141 abstraction so that we replace the data a layer uses more easily
2142 in the next step.
2143
2144 * Thuban/Model/data.py: New file with a simple data abstraction
2145 that bundles shapefile and dbffile into one object.
2146
2147 * Thuban/Model/session.py (Session.OpenShapefile): New method to
2148 open shapefiles and return a shape store object
2149
2150 * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
2151 object instead of a shapefile filename. This introduces a new
2152 instance variable store holding the datastore. For intermediate
2153 backwards compatibility keep the old instance variables.
2154 (open_shapefile): Removed. No longer needed with the shape store.
2155 (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
2156 get the shape store used by a layer.
2157 (Layer.Destroy): No need to explicitly destroy the shapefile or
2158 table anymore.
2159
2160 * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
2161 (MainWindow.AddLayer): Use the session's OpenShapefile method to
2162 open shapefiles
2163
2164 * Thuban/Model/load.py (ProcessSession.start_layer): Use the
2165 session's OpenShapefile method to open shapefiles
2166
2167 * test/test_classification.py
2168 (TestClassification.test_classification): Use the session's
2169 OpenShapefile method to open shapefiles and build the filename in
2170 a more platform independed way
2171
2172 * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
2173 Implement to have a session to use in the tests
2174 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2175 (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
2176 session's OpenShapefile method to open shapefiles
2177 (TestLayerLegend.setUp): Instantiate a session so that we can use
2178 it to open shapefiles.
2179 (TestLayerLegend.tearDown): Make sure that all references to
2180 layers and session are removed otherwise we may get a resource
2181 leak
2182
2183 * test/test_map.py (TestMapAddLayer.test_add_layer)
2184 (TestMapWithContents.setUp): Instantiate a session so that we can
2185 use it to open shapefiles.
2186 (TestMapWithContents.tearDown): Make sure that all references to
2187 layers, maps and sessions are removed otherwise we may get a
2188 resource leak
2189 ("__main__"): use support.run_tests() so that more info about
2190 uncollected garbage is printed
2191
2192 * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
2193 session's OpenShapefile method to open shapefiles
2194 ("__main__"): use support.run_tests() so that more info about
2195 uncollected garbage is printed
2196
2197 * test/test_selection.py (TestSelection.tearDown): Make sure that
2198 all references to the session and the selection are removed
2199 otherwise we may get a resource leak
2200 (TestSelection.get_layer): Instantiate a session so that we can
2201 use it to open shapefiles.
2202 ("__main__"): use support.run_tests() so that more info about
2203 uncollected garbage is printed
2204
2205 * test/test_session.py (TestSessionBase.tearDown)
2206 (TestSessionWithContent.tearDown): Make sure that all references
2207 to the session and layers are removed otherwise we may get a
2208 resource leak
2209 (TestSessionWithContent.setUp): Use the session's OpenShapefile
2210 method to open shapefiles
2211
2212 2003-04-24 Jonathan Coles <[email protected]>
2213
2214 * Thuban/Model/load.py (XMLReader.read): Should have been checking
2215 if the file_or_filename object had the 'read' attribute.
2216
2217 2003-04-23 Jonathan Coles <[email protected]>
2218
2219 * Thuban/Model/resource.py: Fixes RTbug #1813.
2220 (ReadProjFile): Add documentation about which exceptions are raised.
2221 Always pass the exceptions up to the caller.
2222 (GetProjFiles): If the directory can't be read return an empty list.
2223 If any of the proj files can't be read skip that file and go
2224 on to the next one.
2225
2226 * test/test_proj.py: Added test cases to handle nonexistent files,
2227 unreadable files, and files that don't parse correctly.
2228
2229 2003-04-23 Jonathan Coles <[email protected]>
2230
2231 Projection dialog. Allows the user to select from a list
2232 of projection templates and optionally edit them and save new ones.
2233
2234 * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
2235 (ProjPanel): Base class for projection specific panels.
2236 (TMPanel): Projection panel for Transverse Mercartor.
2237 (UTMPanel): Projection panel for Universal Transverse Mercartor.
2238 (LCCPanel): Projection panel for Lambert Conic Conformal.
2239 (GeoPanel): Projetion panel for Geographic Projection.
2240
2241 2003-04-23 Jonathan Coles <[email protected]>
2242
2243 * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
2244 promote symmetry. There now exists XMLReader and XMLWriter.
2245 (XMLReader.read): New. Call to read the given file descriptor or
2246 filename.
2247 (XMLReader.close): New. Make sure the file is closed.
2248 (XMLReader.GetFileName): New. Return just the file name that is being
2249 read from.
2250 (XMLReader.GetDirectory): New. Return just the directory of the file
2251 that is being read.
2252 (XMLReader.AddDispatchers): New. Take a dictionary which contains
2253 the names of functions to call as the XML tree is parsed.
2254 (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
2255 (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
2256 (SessionLoader): Removed class variables start_dispatcher and
2257 end_dispatcher since this functionality is now part of a class
2258 instance. Fixes RTbug #1808.
2259 (SessionLoader.__init__): Add dispatcher functions.
2260 (load_xmlfile): Code was moved into the XMLReader.read().
2261 (load_session): Use modified SessionLoader.
2262
2263 * Thuban/Model/map.py (Map.GetProjection): New. Returns the
2264 map's projection.
2265
2266 * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
2267 GetAllParameters.
2268 (Projection.GetParameter): Returns the value for the given parameter.
2269
2270 * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
2271 (GetProjFiles): Renamed from GetProjections. Now returns a list
2272 of ProjFile objects.
2273 (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
2274 a list of ProjFile objects whose files are not user defined.
2275 (GetUserProjFiles): Renamed from GetUserProjections. Returns a
2276 list of ProjFile objects whose files are user defined.
2277 (ProjFileReader): Extend new XMLReader.
2278
2279 * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
2280 promote symmetry.
2281
2282 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
2283 control instead of a wxComboBox. wxChoice controls do not generate
2284 events as the uses highlights possible choices which fixes problems
2285 with resizing the dialog when the use selects an option.
2286
2287 * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
2288 control instead of a wxComboBox.
2289
2290 * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
2291 dialog.
2292
2293 * test/test_proj.py (TestProjection.test): New tests for GetParameter
2294 method.
2295
2296 2003-04-22 Bernhard Herzog <[email protected]>
2297
2298 * Thuban/UI/mainwindow.py: Remove some unused imports and global
2299 constants
2300
2301 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
2302 (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
2303
2304 2003-04-17 Bernhard Herzog <[email protected]>
2305
2306 * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
2307 (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
2308 anymore.
2309 (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
2310 (Layer.ShapeType, Layer.Shape): No need to call
2311 self.open_shapefile since it's always called in __init__
2312
2313 * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
2314 In wxPython 2.4 there's no need to extend MainLoop anymore since
2315 wxPython itself makes sure OnExit is called.
2316
2317 2003-04-16 Jonathan Coles <[email protected]>
2318
2319 Initial putback of projection management code. Includes new
2320 classes to read and write projection files. The current load
2321 and save classes were abstracted a bit so they could be reused.
2322 The Projection class was extended to provide new methods and
2323 have a name.
2324
2325 * Thuban/Model/load.py (XMLProcessor): New. Contains all the
2326 general XML reading methods that were part of ProcessSession.
2327
2328 * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
2329 name.
2330 (ProjFile): New. Represents a file that contains projection
2331 information.
2332
2333 * Thuban/Model/resource.py: New. Contains general utilities
2334 for read and writing projection files.
2335
2336 * Thuban/Model/save.py (XMLSaver): New. Contains all the
2337 general XML writing methods that were part of SessionSaver.
2338 (SessionSaver): Renamed from Saver.
2339
2340 * test/test_proj.py: New test cases for the projection
2341 file read and write functions.
2342
2343 2003-04-16 Jonathan Coles <[email protected]>
2344
2345 * Thuban/Model/classification.py: Use repr() around values
2346 in the ClassGroup*.__repr__() methods so it is clearer when
2347 a value is a string and when it is a number.
2348
2349 * test/test_load.py: Rework the classification test to test
2350 that we can load old files.
2351 (testLabels): Test a file where the groups have labels.
2352
2353 2003-04-16 Bernhard Herzog <[email protected]>
2354
2355 Safer implementation of the performance enhancements of the
2356 low-level renderer:
2357
2358 * extensions/thuban/wxproj.cpp (extract_projection)
2359 (extract_pointer): Rename extract_projection to extract_pointer
2360 and redefine its purpose to return the pointer stored in a CObject
2361 returned by the object's cobject method. Update all callers.
2362 (s_draw_info, free_draw_info, draw_polygon_init): Implement the
2363 handling of these low-level parameters so that each s_draw_info
2364 instance is handled as a CObject at python level that also
2365 contains real references to the actual python objects which
2366 contain the values in the struct. Add free_draw_info as the
2367 destructor.
2368 (draw_polygon_shape): Add the py_draw_info parameter which must a
2369 cobject containing an s_draw_info pointer.
2370
2371 * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
2372 method to instantiat the low-level render parameter
2373 (MapRenderer.draw_shape_layer): Use the new method. Remove some
2374 commented out code.
2375 (MapRenderer.draw_polygon_shape): Make the first parameter not the
2376 layer but the low-level render parameter
2377 (ScreenRenderer.draw_shape_layer): Use the low-level render
2378 parameter.
2379
2380 2003-04-15 Jonathan Coles <[email protected]>
2381
2382 * Thuban/Model/classification.py: Implemented __repr__ for
2383 the ClassGroup* classes to make debugging a bit easier.
2384 (ClassGroup.SetLabel): Check that the string is an instance
2385 of StringTypes not StringType. Accounts for Unicode strings.
2386
2387 * Thuban/Model/color.py: Implemented __repr__ to make
2388 debugging a bit easier.
2389
2390 * Thuban/Model/save.py (Saver.write_classification): Need to
2391 save the group label.
2392
2393 * test/test_load.py (testClassification): New. Loads the
2394 iceland_sample_test.thuban file and checks if it was loaded
2395 correctly.
2396
2397 2003-04-15 Jonathan Coles <[email protected]>
2398
2399 * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
2400 to improve rendering performance by initializing the variables
2401 that are not change each time draw_polygon_shape() is called.
2402 The values are stored in a global struct draw_info.
2403 (draw_polygon_shape): Removed initialization code that is
2404 now in draw_polygon_init().
2405
2406 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
2407 drawing initialization call to draw_polygon_init()
2408 (MapRenderer.draw_polygon_shape): Use new signature of
2409 draw_polygon_shape.
2410
2411 * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
2412 weirdness by setting the range to (1, maxint).
2413
2414 * Thuban/Model/classification.py (ClassGroupProperties): Make
2415 instance variables private and optimize comparison operator
2416 by first checking if the color references are the same.
2417 (ClassGroupSingleton): Make instance variables private.
2418 (ClassGroupRange): Make instance variables private.
2419
2420 * HOWTO-Release: Filled in missing steps for releasing packages.
2421
2422 2003-04-15 Bernhard Herzog <[email protected]>
2423
2424 First stab at internationalized messages:
2425
2426 * Thuban/__init__.py (_): Implement the translation function for
2427 real using the python gettext module.
2428
2429 * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
2430 translate empty strings.
2431
2432 * Thuban/UI/application.py (ThubanApplication.read_startup_files):
2433 Add a missing space to a warning message
2434
2435 * po/README: New. Notes about the management of the translation
2436 files.
2437
2438 * po/Makefile: New. Makefile to help manage the translation files.
2439
2440 * po/es.po: New. Spanish translation by Daniel Calvelo Aros
2441
2442 * MANIFEST.in: Include the *.mo files in Resources/Locale and the
2443 translations and support files in po/
2444
2445 * setup.py (data_files): Add the *.mo files to the data_files too
2446
2447 * README: Add note about the translations when building from CVS
2448
2449 2003-04-14 Jonathan Coles <[email protected]>
2450
2451 * Thuban/UI/dock.py: Fixes some window resizing problems most
2452 noticable under windows. Always assume the button bitmaps will
2453 be there. Code clean up.
2454 (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
2455 images for the dock/undock button to the same images.
2456 Work around for RTbug #1801.
2457
2458 * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
2459 be allowed to grow within the sizer. Fixes a bug under Windows
2460 where the toolbar wasn't being drawn.
2461
2462 2003-04-14 Frank Koormann <[email protected]>
2463
2464 * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
2465 Updated design to try to make the button functionality more
2466 transparent.
2467
2468 2003-04-14 Jonathan Coles <[email protected]>
2469
2470 * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
2471 finalize the intialization of the panel.
2472
2473 * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
2474 creation of the panel. Should be the last thing called in the
2475 initializer of a subclass.
2476
2477 * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
2478 set the current selections in the combo boxes. This is needed
2479 under Windows.
2480
2481 * Thuban/UI/classifier.py (Classifier.__init__): Add a top
2482 level panel to the dialog so that the background colors are
2483 consistent under Windows.
2484
2485 2003-04-11 Jonathan Coles <[email protected]>
2486
2487 * Thuban/UI/classgen.py: Change color ramps to start at white
2488 not black.
2489
2490 * Thuban/UI/legend.py: Enable/disable the legend buttons when
2491 the legend changes. Fixes RTbug #1793.
2492
2493 * test/test_classification.py: Added test for copying of
2494 classifications.
2495
2496 2003-04-11 Jonathan Coles <[email protected]>
2497
2498 * Thuban/UI/resource.py: New. Centralize the loading of resources
2499 such as bitmaps.
2500
2501 * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
2502 added images to the move buttons, added 'reverse' button.
2503 (CustomRampPanel.__init__): Added images to the move buttons.
2504 (GreyRamp): New. Generates a ramp from white to black.
2505 (HotToColdRamp): New. Generates a ramp from cold to hot colors.
2506
2507 * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
2508 ID_PROPERTY_*.
2509 (Classifier.__init__): Minor changes to the layout.
2510 (Classifier._OnTitleChanged): Listen for when the user edits the
2511 title and update the dialog's title and the layer's title.
2512
2513 * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
2514
2515 * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
2516 (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
2517 if the layer's title changes.
2518
2519 * Thuban/UI/mainwindow.py: Added new menu item and associated code
2520 to open a dialog to rename the map.
2521 (MainWindow): Use new resource class to import bitmaps.
2522
2523 2003-04-11 Jonathan Coles <[email protected]>
2524
2525 * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
2526 Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
2527 Resources/Bitmaps/group_use_none.xpm,
2528 Resources/Bitmaps/group_use_not.xpm,
2529 Resources/Bitmaps/hide_layer.xpm,
2530 Resources/Bitmaps/layer_properties.xpm,
2531 Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
2532 Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
2533 New.
2534
2535 2003-04-10 Jonathan Coles <[email protected]>
2536
2537 * Thuban/Model/classification.py: (ClassGroupRange.__init__):
2538 Should pass group to ClassGroup constructor.
2539
2540 2003-04-10 Jonathan Coles <[email protected]>
2541
2542 * Thuban/Model/classification.py: (ClassGroup): Move all the common
2543 methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
2544 here. Implement SetVisible(), IsVisible().
2545 (ClassGroup.__init__): Add group parameter which acts as a copy
2546 constructor.
2547
2548 * Thuban/UI/classifier.py (ClassTable): Add a new column for the
2549 "Visible" check boxes.
2550 (Classifier): Rename the buttons and refactor the code to match
2551 the new labels.
2552
2553 * Thuban/UI/legend.py: Classify button is now called "Properties".
2554 Refactored the code to change variable names.
2555 (LegendTree.__FillTreeLayer): Only list a group if it is visible.
2556
2557 * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
2558 MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
2559 renamed to MainWindow.LayerEditProperties.
2560 (MainWindow.ToggleLegend): Don't include map name in legend title.
2561 (MainWindow.SetMap): Added the map name to the window title.
2562 (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
2563 MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
2564 Functionality is found in the layer properties dialog.
2565
2566 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
2567 draw visible groups.
2568
2569 2003-04-09 Jonathan Coles <[email protected]>
2570
2571 * Thuban/UI/classgen.py: Modifications to allow simple
2572 addition and selection of new color schemes.
2573 (MonochromaticRamp): New. Generates a ramp between two colors.
2574 (RedRamp): New. Generates a ramp of all red.
2575 (GreenRamp): New. Generates a ramp of all green.
2576 (BlueRamp): New. Generates a ramp of all blue.
2577
2578 2003-04-09 Jonathan Coles <[email protected]>
2579
2580 * Thuban/Model/classification.py (Classification.__deepcopy__):
2581 Need to copy over field and fieldType attributes.
2582
2583 * Thuban/Model/table.py (Table.field_range): New. Retrive the
2584 maximum and minimum values over the entire table for a given
2585 field.
2586 (Table.GetUniqueValues): New. Retrieve all the unique values
2587 in the table for a given field.
2588
2589 * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
2590 (GenUniquePanel): New. Controls to allow the user to select
2591 which unique field values they would like in the classification.
2592 (CustomRampPanel): Code that was in ClassGenDialog that allows
2593 the user to select the properties for a custom ramp.
2594 (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
2595
2596 * Thuban/UI/classifier.py: Removed a lot of debugging code.
2597 (Classifier._SetClassification): Callback method so that the
2598 class generator can set the classification in the grid.
2599 (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
2600 editing of a group properties class into a wxWindows control.
2601
2602 * Thuban/UI/dock.py: It was decided that if the user closes
2603 a dockable window the window should simply hide itself. That
2604 way if the user wants to show the dock again it appears in the
2605 same place as it was when it was closed.
2606 (DockableWindow.Destroy): Call renamed method OnDockDestroy().
2607 (DockableWindow._OnButtonClose): Hide the window instead of
2608 destroying it.
2609 (DockableWindow._OnClose): Hide the window instead of
2610 destroying it.
2611
2612 * Thuban/UI/legend.py (LegendTree): Use a private method to
2613 consistently set the font and style of the text. Fixes RTbug #1786.
2614
2615 * Thuban/UI/mainwindow.py: Import just the Classifier class.
2616
2617 2003-04-07 Bernhard Herzog <[email protected]>
2618
2619 * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
2620 to the map module
2621
2622 2003-04-07 Bernhard Herzog <[email protected]>
2623
2624 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
2625 favor of ToggleSessionTree
2626 (MainWindow.ToggleSessionTree): New method to toggle visibility of
2627 the session tree.
2628 (MainWindow.SessionTreeShown): New method to return whether the
2629 session tree is currently shown.
2630 (MainWindow.ToggleLegend): New method to toggle visibility of the
2631 legend
2632 (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
2633 LegendShown
2634 (MainWindow.LegendShown): New method to return whether the legend
2635 is currently shown.
2636 (_method_command): Add checked parameter so we can define check
2637 menu items
2638 (_has_tree_window_shown, _has_legend_shown): Use the appropriate
2639 mainwindow methods.
2640 (show_session_tree, show_legend commands): Removed.
2641 (toggle_session_tree, toggle_legend commands): New commands to
2642 toggle the visibility of the dialogs
2643
2644 2003-04-07 Jonathan Coles <[email protected]>
2645
2646 * Thuban/UI/classgen.py: Fix Windows problem.
2647
2648 * Thuban/UI/dock.py: Fix Windows problem.
2649
2650 * Thuban/UI/mainwindow.py: Use False instead of false.
2651 (MainWindow.ShowLegend): Remove unnecessary switch parameter.
2652
2653 2003-04-07 Jonathan Coles <[email protected]>
2654
2655 Since we now say that the order of the groups in a classification
2656 matters, it makes sense to be able to manipulate that order. Most
2657 of the changes to Thuban/Model/classification.py are to that end.
2658
2659 * Thuban/Model/classification.py (Classification.AppendGroup,
2660 Classification.InsertGroup, Classification.ReplaceGroup,
2661 Classification.RemoveGroup, Classification.GetGroup): Do as the
2662 names imply.
2663 (Classification.FindGroup): This was called GetGroup, but GetGroup
2664 takes an index, while FindGroup takes a value.
2665 (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
2666 REFERENCE. Currently there is a cyclic reference between the layer
2667 and its classification. If the classification doesn't need to know
2668 its owning layer we can change this, since it may make sense to be
2669 able to use the same classification with different layers.
2670
2671 * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
2672
2673 * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
2674 not AddGroup()
2675
2676 * Thuban/UI/classifier.py: Now that we can depend on the order in
2677 a Classification and have methods to manipulate that order we don't
2678 need to use our own data structures in the grid. We can simply make
2679 the grid/table access the information they need from a copy of
2680 the classification object.
2681 (Classifier._OnCloseBtn): Event handler for when the user clicks
2682 'Close'. This is needed so if the user applies changes and then
2683 continues to change the table the user has the option of discarding
2684 the most recent changes and keeping what they applied.
2685
2686 * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
2687 into the same group.
2688
2689 * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
2690 with a really old version of proj, PJ_VERSION won't even be defined.
2691 If it isn't defined then just compile so that the function always
2692 returns Py_False.
2693
2694 * test/test_classification.py: Fix tests to use the renamed methods.
2695 Still need to write tests for the new methods.
2696
2697 2003-04-04 Jonathan Coles <[email protected]>
2698
2699 * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
2700 call to SetSelection out of the method and before the call
2701 to __SelectField in __init__. This prevents a recursion of events
2702 when _OnFieldSelect is triggered by the user.
2703
2704 2003-04-04 Jonathan Coles <[email protected]>
2705
2706 * Thuban/Model/classification.py: Rename Color.None to
2707 Color.Transparent.
2708 (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
2709 Don't bother copying the color, since Colors are immutable.
2710
2711 * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
2712 Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
2713 Thuban/UI/renderer.py, Thuban/UI/view.py:
2714 Rename Color.None to Color.Transparent.
2715
2716 * test/test_classification.py, test/test_load.py: Rename Color.None
2717 to Color.Transparent.
2718
2719 2003-04-04 Jonathan Coles <[email protected]>
2720
2721 * Thuban/Model/classification.py: Fix assert calls.
2722 (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
2723 Copy the color parameter rather than hold onto a reference.
2724
2725 * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
2726 the color object.
2727 (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
2728 are sure there exists only one refernce to Color.None in the system.
2729 This allows us to use 'is' rather than the comparision functions.
2730
2731 * Thuban/Model/save.py: Fix assert calls.
2732
2733 * Thuban/UI/classifier.py: Fix assert calls.
2734 (ClassGrid._OnCellDClick): Call up to the classifier to open the
2735 dialog to edit the groups properties.
2736 (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
2737 correctly if a cell is resized.
2738 (ClassTable.SetClassification): New. Changes the classification
2739 that is in the table.
2740 (ClassTable.__SetRow): Allow groups to be prepended.
2741 (Classifier): New code for opening the EditProperties and
2742 GenerateRanges dialogs.
2743 (SelectPropertiesDialog.__GetColor): Only set the color in the
2744 color dialog if the current color is not None.
2745
2746 * Thuban/UI/dock.py: Fix assert calls.
2747
2748 * Thuban/UI/legend.py: Fix assert calls.
2749
2750 * Thuban/UI/renderer.py: Fix assert calls.
2751
2752 * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
2753 classifications.
2754 (GenRangePanel): Panel specific to range generation.
2755 (GenSingletonPanel): Panel specific to singleton generation.
2756 (ClassGenerator): Class responsible for actually generating
2757 the classification from the data gathered in the dialog box.
2758 (PropertyRamp): Generates properties whose values range from
2759 a starting property to an ending property.
2760
2761 2003-04-03 Bernhard Herzog <[email protected]>
2762
2763 * test/support.py (print_garbage_information): New function that
2764 prints information about still connected messages and memory
2765 leaks.
2766 (run_suite): Removed.
2767 (run_tests): New function for use as a replacement of
2768 unittest.main in the test_* files. This one calls
2769 print_garbage_information at the end.
2770
2771 * test/runtests.py (main): Use support.print_garbage_information
2772
2773 * test/test_layer.py: Use support.run_tests instead of
2774 unittest.main so we get memory leak information
2775 (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
2776 (TestLayer.test_point_layer, TestLayer.test_empty_layer)
2777 (TestLayerLegend.test_visibility): Call the layer's Destroy method
2778 to fix a memory leak.
2779
2780 * test/test_classification.py: Use support.run_tests instead of
2781 unittest.main so we get memory leak information
2782 (TestClassification.test_classification): Call the layer's Destroy
2783 method to fix a memory leak.
2784
2785 2003-04-02 Bernhard Herzog <[email protected]>
2786
2787 * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
2788 Handle the reference counts of the return value and errors in
2789 PyArg_ParseTuple correctly.
2790
2791 * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
2792 sure the filename is absolute to avoid problems when saving the
2793 session again
2794
2795 * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
2796
2797 2003-04-01 Jonathan Coles <[email protected]>
2798
2799 * Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
2800 that there actually are points in the returned list of points
2801 before trying to index into the list. The list may be empty if
2802 the shape is a Null Shape.
2803
2804 2003-04-01 Bernhard Herzog <[email protected]>
2805
2806 * test/test_map.py: Don't use from <module> import *
2807
2808 2003-04-01 Jonathan Coles <[email protected]>
2809
2810 * Thuban/Model/session.py: Use LAYER_CHANGED instead of
2811 LAYER_LEGEND_CHANGED
2812
2813 * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
2814 self.Destroy() to close the window after yesterday's changes.
2815
2816 * test/test_map.py, test/test_session.py: Fix messages that
2817 are sent from maps and layers.
2818
2819 2003-03-31 Jonathan Coles <[email protected]>
2820
2821 * Thuban/UI/classifier.py: Commented out some debugging statements.
2822 (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
2823 RTbug #1769.
2824
2825 * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
2826 position (although position doesn't work yet under GTK).
2827 (DockableWindow.Destroy): New. Called when the window must be
2828 closed. Namely needed when the DockFrame closes and must close
2829 its children.
2830 (DockFrame): Listen for EVT_CLOSE and destroy all children.
2831
2832 * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
2833 when then window is told to close.
2834 (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
2835 comment in source for more info.
2836
2837 * Thuban/UI/main.py: Show the legend by default when Thuban starts.
2838
2839 * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
2840 symmetry with other such methods.
2841 (MainWindow.ShowLegend): Show the legend docked by default.
2842
2843 2003-03-28 Jonathan Coles <[email protected]>
2844
2845 * Thuban/UI/classifier.py: Support for highlighting a specific
2846 group within the grid when the classification dialog is opened.
2847 Also contains a lot of debugging printouts which will later
2848 be removed.
2849
2850 * Thuban/UI/dock.py: Complete rework on the dock code so that
2851 that it is fairly removed from the rest of the Thuban application.
2852 It is easy to add new docks which the rest of the program having
2853 to be aware of them.
2854
2855 * Thuban/UI/legend.py: Modifications to support selecting a
2856 specific group in the classification dialog. Changed how layers
2857 are drawn when the layer is visible/invisible.
2858
2859 * Thuban/UI/mainwindow.py: Removed legend specific code and
2860 replaced it with calls to the new dock code.
2861
2862 * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
2863 to check if scale > 0. Trying to track down a divide by zero.
2864
2865 2003-03-26 Jonathan Coles <[email protected]>
2866
2867 * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
2868 (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
2869 now part of DockableWindow.
2870 (LegendPanel.DoOnSelChanged): Select the current layer in the
2871 map.
2872 (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
2873 with the selected layer and/or group.
2874
2875 2003-03-26 Jonathan Coles <[email protected]>
2876
2877 This putback contains the code for dockable windows. There is
2878 no support in wxWindows as of this date for windows that can
2879 attach themselves to other windows.
2880
2881 The current model contains a DockableWindow which has a parent
2882 window for when it is detached and a dock window that it puts
2883 its contents in when it is docked. The contents of a DockableWindow
2884 must be a DockPanel. DockPanel itself derives from wxPanel.
2885
2886 * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
2887 message, not a LAYER_LEGEND_CHANGED message.
2888
2889 * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
2890
2891 * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
2892 as one of the style properties for the fieldTypeText item to
2893 be sure that its size is correct when the text changes.
2894
2895 * Thuban/UI/dock.py: New. Classes for the DockPanel and
2896 DockableWindow.
2897
2898 * Thuban/UI/legend.py: Added some more buttons and made the
2899 LegendPanel a DockPanel.
2900
2901 * Thuban/UI/mainwindow.py: Added sash windows to the main window
2902 and supporting functions for manipulating the sashes.
2903 (MainWindow.ShowLegend): Create a DockableWindow with the
2904 LegendPanel as the contents.
2905
2906 * Thuban/UI/messages.py: Added DOCKABLE_* messages
2907
2908 * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
2909 not LAYER_LEGEND_CHANGED, messages.
2910
2911 2003-03-25 Jonathan Coles <[email protected]>
2912
2913 * setup.py: Added custom script bdist_rpm_build_script so that
2914 when the rpm is built the path to wx-config is correct.
2915
2916 * setup.cfg: Added line saying to use the custom build script
2917
2918 2003-03-20 Jonathan Coles <[email protected]>
2919
2920 Initial implementation of the Legend.
2921
2922 * Thuban/UI/legend.py: New. Creates a window that shows the map's
2923 Legend information and allows the user to add/modify classifications
2924 and how the layers are drawn on the map.
2925
2926 * setup.py: New command 'build_docs' which currently uses
2927 happydoc to generate html documentation for Thuban.
2928
2929 * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
2930 Returns a string which is appropriately describes the group.
2931
2932 * Thuban/Model/layer.py (Layer.SetClassification): Generate a
2933 LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
2934
2935 * Thuban/Model/map.py (Map): Rename messages and use new, more
2936 specific, messages.
2937
2938 * Thuban/Model/messages.py: New message to indicate that a layer's
2939 data has changed (LAYER_CHANGED). New map messages to indicate
2940 when layers have been added/removed/changed or if the stacking order
2941 of the layers has changed.
2942
2943 * Thuban/Model/session.py: Rename and use new messages.
2944
2945 * Thuban/UI/classifier.py: Remember if any changes have actually
2946 been applied so that if the dialog is cancelled without an application
2947 of changes we don't have to set a new classification.
2948 (ClassDataPreviewer): Pulled out the window specific code and put it
2949 ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
2950 symbols on any DC.
2951
2952 * Thuban/UI/mainwindow.py: New code to open the legend.
2953
2954 * Thuban/UI/view.py: Use new message names.
2955
2956 2003-03-19 Jonathan Coles <[email protected]>
2957
2958 * Thuban/UI/main.py (verify_versions): New. Checks the versions
2959 of Python, wxPython, and some other libraries.
2960
2961 * extensions/thuban/wxproj.cpp (check_version): Checks the given
2962 version against what wxproj was compiled with.
2963 (check_version_gtk): If wxproj was compiled with gtk then check
2964 the given version against the version of the gtk library
2965 currently being used.
2966
2967 2003-03-14 Bernhard Herzog <[email protected]>
2968
2969 * test/test_command.py: Run the tests when the module is run as a
2970 script
2971
2972 2003-03-14 Bernhard Herzog <[email protected]>
2973
2974 Implement selection of multiple selected shapes in the same layer:
2975
2976 - Introduce a new class to hold the selection. This basically
2977 replaces the interactor which was nothing more than the
2978 selection anyway. A major difference is of course that the new
2979 selection class supports multiple selected shapes in one layer
2980
2981 - Move the object that represents the selection from the
2982 application to the canvas. The canvas is a better place than the
2983 application because the selection represents which shapes and
2984 layer of the map displayed by the canvas are selected and
2985 affects how the map is drawn.
2986
2987 - Make the selection and its messages publicly available through
2988 the mainwindow.
2989
2990 - The non-modal dialogs do not get a reference to the interactor
2991 anymore as they can simply refer to their parent, the
2992 mainwindow, for the what the interactor had to offer.
2993
2994 * Thuban/UI/selection.py: New module with a class to represent the
2995 selection.
2996
2997 * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
2998 these unused messages
2999
3000 * Thuban/UI/application.py (ThubanApplication.OnInit)
3001 (ThubanApplication.OnExit, ThubanApplication.SetSession): The
3002 interactor is gone now.
3003 (ThubanApplication.CreateMainWindow): There is no interactor
3004 anymore so we pass None as the interactor argument for now for
3005 compatibility.
3006
3007 * Thuban/UI/view.py (MapCanvas.delegated_messages)
3008 (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
3009 Unsubscribe, delegate messages according to the delegated_messages
3010 class variable.
3011 (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
3012 attributes from instance variables as described with the
3013 delegated_methods class variable.
3014 (MapCanvas.__init__): New instance variable selection holding the
3015 current selection
3016 (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
3017 pass them on to the renderer
3018 (MapCanvas.SetMap): Clear the selection when a different map is
3019 selected.
3020 (MapCanvas.shape_selected): Simple force a complete redraw. The
3021 selection class now takes care of only issueing SHAPES_SELECTED
3022 messages when the set of selected shapes actually does change.
3023 (MapCanvas.SelectShapeAt): The selection is now managed in
3024 self.selection
3025
3026 * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
3027 (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
3028 Unsubscribe, delegate messages according to the delegated_messages
3029 class variable.
3030 (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
3031 attributes from instance variables as described with the
3032 delegated_methods class variable.
3033 (MainWindow.__init__): The interactor as ivar is gone. The
3034 parameter is still there for compatibility. The selection messages
3035 now come from the canvas.
3036 (MainWindow.current_layer, MainWindow.has_selected_layer):
3037 Delegate to the the canvas.
3038 (MainWindow.LayerShowTable, MainWindow.Classify)
3039 (MainWindow.identify_view_on_demand): The dialogs don't need the
3040 interactor parameter anymore.
3041
3042 * Thuban/UI/tableview.py (TableFrame.__init__)
3043 (LayerTableFrame.__init__, LayerTableFrame.OnClose)
3044 (LayerTableFrame.row_selected): The interactor is gone. It's job
3045 from the dialog's point of view is now done by the mainwindow,
3046 i.e. the parent. Subscribe to SHAPES_SELECTED instead
3047 of SELECTED_SHAPE
3048
3049 * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
3050 is gone. It's job from the dialog's point of view is now done by
3051 the mainwindow, i.e. the parent.
3052
3053 * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
3054 gone. It's job from the dialog's point of view is now done by the
3055 mainwindow, i.e. the parent.
3056
3057 * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
3058 gone. It's job from the dialog's point of view is now done by the
3059 mainwindow, i.e. the parent.
3060 (SessionTreeCtrl.__init__): New parameter mainwindow which is
3061 stored as self.mainwindow. The mainwindow is need so that the tree
3062 can still subscribe to the selection messages.
3063 (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
3064 (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
3065 selection is now accessible through the mainwindow. Subscribe to
3066 SHAPES_SELECTED instead of SELECTED_SHAPE
3067
3068 * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
3069 SHAPES_SELECTED message now.
3070 (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
3071 so deal with multiple shapes
3072 (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
3073 gone. It's job from the dialog's point of view is now done by the
3074 mainwindow, i.e. the parent.
3075
3076 * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
3077 parameter is now a list of shape ids.
3078 (RecordTable.SetTable): The second parameter is now a list of
3079 indices.
3080
3081 * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
3082 selected_shape parameter and ivar to selected_shapes. It's now a
3083 list of shape ids.
3084 (MapRenderer.draw_label_layer): Deal with multiple selected
3085 shapes. Rearrange the code a bit so that the setup and shape type
3086 distinctions are only executed once.
3087
3088 * test/test_selection.py: Test cases for the selection class
3089
3090 2003-03-11 Jonathan Coles <[email protected]>
3091
3092 * Thuban/Model/load.py: Temporary fix so that the xml reader
3093 doesn't cause Thuban to crash.
3094
3095 * Thuban/Model/layer.py: Handle the cyclic references between
3096 a layer and its classification better, and be sure to disconnect
3097 the classification from the layer when the layer is destroyed
3098 so that we don't maintain a cyclic reference that may not be
3099 garbage collected.
3100
3101 * Thuban/Model/classification.py: See comment for layer.py.
3102
3103 2003-03-12 Jan-Oliver Wagner <[email protected]>
3104
3105 * HOWTO-Release: New. Information on the steps for releasing
3106 a new version of Thuban.
3107
3108 2003-03-11 Jonathan Coles <[email protected]>
3109
3110 * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
3111 Use True instead of true.
3112 (Classifier): Should have a single panel in which all the controls lie.
3113
3114 * Thuban/UI/proj4dialog.py: Add normal border.
3115
3116 * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
3117
3118 * Thuban/UI/mainwindow.py: Use True instead of true.
3119
3120 * setup.py: Update some definitions to use wxWindows2.4 files
3121
3122 * Data/iceland_sample_class.thuban: Fixed file so that the
3123 field_type information is present.
3124
3125 2003-03-10 Jonathan Coles <[email protected]>
3126
3127 * Thuban/UI/classifier.py (Classifier.__init__): Make the
3128 field type label grow so that when the text changes the
3129 size is updated correctly. This may be a wxWindows bug.
3130
3131 2003-03-10 Jonathan Coles <[email protected]>
3132
3133 * Thuban/UI/application.py: Changed SESSION_CHANGED to
3134 SESSION_REPLACED.
3135
3136 * Thuban/UI/classifier.py: Wrap text with _().
3137 (ClassGrid.CreateTable): Set dimensions and size hints here,
3138 instead of in Reset, so we only set the size once.
3139
3140 * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
3141
3142 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3143 Call Close() instead of Shutdown().
3144
3145 * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3146
3147 * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
3148 Go back to using OnClose() instead of Shutdown().
3149
3150 2003-03-10 Jonathan Coles <[email protected]>
3151
3152 * Thuban/UI/classifier.py (Classifier): SelectField() needed
3153 to know the old field index as well as the new one.
3154
3155 2003-03-10 Jonathan Coles <[email protected]>
3156
3157 * Thuban/UI/classifier.py (Classifier): Use __SelectField()
3158 to correctly set the table information and call this from
3159 __init__ and from _OnFieldSelect so that all the information
3160 is up to date when the dialog opens and when a field is changed.
3161
3162 2003-03-10 Jonathan Coles <[email protected]>
3163
3164 * Thuban/Model/classification.py (Classification): Don't use
3165 layer's message function directly, use the ClassChanged() method
3166 when then classification changes. SetField/SetFieldType/SetLayer
3167 must keep the information about field name and field type in
3168 sync when an owning layer is set or removed.
3169
3170 * Thuban/Model/layer.py: Added ClassChanged() so that the
3171 classification can tell the layer when its data has changed.
3172 (Layer.SetClassification): Accepts None as an arguement to
3173 remove the current classification and correctly handles
3174 adding a new classification.
3175
3176 * Thuban/Model/load.py: Comment out print statement
3177
3178 * test/test_classification.py, test/test_save.py: New and
3179 improved tests.
3180
3181 2003-03-07 Jonathan Coles <[email protected]>
3182
3183 * Thuban/Model/classification.py: Implemented __copy__ and
3184 __deepcopy__ for ClassGroup* and ClassGroupProperites so
3185 they can easily be copied by the classifier dialog.
3186 (ClassGroupProperites.__init__): The default line color should
3187 have been Color.Black.
3188
3189 * Thuban/UI/classifier.py: Setting and Getting table values now
3190 uses a consistent set of functions.
3191 (Classifier): Now non-modal. Has field type label which changes
3192 as the field changes. Keep track of buttons in a list so that
3193 we can enable/disable the buttons when the None field is selected.
3194 (SelectPropertiesDialog): Add buttons to make the colors transparent.
3195
3196 * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
3197 does what OnClose did, but can be called by the application to
3198 close a window. Needed when a session changes, and we have to
3199 close the classifier windows.
3200
3201 * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
3202 Shuts down open dialogs. Used when a new session is created
3203 or a session is opened.
3204 (MainWindow.SaveSession): Should only call application.SaveSession()
3205 if we don't call SaveSessionAs first.
3206 (MainWindow.Classify): Allow different classifier dialogs for
3207 different layers.
3208
3209 * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
3210 the parent class handle it. Add Shutdown() to unsubscibe from
3211 event notification and call the parent Shutdown(). This was
3212 necessary so the application can close the tree window.
3213
3214 2003-03-06 Jonathan Coles <[email protected]>
3215
3216 * Thuban/Model/classification.py: Minor documentation changes,
3217 Addition of __eq__ and __ne__ methods.
3218 (Classification.SetLayer): prevent recursion between this method
3219 and Layer.SetClassification().
3220
3221 * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
3222
3223 * Thuban/Model/layer.py (SetClassification): prevent recursion
3224 between this method and Classification.SetLayer().
3225
3226 * test/test_classification.py, test/test_load.py,
3227 test/test_session.py: Fixed and added tests for the classification
3228 classes.
3229
3230 2003-03-06 Bernhard Herzog <[email protected]>
3231
3232 * Thuban/UI/classifier.py (ClassGrid.__init__)
3233 (ClassGrid.CreateTable): Move the SetSelectionMode call to
3234 CreateTable because otherwise it triggers an assertion in
3235 wxPython/wxGTK 2.4.
3236
3237 2003-03-05 Jonathan Coles <[email protected]>
3238
3239 * Thuban/common.py: Move FIELDTYPE constants back to table.py.
3240
3241 * Thuban/Model/load.py: import FIELDTYPE constants from table.
3242
3243 * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
3244
3245 * Thuban/Model/table.py: Put FIELDTYPE constants back.
3246
3247 2003-03-05 Jonathan Coles <[email protected]>
3248
3249 * Thuban/UI/classifier.py: Added class documentation.
3250 Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
3251 Store just the groups in the table and generate the other
3252 column information when it is requested. Add "None" field
3253 to pull-down to select no classification.
3254
3255 * Thuban/common.py: Moved FIELDTYPE constants from table.py
3256 (Str2Num): Only catch ValueError exceptions.
3257
3258 * Thuban/Model/classification.py: Class documentation. Renaming
3259 of methods with Stroke to Line. Groups are stored in a single
3260 list with the default as the first element. Groups are searched
3261 in the order they appear in the list.
3262
3263 * Thuban/Model/color.py: Documentation.
3264
3265 * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
3266 the kind of data represented by a field.
3267
3268 * Thuban/Model/load.py (ProcessSession): Use proper string
3269 conversion function; fixes RTbug #1713.
3270
3271 * Thuban/Model/save.py (Saver): Store field type information.
3272
3273 * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
3274 (Table): Add field_info_by_name() to retrieve field information
3275 by specifying the field name, not the number.
3276
3277 * Thuban/UI/mainwindow.py: Function name changes.
3278
3279 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
3280 get the layer classification once. Don't try to classify
3281 values when the field is None: just use the default properties.
3282
3283 * Thuban/UI/view.py: Function name changes.
3284
3285 * Doc/thuban.dtd: Add field_type attribute to a classification.
3286
3287 2003-03-04 Bernhard Herzog <[email protected]>
3288
3289 * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
3290 the fill and stroke layer attributes optional with suitable
3291 default values. Add the stroke_width layer attribute. Use correct
3292 syntax for empty elements. Make the attribute list for labels
3293 refer to the label element.
3294
3295 2003-03-04 Bernhard Herzog <[email protected]>
3296
3297 * setup.py (thuban_build_py.build): Add a comment about distutils in
3298 Python 2.3 containing some of the functionality we implement in
3299 setup.py ourselves.
3300
3301 * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
3302 before the selection mode. Doing it the other way round triggers
3303 an assertion in wxWindows.
3304
3305 * Thuban/Model/save.py (escape): Fix typo in doc-string
3306
3307 * Thuban/Model/classification.py: Remove unnecessary wxPython
3308 import
3309
3310 2003-03-04 Jonathan Coles <[email protected]>
3311
3312 * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
3313 Parameter 'value' should default to None.
3314
3315 * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
3316 the class attribute __classification is now private.
3317
3318 * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
3319 Classifier to ClassGrid. Added support for removing selected rows,
3320 which including code for keeping track of when cells are selected,
3321 and deselected.
3322 (ClassTable): Support for added/removing rows. Fixed a problem
3323 with __ParseInput whereby it would not allow strings (only numbers)
3324 to be entered.
3325 (Classifier): Added button and supporting code for removing
3326 selected rows.
3327
3328 2003-02-27 Jonathan Coles <[email protected]>
3329
3330 * Thuban/common.py: Moved color conversion functions into
3331 Thuban/UI/common.py.
3332 (Str2Num): Now converts the float (not the string) to a long/int
3333 so that an exception isn't thrown.
3334
3335 * Thuban/UI/common.py: Common functions used in several UI modules
3336
3337 * Thuban/Model/classification.py: Changed the class hierarchy
3338 so that a Classification consists of Groups which return
3339 Properties when a value matches a Group.
3340
3341 * Thuban/Model/layer.py: Fixed name resolution problem.
3342
3343 * Thuban/Model/load.py: Use new Classification and Group functions.
3344
3345 * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
3346 failure.
3347 (Saver.write_classification): Use new Classification and Group
3348 functions.
3349
3350 * Thuban/UI/classifier.py: Changes to use new Classification and Group
3351 functions. Fix to create a tuple with a single value instead of
3352 simply returning the value.
3353
3354 * Thuban/UI/renderer.py: Use new Classification and Group functions.
3355 Use common.py functions.
3356
3357 * Thuban/UI/tree.py: Use common.py functions.
3358
3359 * test/test_classification.py: Use new Classification and Group
3360 classes.
3361
3362 2003-02-24 Jonathan Coles <[email protected]>
3363
3364 * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
3365 functions from Thuban color objects to wxWindow colour objects.
3366
3367 * Thuban/Model/classification.py (Classification): Renamed
3368 GetProperties() to GetClassData(). Used the new iterator
3369 in TreeInfo().
3370 (ClassIterator): Iterator implementation to iterate over the
3371 ClassData objects in a classification object.
3372
3373 * Thuban/Model/save.py (Saver.write_classificaton): Uses
3374 the new iterator to save the classification information.
3375
3376 * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
3377 for changing the stroke and fill colors and previewing the
3378 changes.
3379
3380 * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
3381 MainWindow.SaveSessionAs): Text string changes so the dialogs
3382 have more meaningful titles.
3383
3384 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
3385 Classification method name from GetProperties to GetClassData.
3386
3387 * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
3388 instead of accessing now non-existent class variables.
3389
3390 2003-02-24 Bernhard Herzog <[email protected]>
3391
3392 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
3393 unneeded Shape() call. Rendering is substantially faster without
3394 it and it avoids some problems with broken shape files.
3395
3396 2003-02-20 Frank Koormann <[email protected]>
3397
3398 Force minimal size of identify and label dialogs. The autosizing
3399 looked too ugly.
3400
3401 * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
3402 * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
3403 Set size of listctrl.
3404 * Thuban/UI/identifyview.py (IdentifyView.__init__):
3405 Set size of dialog.
3406
3407 2003-02-19 Jonathan Coles <[email protected]>
3408
3409 * test/test_classification.py, test/test_layer.py,
3410 test/test_load.py, test/test_map.py, test/test_session.py:
3411 Updated the tests to use the new functions that are in the
3412 respective classes.
3413
3414 * Thuban/Model/classification.py (Classification):
3415 Uses the new ClassData* classes. Modification messages are
3416 passed up to the parent layer (if it exists).
3417 (ClassData): New class to encapsulate the common data in each
3418 classification property.
3419 (ClassDataDefault): Represents the Default class. data.
3420 (ClassDataPoint): Represents a single class. data point
3421 (ClassDataRange): Represents a class. range
3422 (ClassDataMap): Represents a class. map (unused).
3423
3424 * Thuban/Model/color.py: Added Color.None to represent something
3425 with no color. Color.Black represents the color black.
3426 (NoColor): Helper class derived from Color to represent something
3427 with no color.
3428
3429 * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
3430 stroke_width attributes. Made the 'classification' attribute private.
3431 New methods for setting/getting the classification.
3432
3433 * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
3434 to get the classifcation and use the new ClassData* classes to
3435 hold the classification data. Use Str2Num to convert numbers
3436 properly.
3437
3438 * Thuban/Model/save.py (Saver): Use new Color and Classification
3439 methods
3440
3441 * Thuban/UI/classifier.py (ClassGrid): New class to represent a
3442 custom grid.
3443 (ClassTable): Support for editing Values and Labels and for
3444 changing what type (point or range) of data is stored in each
3445 property based on how the user enters the data.
3446 (Classifier): Support for saving the new classifications and
3447 launching the dialog to edit a property.
3448 (SelectPropertiesDialog): New class for editing the visual
3449 properties of a classification (stroke color, width, and fill color)
3450 (ClassPreviewer): Took the Draw method from ClassRenderer and
3451 made most of it into this new class. Intend to use this class in
3452 the SelectPropertiesDialog for previewing changes.
3453
3454 * Thuban/UI/renderer.py: Use new Color and Classification methods.
3455
3456 * Thuban/UI/tree.py: Formatting changes.
3457
3458 * Doc/thuban.dtd: Add 'label' element
3459
3460 * Thuban/common.py: New. Contains common routines used throughout
3461 the code.
3462 (Str2Num): Takes a string and converts it to the "best" type of
3463 number.
3464
3465 2003-02-14 Bernhard Herzog <[email protected]>
3466
3467 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
3468 dragging flag is always set to 0 even when the tool implementation
3469 raises an exception
3470
3471 2003-02-11 Bernhard Herzog <[email protected]>
3472
3473 * Thuban/UI/application.py (ThubanApplication.splash_screen): New
3474 method to create a splash screen.
3475 (ThubanApplication.ShowMainWindow): New. Show the main window.
3476 Needed so the splash screen can display the mainwindow
3477 (ThubanApplication.OnInit): Call the
3478 new splash_screen method to determine whether the application
3479 should display a splash screen. If it displays a splash screen do
3480 not immediately show the main window.
3481
3482 2003-02-11 Jonathan Coles <[email protected]>
3483
3484 * Thuban/Model/classification.py: Added import line to fix
3485 feature conflicts between running on python2.2 and python2.1.
3486
3487 * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
3488 onto the clinfo parameter, so removed the deepcopy().
3489
3490 2003-02-10 Jonathan Coles <[email protected]>
3491
3492 * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
3493 Added element_open variable to track opening and closing of tags
3494 so that tags that don't span more than one line are closed with
3495 /> instead of </tag_name>. Use the GetDefault*() methods of
3496 the Classification class.
3497
3498 * Thuban/Model/classification.py (Classificaton): Added set and
3499 get methods for the default data. The class also takes a layer
3500 reference so that modification messages can be sent. Fixed the
3501 methods to use the new ClassData class.
3502 (ClassData): New class to encapsulate the classification data
3503
3504 * Thuban/Model/layer.py (Layer): Remove the
3505 Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
3506 SetDefault*() methods on the layer's classification object.
3507 (Layer.__init__): Use the new SetDefault*() methods in the
3508 Classification class.
3509
3510 * Thuban/Model/load.py (ProcessSession): Use the new ClassData
3511 object instead of a dictionary.
3512
3513 * Thuban/UI/classifier.py (ClassRenderer): New class to
3514 draw the classifications in the dialog box's table.
3515 (Classifier): Modified to use the ClassRenderer class.
3516
3517 * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
3518 methods of the Classification class.
3519
3520 * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
3521 of the ClassData class.
3522
3523 * test/test_classification.py, test/test_layer.py,
3524 test/test_map.py, test/test_session.py: Fix the tests to work
3525 with the above code changes.
3526
3527 2003-02-03 Jonathan Coles <[email protected]>
3528
3529 * Thuban/Model/classification.py (Classification): Added getNull()
3530 to return the NullData reference
3531
3532 * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
3533 Layer.SetStrokeWidth): Modified these functions to change the
3534 null data in the classification rather than keep these values
3535 directly in the Layer class. Menu options to change these values
3536 work again.
3537
3538 2003-01-28 Jonathan Coles <[email protected]>
3539
3540 * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
3541 Fixed crashing problem on some systems. Dialog box shows
3542 classification data.
3543
3544 * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
3545 Colors in the tree view.
3546
3547 * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
3548 the tree info for classifications. Commented out unnecessary lines.
3549
3550 * Thuban/Model/classification.py (Classification.TreeInfo): New
3551 function to add information about the classification into the
3552 tree view.
3553
3554 2003-01-27 Jan-Oliver Wagner <[email protected]>
3555
3556 * Thuban/__init__.py (_): New.
3557
3558 * Thuban/Model/classification.py, Thuban/Model/extension.py,
3559 Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
3560 Thuban/Model/session.py, Thuban/UI/application.py,
3561 Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
3562 Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
3563 Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
3564 Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
3565 Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
3566
3567 2003-01-27 Jonathan Coles <[email protected]>
3568
3569 * Thuban/Model/layer.py: Classification initialization calls.
3570
3571 * Thuban/Model/classification.py: Created class to encapsulate
3572 a layer classification. Supports specific data points and
3573 ranges.
3574
3575 * Thuban/Model/load.py: Added support for loading classification
3576 information.
3577
3578 * Thuban/Model/save.py: Added support for saving classification
3579 information.
3580
3581 * Thuban/UI/classifier.py: Initial class for a dialog box for
3582 specifying classification information.
3583
3584 * Thuban/UI/mainwindows.py: Support for opening the classifier
3585 dialog.
3586
3587 * Thuban/UI/renderer.py: Support for drawing a layer with the
3588 classification information.
3589
3590 * Data/iceland_sample_class.thuban: iceland_sample with
3591 classification data.
3592
3593 * test/test_classification: Tests for the Classification class.
3594
3595 2002-12-09 Bernhard Herzog <[email protected]>
3596
3597 * test/test_command.py: New. Tests for the command classes.
3598
3599 * Thuban/UI/command.py (ToolCommand): New class for tool commands.
3600 (Command.IsTool): New method to distinguish between command
3601 switching tools and other commands.
3602
3603 * Thuban/UI/view.py (MapCanvas.SelectTool): New method to select
3604 the tool to avoid direct assignments to instance variables
3605 (MapCanvas.ZoomInTool, MapCanvas.ZoomOutTool, MapCanvas.PanTool)
3606 (MapCanvas.IdentifyTool, MapCanvas.LabelTool): Use SelectTool to
3607 change the tool
3608
3609 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): If an
3610 active tool's command turns insensitive, disable the tool.
3611 (_tool_command): Use the new ToolCommand class
3612
3613 * Examples/simple_extensions/simple_tool.py (simple_tool): Use the
3614 SelectTool method to change the tool
3615 (iconfile): Use the ToolCommand class
3616
3617 2002-12-03 Bernhard Herzog <[email protected]>
3618
3619 * Thuban/UI/tree.py (SessionTreeCtrl.normalize_selection): Handle
3620 the case of selected items that are not children of Layers or Maps
3621 properly. Previously this bug would trigger an assertion in
3622 wxWindows.
3623
3624 2002-11-06 Frank Koormann <[email protected]>
3625
3626 * Thuban/UI/mainwindow.py: Altered the order of tools in the
3627 toolbar: First now are all navigation tools (Zoom In/Out, Pan,
3628 Full Extent).
3629
3630 2002-10-23 Bernhard Herzog <[email protected]>
3631
3632 * setup.py (setup call): version now 0.1.3
3633
3634 * MANIFEST.in: Add the files in test/
3635
3636 * test/README: Add note about tests requiring the iceland data
3637
3638 * Thuban/UI/mainwindow.py (MainWindow.About): Add 2002 to
3639 copyright notice.
3640
3641 2002-10-18 Bernhard Herzog <[email protected]>
3642
3643 * test/test_map.py
3644 (TestMapWithContents.test_projected_bounding_box): Use an explicit
3645 epsilon.
3646
3647 * test/support.py (FloatComparisonMixin.assertFloatEqual)
3648 (FloatComparisonMixin.assertFloatSeqEqual): give a more useful
3649 message if the assertion fails and don't return the return value
3650 of self.assert_. In assertFloatSeqEqual the return meant that not
3651 all items of the sequence were compared.
3652
3653 2002-09-20 Bernhard Herzog <[email protected]>
3654
3655 * test/test_fileutil.py: New. Test cases for Thuban.Lib.fileutil
3656
3657 * Thuban/Lib/fileutil.py: Fixup some whitespace and typos
3658
3659 * test/test_map.py (TestMapWithContents.test_tree_info): Create
3660 the string with the bounding box on the fly because of platform
3661 differences in the way %g is handled.
3662
3663 * test/test_layer.py (TestLayer.test_empty_layer): Create an empty
3664 DBFfile too because Thuban layers can't yet cope missing DBF
3665 files.
3666
3667 2002-09-20 Bernhard Herzog <[email protected]>
3668
3669 * test/test_menu.py: Use initthuban instead of
3670 add_thuban_dir_to_path to initialize Thuban.
3671
3672 * test/support.py (FloatComparisonMixin.assertFloatEqual): New.
3673 Mixin class for float comparisons
3674 (SubscriberMixin): New. Mixin class to test messages sent through
3675 the Connector class
3676
3677 * test/README: Fix a typo and add the -v flag to the command for
3678 individual tests
3679
3680 * test/test_session.py: New. Test cases for Thuban.Model.session
3681
3682 * test/test_proj.py: New. Test cases for Thuban.Model.proj
3683
3684 * test/test_map.py: New. Test cases for Thuban.Model.map
3685
3686 * test/test_layer.py: New. Test cases for Thuban.Model.layer
3687
3688 * test/test_label.py: New. Test cases for Thuban.Model.label
3689
3690 * test/test_connector.py: New. Test cases for Thuban.Lib.connector
3691
3692 * test/test_color.py: New. Test cases for Thuban.Model.color
3693
3694 * test/test_base.py: New. Test cases for Thuban.Model.base
3695
3696 2002-09-13 Bernhard Herzog <[email protected]>
3697
3698 * Thuban/Model/session.py (Session.forwarded_channels): Forward
3699 the CHANGED channel too.
3700
3701 * Thuban/Model/map.py (Map.forwarded_channels): Forward the
3702 CHANGED channel too.
3703 (Map.__init__): Call the Modifiable constructor as well.
3704
3705 * Thuban/Model/base.py (Modifiable.UnsetModified): Issue a CHANGED
3706 event if the modified flag changes.
3707 (Modifiable.changed): Tweak the doc-string.
3708
3709 * Thuban/UI/mainwindow.py (MainWindow.view_position_changed)
3710 (MainWindow.set_position_text): Put the code that puts the text
3711 with the mouse position into the status bar into the new method
3712 set_position_text so that it can overwritten in derived classes.
3713
3714 2002-09-12 Bernhard Herzog <[email protected]>
3715
3716 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Center the
3717 message box on the main window.
3718
3719 2002-09-11 Bernhard Herzog <[email protected]>
3720
3721 * Thuban/UI/mainwindow.py: Underline the 'x' in "Exit" instead of
3722 the 'E' because it's less likely to interfere with other menu
3723 entries.
3724 (MainWindow.build_menu): remove an incorrect comment.
3725
3726 2002-09-10 Bernhard Herzog <[email protected]>
3727
3728 * Thuban/UI/mainwindow.py (MainWindow.Map): New.
3729 (_tool_command): Add sensitive parameter
3730 (_has_visible_map): Sensitivity callback to tools and other
3731 commands that require a visible map. Use it in map_zoom_in_tool,
3732 map_zoom_out_tool, map_pan_tool, map_identify_tool, map_label_tool
3733 and map_full_extent
3734
3735 2002-09-06 Bernhard Herzog <[email protected]>
3736
3737 * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
3738 VIEW_POSITION
3739
3740 2002-09-04 Frank Koormann <[email protected]>
3741
3742 * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
3743
3744 2002-09-02 Bernhard Herzog <[email protected]>
3745
3746 * Thuban/UI/view.py: Get rid of the idle redraw. This is done by
3747 wxWindows already and our implementation doesn't work correctly
3748 with wxGTK 2.3:
3749 (MapCanvas.__init__): Remove the instance variable
3750 (MapCanvas.OnPaint): Always call do_redraw when there's a map to
3751 be drawin
3752 (MapCanvas.OnIdle): Removed.
3753
3754 * Thuban/UI/view.py (MapCanvas.unprojected_rect_around_point): Add
3755 a parameter to determine the size of the rectangle.
3756 (MapCanvas.find_shape_at): Create the box around the point on a
3757 layer by layer basis and make the size depend on the shape type.
3758 This solves a problem with the selection of point shapes at the
3759 border of the layer's bounding box
3760
3761 2002-08-30 Bernhard Herzog <[email protected]>
3762
3763 * Thuban/UI/mainwindow.py (MainWindow.CanRemoveLayer): New method
3764 for the sensitivity of remove layer.
3765 (_can_remove_layer): New. Sensitivity callback for remove layer
3766 (Command layer_remove): Use _can_remove_layer
3767
3768 * Thuban/Model/map.py (Map.CanRemoveLayer): New method to
3769 determine whether a given layer can be deleted.
3770
3771 * Thuban/UI/view.py (MapCanvas.__init__, MapCanvas.OnPaint)
3772 (MapCanvas.do_redraw): Get rid of the unused update_region
3773 instance variable
3774
3775 * Thuban/UI/view.py: Add/update some doc-strings.
3776
3777 * test/: new subdirectory with a bunch of unit tests.
3778
3779 * test/README, test/test_table.py, test/test_save.py,
3780 test/test_menu.py, test/test_load.py: Initial set of tests and
3781 brief instructions on how to run them
3782
3783 2002-08-29 Bernhard Herzog <[email protected]>
3784
3785 * Thuban/UI/renderer.py (ScreenRenderer.draw_shape_layer): Handle
3786 arcs with multiple parts.
3787
3788 * Thuban/UI/view.py (ZoomInTool.MouseUp, ZoomOutTool.MouseUp):
3789 Handle degenrate rectangles.
3790
3791 * Thuban/Model/table.py: Make writing records work correctly:
3792 (Table.__init__): Keep track of whether the DBF is open for
3793 writing
3794 (Table.write_record): Open the DBF file for writing when necessary
3795
3796 2002-08-27 Bernhard Herzog <[email protected]>
3797
3798 * Thuban/Model/table.py (Table.write_record, Table.__init__): Open
3799 dbf files only for reading by default. Use a new writable dbf
3800 object for writing.
3801
3802 2002-08-26 Bernhard Herzog <[email protected]>
3803
3804 * Thuban/UI/mainwindow.py: Refactor the context creation:
3805 (MainWindow.Context): New method to return a context
3806 (MainWindow.invoke_command, MainWindow.update_command_ui): Use the
3807 new method
3808
3809 * Thuban/UI/tableview.py (TableGrid, LayerTableGrid): Split the
3810 layer table specific code from TableGrid into LayerTableGrid
3811 (TableFrame, LayerTableFrame): Split the layer table specific code
3812 from TableFrame into LayerTableFrame
3813 (LayerTableGrid.select_shape): Remove a debug print
3814
3815 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Use the
3816 LayerTableFrame
3817
3818 2002-08-23 Bernhard Herzog <[email protected]>
3819
3820 * Thuban/Model/layer.py (Layer.__init__): Make sure we have an
3821 absolute filename.
3822
3823 2002-08-22 Bernhard Herzog <[email protected]>
3824
3825 * Thuban/Model/table.py (Table.write_record): New method to write
3826 records.
3827 (Table.__init__): Open the DBF file for writing too.
3828
3829 * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
3830 into the underlying table.
3831
3832 * extensions/shapelib/shapefil.h (DBFCommit),
3833 extensions/shapelib/dbfopen.c (DBFCommit): New API function to
3834 commit any changes made to the DBF file.
3835
3836 * Thuban/UI/mainwindow.py (make_check_current_tool)
3837 (_tool_command): Put the code that generates the "checked"
3838 callback into a separate function so that we can reuse it
3839 elsewhere
3840
3841 * Thuban/Model/save.py (Saver): New class to handle serializing a
3842 session into an XML file. The main reason to introduce a class is
3843 that applications built on Thuban can derive from it so that they
3844 can save additional information in a session file.
3845 (save_session): Delegate almost all the work to the Saver class.
3846 Rename the filename argument to file because it may be a file like
3847 object now.
3848
3849 * Thuban/Model/load.py: Get rid of the Python 1.5.2 compatibility
3850 code. Remove the little test code which would be executed when the
3851 module is run as a script which didn't work anymore since it can't
3852 import the other Thuban modules.
3853 (ProcessSession, load_session): Refactor the ProcessSession to
3854 have one method for each element start and end tag so that derived
3855 classes can easily override the processing of individual tags.
3856 Also, always parse with namespaces enabled because applications
3857 built on top of Thuban will likely use namespaces if they extend
3858 the session file format.
3859
3860 2002-08-21 Bernhard Herzog <[email protected]>
3861
3862 * setup.py (ThubanInstall.run): Don't repr install_lib_orig
3863 because thubaninit_contents will do it for us.
3864
3865 2002-08-16 Jan-Oliver Wagner <[email protected]>
3866
3867 * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
3868 tree window already open
3869
3870 2002-08-15 Bernhard Herzog <[email protected]>
3871
3872 * Thuban/Model/layer.py (Layer.Destroy): Call the unboundd method
3873 with self.
3874
3875 * Thuban/UI/view.py (MapCanvas.OnLeftUp): Only release the mouse
3876 when we have actually captured it.
3877
3878 * Thuban/Model/layer.py (Layer.Destroy): New. Explicitly close the
3879 shapefile and destroy the table.
3880
3881 * Thuban/Model/table.py (Table.Destroy): New. Close the DBF file.
3882
3883 2002-08-14 Bernhard Herzog <[email protected]>
3884
3885 * Thuban/UI/controls.py (RecordTable.__init__): Remove the unused
3886 instance variable columns
3887 (RecordTable.GetTypeName): row and col may be negative in some
3888 cases.
3889
3890 * setup.py (InstallLocal.initialize_options)
3891 (InstallLocal.finalize_options, InstallLocal.user_options): New
3892 option create-init-file to build a thubaninit.py when running
3893 install_local
3894 (InstallLocal.run): Create the thubaninit.py module when requested
3895 (thubaninit_contents): Split the template into several parts and
3896 create a new function thubaninit_contents that creates the
3897 contents of a thubaninit module.
3898 (ThubanInstall.run): Use the new function to create the thubaninit
3899 module.
3900
3901 2002-07-30 Bernhard Herzog <[email protected]>
3902
3903 * Thuban/UI/application.py (ThubanApplication.OnExit): Do some
3904 cleanup.
3905 (ThubanApplication.MainLoop): Extend to automatically call OnExit.
3906
3907 * Thuban/Model/session.py (Session.Destroy): Don't bypass the
3908 direct base class' Destroy method.
3909
3910 * Thuban/Model/map.py (Map.ClearLayers): New method to delete all
3911 layers.
3912 (Map.Destroy): Destroy the label_layer as well and call the
3913 inherited Desatroymethod first so that no more messages are
3914 issued.
3915 (Map.RaiseLayer, Map.LowerLayer): Only issue LAYERS_CHANGED
3916 message if the stacking order actually has changed. Add
3917 doc-strings.
3918 (Map.BoundingBox): Correct the doc-string.
3919 (Map.AddLayer, Map.RemoveLayer, Map.Layers, Map.HasLayers)
3920 (Map.ProjectedBoundingBox, Map.SetProjection): Add doc-strings.
3921
3922 * Thuban/Model/label.py (LabelLayer.ClearLabels): New to delete
3923 all labels.
3924
3925 2002-07-29 Bernhard Herzog <[email protected]>
3926
3927 * Thuban/Model/map.py (Map.subscribe_layer_channels)
3928 (Map.unsubscribe_layer_channels): Put the code that (un)subscribes
3929 to a layer's channels into separate methods.
3930 (Map.RemoveLayer, Map.AddLayer): Call the new methods
3931 (Map.Destroy): Unsubscribe from a layer's channels before
3932 destroying it.
3933
3934 * Thuban/UI/view.py (MapCanvas.find_shape_at): Change the
3935 selected_layer parameter to searched_layer which is the layer to
3936 search in.
3937 (MapCanvas.SelectShapeAt): New parameter layer to restrict the
3938 search to that layer. Return the selected layer and shape.
3939
3940 * Examples/simple_extensions/simple_tool.py (simple_tool): Fix a
3941 typo
3942
3943 2002-07-24 Bernhard Herzog <[email protected]>
3944
3945 * Thuban/UI/application.py (ThubanApplication.create_session):
3946 Extend the doc string.
3947 (ThubanApplication.subscribe_session)
3948 (ThubanApplication.unsubscribe_session): New methods to
3949 subscribe/unsubscribe to/from session channels.
3950 (ThubanApplication.SetSession): Call the new methods here.
3951 (ThubanApplication.maps_changed, ThubanApplication.set_map):
3952 Renamed set_map to maps_changed. Its now a subscriber for
3953 MAPS_CHANGED.
3954
3955 * Thuban/UI/view.py (ZoomOutTool.MouseUp): Use the correct
3956 x-coordinate in case of simple clicks
3957
3958 * Thuban/Model/base.py (Modifiable.changed): Apply the args tuple,
3959 don't pass it as a parameter
3960
3961 * Thuban/Model/session.py (Session.RemoveMap): New
3962
3963 * Thuban/UI/mainwindow.py (MainWindow.__init__): Turn the initial
3964 window size into a parameter.
3965
3966 2002-07-23 Bernhard Herzog <[email protected]>
3967
3968 * Thuban/UI/menu.py (Menu.item_index): Also search for menus not
3969 just commands.
3970
3971 * Thuban/UI/mainwindow.py (MainWindow.__init__): Change the
3972 parameter list a bit to allow setting the window title and the
3973 initial message in the status bar. Update the callers.
3974
3975 * Thuban/UI/application.py (ThubanApplication.OnInit)
3976 (ThubanApplication.CreateMainWindow): Put the mainwindow
3977 instantiation into a separate method so that it can be overridden
3978 by a subclass.
3979
3980 2002-07-19 Bernhard Herzog <[email protected]>
3981
3982 * Thuban/Model/session.py: Issue a CHANGED message every time
3983 another changed message is issued to make it easier to get
3984 notified of changes.
3985 (Session): Update the doc string
3986 (Session.forward): Issue changed-events as CHANGED as well.
3987 (Session.changed): Overwrite the inherited version to issue
3988 CHANGED events as well.
3989
3990 * Thuban/UI/tree.py: We can now simply subscribe to the session's
3991 CHANGED channel to be informed of changes.
3992 (SessionTreeCtrl.session_channels): Not needed any longer.
3993 (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
3994 Only have to (un)subscribe CHANGED
3995
3996 * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
3997
3998 * Thuban/UI/main.py, Thuban/UI/__init__.py: Move the work-around
3999 for the wxPython locale bug to __init__.py so that it's
4000 automatically executed by anybody using UI code from Thuban.
4001
4002 2002-07-18 Bernhard Herzog <[email protected]>
4003
4004 * Thuban/UI/main.py (main): app no longer needs to be global
4005
4006 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add application
4007 as parameter and store it in an instance variable
4008 (MainWindow.invoke_command, MainWindow.update_command_ui)
4009 (MainWindow.save_modified_session, MainWindow.NewSession)
4010 (MainWindow.OpenSession, MainWindow.SaveSession)
4011 (MainWindow.SaveSessionAs, MainWindow.ShowSessionTree): Use self's
4012 application object.
4013
4014 * Thuban/UI/application.py (ThubanApplication.OnInit): Instantiate
4015 the main window with self.
4016
4017 * Thuban/UI/context.py: New module with the context class
4018
4019 * Thuban/UI/command.py (Command): Update doc string.
4020
4021 * Thuban/UI/mainwindow.py (MainWindow.invoke_command,
4022 MainWindow.update_command_ui): Pass an instance of the context
4023 class to the command's methods
4024 (check_current_tool, call_method): Handle the new context
4025 implementation
4026
4027 * Examples/simple_extensions/simple_tool.py (simple_tool,
4028 check_simple_tool): Handle the new context implementation
4029
4030 * Examples/simple_extensions/simple_command.py (simple_command):
4031 Handle the new context implementation. Update the comments about
4032 the context.
4033
4034 * Thuban/UI/application.py (ThubanApplication.SetSession): Add
4035 doc-string
4036 (ThubanApplication.Session): New method to return the session
4037 object
4038
4039 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): The
4040 interactor's selected_layer may not be a layer of the current
4041 session when the tree is updated while a new session is being set.
4042
4043 2002-07-17 Bernhard Herzog <[email protected]>
4044
4045 * Thuban/UI/tree.py (color_string): Removed. No longer used.
4046 (SessionTreeCtrl.update_tree, SessionTreeCtrl.add_items): Split
4047 update_tree into update_tree and add_items. The tree now uses a
4048 more generic way to display the contents of the tree.
4049 (SessionTreeCtrl): Add a doc string explaining the TreeInfo method
4050
4051 * Thuban/Model/layer.py (Layer.TreeInfo),
4052 Thuban/Model/extension.py (Extension.TreeInfo),
4053 Thuban/Model/map.py (Map.TreeInfo),
4054 Thuban/Model/session.py (Session.TreeInfo):
4055 Add TreeInfo methods to implement the new tree view update scheme
4056
4057 2002-07-16 Bernhard Herzog <[email protected]>
4058
4059 * Thuban/UI/application.py: Don't use "import from" for the
4060 MainWindow. It can't always be resolved.
4061 (ThubanApplication.OnInit): change reference to MainWindow
4062 accordingly.
4063
4064 * Thuban/UI/menu.py (Menu.SetItems): New method to replace a menu
4065 completely
4066
4067 2002-07-10 Bernhard Herzog <[email protected]>
4068
4069 * setup.py (create_init_module): New configurable variable whose
4070 default depends on the platform we're running on.
4071 (ThubanInstall.initialize_options): Initialize
4072 self.create_init_module from the global create_init_module
4073 (ThubanInstall.user_options): indictate that the options
4074 create-init-module and init-module-dir have arguments.
4075
4076 * setup.py: In the setup call change the version number to include
4077 cvs.
4078
4079 * MANIFEST.in: Add the files in Examples
4080
4081 2002-07-09 Bernhard Herzog <[email protected]>
4082
4083 * setup.py: In the setup call, use the thuban homepage as the
4084 value of the url parameter.
4085
4086 * Examples: New subdirectory for examples.
4087
4088 * Examples/simple_extensions/simple_tool.xpm,
4089 Examples/simple_extensions/simple_tool.py,
4090 Examples/simple_extensions/simple_command.py,
4091 Examples/simple_extensions/README: Simple examples showing how to
4092 add new commands and tools.
4093
4094 * setup.cfg (bdist_rpm): Add the default value for prefix and tell
4095 bdist_rpm that we also have an install script.
4096 (bdist_inno): Add 2002 to the copyright notice.
4097
4098 * setup.py: Create a file in python's site-packages directory to
4099 make installation of Thuban as a library easier.
4100 (ThubanInstall.user_options): Add two new options,
4101 create-init-module and init-module-dir
4102 (ThubanInstall.expand_with_pure_python_dirs): New method to expand
4103 filenames for installation in the default directories.
4104 (ThubanInstall.select_scheme, ThubanInstall.convert_paths): Extend
4105 the inherited methods to capture some filenames before they're
4106 transformed too much by distutils.
4107 (ThubanInstall.run): Create the init module if requested.
4108 (ThubanInstall.thuban_init_filename): New method to return the
4109 full name of the init module.
4110 (ThubanInstall.get_outputs): Append the filename of the init
4111 module.
4112
4113 2002-07-08 Bernhard Herzog <[email protected]>
4114
4115 * setup.py (thuban_bdist_rpm): Extend this version of bdist_rpm to
4116 handle the prefix properly which means that the default for the
4117 installation prefix should be /usr for RPMs and /usr/local when
4118 doing a normal source install.
4119 (bdist_rpm_install_script): Script to override the default install
4120 commands in the specfile generated by the bdist_rpm command.
4121 (thuban_bdist_rpm.user_options): Add a prefix option
4122 (thuban_bdist_rpm.initialize_options): Init the prefix option.
4123 Create the script files for the spec files as empty files here
4124 (thuban_bdist_rpm._make_spec_file): Override the inherited method
4125 to fill the script files with content.
4126
4127 * Thuban/Model/save.py (relative_filename): Wrapper around
4128 Thuban.Lib.fileutil.relative_filename that accepts an empty dir
4129 argument. save_session now automatically uses this version,
4130 solving a problem when saving to a relative filename.
4131
4132 * setup.py: In the setup call, make sure that the library
4133 directories are under $prefix/lib not directly under $prefix.
4134
4135 2002-06-20 Jan-Oliver Wagner <[email protected]>
4136
4137 * Thuban/Model/extension.py: new module to handle extension objects.
4138 * Thuban/Model/messages.py: new messages for extensions.
4139 * Thuban/Model/session.py (Session.Extensions, Session.HasExtensions,
4140 Session.AddExtension): new for handling extensions.
4141 Also some other minor changes to round up extension handling.
4142 * Thuban/UI/tree.py (SessionTreeCrtl:update_tree): Added visualization
4143 of Extension titles and title and names of its objects.
4144
4145 2002-05-29 Bernhard Herzog <[email protected]>
4146
4147 * Thuban/UI/mainwindow.py (MainWindow.bind_command_events): Bind
4148 the events for a command.
4149 (MainWindow.add_toolbar_command, MainWindow.add_menu_command):
4150 Call bind_command_events to bind the events. add_toolbar_command
4151 can now bind events too so that it's possible to have commands
4152 that are only available through the toolbar.
4153 (MainWindow.init_ids): New instance variable events_bound to keep
4154 track of for which commands events have been bound.
4155
4156 2002-05-28 Bernhard Herzog <[email protected]>
4157
4158 * Thuban/UI/menu.py: New module to build and manage menus.
4159
4160 * Thuban/UI/mainwindow.py: Remove some unused imports.
4161 (MainWindow.__init__, main_menu): move the definition of the main
4162 menu from __init__ to the Menu instance main_menu.
4163 (MainWindow.build_menu_bar, MainWindow.build_menu): New methods to
4164 build the menu bar and sub-menus from a menu description.
4165
4166 * Thuban/UI/application.py (ThubanApplication.OnInit): Read the
4167 startup file
4168 (ThubanApplication.read_startup_files): New method to run
4169 ~/.thuban/thubanstart.py
4170
4171 * Thuban/UI/mainwindow.py (MainWindow.__init__, main_toolbar):
4172 Move the toolbar definition to the Menu instance main_toolbar.
4173 (MainWindow.build_toolbar): New method to build the toolbar
4174 similar to the build_menu methods
4175
4176 2002-05-23 Bernhard Herzog <[email protected]>
4177
4178 * Thuban/UI/mainwindow.py (MainWindow.__init__): Fix spelling of
4179 layer_outline_color. Fix it in the definition of the command too.
4180
4181 * Thuban/UI/command.py (Command): Fix typo in doc string
4182
4183 2002-05-22 Bernhard Herzog <[email protected]>
4184
4185 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): Fix a typo
4186 in the docstring
4187
4188 2002-05-15 Bernhard Herzog <[email protected]>
4189
4190 * Thuban/Model/layer.py (Layer.open_shapefile): Set bbox to None
4191 when the shapefile is empty.
4192 (Layer.BoundingBox, Layer.LatLongBoundingBox): Both methods may
4193 now return None for empty shapefiles. Update doc-strings.
4194
4195 * Thuban/Model/map.py (Map.BoundingBox): Add doc-string. Deal with
4196 the layer's bbox being None.
4197
4198 * Thuban/UI/tree.py (SessionTreeCtrl.update_tree): Deal with the
4199 layer's bbox being None.
4200
4201 * Thuban/UI/view.py (MapCanvas.shape_selected): Only redraw when
4202 necessary.
4203 (MapCanvas.__init__): New instance variables, last_selected_layer
4204 and last_selected_shape to determine how the selection has
4205 changed.
4206
4207 * Thuban/UI/tableview.py (TableGrid.__init__): Do not call
4208 AutoSizeColumns because it will cause a traversal of the entire
4209 table which for large .dbf files will take a very long time.
4210
4211 2002-05-14 Bernhard Herzog <[email protected]>
4212
4213 * Thuban/Model/layer.py (Layer.open_shapefile): Choose a better
4214 maximum depth for the tree than shapelib does by default.
4215
4216 2002-05-10 Bernhard Herzog <[email protected]>
4217
4218 * setup.py (py_modules): The shptree modules doesn't have a
4219 wrapper, so don't include it in the py_modules
4220
4221 2002-05-08 Bernhard Herzog <[email protected]>
4222
4223 * extensions/shapelib/shptree.c (compare_ints): Make arguments
4224 const void * as in the qsort prototype
4225 (SHPTreeFindLikelyShapes): Remove some unused variables.
4226
4227 * Thuban/UI/view.py (PanTool.MouseMove): Use the bitmap the view
4228 maintains to redraw the window during a drag.
4229 (MapCanvas.unprojected_rect_around_point): New method to determine
4230 a small region around a point for hit-testing.
4231 (MapCanvas.find_shape_at): Only test the shapes in a small region
4232 around the point.
4233
4234 * setup.py: Increment the version to 0.1.2
4235
4236 * Thuban/UI/tree.py (SessionTreeCtrl.unsubscribe_all): Remove a
4237 debug print and set session to None after unsubscribing
4238
4239 2002-05-07 Bernhard Herzog <[email protected]>
4240
4241 * Data/iceland_sample.session, Data/iceland_sample.thuban: Rename
4242 the file to have a .thuban extension.
4243
4244 * Thuban/UI/tree.py (session_channels): New class constant with
4245 all the session channels to subscribe to to update the tree
4246 (SessionTreeCtrl.session_changed): Remember the session so that we
4247 can unsubscribe properly. Use the new class constant to
4248 unsubscribe from the old session and subscribe to the new one.
4249 (SessionTreeCtrl.unsubscribe_all): New method to unsubscribe all
4250 subscriptions of the SessionTreeCtrl.
4251 (SessionTreeView.OnClose): Call the tree's unsubscribe_all method.
4252
4253 * Thuban/UI/mainwindow.py (MainWindow.__init__): Add the "Show
4254 Session Tree" command to the file menu.
4255
4256 * Thuban/UI/view.py (MapCanvas.do_redraw): Pass the entire bitmap
4257 as update_region to the renderer.
4258
4259 * Thuban/UI/renderer.py
4260 (ScreenRenderer.layer_ids, ScreenRenderer.draw_shape_layer): The
4261 update box is now directly a tuple, not a wxRect anymore.
4262
4263 * Thuban/Model/layer.py (Layer.ShapesInRegion): Remove some debug
4264 prints.
4265
4266 2002-05-07 Bernhard Herzog <[email protected]>
4267
4268 * setup.py: Add the shptree extension module. See
4269 extensions/pyshapelib/ChangeLog for more details.
4270
4271 * extensions/shapelib/shpopen.c, extensions/shapelib/shapefil.h,
4272 extensions/shapelib/dbfopen.c: Really update to the versions of
4273 shapelib 1.2.9. For some reason it wasn't really done on
4274 2002-04-11.
4275
4276 * extensions/shapelib/shptree.c: Modified version of shptree.c of
4277 shapelib 1.2.9. The only real difference is the use of qsort
4278 instead of a bubble sort implementation
4279
4280 * Thuban/Model/layer.py (Layer.__init__): New instance variable
4281 shapetree to hold the shapelib quadtree for the shapefile
4282 (Layer.open_shapefile): Create the quad tree.
4283 (Layer.ShapesInRegion): New method to return the ids of shapes in
4284 a given region using the quad tree.
4285
4286 * extensions/thuban/wxproj.cpp (project_points): Fix some typos in
4287 comment
4288 (draw_polygon_shape): Accept both arcs and polygons.
4289 (initwxproj): Use the new PYSHAPELIB_IMPORT_API macro to import
4290 the api.
4291
4292 * Thuban/UI/renderer.py (MapRenderer.layer_ids): New method to
4293 return the shape ids to be rendered in a given layer.
4294 (MapRenderer.draw_shape_layer): Call layer_ids to get the list of
4295 ids. Use draw_polygon_shape to draw arc shapes as well.
4296 (ScreenRenderer.RenderMap): New parameter for the rectangle that
4297 has to be updated
4298 (ScreenRenderer.layer_ids): Make use of the layer's quadtree by
4299 calling it's ShapesInRegion method.
4300
4301 * Thuban/UI/view.py (MapCanvas.__init__): New instance variable
4302 update_region for the update region.
4303 (MapCanvas.OnPaint): Maintain the update region
4304 (MapCanvas.do_redraw): Pass the bounding box of the update_region
4305 to the renderer when drawing the bitmap. Reset the update_region.
4306
4307 2002-05-03 Bernhard Herzog <[email protected]>
4308
4309 * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs,
4310 MainWindow.OpenSession): Change the file extension of the session
4311 files to .thuban
4312
4313 * Thuban/Model/session.py (Session.AddMap, forwarded_channels):
4314 Move the map channels to be forwarded by the session into the
4315 class constant with forwarded_channels. Also add
4316 LAYER_PROJECTION_CHANGED and LAYER_VISIBILITY_CHANGED to
4317 forwarded_channels
4318
4319 * Thuban/Model/base.py (Modifiable.changed): Fix doc-string (a
4320 typo and some rewording).
4321
4322 2002-05-02 Bernhard Herzog <[email protected]>
4323
4324 * Thuban/UI/view.py: Keep the temporary bitmap used during drawing
4325 around to speed up most redraws:
4326 (MapCanvas.__init__): New instance variable bitmap which holds the
4327 bitmap
4328 (MapCanvas.do_redraw): Redraw self.bitmap if necessary. Use
4329 self.bitmap to draw.
4330 (MapCanvas.full_redraw): New method to force a full redraw
4331 including the bitmap
4332 (MapCanvas.SetMap): Subscribe full_redraw instead of redraw to
4333 make sure the bitmap is redrawn.
4334 (MapCanvas.projection_changed, MapCanvas.set_view_transform,
4335 MapCanvas.shape_selected): Call full_redraw instead of readraw to
4336 make sure the bitmap is redrawn.
4337 (MapCanvas.OnSize): New method to handle size events so that the
4338 bitmap can be redrawn.
4339
4340 2002-04-29 Bernhard Herzog <[email protected]>
4341
4342 * Thuban/UI/mainwindow.py (MainWindow.__init__): Subscribe to the
4343 canvas' VIEW_POSITION event
4344 (MainWindow.view_position_changed): Handler for VIEW_POSITION.
4345 Update the text in the status-bar accordingly.
4346
4347 * Thuban/UI/view.py (MapCanvas): Derive from Publisher as well
4348 (MapCanvas.__del__): Implement because Publisher.__del__ has to be
4349 called.
4350 (MapCanvas.__init__): Bind EVT_LEAVE_WINDOW too. Initialize
4351 current_position
4352 (MapCanvas.set_current_position): New method to set
4353 current_position. Issue a VIEW_POSITION event
4354 (MapCanvas.CurrentPosition): New public method to return the value
4355 of current_position. Should be called when the VIEW_POSITION event
4356 is processed.
4357 (MapCanvas.OnLeftDown, MapCanvas.OnLeftUp, MapCanvas.OnMotion):
4358 Update the position.
4359 (MapCanvas.OnLeaveWindow): Set the position to None.
4360
4361 * Thuban/UI/messages.py (VIEW_POSITION): New message for the
4362 position in the statusbar
4363
4364 2002-04-26 Frank Koormann <[email protected]>
4365
4366 * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
4367
4368 2002-04-24 Frank Koormann <[email protected]>
4369
4370 * Resources/Bitmaps/identify.xpm: shadow added
4371
4372 * Resources/Bitmaps/fullextent.xpm: new
4373
4374 2002-04-22 Jan-Oliver Wagner <[email protected]>
4375
4376 * Thuban/UI/tree.py (update_tree): added test for None on map bounding
4377 box
4378
4379 2002-04-21 Jan-Oliver Wagner <[email protected]>
4380
4381 * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
4382
4383 * Thuban/UI/tree.py (update_tree): added added map extent
4384
4385 * Thuban/UI/mainwindow.py (_method_command): extended by parameter
4386 icon; added map_full_extend as tool
4387
4388 2002-04-19 Jan-Oliver Wagner <[email protected]>
4389
4390 * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
4391 saving _new_ sessions
4392
4393 * Thuban/Model/session.py (create_empty_session): new session
4394 don't have a filename (set to None)
4395
4396 * Thuban/UI/tree.py (update_tree): added filename and modified flag
4397
4398 * Thuban/Model/load.py (ProcessSession): convert projection
4399 parameters from unicode to regular string
4400
4401 * Data/iceland_sample.session: Added UTM Zone 26 projection.
4402
4403 2002-04-11 Bernhard Herzog <[email protected]>
4404
4405 * extensions/shapelib/shapefil.h, extensions/shapelib/shpopen.c,
4406 extensions/shapelib/dbfopen.c: Update to the versions of shapelib
4407 1.2.9
4408
4409 * setup.py (Lib.wxproj extension): Don't link shpopen.c and put
4410 the pyshapelib directoy into the list of include dirs, so that
4411 pyshapelib_api.h can be found.
4412
4413 * extensions/thuban/wxproj.cpp (pyshapelib_api): New variable that
4414 holds the pyshapelib C-API
4415 (draw_polygon_shape, point_in_polygon_shape, shape_centroid): Use
4416 pyshapelib_api to access the shapelib functions.
4417 (initwxproj): Import the c_api from the shapelib module and
4418 initialize pyshapelib_api.
4419
4420 2002-04-04 Bernhard Herzog <[email protected]>
4421
4422 * setup.py (thuban_bdist_rpm.initialize_options): Use
4423 initialize_options to create the scripts for the rpm.
4424
4425 * extensions/pyprojection/setup.py (PROJ4_PREFIX): Just use /
4426
4427 2002-04-03 Bernhard Herzog <[email protected]>
4428
4429 * setup.py: Increment version to 0.1.1
4430
4431 * Thuban/UI/mainwindow.py (MainWindow.__init__): Move the "Add
4432 Layer" and "Remove Layer" commands from the layer menu to the map
4433 menu
4434
4435 2002-02-15 Bernhard Herzog <[email protected]>
4436
4437 * Thuban/Model/layer.py (Layer.Shape): list append only takes one
4438 argument (python <= 1.5.2 erroneously accepted multiuple
4439 arguments)
4440
4441 2002-02-04 Bernhard Herzog <[email protected]>
4442
4443 * Thuban/UI/identifyview.py (IdentifyGridCtrl): New class to use a
4444 RecordGrid in the identifyview.
4445 (IdentifyView.__init__): Use IdentifyGridCtrl instead of
4446 IdentifyListCtrl. The grid allows editing of the values.
4447
4448 * Thuban/UI/controls.py (RecordTable, RecordGridCtrl): New classes
4449 implementing a grid for a single row of a thuban table.
4450
4451 * Thuban/UI/view.py (MapCanvas.SelectShapeAt): Search through all
4452 layers by default. Easier to use than the previous default of only
4453 searching through the select layer which meant that if no layer
4454 was selected, you couldn't select a shape.
4455
4456 * Thuban/UI/tableview.py (TableGrid.__init__): Fix typo
4457
4458 * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Honour the
4459 stroke_width attribute
4460
4461 * Thuban/Model/save.py (save_session): Write the new stroke_width
4462 attribute
4463
4464 * Thuban/Model/load.py (ProcessSession.startElement): Read the
4465 stroke_width attribute
4466
4467 * Thuban/Model/layer.py (Layer.__init__): New parameter and
4468 instance variable stroke_width
4469 (Layer.SetStrokeWidth): Set the stroke_width.
4470
4471 2002-02-01 Bernhard Herzog <[email protected]>
4472
4473 * extensions/thuban/wxproj.cpp (project_points): Fix two
4474 off-by-one errors in the last loop that joins the various parts
4475 together.
4476
4477 2002-01-14 Bernhard Herzog <[email protected]>
4478
4479 * setup.py (data_dist.make_distribution): Fix some typos
4480
4481 2001-09-18 Bernhard Herzog <[email protected]>
4482
4483 * README: Slight tweaking in preparation for the 0.1 release
4484
4485 * setup.cfg: Add section for sdist to create both tgz and zip
4486 archives
4487
4488 * setup.py: increase version number to 0.1
4489 (data_dist): New command class for data distribution
4490
4491 2001-09-14 Bernhard Herzog <[email protected]>
4492
4493 * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
4494 Handle the case of no layer (i.e. layer is None) properly.
4495
4496 * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
4497 Set the initial selection of the combo boxes to reflect the
4498 projection we're starting with in a way that works on windows,
4499 too.
4500
4501 * Thuban/Lib/connector.py (Connector.print_connections): Print the
4502 puiblisher's ids in hex to make it easier to compare them to the
4503 standard repr of python methods
4504
4505 * Thuban/Model/map.py (Map.Destroy): Unsubscribe the label_layer
4506 messages
4507
4508 2001-09-13 Bernhard Herzog <[email protected]>
4509
4510 * Thuban/UI/tree.py (SessionTreeCtrl.OnSelChanged): Make sure to
4511 deselect the layer if no layer is selected
4512
4513 * Thuban/UI/view.py (MapCanvas.OnPaint): Only delay drawing to
4514 idle time when there actually is something to draw. If there's
4515 nothing to draw simply clear the window
4516 (MapCanvas.do_redraw): Call dc.EndDrawing and add some comments.
4517 (MapCanvas.SetMap): force a redraw in all cases because
4518 FitMapToWindow doesn't always do it.
4519 (MapCanvas.ZoomFactor): Add an optional parameter, center, to
4520 specify the point to move into the center of the window
4521 (ZoomOutTool.MouseUp, ZoomInTool.MouseUp): If the mouse wasn't
4522 dragged, zoon in/out by a factor of 2
4523 (MapCanvas.find_shape_at): Iterate backwards (i.e. with decreasing
4524 index, i.e. reversed drawing order) so that objects appearing to
4525 be in from of others are selected first. This is probably mostly
4526 relevant for point shapes where the symbols used may overlap
4527
4528 * Thuban/Model/session.py (create_empty_session): Unset the
4529 modified bit before returning it
4530
4531 * Thuban/UI/mainwindow.py (MainWindow.NewSession): Use
4532 create_empty_session session to create the new, empty session.
4533
4534 * Thuban/UI/mainwindow.py (MainWindow.__init__): Set the size of
4535 the tool bitmaps.
4536 (MainWindow.OnClose, MainWindow.save_modified_session): Separate
4537 the code that asks whether the session should be saved into the
4538 new method save_modified_session.
4539 (MainWindow.OpenSession, MainWindow.NewSession): Use the new
4540 method to save modified session here too.
4541
4542 2001-09-11 Bernhard Herzog <[email protected]>
4543
4544 * setup.py (InnoIconItem): fix typo
4545
4546 (thuban_bdist_inno.run):
4547 (bdist_inno.run): Move the decision not to create symlinks on
4548 non-nt platforms to thuban_bdist_inno and do it unconditinally
4549 since we never want to create the symlinks here
4550
4551 2001-09-10 Bernhard Herzog <[email protected]>
4552
4553 * Thuban/UI/mainwindow.py (MainWindow.IdentifyTool): Popup the
4554 identify view immediately
4555
4556 * Thuban/UI/controls.py: New file with two classes RecordListCtrl
4557 and SelectableRecordListCtrl that implement the code shared by the
4558 identify view and the label dialog
4559
4560 * Thuban/UI/identifyview.py (IdentifyListCtrl): Derive from the
4561 new class RecordListCtrl
4562
4563 * Thuban/UI/labeldialog.py (LabelDialog.OnOK): Check whether the
4564 return value of GetValue is None instead of using it as a boolean
4565 directly so that Zero numbers are handled properly.
4566 (LabelListCtrl): Derive from the new class
4567 SelectableRecordListCtrl
4568
4569 * Thuban/UI/proj4dialog.py (Proj4Dialog.__init__):
4570 (Proj4Dialog.dialogLayout): Make the window resizable and set the
4571 size of the text control explicitly to make the sizers work on
4572 both Windows and X.
4573
4574 2001-09-07 Bernhard Herzog <[email protected]>
4575
4576 * Thuban/UI/view.py (MapCanvas.find_shape_at):Add a new parameter
4577 that can limit the search to the currently selected layer.
4578 (MapCanvas.SelectShapeAt): Make sure that the currently selected
4579 layer stays selected even when no shape is found
4580 (MapCanvas.FitRectToWindow): If the rect has zero with or zero
4581 height do nothing (avoids zero division errors)
4582
4583 2001-09-06 Bernhard Herzog <[email protected]>
4584
4585 * Thuban/UI/tree.py (SessionTreeCtrl, SessionTreeView.__init__):
4586 Correct the spelling of SessionTreeCtrl. dabbrev is too damn
4587 convenient :-)
4588 (SessionTreeCtrl.__init__, SessionTreeCtrl.update_tree): Introduce
4589 a new instvar layer_to_item to map layers to tree items
4590 (SessionTreeCtrl.layer_selected): Select the appropriate tree item
4591 to match the current selection in the interactor
4592
4593 * Thuban/UI/interactor.py (Interactor.SelectedLayer):
4594 (Interactor.HasSelectedLayer): New methods to query the current
4595 selection
4596
4597 * Thuban/UI/mainwindow.py (MainWindow.current_layer):
4598 (MainWindow.has_selected_layer): Simply call the appropriate
4599 interactor method
4600
4601 * Thuban/UI/mainwindow.py (MainWindow.__init__):
4602 (MainWindow.LayerShowTable):
4603 (MainWindow.identify_view_on_demand): Store the interactor in an
4604 instvar and use that reference instead of going through main.app
4605
4606 * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
4607 * Thuban/UI/application.py (ThubanApplication.OnInit):
4608 * Thuban/UI/main.py (main): Create the session tree view in main
4609 with the new mainwindow method ShowSessionTree and not directly
4610 the application's OnInit method
4611
4612 * Thuban/UI/tree.py (myTreeCtrlPanel):
4613 (SessioinTreeCtrl): Rename to SessioinTreeCtrl and turn it into a
4614 TreeCtrl isntead of a panel. This affects most method since we now
4615 refer to self instead of self.tree
4616 (SessionTreeView): New class implementing a non-modal dialog
4617 showing the session tree.
4618
4619 * Thuban/UI/mainwindow.py (MainWindow.LayerShowTable): Pass the
4620 layer to the tableview dialog.
4621
4622 * Thuban/UI/tableview.py: Add some doc-strings
4623 (TableGrid):
4624 (TableGrid.OnRangeSelect):
4625 (TableGrid.OnSelectCell):
4626 (TableFrame.__init__):
4627 (TableFrame.row_selected):
4628 Selecting rows in the grid view now updates the selected shapes
4629 through the TableFrame. To achieve this we derive TableGrid from
4630 Publisher and introduce the message type ROW_SELECTED which the
4631 TableFrame subscribes to and which is issued by OnRangeSelect and
4632 OnSelectCell
4633
4634 (DataTable.SelectRow): Removed because it's no longer needed in
4635 the row/shape selection scheme
4636
4637 * Thuban/UI/dialogs.py: New file implementing common classes for
4638 dialogs
4639
4640 * Thuban/UI/tableview.py (TableGrid.__init__): Don't subscribe to
4641 the SELECTED_SHAPE message anymore. This is now handled by the
4642 parent.
4643 (TableGrid.select_shape): Only update the selection if the shape
4644 is not None.
4645 (TableFrame): Inherit from the new NonModalDialog class.
4646 (TableFrame.__init__, TableFrame.select_shape): Handle the
4647 SELECT_SHAPE message.
4648 (TableFrame.OnClose): Extend the inherited method to unsubscribe
4649 SELECT_SHAPE
4650
4651 * Thuban/UI/mainwindow.py (MainWindow.init_dialogs):
4652 (MainWindow.add_dialog):
4653 (MainWindow.dialog_open):
4654 (MainWindow.remove_dialog):
4655 (MainWindow.get_open_dialog): New methods to maintain a dictionary
4656 of opened non-modal dialogs.
4657
4658 (MainWindow.__init__): Initialize the new non-modal dictionary
4659 management code
4660 (MainWindow.LayerShowTable): maintain separate dialogs for each
4661 table using the non-modal dialog management code to only open a
4662 view once for each table.
4663
4664 (MainWindow.IdentifyTool):
4665 (MainWindow.__init__):
4666 (MainWindow.identify_view_on_demand): Don't open the identify view
4667 in IdentifyTool anymore. This will be done automatically by the
4668 new method identify_view_on_demand which handles the
4669 SELECTED_SHAPE message so that the identify view will be opened on
4670 demand
4671
4672 * Thuban/UI/identifyview.py (IdentifyListCtrl.__init__): Remove
4673 the interactor argument. The SELECTED_SHAPE message is now handled
4674 by the parent.
4675 (IdentifyView.__init__): Add the interactor argument so that we
4676 can handle the SELECTED_SHAPE message here
4677 (IdentifyView.selected_shape): New method to handle the
4678 SELECTED_SHAPE messages
4679
4680 * Thuban/UI/identifyview.py (IdentifyView): Derive from the new
4681 NonModalDialog class
4682 (IdentifyView.OnClose): Extend the inherited version to
4683 unsubscribe SELECT_SHAPE
4684
4685 * Thuban/Model/session.py (Session.UnsetModified): Remove debug prints
4686
4687 2001-09-05 Bernhard Herzog <[email protected]>
4688
4689 * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
4690
4691 * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
4692 interactor to pass through to the MapCanvas
4693
4694 * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
4695 argument to the MainWindow constructor to get rid of the ugly hack
4696 that made main.app available early just so that the mapcanvas
4697 could access the interactor object.
4698
4699 2001-09-04 Bernhard Herzog <[email protected]>
4700
4701 * Thuban/UI/mainwindow.py (MainWindow.RunMessageBox): New method
4702 that runs a modal message box
4703 (MainWindow.OnClose): Use the new method
4704 (MainWindow.RemoveLayer): Just do nothing in case no layer is
4705 selected. The command should be grayed out anyway, so there's no
4706 need to pop up a message box.
4707 (MainWindow.AddLayer): Pop up a message box with an error message
4708 if the shape file can't be opened
4709
4710 * Thuban/Model/layer.py (Layer.__init__): Open the shapefile
4711 immediately. This will cause an exception in case the file can't
4712 be opened and we can display an appropriate message.
4713
4714 * MANIFEST.in: Add extensions/pyprojection/LICENSE
4715
4716 * setup.py (thuban_bdist_rpm): New class implementing a Thuban
4717 specific bdist_rpm command.
4718
4719 * Thuban/UI/main.py: Catch ImportError exceptions when importing
4720 the locale module because it may not be available on some
4721 installations.
4722
4723 * extensions/pyprojection/LICENSE: Copy of the license text in
4724 Projection.i. Having it in a separate file makes it easier to
4725 refer to license text in e.g. RPMs
4726
4727 2001-09-03 Bernhard Herzog <[email protected]>
4728
4729 * setup.py: use wx-config instead of wxgtk-config because it's
4730 more generic
4731
4732 * setup.py (ThubanInstall.get_outputs): Add the symlink in
4733 <prefix>/bin to the outputs
4734 (ThubanInstall.link_file): New method to link files. We need this
4735 because the standard copy_files refuses to link non-existing
4736 files.
4737 (ThubanInstall.run): Remove the leading install root from the
4738 script filename if an install root was specified and use the new
4739 link_file method
4740
4741 * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
4742 the window when the first layer is added to the map.
4743
4744 * setup.py (ThubanInstall.run): Honor the build root (self.root)
4745 when linking thuban.py to <prefix>/bin
4746
4747 2001-08-31 Bernhard Herzog <[email protected]>
4748
4749 * setup.py: In the setup call, the install parameters shouldn't
4750 have trailing slashes because distutils on non-posix platforms
4751 doesn't like that. The same applies to other directories like
4752 "Resources/Bitmaps"
4753
4754 In the configuration section for nt, move the wxWindows directory
4755 optins into the part clearly marked as editable.
4756
4757 (InstallLocal.initialize_options):
4758 (InstallLocal.user_options): remove the currently unused debug
4759 flag
4760 (thuban_build_py.find_all_modules): Add this method so that it
4761 works for our case of having packages and modules in one
4762 distribution as well.
4763 (ThubanInstall.initialize_options):
4764 (ThubanInstall.finalize_options):
4765 (ThubanInstall.user_options):
4766 (ThubanInstall.boolean_options): Add new options, do-symlink and
4767 extra files. Since these are the first ThubanInstall specific
4768 options, override user_options and boolean_options
4769 (ThubanInstall.run): Honor the new do-symlink and extra-files
4770 options.
4771 (ThubanInstall.get_outputs): Add to override the base-class's
4772 version and add the extra-files to the outputs
4773 (bdist_inno): New class for windows distributions with Inno Setup
4774 (InnoIconItem): Helper class for bdist_inno
4775 (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
4776 this together with the appropriate parameters, to the setup call.
4777
4778 * setup.cfg (bdist_inno): added new section for the inno setup
4779 installer
4780
4781 * Thuban/UI/tree.py (myTreeCtrlPanel.__init__): New inst var
4782 changing_selection to avoid recursive selection events when
4783 modifying the selection in response to a selection event.
4784 (myTreeCtrlPanel.normalize_selection): Set the new inst var when
4785 changing the tree's selection.
4786 (myTreeCtrlPanel.OnSelChanged): Only normalize the selection when
4787 we're not being called indirectly from normalize_selection.
4788
4789 * Thuban/UI/mainwindow.py (MainWindow.update_command_ui): Call
4790 event.Check only if the command is actuall checkable.
4791 (MainWindow.__init__): Call the toolbar's Realize method to make
4792 sure that the items are actually shown
4793
4794 2001-08-28 Bernhard Herzog <[email protected]>
4795
4796 * setup.py: Fix some doc strings
4797
4798 * ChangeLog: started
4799

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26