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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1312 - (show annotations)
Thu Jun 26 17:01:28 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 205961 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26