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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 870 - (show annotations)
Thu May 8 14:06:32 2003 UTC (21 years, 10 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 129748 byte(s)
Coding style updates.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26