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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1220 - (show annotations)
Mon Jun 16 17:43:09 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 187644 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26