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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 975 - (show annotations)
Wed May 21 17:39:51 2003 UTC (21 years, 9 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 145800 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26