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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1329 - (show annotations)
Tue Jul 1 12:02:11 2003 UTC (21 years, 8 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 206904 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26