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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1242 - (show annotations)
Thu Jun 19 09:26:10 2003 UTC (21 years, 8 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 191979 byte(s)
MERGE from the greater-ms3 branch.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26