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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 924 - (show annotations)
Mon May 19 09:12:42 2003 UTC (21 years, 9 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 138061 byte(s)
Extended version information for Thuban

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26