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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1349 - (show annotations)
Tue Jul 1 16:12:38 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 211646 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26