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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 999 - (show annotations)
Thu May 22 19:29:50 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 152214 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26