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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1237 - (show annotations)
Wed Jun 18 15:30:14 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 191043 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26