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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 893 - (show annotations)
Mon May 12 10:46:05 2003 UTC (21 years, 9 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 133471 byte(s)
Update unicode encoding

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26