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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 899 - (show annotations)
Mon May 12 12:20:10 2003 UTC (21 years, 9 months ago) by jonathan
Original Path: trunk/thuban/ChangeLog
File size: 134751 byte(s)
updated ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26