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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 359 by bh, Mon Dec 9 10:32:51 2002 UTC revision 867 by frank, Thu May 8 13:42:36 2003 UTC
# Line 1  Line 1 
1    2003-05-08  Frank Koormann <[email protected]>
2    
3            * Thuban/UI/scalebar.py
4            (ScaleBar.DrawScalebar): Format string bug fixed.
5    
6    2003-05-08  Frank Koormann <[email protected]>
7    
8            Reorganization of scalebar component (no wx in Thuban/Model)
9    
10            * Thuban/Model/scalebar.py: Rendering moved to Thuban/UI/scalebar.py
11            (deriveInterval):
12            Calculate scalebar interval and unit which fits in width for scale.
13            (roundInterval): Round float.
14    
15            * Thuban/UI/scalebar.py (ScaleBar): Scalebar rendering
16    
17            * test/test_scalebar.py: Test for Thuban/Model/scalebar.py methods.
18    
19            * Thuban/UI/legend.py: Import Thuban.UI.scalebar
20    
21    2003-05-08  Frank Koormann <[email protected]>
22    
23            * Thuban/UI/legend.py (ScalebarBitmap.SetCanvas):
24            Initialize ScaleBar with canvas.map
25    
26            * Thuban/Model/scalebar.py (ScaleBar.roundInterval()): New,
27            round intervals to display smarter lengths
28            (ScaleBar.DrawScalebar): Draw Scalebar only if the map contains a
29            layer. If the maps has no projection applied grey the scalebar.
30    
31    2003-05-07  Frank Koormann <[email protected]>
32            
33            Basic Scalebar features added.
34    
35            * Thuban/Model/scalebar.py (ScaleBar): New, scalebar rendering.
36    
37            * Thuban/UI/legend.py (LegendPanel): Added scalebar bitmap
38            (ScaleBarBitmap): New, links the scalebar bitmap with view messages
39            and the renderer.
40    
41            * Thuban/UI/view.py (MapCanvas.set_view_transform): Issue SCALE_CHANGED.
42    
43            * Thuban/UI/messages.py: SCALE_CHANGED added.
44    
45    2003-05-07  Bernhard Herzog  <[email protected]>
46    
47            * Thuban/Model/session.py (Session.__init__): New instance
48            variable shapestores to hold a list of all open shapestore objects
49            (Session.ShapeStores): New. Accessor method for the shapestores
50            list.
51            (Session._add_shapestore, Session._clean_weak_store_refs): New.
52            Internal methods to maintain the shapestores list.
53            (Session.Tables): New. Return all tables open in the session.
54            (Session.OpenShapefile): Insert the new ShapeStore into the
55            shapestores list.
56    
57            * test/test_session.py (TestSessionSimple.test_initial_state): Add
58            tests for ShapeStores and Tables
59            (TestSessionWithContent.test_shape_stores)
60            (TestSessionWithContent.test_tables): New. Test cases for
61            ShapeStores and Tables
62    
63    2003-05-07  Bernhard Herzog  <[email protected]>
64    
65            * Thuban/Model/transientdb.py (TransientTableBase.ReadRowAsDict):
66            Add comments about the optimizations used.
67            (AutoTransientTable.ReadValue, TransientTableBase.ReadValue): New.
68            Implement the ReadValue table interface method.
69    
70            * test/test_transientdb.py
71            (TestTransientTable.run_iceland_political_tests)
72            (TestTransientTable.test_transient_joined_table): Add tests for
73            ReadValue
74    
75    2003-05-07  Frank Koormann <[email protected]>
76    
77            * Resources/Bitmaps/fulllayerextent.xpm,
78            Resources/Bitmaps/fullselextent.xpm: Replaced the place holders with
79            new icons.
80    
81    2003-05-06  Bernhard Herzog  <[email protected]>
82    
83            * Thuban/Model/transientdb.py (AutoTransientTable.SimpleQuery):
84            New. Simply delegate to the transient table's version.
85    
86            * test/test_transientdb.py
87            (TestTransientTable.test_auto_transient_table_query): New. Test
88            case for AutoTransientTable's SimpleQuery
89    
90    2003-05-06  Bernhard Herzog  <[email protected]>
91    
92            * Thuban/Model/transientdb.py (TransientTableBase.SimpleQuery):
93            Implement a simple query method for the query dialog
94            (TransientTableBase.create): Add an INTEGER PRIMARY KEY that holds
95            the row index or shapeid.
96            (TransientTable.create): Insert the right value of the row index
97            (TransientJoinedTable.create): Copy the row index of the left
98            table to the joined result table
99    
100            * test/test_transientdb.py
101            (TestTransientTable.test_transient_table_read_twice): Fix
102            doc-string
103            (TestTransientTable.test_transient_table_query): New. Test for the
104            SimpleQuery method
105    
106    2003-05-06  Bernhard Herzog  <[email protected]>
107    
108            Convert all table users to use the new table interface. This only
109            covers Thuban itself, not GREAT-ER or other applications built on
110            Thuban yet, so the compatibility interface stays in place for the
111            time being but it now issues DeprecationWarnings.
112    
113            Finally, the new Table interface has a new method, HasColumn.
114    
115            * Thuban/Model/table.py (OldTableInterfaceMixin): All methods
116            issue deprecation warnings when they're. The warnings refer to the
117            caller of the method.
118            (OldTableInterfaceMixin.__deprecation_warning): New. Helper method
119            for the deprecation warnings
120    
121            * test/test_table.py: Ignore the deprecation warnings for the old
122            table in the tests in this module. The purpose of the tests is to
123            test the old interface, after all.
124    
125            * test/test_transientdb.py
126            (TestTransientTable.run_iceland_political_tests): Use the
127            constants for the types. Add a test for HasColumn
128            (TestTransientTable.test_transient_joined_table): Adapt to new
129            table interface. Add a test for HasColumn
130            (TestTransientTable.test_transient_table_read_twice): Adapt to new
131            table interface
132    
133            * Thuban/UI/tableview.py (DataTable.SetTable, DataTable.GetValue):
134            Adapt to new table interface
135    
136            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Adapt to
137            new table interface
138    
139            * Thuban/UI/controls.py (RecordListCtrl.fill_list)
140            (RecordTable.SetTable): Adapt to new table interface
141    
142            * Thuban/UI/classifier.py (Classifier.__init__)
143            (Classifier.__init__): Adapt to new table interface
144    
145            * Thuban/UI/classgen.py (ClassGenDialog.__init__)
146            (GenUniformPanel._OnRetrieve, GenUniquePanel._OnRetrieve): Adapt
147            to new table interface
148    
149            * Thuban/Model/transientdb.py (TransientTableBase.HasColumn)
150            (AutoTransientTable.HasColumn): Implement the new table interface
151            method
152            (AutoTransientTable.ReadRowAsDict, AutoTransientTable.ValueRange)
153            (AutoTransientTable.UniqueValues): Adapt to new table interface
154    
155            * Thuban/Model/layer.py (Layer.SetShapeStore, Layer.GetFieldType):
156            Adapt to new table interface
157    
158            * test/test_layer.py (TestLayer.open_shapefile): Helper method to
159            simplify opening shapefiles a bit easier.
160            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
161            (TestLayer.test_point_layer): Use the new helper method
162            (TestLayer.test_get_field_type): New. Test for the GetFieldType
163            method
164    
165            * test/test_dbf_table.py (TestDBFTable.test_has_column): Test for
166            the new table method
167    
168            * test/test_memory_table.py (TestMemoryTable.test_has_column):
169            Test for the new table method HasColumn
170    
171    2003-05-06  Jonathan Coles   <[email protected]>
172    
173            Addresses the "Selection Extent" wish of RTbug #1787.
174    
175            * Resources/Bitmaps/fulllayerextent.xpm,
176            Resources/Bitmaps/fullselextent.xpm: Bitmaps for layer and selection
177            extent. These are just place holders for the real bitmaps.
178    
179            * Thuban/Model/layer.py (Shape): Since a Shape is immutable only
180            calculate the bounding box once (the first time compute_bbox() is
181            called).
182            (Layer.ShapesBoundingBox): New. Given a list of shape ids, return
183            the bounding box for the shapes in lat/long coordinates.
184    
185            * Thuban/UI/mainwindow.py: Added new "Full selection extent" menu
186            option.
187            (MainWindow.has_selected_shapes): New. Returns true if there are
188            any selected shapes.
189            (MainWindow.FullSelectionExtent): New. Calls
190            MapCanvas.FitSelectedToWindow() when the user selects the menu option.
191            (_has_selected_shapes): New. Returns true if there are any
192            selected shapes.
193    
194            * Thuban/UI/selection.py (Selection.HasSelectedShapes): New. Returns
195            true if there are any selected shapes.
196    
197            * Thuban/UI/view.py (MapCanvas): Added delegated method
198            HasSelectedShapes.
199            (MapCanvas.FitSelectedToWindow): New. Centers and scales any selected
200            shapes on the canvas using the map projection (if any).
201    
202            * test/test_layer.py (TestLayer.test_arc_layer): Add some tests
203            for Layer.ShapesBoundingBox().
204    
205    2003-05-06  Bernhard Herzog  <[email protected]>
206    
207            * Resources/Projections/defaults.proj: Fix spelling of Mercator
208    
209    2003-05-05  Jonathan Coles   <[email protected]>
210    
211            Addresses the "Full Layer Extent" wish of RTbug #1787.
212    
213            * Resources/Projections/defaults.proj: Added UK National Grid.
214    
215            * Thuban/UI/mainwindow.py: Added new "Full layer extent" menu option.
216            (MainWindow.FullLayerExtent): New. Calls MapCanvas.FitLayerToWindow()
217            when the user selects the menu option.
218    
219            * Thuban/UI/view.py (MapCanvas.FitLayerToWindow): New. Centers and
220            scales the given layer on the canvas using the map projection.
221    
222    2003-05-05  Bernhard Herzog  <[email protected]>
223    
224            Convert the table implementations to a new table interface. All
225            tables use a common mixin class to provide backwards compatibility
226            until all table users have been updated.
227    
228            * Thuban/Model/table.py (OldTableInterfaceMixin): Mixin class to
229            provide backwards compatibility for table classes implementing the
230            new interface
231            (DBFTable, MemoryTable): Implement the new table interface. Use
232            OldTableInterfaceMixin as base for compatibility
233            (DBFColumn, MemoryColumn): New. Column description for DBFTable
234            and MemoryTable resp.
235    
236            * test/test_dbf_table.py: New. Test cases for the DBFTable with
237            the new table interface.
238    
239            * test/test_memory_table.py: New. Test cases for the MemoryTable
240            with the new table interface.
241    
242            * test/test_table.py: Document the all tests in this file as only
243            for backwards compatibility. The equivalent tests for the new
244            interface are in test_memory_table.py and test_dbf_table.py
245            (MemoryTableTest.test_read): field_info should be returning tuples
246            with four items
247            (MemoryTableTest.test_write): Make doc-string a more precise.
248    
249            * Thuban/Model/transientdb.py (TransientTableBase): Convert to new
250            table interface. Derive from from OldTableInterfaceMixin for
251            compatibility.
252            (TransientTableBase.create): New intance variable column_map to
253            map from names and indices to column objects
254            (TransientTable.create): Use the new table interface of the input
255            table
256            (AutoTransientTable): Convert to new table interface. Derive from
257            from OldTableInterfaceMixin for compatibility.
258            (AutoTransientTable.write_record): Removed. It's not implemented
259            yet and we still have to decide how to handle writing with the new
260            table and data framework.
261    
262            * test/test_transientdb.py
263            (TestTransientTable.run_iceland_political_tests)
264            (TestTransientTable.test_transient_joined_table): Use the new
265            table interface
266    
267    2003-05-05  Jonathan Coles   <[email protected]>
268    
269            This is namely a collection of UI updates to improve user interactivity.
270            Tabbing between controls now exists and you can use ESC to close dialog
271            boxes; ENTER will active the default button.
272    
273            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Rearrange the
274            order that the controls are created so that tabbing works correctly.
275            (ClassGenDialog.OnOK): Renamed from _OnGenerate() so that the
276            wxDialog can handle the default button correctly.
277            (ClassGenDialog.OnCancel): Renamed from _OnCloseBtn() for the
278            same reasons as for OnOK.
279            (GenUniformPanel._OnRetrieve): Call wxBeginBusyCursor/wxEndBusyCursor
280            when we ask the table for the maximum/minimum values of a field
281            which could take a very long time.
282    
283            * Thuban/UI/classifier.py (Classifier.__init__): Rearrange the
284            order that the controls are created so that tabbing works correctly.
285            (SelectPropertiesDialog.__init__): Rearrange the order that the
286            controls are created so that tabbing works correctly.
287    
288            * Thuban/UI/dialogs.py: Copied NonModalDialog box and changed it
289            to derive from a wxDialog but behave like the original implementation
290            which was derived from a wxFrame. wxDialog provides useful key
291            handling functionality like ESC calling OnCancel and ENTER calling
292            OnOK which is lost with wxFrame.
293    
294            * Thuban/UI/mainwindow.py: Add "..." to menu items that will open
295            new dialogs.
296    
297            * Thuban/UI/projdialog.py (ProjFrame.__init__): Rearrange the
298            order that the controls are created so that tabbing works correctly.
299            (ProjFrame.OnApply): Renamed from _OnTry() to use wxDialog behaviour.
300            (ProjFrame.OnOK): Renamed from _OnOK() to use wxDialog behaviour.
301            (ProjFrame.OnCancel): Renamed from _OnClose() to use wxDialog behaviour.
302            (ProjPanel.__init__): Add "Airy" to the list of ellipsoids so we
303            can provide the "UK National Grid" as a default projection.
304            (UTMPanel.__init__): Rearrange the order that the controls are
305            created so that tabbing works correctly.
306    
307    2003-05-05  Bernhard Herzog  <[email protected]>
308    
309            * extensions/thuban/wxproj.cpp: Fix some of the comments.
310            (project_point): If a map projection but no layer projection is
311            given, convert degrees to radians before applying the map
312            projection.
313    
314            * Thuban/UI/tableview.py (TableGrid.disallow_messages)
315            (TableGrid.allow_messages): New methods to make it possible to
316            inhibit message sending.
317            (TableGrid.issue): Only send the message if not inhibited.
318            (LayerTableGrid.select_shape): Use the new methods to make sure
319            that no ROW_SELECTED message is sent while we're updating the
320            selected rows to match the selected shapes.
321    
322    2003-05-02  Jan-Oliver Wagner <[email protected]>
323    
324            Implementation of MemoryTable.
325    
326            * Thuban/Model/table.py (MemoryTable): New. Quite simple table
327            implementation that operates on a list of tuples. All of the data
328            are kept in the memory.
329    
330            * test/test_table.py (MemoryTableTest): New.
331    
332            * test/test_transientdb.py (SimpleTable): Removed.
333            (TestTransientTable.test_transient_joined_table,
334            (TestTransientTable.test_transient_table_read_twice): Replaced
335            SimpleTable by MemoryTable.
336    
337    2003-04-30  Jonathan Coles   <[email protected]>
338    
339            * Data/iceland_sample.thuban: Now contains correct projections
340            for each of the layers.
341    
342            * Resources/Projections/defaults.proj: Geographic projection
343            contains unit conversion parameter.
344    
345    2003-04-30  Jonathan Coles   <[email protected]>
346    
347            The most important part of this putback is the projection changes.
348            It should now be possible to specify the projection that a layer
349            is in and then specify a different projection for the map. The
350            projection dialog has an extra parameter for a geographic projection
351            which lets the user select if the input is in degrees or radians.
352    
353            * Thuban/Model/layer.py (Layer.ShapesInRegion): Fix docstring
354            to say that the parameter is a tuple of unprojected
355            points (which is what the callers to this method were assuming).
356            Also, since the points are unprojected we need to projected them.
357    
358            * Thuban/UI/legend.py (LegendTree.MoveCurrentItemUp,
359            LegendTree.MoveCurrentItemDown): If the layer or any of the layer's
360            groups are selected, move the layer up/down. Fixes RTbug #1833.
361    
362            * Thuban/UI/mainwindow.py: Move menu item map_rename up.
363    
364            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Add missing
365            parameter in call to SetClientData.
366            (GeoPanel): Add support for selecting the units that the
367            source data is in (Radians or Degrees).
368    
369            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Optimize
370            the rendering loop by reducing the number of if's, removing the
371            unnecessary try/except block, and checking if the old group
372            is the same as the new one (which happens a lot if there is
373            no classification, or lots of shapes are in the same group).
374    
375            * Thuban/UI/view.py (MapCanvas.OnPaint): Add a try/except block
376            around the redraw routine to try to catch problems that the user
377            may create by selecting invalid projections for the data set and
378            map. Clears the display if there are any problems and prints the
379            error.
380            (MapCanvas.do_redraw): Use DC.Clear() instead of drawing a filled
381            rectangle.
382    
383            * extensions/thuban/wxproj.cpp (project_point): First invert the
384            supplied point (which should be in projected coordinates) using
385            the layer's projection and then project the point using the
386            map's projection.
387            (project_points): Use project_point() to project each point.
388    
389    2003-04-30  Jan-Oliver Wagner <[email protected]>
390    
391            * Thuban/Model/layer.py (Layer.SetShapeStore): Fixed a bug:
392            don't set the Classification to None if the classfication field
393            is None (ie only a DEFAULT).
394    
395    2003-04-30  Bernhard Herzog  <[email protected]>
396    
397            * Thuban/UI/view.py: Fix some typos.
398    
399            * Thuban/UI/mainwindow.py (MainWindow.identify_view_on_demand): Do
400            not pop up the dialog if the selection becomes empty (this could
401            happen if e.g. a new selection is opened while the identify tool
402            is active and dialog had been closed)
403    
404    2003-04-30  Bernhard Herzog  <[email protected]>
405    
406            * Thuban/Model/transientdb.py (TransientTableBase.__init__): New
407            instance variable read_record_last_result
408            (TransientTableBase.read_record): Make sure reading the same
409            record twice works. The implementation uses the new instance
410            variable read_record_last_result
411    
412            * test/test_transientdb.py
413            (TestTransientTable.test_transient_table_read_twice): New test
414            case for the above bug-fix.
415    
416    2003-04-29  Jonathan Coles   <[email protected]>
417    
418            * Thuban/common.py: Removed. No longer needed Str2Num. RTbug #1832.
419    
420            * Thuban/UI/classgen.py: Remove all uses of Str2Num.
421    
422            * Thuban/UI/classifier.py: Remove all uses of Str2Num.
423            (ClassTable.SetValueAsCustom): Rename keyword argument in
424            ClassGroup* constructors to match argument name.
425    
426    2003-04-29  Bernhard Herzog  <[email protected]>
427    
428            * Thuban/Model/session.py (Session.Destroy): Explicitly close the
429            transient DB if it exists to make sure it doesn't leave a journal
430            file in the temp directory.
431    
432            * Thuban/Model/transientdb.py (TransientDatabase.close): Set
433            self.conn to None after closing the connection to make sure it's
434            not closed twice
435    
436    2003-04-29  Jonathan Coles   <[email protected]>
437    
438            Add a visible parameter in the layer XML tag. The default value is
439            "true". If anything other than "false" is specified we also assume
440            "true". Addresses RTbug #1025.
441    
442            * Doc/thuban.dtd: Add visible parameter to a layer.
443    
444            * Thuban/Model/layer.py (BaseLayer.__init__): Change default value
445            of visible from 1 to True.
446            (Layer.__init__): Change default value of visible from 1 to True.
447    
448            * Thuban/Model/load.py (SessionLoader.start_layer): Read visible
449            parameter.
450    
451            * Thuban/Model/save.py (SessionSaver.write_layer): Save visible
452            parameter.
453    
454            * test/test_load.py: Add new test data contents_test_visible.
455            (LoadSessionTest.setUp): save test data.
456            (LoadSessionTest.testLayerVisibility): Test if the visible flag
457            is loaded correctly.
458    
459            * test/test_save.py (SaveSessionTest.testSingleLayer): Add test
460            for saving an invisible layer.
461    
462    2003-04-29  Jonathan Coles   <[email protected]>
463    
464            * Thuban/UI/mainwindow.py (MainWindow.SetMap): Look up the
465            legend dialog box and tell it to change its map to the one
466            supplied to SetMap(). Fixes RTbug #1770.
467    
468    2003-04-29  Bernhard Herzog  <[email protected]>
469    
470            Next step of table implementation. Introduce a transient database
471            using SQLite that some of the data is copied to on demand. This
472            allows us to do joins and other operations that require an index
473            for good performance with reasonable efficiency. Thuban now needs
474            SQLite 2.8.0 and pysqlite 0.4.1. Older versions may work but I
475            haven't tested that.
476            
477            * Thuban/Model/transientdb.py: New. Transient database
478            implementation.
479    
480            * test/test_transientdb.py: New. Tests for the transient DB
481            classes.
482    
483            * Thuban/Model/session.py (AutoRemoveFile, AutoRemoveDir): New
484            classes to help automatically remove temporary files and
485            directories.
486            (Session.__init__): New instance variables temp_dir for the
487            temporary directory and transient_db for the SQLite database
488            (Session.temp_directory): New. Create a temporary directory if not
489            yet done and return its name. Use AutoRemoveDir to have it
490            automatically deleted
491            (Session.TransientDB): Instantiate the transient database if not
492            done yet and return it.
493    
494            * Thuban/Model/data.py (ShapefileStore.__init__): Use an
495            AutoTransientTable so that data is copied to the transient DB on
496            demand.
497            (SimpleStore): New class that simply combines a table and a
498            shapefile
499    
500            * Thuban/Model/table.py (Table, DBFTable): Rename Table into
501            DBFTable and update its doc-string to reflect the fact that this
502            is only the table interface to a DBF file. Table is now an alias
503            for DBFTable for temporary backwards compatibility.
504    
505            * Thuban/UI/application.py (ThubanApplication.OnExit): Make sure
506            the last reference to the session goes away so that the temporary
507            files are removed properly.
508    
509            * test/test_load.py (LoadSessionTest.tearDown): Remove the
510            reference to the session to make sure the temporary files are
511            removed.
512    
513    2003-04-29  Bernhard Herzog  <[email protected]>
514    
515            * Thuban/Model/load.py (XMLReader.__init__, XMLReader.read): Turn
516            the __parser instance variable into a normal local variable in
517            read. It's only used there and read will never be called more than
518            once. Plus it introduces a reference cycle that keeps can keep the
519            session object alive for a long time.
520    
521    2003-04-29  Jonathan Coles   <[email protected]>
522    
523            * Thuban/Model/proj.py (Projection): Removed Set*() methods to make
524            Projection an immutable item. Fixes RTbug #1825.
525            (Projection.__init__): Initialize instance variables here.
526            (ProjFile.Replace): New. Replace the given projection object with
527            the new projection object. This solves the problem of needing the
528            mutator Projection.SetProjection() in the ProjFrame class and
529            allows a projection to change parameters without changing its
530            location in the file.
531    
532            * Thuban/UI/mainwindow.py (MainWindow.SaveSessionAs): Dialog should
533            be of type wxSAVE and should verify overwriting a file.
534    
535            * Thuban/UI/projdialog.py (ProjFrame._OnSave): Use the new
536            ProjFile.Replace() method instead of the mutator
537            Projection.SetProjection(). Also requires that we reassign the
538            client data to the new projection.
539    
540            * test/test_proj.py (TestProjection.test): Test GetName() and
541            GetAllParameters()
542            (TestProjFile.test): Remove tests for Set*() methods. Add tests
543            for Replace().
544    
545    2003-04-25  Jonathan Coles   <[email protected]>
546    
547            * Thuban/Model/save.py (SessionSaver.write_projection): Make sure
548            to save the name of the projection.
549    
550            * test/test_save.py (SaveSessionTest.testLayerProjection): New
551            test to verify layer projections are saved correctly.
552    
553    2003-04-25  Jonathan Coles   <[email protected]>
554    
555            * Thuban/Model/proj.py (Projection.SetName): Set the name
556            to "Unknown" if name is None.
557            (Projection.SetAllParameters): New. Set the projection's
558            parameter list to the one supplied.
559            (Projection.SetProjection): New. Set the projection's
560            properties to those of the supplied Projection.
561    
562            * Thuban/UI/mainwindow.py (MainWindow.MapProjection): Set
563            the dialog title to include the map's title.
564            (MainWindow.LayerProjection): Set the dialog title to include
565            the layer's title.
566    
567            * Thuban/UI/projdialog.py (ProjFrame.__ShowError): Consolidate
568            error dialogs into a single method call.
569            (ProjFrame.__VerifyButtons): Add more states to check.
570            (ProjFrame.__GetProjection): Return the current state of an
571            edited projection or None.
572            (ProjFrame.__FillAvailList): Remove checks for states that
573            shouldn't exist.
574            (ProjFrame._OnNew): Clear all selected items and supply
575            a projection panel if necessary.
576    
577            * test/test_proj.py (TestProjFile.test): Add tests for
578            ProjFile.SetAllParameters, ProjFile.SetProjection,
579            ProjFile.SetName.
580    
581    2003-04-25  Jonathan Coles   <[email protected]>
582    
583            * Thuban/UI/projdialog.py (ProjFrame.__FillAvailList): Now
584            takes an optional argument to select the current projection.
585            This does not guarantee that the item is visible due to
586            limited wxWindows functionality. Fixes RTBug #1821.
587    
588    2003-04-25  Jonathan Coles   <[email protected]>
589    
590            * Thuban/Model/load.py (SessionLoader.start_projection): Remember
591            the projection name and use it when constructing the Projection
592            object.
593    
594            * Thuban/Model/proj.py (Projection.__init__): Change the default
595            value for 'name' to None and then test if name is equal to None
596            in the body of the constructor. This way the caller doesn't have to
597            know what the default value should be. Namely, useful in load.py
598            where we have to pick a default value if the 'name' parameter
599            doesn't exist in the XML file.
600    
601            * test/test_load.py (LoadSessionTest.testLayerProjection): New.
602            Tests a file where a layer has a projection.
603    
604    2003-04-25  Jonathan Coles   <[email protected]>
605    
606            * Thuban/Model/layer.py (Layer.TreeInfo): Add an item to the
607            tree for projection information.
608    
609            * Thuban/Model/load.py (XMLReader.GetFilename): Renamed from
610            XMLReader.GetFileName.
611            (SessionLoader): Added support for loading projection tags that
612            appear inside a layer.
613    
614            * Thuban/Model/proj.py (ProjFile): Document the class. Move
615            back to using a list because the order of the projections in
616            the file is important to maintain. Fixes RTbug #1817.
617    
618            * Thuban/Model/resource.py: Rename calls to ProjFile.GetFileName
619            to ProjFile.GetFilename.
620    
621            * Thuban/Model/save.py (SessionSaver.write_layer): Save projection
622            information.
623    
624            * Thuban/UI/projdialog.py (ProjFrame._OnAddToList): Renamed from
625            ProjFrame._OnSaveAs. Removed old dead code from previous
626            implementation.
627            (ProjFrame._OnExport): Add support for exporting more than one
628            projection to a single file.
629            (ProjFrame.__FillAvailList): use string formatting (% operator)
630            to build strings that are (partly) translated. Fixes RTbug #1818.
631    
632            * test/test_proj.py (TestProjFile.test): New. Tests the base ProjFile
633            class.
634    
635    2003-04-24  Bernhard Herzog  <[email protected]>
636    
637            * po/es.po: Updated Spanish translation by Daniel Calvelo Aros
638    
639            * po/fr.po: New. French translation by Daniel Calvelo Aros
640    
641            * Thuban/UI/projdialog.py (ProjFrame._OnSaveAs): Don't translate
642            empty strings.
643    
644    2003-04-24  Jonathan Coles   <[email protected]>
645    
646            * Thuban/Model/layer.py (Layer.GetProjection): New. Needed to
647            implement the interface that the ProjFrame dialog expects.
648    
649            * Thuban/Model/proj.py (Projection.SetName): New. Allows the
650            name of the projection to be changed.
651            (ProjFile): Use a dictionary instead of a list so that removing
652            projections is easier and we are sure about uniqueness.
653            (ProjFile.Remove): Remove the given projection object.
654    
655            * Thuban/Model/resource.py (GetSystemProjFiles, GetUserProjFiles):
656            Return a list with only one projection file instead of searching for
657            any projection file. This simplifies many things if the user can
658            only have one system file and one user file.
659    
660            * Thuban/UI/classgen.py: Change all references to
661            genCombo to genChoice.
662    
663            * Thuban/UI/mainwindow.py: Add a Projection option under the
664            layer menu.
665            (MainWindow.LayerProjection): New. Open up a projection window
666            for a layer.
667    
668            * Thuban/UI/projdialog.py: Large changes to how the dialog is
669            laid out. Use three panels instead of one. One for the list of
670            projections, one for the edit controls, and one for the buttons.
671            Fixed resizing problems so that the dialog resizes correctly
672            when the projection panel changes. Added import/export, save, and
673            new buttons/functionality.
674    
675    2003-04-24  Bernhard Herzog  <[email protected]>
676    
677            First step towards table management. Introduce a simple data
678            abstraction so that we replace the data a layer uses more easily
679            in the next step.
680    
681            * Thuban/Model/data.py: New file with a simple data abstraction
682            that bundles shapefile and dbffile into one object.
683    
684            * Thuban/Model/session.py (Session.OpenShapefile): New method to
685            open shapefiles and return a shape store object
686    
687            * Thuban/Model/layer.py (Layer.__init__): Pass the data as a store
688            object instead of a shapefile filename. This introduces a new
689            instance variable store holding the datastore. For intermediate
690            backwards compatibility keep the old instance variables.
691            (open_shapefile): Removed. No longer needed with the shape store.
692            (Layer.SetShapeStore, Layer.ShapeStore): New methods to set and
693            get the shape store used by a layer.
694            (Layer.Destroy): No need to explicitly destroy the shapefile or
695            table anymore.
696    
697            * Thuban/UI/mainwindow.py (MainWindow.AddLayer)
698            (MainWindow.AddLayer): Use the session's OpenShapefile method to
699            open shapefiles
700    
701            * Thuban/Model/load.py (ProcessSession.start_layer): Use the
702            session's OpenShapefile method to open shapefiles
703    
704            * test/test_classification.py
705            (TestClassification.test_classification): Use the session's
706            OpenShapefile method to open shapefiles and build the filename in
707            a more platform independed way
708    
709            * test/test_layer.py (TestLayer.setUp, TestLayer.tearDown):
710            Implement to have a session to use in the tests
711            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
712            (TestLayer.test_point_layer, TestLayer.test_empty_layer): Use the
713            session's OpenShapefile method to open shapefiles
714            (TestLayerLegend.setUp): Instantiate a session so that we can use
715            it to open shapefiles.
716            (TestLayerLegend.tearDown): Make sure that all references to
717            layers and session are removed otherwise we may get a resource
718            leak
719    
720            * test/test_map.py (TestMapAddLayer.test_add_layer)
721            (TestMapWithContents.setUp): Instantiate a session so that we can
722            use it to open shapefiles.
723            (TestMapWithContents.tearDown): Make sure that all references to
724            layers, maps and sessions are removed otherwise we may get a
725            resource leak
726            ("__main__"): use support.run_tests() so that more info about
727            uncollected garbage is printed
728    
729            * test/test_save.py (SaveSessionTest.testSingleLayer): Use the
730            session's OpenShapefile method to open shapefiles
731            ("__main__"): use support.run_tests() so that more info about
732            uncollected garbage is printed
733    
734            * test/test_selection.py (TestSelection.tearDown): Make sure that
735            all references to the session and the selection are removed
736            otherwise we may get a resource leak
737            (TestSelection.get_layer): Instantiate a session so that we can
738            use it to open shapefiles.
739            ("__main__"): use support.run_tests() so that more info about
740            uncollected garbage is printed
741    
742            * test/test_session.py (TestSessionBase.tearDown)
743            (TestSessionWithContent.tearDown): Make sure that all references
744            to the session and layers are removed otherwise we may get a
745            resource leak
746            (TestSessionWithContent.setUp): Use the session's OpenShapefile
747            method to open shapefiles
748    
749    2003-04-24  Jonathan Coles   <[email protected]>
750    
751            * Thuban/Model/load.py (XMLReader.read): Should have been checking
752            if the file_or_filename object had the 'read' attribute.
753    
754    2003-04-23  Jonathan Coles   <[email protected]>
755    
756            * Thuban/Model/resource.py: Fixes RTbug #1813.
757            (ReadProjFile): Add documentation about which exceptions are raised.
758            Always pass the exceptions up to the caller.
759            (GetProjFiles): If the directory can't be read return an empty list.
760            If any of the proj files can't be read skip that file and go
761            on to the next one.
762    
763            * test/test_proj.py: Added test cases to handle nonexistent files,
764            unreadable files, and files that don't parse correctly.
765    
766    2003-04-23  Jonathan Coles   <[email protected]>
767    
768            Projection dialog. Allows the user to select from a list
769            of projection templates and optionally edit them and save new ones.
770    
771            * Thuban/UI/projdialog.py (ProjFrame): New. Main dialog.
772            (ProjPanel): Base class for projection specific panels.
773            (TMPanel): Projection panel for Transverse Mercartor.
774            (UTMPanel): Projection panel for Universal Transverse Mercartor.
775            (LCCPanel): Projection panel for Lambert Conic Conformal.
776            (GeoPanel): Projetion panel for Geographic Projection.
777    
778    2003-04-23  Jonathan Coles   <[email protected]>
779    
780            * Thuban/Model/load.py (XMLReader): Renamed from XMLProcessor to
781            promote symmetry. There now exists XMLReader and XMLWriter.
782            (XMLReader.read): New. Call to read the given file descriptor or
783            filename.
784            (XMLReader.close): New. Make sure the file is closed.
785            (XMLReader.GetFileName): New. Return just the file name that is being
786            read from.
787            (XMLReader.GetDirectory): New. Return just the directory of the file
788            that is being read.
789            (XMLReader.AddDispatchers): New. Take a dictionary which contains
790            the names of functions to call as the XML tree is parsed.
791            (XMLReader.startElementNS): Updated to use new dispatcher dictionary.
792            (XMLReader.endElementNS): Updated to use new dispatcher dictionary.
793            (SessionLoader): Removed class variables start_dispatcher and
794            end_dispatcher since this functionality is now part of a class
795            instance. Fixes RTbug #1808.
796            (SessionLoader.__init__): Add dispatcher functions.
797            (load_xmlfile): Code was moved into the XMLReader.read().
798            (load_session): Use modified SessionLoader.
799    
800            * Thuban/Model/map.py (Map.GetProjection): New. Returns the
801            map's projection.
802    
803            * Thuban/Model/proj.py (Projection.GetParameters): Renamed to
804            GetAllParameters.
805            (Projection.GetParameter): Returns the value for the given parameter.
806    
807            * Thuban/Model/resource.py: Use XMLReader and XMLWriter.
808            (GetProjFiles): Renamed from GetProjections. Now returns a list
809            of ProjFile objects.
810            (GetSystemProjFiles): Renamed from GetSuppliedProjections. Returns
811            a list of ProjFile objects whose files are not user defined.
812            (GetUserProjFiles): Renamed from GetUserProjections. Returns a
813            list of ProjFile objects whose files are user defined.
814            (ProjFileReader): Extend new XMLReader.
815    
816            * Thuban/Model/save.py (XMLWriter): Renamed from XMLSaver to
817            promote symmetry.
818    
819            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Use a wxChoice
820            control instead of a wxComboBox. wxChoice controls do not generate
821            events as the uses highlights possible choices which fixes problems
822            with resizing the dialog when the use selects an option.
823    
824            * Thuban/UI/classifier.py (Classifier.__init__): Use a wxChoice
825            control instead of a wxComboBox.
826    
827            * Thuban/UI/mainwindow.py (MainWindow.Projection): Use new projection
828            dialog.
829    
830            * test/test_proj.py (TestProjection.test): New tests for GetParameter
831            method.
832    
833    2003-04-22  Bernhard Herzog  <[email protected]>
834    
835            * Thuban/UI/mainwindow.py: Remove some unused imports and global
836            constants
837    
838            * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape)
839            (IdentifyGridCtrl.selected_shape): Use table, not shapetable.
840    
841    2003-04-17  Bernhard Herzog  <[email protected]>
842    
843            * Thuban/Model/layer.py: Don't import LAYER_LEGEND_CHANGED.
844            (Layer): Update doc-string since LAYER_LEGEND_CHANGED is not used
845            anymore.
846            (Layer.BoundingBox, Layer.GetFieldType, Layer.NumShapes)
847            (Layer.ShapeType, Layer.Shape): No need to call
848            self.open_shapefile since it's always called in __init__
849    
850            * Thuban/UI/application.py (ThubanApplication.MainLoop): Removed.
851            In wxPython 2.4 there's no need to extend MainLoop anymore since
852            wxPython itself makes sure OnExit is called.
853    
854    2003-04-16  Jonathan Coles   <[email protected]>
855    
856            Initial putback of projection management code. Includes new
857            classes to read and write projection files. The current load
858            and save classes were abstracted a bit so they could be reused.
859            The Projection class was extended to provide new methods and
860            have a name.
861    
862            * Thuban/Model/load.py (XMLProcessor): New. Contains all the
863            general XML reading methods that were part of ProcessSession.
864    
865            * Thuban/Model/proj.py (Projection.__init__): Accepts an optional
866            name.
867            (ProjFile): New. Represents a file that contains projection
868            information.
869    
870            * Thuban/Model/resource.py: New. Contains general utilities
871            for read and writing projection files.
872    
873            * Thuban/Model/save.py (XMLSaver): New. Contains all the
874            general XML writing methods that were part of SessionSaver.
875            (SessionSaver): Renamed from Saver.
876    
877            * test/test_proj.py: New test cases for the projection
878            file read and write functions.
879    
880    2003-04-16  Jonathan Coles   <[email protected]>
881    
882            * Thuban/Model/classification.py: Use repr() around values
883            in the ClassGroup*.__repr__() methods so it is clearer when
884            a value is a string and when it is a number.
885    
886            * test/test_load.py: Rework the classification test to test
887            that we can load old files.
888            (testLabels): Test a file where the groups have labels.
889    
890    2003-04-16  Bernhard Herzog  <[email protected]>
891    
892            Safer implementation of the performance enhancements of the
893            low-level renderer:
894            
895            * extensions/thuban/wxproj.cpp (extract_projection)
896            (extract_pointer): Rename extract_projection to extract_pointer
897            and redefine its purpose to return the pointer stored in a CObject
898            returned by the object's cobject method. Update all callers.
899            (s_draw_info, free_draw_info, draw_polygon_init): Implement the
900            handling of these low-level parameters so that each s_draw_info
901            instance is handled as a CObject at python level that also
902            contains real references to the actual python objects which
903            contain the values in the struct. Add free_draw_info as the
904            destructor.
905            (draw_polygon_shape): Add the py_draw_info parameter which must a
906            cobject containing an s_draw_info pointer.
907    
908            * Thuban/UI/renderer.py (MapRenderer.polygon_render_param): New
909            method to instantiat the low-level render parameter
910            (MapRenderer.draw_shape_layer): Use the new method. Remove some
911            commented out code.
912            (MapRenderer.draw_polygon_shape): Make the first parameter not the
913            layer but the low-level render parameter
914            (ScreenRenderer.draw_shape_layer): Use the low-level render
915            parameter.
916    
917    2003-04-15  Jonathan Coles   <[email protected]>
918    
919            * Thuban/Model/classification.py: Implemented __repr__ for
920            the ClassGroup* classes to make debugging a bit easier.
921            (ClassGroup.SetLabel): Check that the string is an instance
922            of StringTypes not StringType. Accounts for Unicode strings.
923    
924            * Thuban/Model/color.py: Implemented __repr__ to make
925            debugging a bit easier.
926    
927            * Thuban/Model/save.py (Saver.write_classification): Need to
928            save the group label.
929    
930            * test/test_load.py (testClassification): New. Loads the
931            iceland_sample_test.thuban file and checks if it was loaded
932            correctly.
933    
934    2003-04-15  Jonathan Coles   <[email protected]>
935    
936            * extensions/thuban/wxproj.cpp (draw_polygon_init): New. Used
937            to improve rendering performance by initializing the variables
938            that are not change each time draw_polygon_shape() is called.
939            The values are stored in a global struct draw_info.
940            (draw_polygon_shape): Removed initialization code that is
941            now in draw_polygon_init().
942    
943            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Make
944            drawing initialization call to draw_polygon_init()
945            (MapRenderer.draw_polygon_shape): Use new signature of
946            draw_polygon_shape.
947    
948            * Thuban/UI/classgen.py (GenUniformPanel): Fix spin control
949            weirdness by setting the range to (1, maxint).
950    
951            * Thuban/Model/classification.py (ClassGroupProperties): Make
952            instance variables private and optimize comparison operator
953            by first checking if the color references are the same.
954            (ClassGroupSingleton): Make instance variables private.
955            (ClassGroupRange): Make instance variables private.
956    
957            * HOWTO-Release: Filled in missing steps for releasing packages.
958    
959    2003-04-15  Bernhard Herzog  <[email protected]>
960    
961            First stab at internationalized messages:
962    
963            * Thuban/__init__.py (_): Implement the translation function for
964            real using the python gettext module.
965    
966            * Thuban/UI/classifier.py (ClassTable.GetRowLabelValue): Don't
967            translate empty strings.
968    
969            * Thuban/UI/application.py (ThubanApplication.read_startup_files):
970            Add a missing space to a warning message
971    
972            * po/README: New. Notes about the management of the translation
973            files.
974    
975            * po/Makefile: New. Makefile to help manage the translation files.
976    
977            * po/es.po: New. Spanish translation by Daniel Calvelo Aros
978    
979            * MANIFEST.in: Include the *.mo files in Resources/Locale and the
980            translations and support files in po/
981    
982            * setup.py (data_files): Add the *.mo files to the data_files too
983    
984            * README: Add note about the translations when building from CVS
985    
986    2003-04-14  Jonathan Coles   <[email protected]>
987    
988            * Thuban/UI/dock.py: Fixes some window resizing problems most
989            noticable under windows. Always assume the button bitmaps will
990            be there. Code clean up.
991            (DockabelWindow.Dock, DockableWindow.UnDock): Force all the
992            images for the dock/undock button to the same images.
993            Work around for RTbug #1801.
994    
995            * Thuban/UI/legend.py (LegendPanel.__init__): The toolbar should
996            be allowed to grow within the sizer. Fixes a bug under Windows
997            where the toolbar wasn't being drawn.
998    
999    2003-04-14  Frank Koormann   <[email protected]>
1000    
1001            * Resources/Bitmaps/dock_12.xpm, Resources/Bitmaps/undock_12.xpm:
1002            Updated design to try to make the button functionality more
1003            transparent.
1004    
1005    2003-04-14  Jonathan Coles   <[email protected]>
1006    
1007            * Thuban/UI/legend.py (LegendPanel.__init__): Call Create() to
1008            finalize the intialization of the panel.
1009    
1010            * Thuban/UI/dock.py (DockPanel.Create): New. Finalizes the
1011            creation of the panel. Should be the last thing called in the
1012            initializer of a subclass.
1013    
1014            * Thuban/UI/classgen.py (ClassGenDialog.__init__): Actively
1015            set the current selections in the combo boxes. This is needed
1016            under Windows.
1017    
1018            * Thuban/UI/classifier.py (Classifier.__init__): Add a top
1019            level panel to the dialog so that the background colors are
1020            consistent under Windows.
1021    
1022    2003-04-11  Jonathan Coles   <[email protected]>
1023    
1024            * Thuban/UI/classgen.py: Change color ramps to start at white
1025            not black.
1026    
1027            * Thuban/UI/legend.py: Enable/disable the legend buttons when
1028            the legend changes. Fixes RTbug #1793.
1029    
1030            * test/test_classification.py: Added test for copying of
1031            classifications.
1032    
1033    2003-04-11  Jonathan Coles   <[email protected]>
1034    
1035            * Thuban/UI/resource.py: New. Centralize the loading of resources
1036            such as bitmaps.
1037    
1038            * Thuban/UI/classgen.py (GenUniquePanel.__init__): Reordered buttons,
1039            added images to the move buttons, added 'reverse' button.
1040            (CustomRampPanel.__init__): Added images to the move buttons.
1041            (GreyRamp): New. Generates a ramp from white to black.
1042            (HotToColdRamp): New. Generates a ramp from cold to hot colors.
1043    
1044            * Thuban/UI/classifier.py: Refactored ID's from ID_CLASSIFY_* to
1045            ID_PROPERTY_*.
1046            (Classifier.__init__): Minor changes to the layout.
1047            (Classifier._OnTitleChanged): Listen for when the user edits the
1048            title and update the dialog's title and the layer's title.
1049    
1050            * Thuban/UI/dock.py: Use new bitmaps for the control buttons.
1051    
1052            * Thuban/UI/legend.py: Use new bitmaps for the control buttons.
1053            (LegendTree._OnMsgLayerTitleChanged): Change the displayed title
1054            if the layer's title changes.
1055    
1056            * Thuban/UI/mainwindow.py: Added new menu item and associated code
1057            to open a dialog to rename the map.
1058            (MainWindow): Use new resource class to import bitmaps.
1059    
1060    2003-04-11  Jonathan Coles   <[email protected]>
1061    
1062            * Resources/Bitmaps/close_12.xpm, Resources/Bitmaps/dock_12.xpm,
1063            Resources/Bitmaps/group_use.xpm, Resources/Bitmaps/group_use_all.xpm,
1064            Resources/Bitmaps/group_use_none.xpm,
1065            Resources/Bitmaps/group_use_not.xpm,
1066            Resources/Bitmaps/hide_layer.xpm,
1067            Resources/Bitmaps/layer_properties.xpm,
1068            Resources/Bitmaps/lower_layer.xpm, Resources/Bitmaps/raise_layer.xpm,
1069            Resources/Bitmaps/show_layer.xpm, Resources/Bitmaps/undock_12.xpm:
1070            New.
1071    
1072    2003-04-10  Jonathan Coles   <[email protected]>
1073    
1074            * Thuban/Model/classification.py: (ClassGroupRange.__init__):
1075            Should pass group to ClassGroup constructor.
1076    
1077    2003-04-10  Jonathan Coles   <[email protected]>
1078    
1079            * Thuban/Model/classification.py: (ClassGroup): Move all the common
1080            methods of the derived classes ([Set|Get]Properties(), __eq__, __ne__)
1081            here. Implement SetVisible(), IsVisible().
1082            (ClassGroup.__init__): Add group parameter which acts as a copy
1083            constructor.
1084    
1085            * Thuban/UI/classifier.py (ClassTable): Add a new column for the
1086            "Visible" check boxes.
1087            (Classifier): Rename the buttons and refactor the code to match
1088            the new labels.
1089    
1090            * Thuban/UI/legend.py: Classify button is now called "Properties".
1091            Refactored the code to change variable names.
1092            (LegendTree.__FillTreeLayer): Only list a group if it is visible.
1093    
1094            * Thuban/UI/mainwindow.py: MainWindow.OpenClassifier renamed to
1095            MainWindow.OpenLayerProperties. MainWindow.LayerEditProperties
1096            renamed to MainWindow.LayerEditProperties.
1097            (MainWindow.ToggleLegend): Don't include map name in legend title.
1098            (MainWindow.SetMap): Added the map name to the window title.
1099            (MainWindow.LayerFillColor, MainWindow.LayerTransparentFill,
1100            MainWindow.LayerOutlineColor, MainWindow.LayerNoOutline): Removed.
1101            Functionality is found in the layer properties dialog.
1102    
1103            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
1104            draw visible groups.
1105    
1106    2003-04-09  Jonathan Coles   <[email protected]>
1107    
1108            * Thuban/UI/classgen.py: Modifications to allow simple
1109            addition and selection of new color schemes.
1110            (MonochromaticRamp): New. Generates a ramp between two colors.
1111            (RedRamp): New. Generates a ramp of all red.
1112            (GreenRamp): New. Generates a ramp of all green.
1113            (BlueRamp): New. Generates a ramp of all blue.
1114    
1115    2003-04-09  Jonathan Coles   <[email protected]>
1116    
1117            * Thuban/Model/classification.py (Classification.__deepcopy__):
1118            Need to copy over field and fieldType attributes.
1119    
1120            * Thuban/Model/table.py (Table.field_range): New. Retrive the
1121            maximum and minimum values over the entire table for a given
1122            field.
1123            (Table.GetUniqueValues): New. Retrieve all the unique values
1124            in the table for a given field.
1125    
1126            * Thuban/UI/classgen.py: Renamed GenRangePanel to GenUniformPanel.
1127            (GenUniquePanel): New. Controls to allow the user to select
1128            which unique field values they would like in the classification.
1129            (CustomRampPanel): Code that was in ClassGenDialog that allows
1130            the user to select the properties for a custom ramp.
1131            (ClassGenerator.GenUniformDistribution): Was called GenerateRanges.
1132    
1133            * Thuban/UI/classifier.py: Removed a lot of debugging code.
1134            (Classifier._SetClassification): Callback method so that the
1135            class generator can set the classification in the grid.
1136            (ClassGroupPropertiesCtrl): New. Encapsulates the drawing and
1137            editing of a group properties class into a wxWindows control.
1138    
1139            * Thuban/UI/dock.py: It was decided that if the user closes
1140            a dockable window the window should simply hide itself. That
1141            way if the user wants to show the dock again it appears in the
1142            same place as it was when it was closed.
1143            (DockableWindow.Destroy): Call renamed method OnDockDestroy().
1144            (DockableWindow._OnButtonClose): Hide the window instead of
1145            destroying it.
1146            (DockableWindow._OnClose): Hide the window instead of
1147            destroying it.
1148    
1149            * Thuban/UI/legend.py (LegendTree): Use a private method to
1150            consistently set the font and style of the text. Fixes RTbug #1786.
1151    
1152            * Thuban/UI/mainwindow.py: Import just the Classifier class.
1153    
1154    2003-04-07  Bernhard Herzog  <[email protected]>
1155    
1156            * Thuban/UI/mainwindow.py (main_menu): Move the toggle_legend item
1157            to the map module
1158    
1159    2003-04-07  Bernhard Herzog  <[email protected]>
1160    
1161            * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree): Removed in
1162            favor of ToggleSessionTree
1163            (MainWindow.ToggleSessionTree): New method to toggle visibility of
1164            the session tree.
1165            (MainWindow.SessionTreeShown): New method to return whether the
1166            session tree is currently shown.
1167            (MainWindow.ToggleLegend): New method to toggle visibility of the
1168            legend
1169            (MainWindow.ShowLegend): Implement in terms of ToggleLegend and
1170            LegendShown
1171            (MainWindow.LegendShown): New method to return whether the legend
1172            is currently shown.
1173            (_method_command): Add checked parameter so we can define check
1174            menu items
1175            (_has_tree_window_shown, _has_legend_shown): Use the appropriate
1176            mainwindow methods.
1177            (show_session_tree, show_legend commands): Removed.
1178            (toggle_session_tree, toggle_legend commands): New commands to
1179            toggle the visibility of the dialogs
1180    
1181    2003-04-07  Jonathan Coles   <[email protected]>
1182    
1183            * Thuban/UI/classgen.py: Fix Windows problem.
1184    
1185            * Thuban/UI/dock.py: Fix Windows problem.
1186    
1187            * Thuban/UI/mainwindow.py: Use False instead of false.
1188            (MainWindow.ShowLegend): Remove unnecessary switch parameter.
1189    
1190    2003-04-07  Jonathan Coles   <[email protected]>
1191    
1192            Since we now say that the order of the groups in a classification
1193            matters, it makes sense to be able to manipulate that order. Most
1194            of the changes to Thuban/Model/classification.py are to that end.
1195    
1196            * Thuban/Model/classification.py (Classification.AppendGroup,
1197            Classification.InsertGroup, Classification.ReplaceGroup,
1198            Classification.RemoveGroup, Classification.GetGroup): Do as the
1199            names imply.
1200            (Classification.FindGroup): This was called GetGroup, but GetGroup
1201            takes an index, while FindGroup takes a value.
1202            (Classification.__deepcopy__): Copy all the groups, BUT NOT THE LAYER
1203            REFERENCE. Currently there is a cyclic reference between the layer
1204            and its classification. If the classification doesn't need to know
1205            its owning layer we can change this, since it may make sense to be
1206            able to use the same classification with different layers.
1207    
1208            * Thuban/Model/load.py: Use Classification.AppendGroup(), not AddGroup()
1209    
1210            * Thuban/UI/classgen.py: Use Classification.AppendGroup(),
1211            not AddGroup()
1212    
1213            * Thuban/UI/classifier.py: Now that we can depend on the order in
1214            a Classification and have methods to manipulate that order we don't
1215            need to use our own data structures in the grid. We can simply make
1216            the grid/table access the information they need from a copy of
1217            the classification object.
1218            (Classifier._OnCloseBtn): Event handler for when the user clicks
1219            'Close'. This is needed so if the user applies changes and then
1220            continues to change the table the user has the option of discarding
1221            the most recent changes and keeping what they applied.
1222    
1223            * Thuban/UI/mainwindow.py: Put "Show Legend" and "Show Session Tree"
1224            into the same group.
1225    
1226            * extensions/thuban/wxproj.cpp (check_version): If Thuban is compiled
1227            with a really old version of proj, PJ_VERSION won't even be defined.
1228            If it isn't defined then just compile so that the function always
1229            returns Py_False.
1230    
1231            * test/test_classification.py: Fix tests to use the renamed methods.
1232            Still need to write tests for the new methods.
1233    
1234    2003-04-04  Jonathan Coles   <[email protected]>
1235    
1236            * Thuban/UI/classifier.py (Classifier.__SelectField): Move the
1237            call to SetSelection out of the method and before the call
1238            to __SelectField in __init__. This prevents a recursion of events
1239            when _OnFieldSelect is triggered by the user.
1240    
1241    2003-04-04  Jonathan Coles   <[email protected]>
1242    
1243            * Thuban/Model/classification.py: Rename Color.None to
1244            Color.Transparent.
1245            (ClassGroupProperties.SetLineColori, ClassGroupProperties.SetFill):
1246            Don't bother copying the color, since Colors are immutable.
1247    
1248            * Thuban/Model/color.py, Thuban/Model/layer.py, Thuban/Model/load.py,
1249            Thuban/UI/classifier.py, Thuban/UI/mainwindow.py,
1250            Thuban/UI/renderer.py, Thuban/UI/view.py:
1251            Rename Color.None to Color.Transparent.
1252        
1253            * test/test_classification.py, test/test_load.py: Rename Color.None
1254            to Color.Transparent.
1255    
1256    2003-04-04  Jonathan Coles   <[email protected]>
1257    
1258            * Thuban/Model/classification.py: Fix assert calls.
1259            (ClassGroupProperties.SetLineColor, ClassGroupProperties.SetFill):
1260            Copy the color parameter rather than hold onto a reference.
1261    
1262            * Thuban/Model/color.py (Color.__copy__, Color.__deepcopy): Copy
1263            the color object.
1264            (NoColor.__copy__, NoColor.__deepcopy): Return 'self' so that we
1265            are sure there exists only one refernce to Color.None in the system.
1266            This allows us to use 'is' rather than the comparision functions.
1267            
1268            * Thuban/Model/save.py: Fix assert calls.
1269            
1270            * Thuban/UI/classifier.py: Fix assert calls.
1271            (ClassGrid._OnCellDClick): Call up to the classifier to open the
1272            dialog to edit the groups properties.
1273            (ClassGrid._OnCellResize): Make sure that the scollbars are drawn
1274            correctly if a cell is resized.
1275            (ClassTable.SetClassification): New. Changes the classification
1276            that is in the table.
1277            (ClassTable.__SetRow): Allow groups to be prepended.
1278            (Classifier): New code for opening the EditProperties and
1279            GenerateRanges dialogs.
1280            (SelectPropertiesDialog.__GetColor): Only set the color in the
1281            color dialog if the current color is not None.
1282            
1283            * Thuban/UI/dock.py: Fix assert calls.
1284            
1285            * Thuban/UI/legend.py: Fix assert calls.
1286            
1287            * Thuban/UI/renderer.py: Fix assert calls.
1288            
1289            * Thuban/UI/classgen.py (ClassGenDialog): Dialog for generating
1290            classifications.
1291            (GenRangePanel): Panel specific to range generation.
1292            (GenSingletonPanel): Panel specific to singleton generation.
1293            (ClassGenerator): Class responsible for actually generating
1294            the classification from the data gathered in the dialog box.
1295            (PropertyRamp): Generates properties whose values range from
1296            a starting property to an ending property.
1297    
1298    2003-04-03  Bernhard Herzog  <[email protected]>
1299    
1300            * test/support.py (print_garbage_information): New function that
1301            prints information about still connected messages and memory
1302            leaks.
1303            (run_suite): Removed.
1304            (run_tests): New function for use as a replacement of
1305            unittest.main in the test_* files. This one calls
1306            print_garbage_information at the end.
1307    
1308            * test/runtests.py (main): Use support.print_garbage_information
1309    
1310            * test/test_layer.py: Use support.run_tests instead of
1311            unittest.main so we get memory leak information
1312            (TestLayer.test_arc_layer, TestLayer.test_polygon_layer)
1313            (TestLayer.test_point_layer, TestLayer.test_empty_layer)
1314            (TestLayerLegend.test_visibility): Call the layer's Destroy method
1315            to fix a memory leak.
1316    
1317            * test/test_classification.py: Use support.run_tests instead of
1318            unittest.main so we get memory leak information
1319            (TestClassification.test_classification): Call the layer's Destroy
1320            method to fix a memory leak.
1321    
1322    2003-04-02  Bernhard Herzog  <[email protected]>
1323    
1324            * extensions/thuban/wxproj.cpp (check_version, check_version_gtk):
1325            Handle the reference counts of the return value and errors in
1326            PyArg_ParseTuple correctly.
1327    
1328            * Thuban/UI/application.py (ThubanApplication.OpenSession): Make
1329            sure the filename is absolute to avoid problems when saving the
1330            session again
1331    
1332            * Thuban/Model/table.py: Remove unnecessary import. Fix a typo.
1333    
1334    2003-04-01  Jonathan Coles   <[email protected]>
1335    
1336            *  Thuban/UI/renderer.py (MapRenderer.draw_point_shape): Check
1337            that there actually are points in the returned list of points
1338            before trying to index into the list. The list may be empty if
1339            the shape is a Null Shape.
1340    
1341    2003-04-01  Bernhard Herzog  <[email protected]>
1342    
1343            * test/test_map.py: Don't use from <module> import *
1344    
1345    2003-04-01  Jonathan Coles   <[email protected]>
1346    
1347            * Thuban/Model/session.py: Use LAYER_CHANGED instead of
1348            LAYER_LEGEND_CHANGED
1349    
1350            * Thuban/UI/dock.py (DockableWindow._OnButtonClose): Call
1351            self.Destroy() to close the window after yesterday's changes.
1352    
1353            * test/test_map.py, test/test_session.py: Fix messages that
1354            are sent from maps and layers.
1355    
1356    2003-03-31  Jonathan Coles   <[email protected]>
1357    
1358            * Thuban/UI/classifier.py: Commented out some debugging statements.
1359            (ClassDataPreviewer.Draw): Draw rectangles for polygon layers per
1360            RTbug #1769.
1361    
1362            * Thuban/UI/dock.py (DockableWindow.UnDock): Restore size and
1363            position (although position doesn't work yet under GTK).
1364            (DockableWindow.Destroy): New. Called when the window must be
1365            closed. Namely needed when the DockFrame closes and must close
1366            its children.
1367            (DockFrame): Listen for EVT_CLOSE and destroy all children.
1368    
1369            * Thuban/UI/legend.py (LegendPanel.Destroy): New. Cleans up
1370            when then window is told to close.
1371            (LegendTree._OnMsgLayerChanged): Fixes a seg fault bug. See
1372            comment in source for more info.
1373    
1374            * Thuban/UI/main.py: Show the legend by default when Thuban starts.
1375    
1376            * Thuban/UI/mainwindow.py: Renamed OnClose to _OnClose for
1377            symmetry with other such methods.
1378            (MainWindow.ShowLegend): Show the legend docked by default.
1379    
1380    2003-03-28  Jonathan Coles   <[email protected]>
1381    
1382            * Thuban/UI/classifier.py: Support for highlighting a specific
1383            group within the grid when the classification dialog is opened.
1384            Also contains a lot of debugging printouts which will later
1385            be removed.
1386    
1387            * Thuban/UI/dock.py: Complete rework on the dock code so that
1388            that it is fairly removed from the rest of the Thuban application.
1389            It is easy to add new docks which the rest of the program having
1390            to be aware of them.
1391    
1392            * Thuban/UI/legend.py: Modifications to support selecting a
1393            specific group in the classification dialog. Changed how layers
1394            are drawn when the layer is visible/invisible.
1395    
1396            * Thuban/UI/mainwindow.py: Removed legend specific code and
1397            replaced it with calls to the new dock code.
1398    
1399            * Thuban/UI/renderer.py (MapRenderer.__init__): Added assert
1400            to check if scale > 0. Trying to track down a divide by zero.
1401    
1402    2003-03-26  Jonathan Coles   <[email protected]>
1403    
1404            * Thuban/UI/legend.py: Removed unnecessary LegendDialog class.
1405            (LegendPanel): Removed _OnDock()/_OnUnDock() methods which are
1406            now part of DockableWindow.
1407            (LegendPanel.DoOnSelChanged): Select the current layer in the
1408            map.
1409            (LegendTree._OnSelChanged): Call LegendPanel.DoOnSelChanged()
1410            with the selected layer and/or group.
1411    
1412    2003-03-26  Jonathan Coles   <[email protected]>
1413    
1414            This putback contains the code for dockable windows. There is
1415            no support in wxWindows as of this date for windows that can
1416            attach themselves to other windows.
1417    
1418            The current model contains a DockableWindow which has a parent
1419            window for when it is detached and a dock window that it puts
1420            its contents in when it is docked. The contents of a DockableWindow
1421            must be a DockPanel. DockPanel itself derives from wxPanel.
1422    
1423            * Thuban/Model/layer.py (Layer.ClassChanged): Send a LAYER_CHANGED
1424            message, not a LAYER_LEGEND_CHANGED message.
1425    
1426            * Thuban/Model/map.py (Map): Forward LAYER_CHANGED messages.
1427    
1428            * Thuban/UI/classifier.py (Classifier.__init__): Use wxADJUST_MINSIZE
1429            as one of the style properties for the fieldTypeText item to
1430            be sure that its size is correct when the text changes.
1431    
1432            * Thuban/UI/dock.py: New. Classes for the DockPanel and
1433            DockableWindow.
1434    
1435            * Thuban/UI/legend.py: Added some more buttons and made the
1436            LegendPanel a DockPanel.
1437    
1438            * Thuban/UI/mainwindow.py: Added sash windows to the main window
1439            and supporting functions for manipulating the sashes.
1440            (MainWindow.ShowLegend): Create a DockableWindow with the
1441            LegendPanel as the contents.
1442    
1443            * Thuban/UI/messages.py: Added DOCKABLE_* messages
1444    
1445            * Thuban/UI/view.py (MapCanves.SetMap): Listen for LAYER_CHANGED,
1446            not LAYER_LEGEND_CHANGED, messages.
1447    
1448    2003-03-25  Jonathan Coles   <[email protected]>
1449    
1450            * setup.py: Added custom script bdist_rpm_build_script so that
1451            when the rpm is built the path to wx-config is correct.
1452    
1453            * setup.cfg: Added line saying to use the custom build script
1454    
1455    2003-03-20  Jonathan Coles   <[email protected]>
1456    
1457            Initial implementation of the Legend.
1458    
1459            * Thuban/UI/legend.py: New. Creates a window that shows the map's
1460            Legend information and allows the user to add/modify classifications
1461            and how the layers are drawn on the map.
1462    
1463            * setup.py: New command 'build_docs' which currently uses
1464            happydoc to generate html documentation for Thuban.
1465    
1466            * Thuban/Model/classification.py (ClassGroup.GetDisplayText): New.
1467            Returns a string which is appropriately describes the group.
1468    
1469            * Thuban/Model/layer.py (Layer.SetClassification): Generate a
1470            LAYER_CHANGED event instead of a LAYER_LEGEND_CHANGED event.
1471    
1472            * Thuban/Model/map.py (Map): Rename messages and use new, more
1473            specific, messages.
1474    
1475            * Thuban/Model/messages.py: New message to indicate that a layer's
1476            data has changed (LAYER_CHANGED). New map messages to indicate
1477            when layers have been added/removed/changed or if the stacking order
1478            of the layers has changed.
1479    
1480            * Thuban/Model/session.py: Rename and use new messages.
1481    
1482            * Thuban/UI/classifier.py: Remember if any changes have actually
1483            been applied so that if the dialog is cancelled without an application
1484            of changes we don't have to set a new classification.
1485            (ClassDataPreviewer): Pulled out the window specific code and put it
1486            ClassDataPreviewWindow. ClassDataPreviewer can then be used to draw
1487            symbols on any DC.
1488            
1489            * Thuban/UI/mainwindow.py: New code to open the legend.
1490    
1491            * Thuban/UI/view.py: Use new message names.
1492    
1493    2003-03-19  Jonathan Coles   <[email protected]>
1494    
1495            * Thuban/UI/main.py (verify_versions): New. Checks the versions
1496            of Python, wxPython, and some other libraries.
1497    
1498            * extensions/thuban/wxproj.cpp (check_version): Checks the given
1499            version against what wxproj was compiled with.
1500            (check_version_gtk): If wxproj was compiled with gtk then check
1501            the given version against the version of the gtk library
1502            currently being used.
1503    
1504    2003-03-14  Bernhard Herzog  <[email protected]>
1505    
1506            * test/test_command.py: Run the tests when the module is run as a
1507            script
1508    
1509    2003-03-14  Bernhard Herzog  <[email protected]>
1510    
1511            Implement selection of multiple selected shapes in the same layer:
1512    
1513            - Introduce a new class to hold the selection. This basically
1514              replaces the interactor which was nothing more than the
1515              selection anyway. A major difference is of course that the new
1516              selection class supports multiple selected shapes in one layer
1517            
1518            - Move the object that represents the selection from the
1519              application to the canvas. The canvas is a better place than the
1520              application because the selection represents which shapes and
1521              layer of the map displayed by the canvas are selected and
1522              affects how the map is drawn.
1523    
1524            - Make the selection and its messages publicly available through
1525              the mainwindow.
1526    
1527            - The non-modal dialogs do not get a reference to the interactor
1528              anymore as they can simply refer to their parent, the
1529              mainwindow, for the what the interactor had to offer.
1530    
1531            * Thuban/UI/selection.py: New module with a class to represent the
1532            selection.
1533    
1534            * Thuban/UI/messages.py (SELECTED_TABLE, SELECTED_MAP): Remove
1535            these unused messages
1536    
1537            * Thuban/UI/application.py (ThubanApplication.OnInit)
1538            (ThubanApplication.OnExit, ThubanApplication.SetSession): The
1539            interactor is gone now.
1540            (ThubanApplication.CreateMainWindow): There is no interactor
1541            anymore so we pass None as the interactor argument for now for
1542            compatibility.
1543    
1544            * Thuban/UI/view.py (MapCanvas.delegated_messages)
1545            (MapCanvas.Subscribe, MapCanvas.Unsubscribe): In Subscribe and
1546            Unsubscribe, delegate messages according to the delegated_messages
1547            class variable.
1548            (MapCanvas.__getattr__, MapCanvas.delegated_methods): Get some
1549            attributes from instance variables as described with the
1550            delegated_methods class variable.
1551            (MapCanvas.__init__): New instance variable selection holding the
1552            current selection
1553            (MapCanvas.do_redraw): Deal with multiple selected shapes. Simply
1554            pass them on to the renderer
1555            (MapCanvas.SetMap): Clear the selection when a different map is
1556            selected.
1557            (MapCanvas.shape_selected): Simple force a complete redraw. The
1558            selection class now takes care of only issueing SHAPES_SELECTED
1559            messages when the set of selected shapes actually does change.
1560            (MapCanvas.SelectShapeAt): The selection is now managed in
1561            self.selection
1562    
1563            * Thuban/UI/mainwindow.py (MainWindow.delegated_messages)
1564            (MainWindow.Subscribe, MainWindow.Unsubscribe): In Subscribe and
1565            Unsubscribe, delegate messages according to the delegated_messages
1566            class variable.
1567            (MainWindow.delegated_methods, MainWindow.__getattr__): Get some
1568            attributes from instance variables as described with the
1569            delegated_methods class variable.
1570            (MainWindow.__init__): The interactor as ivar is gone. The
1571            parameter is still there for compatibility. The selection messages
1572            now come from the canvas.
1573            (MainWindow.current_layer, MainWindow.has_selected_layer):
1574            Delegate to the the canvas.
1575            (MainWindow.LayerShowTable, MainWindow.Classify)
1576            (MainWindow.identify_view_on_demand): The dialogs don't need the
1577            interactor parameter anymore.
1578    
1579            * Thuban/UI/tableview.py (TableFrame.__init__)
1580            (LayerTableFrame.__init__, LayerTableFrame.OnClose)
1581            (LayerTableFrame.row_selected): The interactor is gone. It's job
1582            from the dialog's point of view is now done by the mainwindow,
1583            i.e. the parent. Subscribe to SHAPES_SELECTED instead
1584            of SELECTED_SHAPE
1585            
1586            * Thuban/UI/dialogs.py (NonModalDialog.__init__): The interactor
1587            is gone. It's job from the dialog's point of view is now done by
1588            the mainwindow, i.e. the parent.
1589            
1590            * Thuban/UI/classifier.py (Classifier.__init__): The interactor is
1591            gone. It's job from the dialog's point of view is now done by the
1592            mainwindow, i.e. the parent.
1593    
1594            * Thuban/UI/tree.py (SessionTreeView.__init__): The interactor is
1595            gone. It's job from the dialog's point of view is now done by the
1596            mainwindow, i.e. the parent.
1597            (SessionTreeCtrl.__init__): New parameter mainwindow which is
1598            stored as self.mainwindow. The mainwindow is need so that the tree
1599            can still subscribe to the selection messages.
1600            (SessionTreeCtrl.__init__, SessionTreeCtrl.unsubscribe_all)
1601            (SessionTreeCtrl.update_tree, SessionTreeCtrl.OnSelChanged): The
1602            selection is now accessible through the mainwindow. Subscribe to
1603            SHAPES_SELECTED instead of SELECTED_SHAPE
1604    
1605            * Thuban/UI/identifyview.py (IdentifyView.__init__): Use the
1606            SHAPES_SELECTED message now.
1607            (IdentifyView.selected_shape): Now subscribed to SHAPES_SELECTED,
1608            so deal with multiple shapes
1609            (IdentifyView.__init__, IdentifyView.OnClose): The interactor is
1610            gone. It's job from the dialog's point of view is now done by the
1611            mainwindow, i.e. the parent.
1612    
1613            * Thuban/UI/controls.py (RecordListCtrl.fill_list): The second
1614            parameter is now a list of shape ids.
1615            (RecordTable.SetTable): The second parameter is now a list of
1616            indices.
1617    
1618            * Thuban/UI/renderer.py (ScreenRenderer.RenderMap): Rename the
1619            selected_shape parameter and ivar to selected_shapes. It's now a
1620            list of shape ids.
1621            (MapRenderer.draw_label_layer): Deal with multiple selected
1622            shapes. Rearrange the code a bit so that the setup and shape type
1623            distinctions are only executed once.
1624    
1625            * test/test_selection.py: Test cases for the selection class
1626    
1627    2003-03-11  Jonathan Coles   <[email protected]>
1628    
1629            * Thuban/Model/load.py: Temporary fix so that the xml reader
1630            doesn't cause Thuban to crash.
1631    
1632            * Thuban/Model/layer.py: Handle the cyclic references between
1633            a layer and its classification better, and be sure to disconnect
1634            the classification from the layer when the layer is destroyed
1635            so that we don't maintain a cyclic reference that may not be
1636            garbage collected.
1637    
1638            * Thuban/Model/classification.py: See comment for layer.py.
1639    
1640    2003-03-12  Jan-Oliver Wagner <[email protected]>
1641    
1642            * HOWTO-Release: New. Information on the steps for releasing
1643            a new version of Thuban.
1644    
1645    2003-03-11  Jonathan Coles   <[email protected]>
1646    
1647            * Thuban/UI/classifier.py: Add normal border to SelectPropertiesDialog.
1648            Use True instead of true.
1649            (Classifier): Should have a single panel in which all the controls lie.
1650    
1651            * Thuban/UI/proj4dialog.py: Add normal border.
1652    
1653            * Thuban/UI/tree.py: Fixed problem with bad item images under Windows.
1654    
1655            * Thuban/UI/mainwindow.py: Use True instead of true.
1656    
1657            * setup.py: Update some definitions to use wxWindows2.4 files
1658    
1659            * Data/iceland_sample_class.thuban: Fixed file so that the
1660            field_type information is present.
1661    
1662    2003-03-10  Jonathan Coles   <[email protected]>
1663    
1664            * Thuban/UI/classifier.py (Classifier.__init__): Make the
1665            field type label grow so that when the text changes the
1666            size is updated correctly. This may be a wxWindows bug.
1667    
1668    2003-03-10  Jonathan Coles   <[email protected]>
1669    
1670            * Thuban/UI/application.py: Changed SESSION_CHANGED to
1671            SESSION_REPLACED.
1672    
1673            * Thuban/UI/classifier.py: Wrap text with _().
1674            (ClassGrid.CreateTable): Set dimensions and size hints here,
1675            instead of in Reset, so we only set the size once.
1676    
1677            * Thuban/UI/dialogs.py: Don't need Shutdown(); just use Close()!
1678    
1679            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
1680            Call Close() instead of Shutdown().
1681    
1682            * Thuban/UI/messages.py: Changed SESSION_CHANGED to SESSION_REPLACED.
1683    
1684            * Thuban/UI/tree.py: Changed SESSION_CHANGED to SESSION_REPLACED.
1685            Go back to using OnClose() instead of Shutdown().
1686    
1687    2003-03-10  Jonathan Coles   <[email protected]>
1688    
1689            * Thuban/UI/classifier.py (Classifier): SelectField() needed
1690            to know the old field index as well as the new one.
1691    
1692    2003-03-10  Jonathan Coles   <[email protected]>
1693    
1694            * Thuban/UI/classifier.py (Classifier): Use __SelectField()
1695            to correctly set the table information and call this from
1696            __init__ and from _OnFieldSelect so that all the information
1697            is up to date when the dialog opens and when a field is changed.
1698    
1699    2003-03-10  Jonathan Coles   <[email protected]>
1700    
1701            * Thuban/Model/classification.py (Classification): Don't use
1702            layer's message function directly, use the ClassChanged() method
1703            when then classification changes. SetField/SetFieldType/SetLayer
1704            must keep the information about field name and field type in
1705            sync when an owning layer is set or removed.
1706    
1707            * Thuban/Model/layer.py: Added ClassChanged() so that the
1708            classification can tell the layer when its data has changed.
1709            (Layer.SetClassification): Accepts None as an arguement to
1710            remove the current classification and correctly handles
1711            adding a new classification.
1712    
1713            * Thuban/Model/load.py: Comment out print statement
1714    
1715            * test/test_classification.py, test/test_save.py: New and
1716            improved tests.
1717    
1718    2003-03-07  Jonathan Coles   <[email protected]>
1719    
1720            * Thuban/Model/classification.py: Implemented __copy__ and
1721            __deepcopy__ for ClassGroup* and ClassGroupProperites so
1722            they can easily be copied by the classifier dialog.
1723            (ClassGroupProperites.__init__): The default line color should
1724            have been Color.Black.
1725    
1726            * Thuban/UI/classifier.py: Setting and Getting table values now
1727            uses a consistent set of functions.
1728            (Classifier): Now non-modal. Has field type label which changes
1729            as the field changes. Keep track of buttons in a list so that
1730            we can enable/disable the buttons when the None field is selected.
1731            (SelectPropertiesDialog): Add buttons to make the colors transparent.
1732    
1733            * Thuban/UI/dialogs.py (NonModalDialog.Shutdown): New method which
1734            does what OnClose did, but can be called by the application to
1735            close a window. Needed when a session changes, and we have to
1736            close the classifier windows.
1737    
1738            * Thuban/UI/mainwindow.py (MainWindow.prepare_new_session):
1739            Shuts down open dialogs. Used when a new session is created
1740            or a session is opened.
1741            (MainWindow.SaveSession): Should only call application.SaveSession()
1742            if we don't call SaveSessionAs first.
1743            (MainWindow.Classify): Allow different classifier dialogs for
1744            different layers.
1745    
1746            * Thuban/UI/tree.py (SessionTreeView): Remove OnClose and let
1747            the parent class handle it. Add Shutdown() to unsubscibe from
1748            event notification and call the parent Shutdown(). This was
1749            necessary so the application can close the tree window.
1750    
1751    2003-03-06  Jonathan Coles   <[email protected]>
1752    
1753            * Thuban/Model/classification.py: Minor documentation changes,
1754            Addition of __eq__ and __ne__ methods.
1755            (Classification.SetLayer): prevent recursion between this method
1756            and Layer.SetClassification().
1757    
1758            * Thuban/Model/color.py: Addition of __eq__ and __ne__ methods.
1759    
1760            * Thuban/Model/layer.py (SetClassification): prevent recursion
1761            between this method and Classification.SetLayer().
1762    
1763            * test/test_classification.py, test/test_load.py,
1764            test/test_session.py: Fixed and added tests for the classification
1765            classes.
1766    
1767    2003-03-06  Bernhard Herzog  <[email protected]>
1768    
1769            * Thuban/UI/classifier.py (ClassGrid.__init__)
1770            (ClassGrid.CreateTable): Move the SetSelectionMode call to
1771            CreateTable because otherwise it triggers an assertion in
1772            wxPython/wxGTK 2.4.
1773    
1774    2003-03-05  Jonathan Coles   <[email protected]>
1775    
1776            * Thuban/common.py: Move FIELDTYPE constants back to table.py.
1777    
1778            * Thuban/Model/load.py: import FIELDTYPE constants from table.
1779    
1780            * Thuban/UI/classifier.py: import FIELDTYPE constants from table.
1781    
1782            * Thuban/Model/table.py: Put FIELDTYPE constants back.
1783    
1784    2003-03-05  Jonathan Coles   <[email protected]>
1785    
1786            * Thuban/UI/classifier.py: Added class documentation.
1787            Fixed RTbug #1713, #1714. Added Move[Up|Down] buttons.
1788            Store just the groups in the table and generate the other
1789            column information when it is requested. Add "None" field
1790            to pull-down to select no classification.
1791    
1792            * Thuban/common.py: Moved FIELDTYPE constants from table.py
1793            (Str2Num): Only catch ValueError exceptions.
1794    
1795            * Thuban/Model/classification.py: Class documentation. Renaming
1796            of methods with Stroke to Line. Groups are stored in a single
1797            list with the default as the first element. Groups are searched
1798            in the order they appear in the list.
1799    
1800            * Thuban/Model/color.py: Documentation.
1801    
1802            * Thuban/Model/layer.py (Layer): Add GetFieldType to retreive
1803            the kind of data represented by a field.
1804    
1805            * Thuban/Model/load.py (ProcessSession): Use proper string
1806            conversion function; fixes RTbug #1713.
1807    
1808            * Thuban/Model/save.py (Saver): Store field type information.
1809    
1810            * Thuban/Model/table.py: Put FIELDTYPE constants in common.py.
1811            (Table): Add field_info_by_name() to retrieve field information
1812            by specifying the field name, not the number.
1813    
1814            * Thuban/UI/mainwindow.py: Function name changes.
1815    
1816            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Only
1817            get the layer classification once. Don't try to classify
1818            values when the field is None: just use the default properties.
1819    
1820            * Thuban/UI/view.py: Function name changes.
1821    
1822            * Doc/thuban.dtd: Add field_type attribute to a classification.
1823    
1824    2003-03-04  Bernhard Herzog  <[email protected]>
1825    
1826            * Doc/thuban.dtd: Use correct syntax for optional attributes. Make
1827            the fill and stroke layer attributes optional with suitable
1828            default values. Add the stroke_width layer attribute. Use correct
1829            syntax for empty elements. Make the attribute list for labels
1830            refer to the label element.
1831    
1832    2003-03-04  Bernhard Herzog  <[email protected]>
1833    
1834            * setup.py (thuban_build_py.build): Add a comment about distutils in
1835            Python 2.3 containing some of the functionality we implement in
1836            setup.py ourselves.
1837    
1838            * Thuban/UI/classifier.py (ClassGrid.__init__): Set the table
1839            before the selection mode. Doing it the other way round triggers
1840            an assertion in wxWindows.
1841    
1842            * Thuban/Model/save.py (escape): Fix typo in doc-string
1843    
1844            * Thuban/Model/classification.py: Remove unnecessary wxPython
1845            import
1846    
1847    2003-03-04  Jonathan Coles   <[email protected]>
1848    
1849            * Thuban/Model/classification.py (ClassGroupRange.GetProperties):
1850            Parameter 'value' should default to None.
1851    
1852            * Thuban/UI/mainwindow.py: Use Layer.GetClassification() since
1853            the class attribute __classification is now private.
1854    
1855            * Thuban/UI/classifier.py (ClassGrid): Moved OnCellDClick() from
1856            Classifier to ClassGrid. Added support for removing selected rows,
1857            which including code for keeping track of when cells are selected,
1858            and deselected.
1859            (ClassTable): Support for added/removing rows. Fixed a problem
1860            with __ParseInput whereby it would not allow strings (only numbers)
1861            to be entered.
1862            (Classifier): Added button and supporting code for removing
1863            selected rows.
1864    
1865    2003-02-27  Jonathan Coles   <[email protected]>
1866    
1867            * Thuban/common.py: Moved color conversion functions into
1868            Thuban/UI/common.py.
1869            (Str2Num): Now converts the float (not the string) to a long/int
1870            so that an exception isn't thrown.
1871    
1872            * Thuban/UI/common.py: Common functions used in several UI modules
1873    
1874            * Thuban/Model/classification.py: Changed the class hierarchy
1875            so that a Classification consists of Groups which return
1876            Properties when a value matches a Group.
1877    
1878            * Thuban/Model/layer.py: Fixed name resolution problem.
1879    
1880            * Thuban/Model/load.py: Use new Classification and Group functions.
1881    
1882            * Thuban/Model/save.py (Saver.write_attribs): Fixes a test case
1883            failure.
1884            (Saver.write_classification): Use new Classification and Group
1885            functions.
1886    
1887            * Thuban/UI/classifier.py: Changes to use new Classification and Group
1888            functions. Fix to create a tuple with a single value instead of
1889            simply returning the value.
1890    
1891            * Thuban/UI/renderer.py: Use new Classification and Group functions.
1892            Use common.py functions.
1893    
1894            * Thuban/UI/tree.py: Use common.py functions.
1895            
1896            * test/test_classification.py: Use new Classification and Group
1897            classes.
1898    
1899    2003-02-24  Jonathan Coles   <[email protected]>
1900    
1901            * Thuban/common.py (Color2wxColour, wxColour2Color): Conversion
1902            functions from Thuban color objects to wxWindow colour objects.
1903    
1904            * Thuban/Model/classification.py (Classification): Renamed
1905            GetProperties() to GetClassData(). Used the new iterator
1906            in TreeInfo().
1907            (ClassIterator): Iterator implementation to iterate over the
1908            ClassData objects in a classification object.
1909    
1910            * Thuban/Model/save.py (Saver.write_classificaton): Uses
1911            the new iterator to save the classification information.
1912    
1913            * Thuban/UI/classifier.py (SelectPropertiesDialog): Support
1914            for changing the stroke and fill colors and previewing the
1915            changes.
1916    
1917            * Thuban/UI/mainwindow.py (MainWindow.OpenSession,
1918            MainWindow.SaveSessionAs): Text string changes so the dialogs
1919            have more meaningful titles.
1920    
1921            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Change
1922            Classification method name from GetProperties to GetClassData.
1923    
1924            * Thuban/UI/view.py (MapCanvas.find_shape_at): Use method calls
1925            instead of accessing now non-existent class variables.
1926    
1927    2003-02-24  Bernhard Herzog  <[email protected]>
1928    
1929            * Thuban/UI/renderer.py (MapRenderer.draw_shape_layer): Remove
1930            unneeded Shape() call. Rendering is substantially faster without
1931            it and it avoids some problems with broken shape files.
1932    
1933    2003-02-20  Frank Koormann   <[email protected]>
1934    
1935            Force minimal size of identify and label dialogs. The autosizing
1936            looked too ugly.
1937    
1938            * Thuban/UI/controls.py (RecordListCtrl): Set minimal width for columns.
1939            * Thuban/UI/labeldialog.py (LabelDialog.dialog_layout):
1940            Set size of listctrl.
1941            * Thuban/UI/identifyview.py (IdentifyView.__init__):
1942            Set size of dialog.
1943    
1944    2003-02-19  Jonathan Coles   <[email protected]>
1945    
1946            * test/test_classification.py, test/test_layer.py,
1947            test/test_load.py, test/test_map.py, test/test_session.py:
1948            Updated the tests to use the new functions that are in the
1949            respective classes.
1950    
1951            * Thuban/Model/classification.py (Classification):
1952            Uses the new ClassData* classes. Modification messages are
1953            passed up to the parent layer (if it exists).
1954            (ClassData): New class to encapsulate the common data in each
1955            classification property.
1956            (ClassDataDefault): Represents the Default class. data.
1957            (ClassDataPoint): Represents a single class. data point
1958            (ClassDataRange): Represents a class. range
1959            (ClassDataMap): Represents a class. map (unused).
1960    
1961            * Thuban/Model/color.py: Added Color.None to represent something
1962            with no color. Color.Black represents the color black.
1963            (NoColor): Helper class derived from Color to represent something
1964            with no color.
1965    
1966            * Thuban/Model/layer.py (Layer): Removed references to fill, stroke,
1967            stroke_width attributes. Made the 'classification' attribute private.
1968            New methods for setting/getting the classification.
1969    
1970            * Thuban/Model/load.py (ProcessSession): Use new methods on Layer
1971            to get the classifcation and use the new ClassData* classes to
1972            hold the classification data. Use Str2Num to convert numbers
1973            properly.
1974    
1975            * Thuban/Model/save.py (Saver): Use new Color and Classification
1976            methods
1977    
1978            * Thuban/UI/classifier.py (ClassGrid): New class to represent a
1979            custom grid.
1980            (ClassTable): Support for editing Values and Labels and for
1981            changing what type (point or range) of data is stored in each
1982            property based on how the user enters the data.
1983            (Classifier): Support for saving the new classifications and
1984            launching the dialog to edit a property.
1985            (SelectPropertiesDialog): New class for editing the visual
1986            properties of a classification (stroke color, width, and fill color)
1987            (ClassPreviewer): Took the Draw method from ClassRenderer and
1988            made most of it into this new class. Intend to use this class in
1989            the SelectPropertiesDialog for previewing changes.
1990    
1991            * Thuban/UI/renderer.py: Use new Color and Classification methods.
1992    
1993            * Thuban/UI/tree.py: Formatting changes.
1994    
1995            * Doc/thuban.dtd: Add 'label' element
1996    
1997            * Thuban/common.py: New. Contains common routines used throughout
1998            the code.
1999            (Str2Num): Takes a string and converts it to the "best" type of
2000            number.
2001    
2002    2003-02-14  Bernhard Herzog  <[email protected]>
2003    
2004            * Thuban/UI/view.py (MapCanvas.OnLeftUp): Make sure that the
2005            dragging flag is always set to 0 even when the tool implementation
2006            raises an exception
2007    
2008    2003-02-11  Bernhard Herzog  <[email protected]>
2009    
2010            * Thuban/UI/application.py (ThubanApplication.splash_screen): New
2011            method to create a splash screen.
2012            (ThubanApplication.ShowMainWindow): New. Show the main window.
2013            Needed so the splash screen can display the mainwindow
2014            (ThubanApplication.OnInit): Call the
2015            new splash_screen method to determine whether the application
2016            should display a splash screen. If it displays a splash screen do
2017            not immediately show the main window.
2018    
2019    2003-02-11  Jonathan Coles  <[email protected]>
2020    
2021            * Thuban/Model/classification.py: Added import line to fix
2022            feature conflicts between running on python2.2 and python2.1.
2023    
2024            * Thuban/UI/classifier.py (ClassTable): Didn't need to hang
2025            onto the clinfo parameter, so removed the deepcopy().
2026    
2027    2003-02-10  Jonathan Coles  <[email protected]>
2028    
2029            * Thuban/Model/save.py (Saver.open_element, Saver.close_element):
2030            Added element_open variable to track opening and closing of tags
2031            so that tags that don't span more than one line are closed with
2032            /> instead of </tag_name>. Use the GetDefault*() methods of
2033            the Classification class.
2034    
2035            * Thuban/Model/classification.py (Classificaton): Added set and
2036            get methods for the default data. The class also takes a layer
2037            reference so that modification messages can be sent. Fixed the
2038            methods to use the new ClassData class.
2039            (ClassData): New class to encapsulate the classification data
2040    
2041            * Thuban/Model/layer.py (Layer): Remove the
2042            Set[Fill|Stroke|StrokeWidth]() methods. Code should call the
2043            SetDefault*() methods on the layer's classification object.
2044            (Layer.__init__): Use the new SetDefault*() methods in the
2045            Classification class.
2046    
2047            * Thuban/Model/load.py (ProcessSession): Use the new ClassData
2048            object instead of a dictionary.
2049    
2050            * Thuban/UI/classifier.py (ClassRenderer): New class to
2051            draw the classifications in the dialog box's table.
2052            (Classifier): Modified to use the ClassRenderer class.
2053    
2054            * Thuban/UI/mainwindow.py (MainWindow): Use the SetDefault*()
2055            methods of the Classification class.
2056    
2057            * Thuban/UI/renderer.py (MapRenderer): Use the Get*() methods
2058            of the ClassData class.
2059    
2060            * test/test_classification.py, test/test_layer.py,
2061            test/test_map.py, test/test_session.py: Fix the tests to work
2062            with the above code changes.
2063    
2064    2003-02-03  Jonathan Coles  <[email protected]>
2065    
2066            * Thuban/Model/classification.py (Classification): Added getNull()
2067            to return the NullData reference
2068    
2069            * Thuban/Model/layer.py (Layer.SetFill, Layer.SetStroke,
2070            Layer.SetStrokeWidth): Modified these functions to change the
2071            null data in the classification rather than keep these values
2072            directly in the Layer class. Menu options to change these values
2073            work again.
2074    
2075    2003-01-28  Jonathan Coles  <[email protected]>
2076    
2077            * Thuban/UI/classifier.py (Classifier): Resolved merging conflicts.
2078            Fixed crashing problem on some systems. Dialog box shows
2079            classification data.
2080    
2081            * Thuban/UI/tree.py (SessionTreeCtrl.add_items): Handle drawing
2082            Colors in the tree view.
2083    
2084            * Thuban/Model/layer.py (Layer.TreeInfo): Added a call to build
2085            the tree info for classifications. Commented out unnecessary lines.
2086    
2087            * Thuban/Model/classification.py (Classification.TreeInfo): New
2088            function to add information about the classification into the
2089            tree view.
2090    
2091    2003-01-27  Jan-Oliver Wagner <[email protected]>
2092    
2093            * Thuban/__init__.py (_): New.
2094    
2095            * Thuban/Model/classification.py, Thuban/Model/extension.py,
2096            Thuban/Model/layer.py, Thuban/Model/load.py, Thuban/Model/map.py,
2097            Thuban/Model/session.py, Thuban/UI/application.py,
2098            Thuban/UI/classifier.py, Thuban/UI/context.py, Thuban/UI/controls.py,
2099            Thuban/UI/identifyview.py, Thuban/UI/labeldialog.py,
2100            Thuban/UI/mainwindow.py, Thuban/UI/menu.py, Thuban/UI/proj4dialog.py,
2101            Thuban/UI/renderer.py, Thuban/UI/tree.py, Thuban/Lib/connector.py,
2102            Thuban/Lib/fileutil.py: Replace user string by _() for i18n.
2103    
2104    2003-01-27  Jonathan Coles  <[email protected]>
2105    
2106            * Thuban/Model/layer.py: Classification initialization calls.
2107    
2108            * Thuban/Model/classification.py: Created class to encapsulate
2109            a layer classification. Supports specific data points and
2110            ranges.
2111    
2112            * Thuban/Model/load.py: Added support for loading classification
2113            information.
2114    
2115            * Thuban/Model/save.py: Added support for saving classification
2116            information.
2117    
2118            * Thuban/UI/classifier.py: Initial class for a dialog box for
2119            specifying classification information.
2120    
2121            * Thuban/UI/mainwindows.py: Support for opening the classifier
2122            dialog.
2123    
2124            * Thuban/UI/renderer.py: Support for drawing a layer with the
2125            classification information.
2126    
2127            * Data/iceland_sample_class.thuban: iceland_sample with
2128            classification data.
2129    
2130            * test/test_classification: Tests for the Classification class.
2131    
2132  2002-12-09  Bernhard Herzog  <[email protected]>  2002-12-09  Bernhard Herzog  <[email protected]>
2133    
2134            * test/test_command.py: New. Tests for the command classes.
2135    
2136          * Thuban/UI/command.py (ToolCommand): New class for tool commands.          * Thuban/UI/command.py (ToolCommand): New class for tool commands.
2137          (Command.IsTool): New method to distinguish between command          (Command.IsTool): New method to distinguish between command
2138          switching tools and other commands.          switching tools and other commands.
# Line 30  Line 2163 
2163          * Thuban/UI/mainwindow.py: Altered the order of tools in the          * Thuban/UI/mainwindow.py: Altered the order of tools in the
2164          toolbar: First now are all navigation tools (Zoom In/Out, Pan,          toolbar: First now are all navigation tools (Zoom In/Out, Pan,
2165          Full Extent).          Full Extent).
2166        
2167  2002-10-23  Bernhard Herzog  <[email protected]>  2002-10-23  Bernhard Herzog  <[email protected]>
2168    
2169          * setup.py (setup call): version now 0.1.3          * setup.py (setup call): version now 0.1.3
# Line 141  Line 2274 
2274          * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe          * Thuban/UI/mainwindow.py (MainWindow.OnClose): Unsubscribe
2275          VIEW_POSITION          VIEW_POSITION
2276    
2277  2002-09-04  Frank Koormann   <[email protected]>  2002-09-04  Frank Koormann  <[email protected]>
2278    
2279          * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")          * Resources/Bitmaps/fullextent.xpm: Updated Icon (removed "potatoe")
2280    
# Line 228  Line 2361 
2361    
2362          * Thuban/Model/table.py (Table.write_record): New method to write          * Thuban/Model/table.py (Table.write_record): New method to write
2363          records.          records.
2364          (Table.__init__): Open the DBF file for writing too.          (Table.__init__): Open the DBF file for writing too.
2365    
2366          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value          * Thuban/UI/controls.py (RecordTable.SetValue): Write the value
2367          into the underlying table.          into the underlying table.
# Line 266  Line 2399 
2399          * setup.py (ThubanInstall.run): Don't repr install_lib_orig          * setup.py (ThubanInstall.run): Don't repr install_lib_orig
2400          because thubaninit_contents will do it for us.          because thubaninit_contents will do it for us.
2401    
2402  2002-08-16      Jan-Oliver Wagner <[email protected]>  2002-08-16  Jan-Oliver Wagner <[email protected]>
2403    
2404          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if          * Thuban/UI/mainwindow.py: menu item 'show session tree' now disable if
2405          tree window already open          tree window already open
# Line 394  Line 2527 
2527          * Thuban/UI/tree.py: We can now simply subscribe to the session's          * Thuban/UI/tree.py: We can now simply subscribe to the session's
2528          CHANGED channel to be informed of changes.          CHANGED channel to be informed of changes.
2529          (SessionTreeCtrl.session_channels): Not needed any longer.          (SessionTreeCtrl.session_channels): Not needed any longer.
2530          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):          (SessionTreeCtrl.unsubscribe_all, SessionTreeCtrl.session_changed):
2531          Only have to (un)subscribe CHANGED          Only have to (un)subscribe CHANGED
2532    
2533          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.          * Thuban/Model/map.py (Map.TreeInfo): Deal better with empty maps.
# Line 455  Line 2588 
2588          * Thuban/Model/layer.py (Layer.TreeInfo),          * Thuban/Model/layer.py (Layer.TreeInfo),
2589          Thuban/Model/extension.py (Extension.TreeInfo),          Thuban/Model/extension.py (Extension.TreeInfo),
2590          Thuban/Model/map.py (Map.TreeInfo),          Thuban/Model/map.py (Map.TreeInfo),
2591          Thuban/Model/session.py (Session.TreeInfo):          Thuban/Model/session.py (Session.TreeInfo):
2592          Add TreeInfo methods to implement the new tree view update scheme          Add TreeInfo methods to implement the new tree view update scheme
2593    
2594  2002-07-16  Bernhard Herzog  <[email protected]>  2002-07-16  Bernhard Herzog  <[email protected]>
# Line 536  Line 2669 
2669          * setup.py: In the setup call, make sure that the library          * setup.py: In the setup call, make sure that the library
2670          directories are under $prefix/lib not directly under $prefix.          directories are under $prefix/lib not directly under $prefix.
2671    
2672  2002-06-20      Jan-Oliver Wagner <[email protected]>  2002-06-20  Jan-Oliver Wagner <[email protected]>
2673    
2674          * Thuban/Model/extension.py: new module to handle extension objects.          * Thuban/Model/extension.py: new module to handle extension objects.
2675          * Thuban/Model/messages.py: new messages for extensions.          * Thuban/Model/messages.py: new messages for extensions.
# Line 765  Line 2898 
2898          * Thuban/UI/messages.py (VIEW_POSITION): New message for the          * Thuban/UI/messages.py (VIEW_POSITION): New message for the
2899          position in the statusbar          position in the statusbar
2900    
2901  2002-04-26      Frank Koormann <[email protected]>  2002-04-26  Frank Koormann <[email protected]>
2902    
2903          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data          * Thuban/UI/mainwindow.py: AddLayer, Dialog title s/session/data
2904    
2905  2002-04-24      Frank Koormann <[email protected]>  2002-04-24  Frank Koormann <[email protected]>
2906            
2907          * Resources/Bitmaps/identify.xpm: shadow added          * Resources/Bitmaps/identify.xpm: shadow added
2908    
2909          * Resources/Bitmaps/fullextent.xpm: new          * Resources/Bitmaps/fullextent.xpm: new
           
 2002-04-22      Jan-Oliver Wagner <[email protected]>  
2910    
2911          * Thuban/UI/tree.py (update_tree): added test for None on map bounding box  2002-04-22  Jan-Oliver Wagner <[email protected]>
2912    
2913  2002-04-21      Jan-Oliver Wagner <[email protected]>          * Thuban/UI/tree.py (update_tree): added test for None on map bounding
2914            box
2915    
2916    2002-04-21  Jan-Oliver Wagner <[email protected]>
2917    
2918          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new          * Thuban/UI/proj4dialog.py (UTMProposeZoneDialog): new
2919    
2920          * Thuban/UI/tree.py (update_tree): added added map extent          * Thuban/UI/tree.py (update_tree): added added map extent
2921    
2922          * Thuban/UI/mainwindow.py (_method_command): extended by parameter          * Thuban/UI/mainwindow.py (_method_command): extended by parameter
2923          icon; added map_full_extend as tool          icon; added map_full_extend as tool
2924    
2925  2002-04-19      Jan-Oliver Wagner <[email protected]>  2002-04-19  Jan-Oliver Wagner <[email protected]>
2926    
2927          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for          * Thuban/UI/mainwindow.py (SaveSession): launch save as dialog for
2928          saving _new_ sessions          saving _new_ sessions
# Line 890  Line 3024 
3024    
3025          * setup.py: increase version number to 0.1          * setup.py: increase version number to 0.1
3026          (data_dist): New command class for data distribution          (data_dist): New command class for data distribution
           
3027    
3028  2001-09-14  Bernhard Herzog  <[email protected]>  2001-09-14  Bernhard Herzog  <[email protected]>
3029    
3030          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):          * Thuban/UI/identifyview.py (IdentifyListCtrl.selected_shape):
3031          Handle the case of no layer (i.e. layer is None) properly.          Handle the case of no layer (i.e. layer is None) properly.
3032    
3033          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):          * Thuban/UI/proj4dialog.py (UTMDialog.__init__, Proj4Dialog.__init__):
3034          Set the initial selection of the combo boxes to reflect the          Set the initial selection of the combo boxes to reflect the
3035          projection we're starting with in a way that works on windows,          projection we're starting with in a way that works on windows,
3036          too.          too.
# Line 1007  Line 3140 
3140          (MainWindow.identify_view_on_demand): Store the interactor in an          (MainWindow.identify_view_on_demand): Store the interactor in an
3141          instvar and use that reference instead of going through main.app          instvar and use that reference instead of going through main.app
3142    
3143          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):          * Thuban/UI/mainwindow.py (MainWindow.ShowSessionTree):
3144          * Thuban/UI/application.py (ThubanApplication.OnInit):          * Thuban/UI/application.py (ThubanApplication.OnInit):
3145          * Thuban/UI/main.py (main): Create the session tree view in main          * Thuban/UI/main.py (main): Create the session tree view in main
3146          with the new mainwindow method ShowSessionTree and not directly          with the new mainwindow method ShowSessionTree and not directly
3147          the application's OnInit method          the application's OnInit method
# Line 1024  Line 3157 
3157          layer to the tableview dialog.          layer to the tableview dialog.
3158    
3159          * Thuban/UI/tableview.py: Add some doc-strings          * Thuban/UI/tableview.py: Add some doc-strings
3160          (TableGrid):          (TableGrid):
3161          (TableGrid.OnRangeSelect):          (TableGrid.OnRangeSelect):
3162          (TableGrid.OnSelectCell):          (TableGrid.OnSelectCell):
3163          (TableFrame.__init__):          (TableFrame.__init__):
# Line 1091  Line 3224 
3224  2001-09-05  Bernhard Herzog  <[email protected]>  2001-09-05  Bernhard Herzog  <[email protected]>
3225    
3226          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.          * Thuban/UI/view.py (MapCanvas.__init__): New argument, interactor.
3227            
3228          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument          * Thuban/UI/mainwindow.py (MainWindow.__init__): New argument
3229          interactor to pass through to the MapCanvas          interactor to pass through to the MapCanvas
3230            
3231          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new          * Thuban/UI/application.py (ThubanApplication.OnInit): Use the new
3232          argument to the MainWindow constructor to get rid of the ugly hack          argument to the MainWindow constructor to get rid of the ugly hack
3233          that made main.app available early just so that the mapcanvas          that made main.app available early just so that the mapcanvas
# Line 1141  Line 3274 
3274          (ThubanInstall.run): Remove the leading install root from the          (ThubanInstall.run): Remove the leading install root from the
3275          script filename if an install root was specified and use the new          script filename if an install root was specified and use the new
3276          link_file method          link_file method
3277            
3278          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to          * Thuban/UI/mainwindow.py (MainWindow.AddLayer): Fit the map to
3279          the window when the first layer is added to the map.          the window when the first layer is added to the map.
3280    
# Line 1178  Line 3311 
3311          (InnoIconItem): Helper class for bdist_inno          (InnoIconItem): Helper class for bdist_inno
3312          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added          (thuban_bdist_inno): Thuban specific version of bdist_inno. Added
3313          this together with the appropriate parameters, to the setup call.          this together with the appropriate parameters, to the setup call.
3314            
3315          * setup.cfg (bdist_inno): added new section for the inno setup          * setup.cfg (bdist_inno): added new section for the inno setup
3316          installer          installer
3317    

Legend:
Removed from v.359  
changed lines
  Added in v.867

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26