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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26