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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1195 - (show annotations)
Fri Jun 13 13:02:39 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 181912 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26