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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1208 - (show annotations)
Fri Jun 13 18:16:15 2003 UTC (21 years, 8 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 185027 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26