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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 924 - (hide annotations)
Mon May 19 09:12:42 2003 UTC (21 years, 9 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 138061 byte(s)
Extended version information for Thuban

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26