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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 865 - (show annotations)
Thu May 8 12:35:14 2003 UTC (21 years, 10 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 129421 byte(s)
Import Thuban.UI.scalebar

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26