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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 908 - (show annotations)
Fri May 16 15:01:18 2003 UTC (21 years, 10 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 135887 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26