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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 927 - (show annotations)
Mon May 19 12:09:25 2003 UTC (21 years, 9 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 138262 byte(s)
Bugfix update.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26