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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1046 - (show annotations)
Tue May 27 06:54:29 2003 UTC (21 years, 9 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 158254 byte(s)
UI update

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26