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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1203 - (show annotations)
Fri Jun 13 16:01:26 2003 UTC (21 years, 9 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 184700 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26