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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 917 - (show annotations)
Fri May 16 16:26:57 2003 UTC (21 years, 10 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 137134 byte(s)
Printing enhancement and WMF export (under Win32)

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26