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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 826 - (show annotations)
Tue May 6 08:24:23 2003 UTC (21 years, 10 months ago) by bh
Original Path: trunk/thuban/ChangeLog
File size: 121970 byte(s)
update ChangeLog

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

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26