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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26