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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1265 - (show annotations)
Fri Jun 20 14:16:10 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 196732 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26