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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1021 - (show annotations)
Fri May 23 13:03:50 2003 UTC (21 years, 9 months ago) by jan
Original Path: trunk/thuban/ChangeLog
File size: 154953 byte(s)
Give all tables a title via mix-in TitledObject.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26