/[thuban]/branches/greater-ms3/thuban/ChangeLog
ViewVC logotype

Contents of /branches/greater-ms3/thuban/ChangeLog

Parent Directory Parent Directory | Revision Log Revision Log


Revision 983 - (show annotations)
Thu May 22 12:02:30 2003 UTC (21 years, 9 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 147372 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26