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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 848 - (show annotations)
Wed May 7 07:20:52 2003 UTC (21 years, 10 months ago) by frank
Original Path: trunk/thuban/ChangeLog
File size: 126936 byte(s)
Icon updates.

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26